|
@@ -48,7 +48,16 @@
|
|
|
#define IETF_MPA_KEY_SIZE 16
|
|
|
#define IETF_MPA_VERSION 1
|
|
|
#define IETF_MAX_PRIV_DATA_LEN 512
|
|
|
-#define IETF_MPA_FRAME_SIZE 20
|
|
|
+#define IETF_MPA_FRAME_SIZE 20
|
|
|
+#define IETF_RTR_MSG_SIZE 4
|
|
|
+#define IETF_MPA_V2_FLAG 0x10
|
|
|
+
|
|
|
+/* IETF RTR MSG Fields */
|
|
|
+#define IETF_PEER_TO_PEER 0x8000
|
|
|
+#define IETF_FLPDU_ZERO_LEN 0x4000
|
|
|
+#define IETF_RDMA0_WRITE 0x8000
|
|
|
+#define IETF_RDMA0_READ 0x4000
|
|
|
+#define IETF_NO_IRD_ORD 0x3FFF
|
|
|
|
|
|
enum ietf_mpa_flags {
|
|
|
IETF_MPA_FLAGS_MARKERS = 0x80, /* receive Markers */
|
|
@@ -56,7 +65,7 @@ enum ietf_mpa_flags {
|
|
|
IETF_MPA_FLAGS_REJECT = 0x20, /* Reject */
|
|
|
};
|
|
|
|
|
|
-struct ietf_mpa_frame {
|
|
|
+struct ietf_mpa_v1 {
|
|
|
u8 key[IETF_MPA_KEY_SIZE];
|
|
|
u8 flags;
|
|
|
u8 rev;
|
|
@@ -66,6 +75,20 @@ struct ietf_mpa_frame {
|
|
|
|
|
|
#define ietf_mpa_req_resp_frame ietf_mpa_frame
|
|
|
|
|
|
+struct ietf_rtr_msg {
|
|
|
+ __be16 ctrl_ird;
|
|
|
+ __be16 ctrl_ord;
|
|
|
+};
|
|
|
+
|
|
|
+struct ietf_mpa_v2 {
|
|
|
+ u8 key[IETF_MPA_KEY_SIZE];
|
|
|
+ u8 flags;
|
|
|
+ u8 rev;
|
|
|
+ __be16 priv_data_len;
|
|
|
+ struct ietf_rtr_msg rtr_msg;
|
|
|
+ u8 priv_data[0];
|
|
|
+};
|
|
|
+
|
|
|
struct nes_v4_quad {
|
|
|
u32 rsvd0;
|
|
|
__le32 DstIpAdrIndex; /* Only most significant 5 bits are valid */
|
|
@@ -171,8 +194,7 @@ struct nes_timer_entry {
|
|
|
|
|
|
#define NES_CM_DEF_SEQ2 0x18ed5740
|
|
|
#define NES_CM_DEF_LOCAL_ID2 0xb807
|
|
|
-#define MAX_CM_BUFFER (IETF_MPA_FRAME_SIZE + IETF_MAX_PRIV_DATA_LEN)
|
|
|
-
|
|
|
+#define MAX_CM_BUFFER (IETF_MPA_FRAME_SIZE + IETF_RTR_MSG_SIZE + IETF_MAX_PRIV_DATA_LEN)
|
|
|
|
|
|
typedef u32 nes_addr_t;
|
|
|
|
|
@@ -204,6 +226,21 @@ enum nes_cm_node_state {
|
|
|
NES_CM_STATE_CLOSED
|
|
|
};
|
|
|
|
|
|
+enum mpa_frame_version {
|
|
|
+ IETF_MPA_V1 = 1,
|
|
|
+ IETF_MPA_V2 = 2
|
|
|
+};
|
|
|
+
|
|
|
+enum mpa_frame_key {
|
|
|
+ MPA_KEY_REQUEST,
|
|
|
+ MPA_KEY_REPLY
|
|
|
+};
|
|
|
+
|
|
|
+enum send_rdma0 {
|
|
|
+ SEND_RDMA_READ_ZERO = 1,
|
|
|
+ SEND_RDMA_WRITE_ZERO = 2
|
|
|
+};
|
|
|
+
|
|
|
enum nes_tcpip_pkt_type {
|
|
|
NES_PKT_TYPE_UNKNOWN,
|
|
|
NES_PKT_TYPE_SYN,
|
|
@@ -245,9 +282,9 @@ struct nes_cm_tcp_context {
|
|
|
|
|
|
|
|
|
enum nes_cm_listener_state {
|
|
|
- NES_CM_LISTENER_PASSIVE_STATE=1,
|
|
|
- NES_CM_LISTENER_ACTIVE_STATE=2,
|
|
|
- NES_CM_LISTENER_EITHER_STATE=3
|
|
|
+ NES_CM_LISTENER_PASSIVE_STATE = 1,
|
|
|
+ NES_CM_LISTENER_ACTIVE_STATE = 2,
|
|
|
+ NES_CM_LISTENER_EITHER_STATE = 3
|
|
|
};
|
|
|
|
|
|
struct nes_cm_listener {
|
|
@@ -283,16 +320,20 @@ struct nes_cm_node {
|
|
|
|
|
|
struct nes_cm_node *loopbackpartner;
|
|
|
|
|
|
- struct nes_timer_entry *send_entry;
|
|
|
-
|
|
|
+ struct nes_timer_entry *send_entry;
|
|
|
+ struct nes_timer_entry *recv_entry;
|
|
|
spinlock_t retrans_list_lock;
|
|
|
- struct nes_timer_entry *recv_entry;
|
|
|
+ enum send_rdma0 send_rdma0_op;
|
|
|
|
|
|
- int send_write0;
|
|
|
union {
|
|
|
- struct ietf_mpa_frame mpa_frame;
|
|
|
- u8 mpa_frame_buf[MAX_CM_BUFFER];
|
|
|
+ struct ietf_mpa_v1 mpa_frame;
|
|
|
+ struct ietf_mpa_v2 mpa_v2_frame;
|
|
|
+ u8 mpa_frame_buf[MAX_CM_BUFFER];
|
|
|
};
|
|
|
+ enum mpa_frame_version mpa_frame_rev;
|
|
|
+ u16 ird_size;
|
|
|
+ u16 ord_size;
|
|
|
+
|
|
|
u16 mpa_frame_size;
|
|
|
struct iw_cm_id *cm_id;
|
|
|
struct list_head list;
|
|
@@ -399,10 +440,8 @@ struct nes_cm_ops {
|
|
|
struct nes_vnic *, u16, void *,
|
|
|
struct nes_cm_info *);
|
|
|
int (*close)(struct nes_cm_core *, struct nes_cm_node *);
|
|
|
- int (*accept)(struct nes_cm_core *, struct ietf_mpa_frame *,
|
|
|
- struct nes_cm_node *);
|
|
|
- int (*reject)(struct nes_cm_core *, struct ietf_mpa_frame *,
|
|
|
- struct nes_cm_node *);
|
|
|
+ int (*accept)(struct nes_cm_core *, struct nes_cm_node *);
|
|
|
+ int (*reject)(struct nes_cm_core *, struct nes_cm_node *);
|
|
|
int (*recv_pkt)(struct nes_cm_core *, struct nes_vnic *,
|
|
|
struct sk_buff *);
|
|
|
int (*destroy_cm_core)(struct nes_cm_core *);
|