Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 615eb715 authored by Tatyana Nikolova's avatar Tatyana Nikolova Committed by Roland Dreier
Browse files

RDMA/nes: Add support for MPAv2 Enhanced RDMA Negotiation

This patch adds support for Enhanced RDMA Connection Establishment
(draft-ietf-storm-mpa-peer-connect-06), aka MPAv2.  Details of draft
can be obtained from:
<http://www.ietf.org/id/draft-ietf-storm-mpa-peer-connect-06.txt

>

For backwards compatibility, the MPAv2 enabled driver reverts to MPAv1
if the remote node doesn't support MPAv2.

Signed-off-by: default avatarTatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: default avatarFaisal Latif <Faisal.Latif@intel.com>
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent d2fe99e8
Loading
Loading
Loading
Loading
+645 −457

File changed.

Preview size limit exceeded, changes collapsed.

+56 −17
Original line number Diff line number Diff line
@@ -49,6 +49,15 @@
#define IETF_MPA_VERSION  1
#define IETF_MAX_PRIV_DATA_LEN 512
#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,
@@ -284,15 +321,19 @@ struct nes_cm_node {
	struct nes_cm_node        *loopbackpartner;

	struct nes_timer_entry	  *send_entry;

	spinlock_t                retrans_list_lock;
	struct nes_timer_entry    *recv_entry;
	spinlock_t                retrans_list_lock;
	enum send_rdma0           send_rdma0_op;

	int                       send_write0;
	union {
		struct ietf_mpa_frame mpa_frame;
		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 *);
+2 −1
Original line number Diff line number Diff line
@@ -139,7 +139,8 @@ struct nes_qp {
	struct nes_cq         *nesrcq;
	struct nes_pd         *nespd;
	void *cm_node; /* handle of the node this QP is associated with */
	struct ietf_mpa_frame *ietf_frame;
	void                  *ietf_frame;
	u8                    ietf_frame_size;
	dma_addr_t            ietf_frame_pbase;
	struct ib_mr          *lsmm_mr;
	struct nes_hw_qp      hwqp;