Commit b4ba4652 authored by Karsten Graul's avatar Karsten Graul Committed by David S. Miller
Browse files

net/smc: extend LLC layer for SMC-Rv2



Add support for large v2 LLC control messages in smc_llc.c.
The new large work request buffer allows to combine control
messages into one packet that had to be spread over several
packets before.
Add handling of the new v2 LLC messages.

Signed-off-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8799e310
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -786,7 +786,7 @@ static int smc_connect_clc(struct smc_sock *smc,
				SMC_CLC_ACCEPT, CLC_WAIT_TIME);
}

static void smc_fill_gid_list(struct smc_link_group *lgr,
void smc_fill_gid_list(struct smc_link_group *lgr,
		       struct smc_gidlist *gidlist,
		       struct smc_ib_device *known_dev, u8 *known_gid)
{
@@ -1435,7 +1435,7 @@ static int smcr_serv_conf_first_link(struct smc_sock *smc)
	smcr_lgr_set_type(link->lgr, SMC_LGR_SINGLE);

	/* initial contact - try to establish second link */
	smc_llc_srv_add_link(link);
	smc_llc_srv_add_link(link, NULL);
	return 0;
}

+19 −1
Original line number Diff line number Diff line
@@ -56,7 +56,20 @@ enum smc_state { /* possible states of an SMC socket */
struct smc_link_group;

struct smc_wr_rx_hdr {	/* common prefix part of LLC and CDC to demultiplex */
	union {
		u8 type;
#if defined(__BIG_ENDIAN_BITFIELD)
		struct {
			u8 llc_version:4,
			   llc_type:4;
		};
#elif defined(__LITTLE_ENDIAN_BITFIELD)
		struct {
			u8 llc_type:4,
			   llc_version:4;
		};
#endif
	};
} __aligned(1);

struct smc_cdc_conn_state_flags {
@@ -286,7 +299,12 @@ static inline bool using_ipsec(struct smc_sock *smc)
}
#endif

struct smc_gidlist;

struct sock *smc_accept_dequeue(struct sock *parent, struct socket *new_sock);
void smc_close_non_accepted(struct sock *sk);
void smc_fill_gid_list(struct smc_link_group *lgr,
		       struct smc_gidlist *gidlist,
		       struct smc_ib_device *known_dev, u8 *known_gid);

#endif	/* __SMC_H */
+1 −0
Original line number Diff line number Diff line
@@ -218,6 +218,7 @@ enum smc_llc_flowtype {
	SMC_LLC_FLOW_NONE	= 0,
	SMC_LLC_FLOW_ADD_LINK	= 2,
	SMC_LLC_FLOW_DEL_LINK	= 4,
	SMC_LLC_FLOW_REQ_ADD_LINK = 5,
	SMC_LLC_FLOW_RKEY	= 6,
};

+447 −109

File changed.

Preview size limit exceeded, changes collapsed.

+11 −1
Original line number Diff line number Diff line
@@ -30,10 +30,19 @@ enum smc_llc_msg_type {
	SMC_LLC_ADD_LINK		= 0x02,
	SMC_LLC_ADD_LINK_CONT		= 0x03,
	SMC_LLC_DELETE_LINK		= 0x04,
	SMC_LLC_REQ_ADD_LINK		= 0x05,
	SMC_LLC_CONFIRM_RKEY		= 0x06,
	SMC_LLC_TEST_LINK		= 0x07,
	SMC_LLC_CONFIRM_RKEY_CONT	= 0x08,
	SMC_LLC_DELETE_RKEY		= 0x09,
	/* V2 types */
	SMC_LLC_CONFIRM_LINK_V2		= 0x21,
	SMC_LLC_ADD_LINK_V2		= 0x22,
	SMC_LLC_DELETE_LINK_V2		= 0x24,
	SMC_LLC_REQ_ADD_LINK_V2		= 0x25,
	SMC_LLC_CONFIRM_RKEY_V2		= 0x26,
	SMC_LLC_TEST_LINK_V2		= 0x27,
	SMC_LLC_DELETE_RKEY_V2		= 0x29,
};

#define smc_link_downing(state) \
@@ -102,7 +111,8 @@ void smc_llc_flow_qentry_del(struct smc_llc_flow *flow);
void smc_llc_send_link_delete_all(struct smc_link_group *lgr, bool ord,
				  u32 rsn);
int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry);
int smc_llc_srv_add_link(struct smc_link *link);
int smc_llc_srv_add_link(struct smc_link *link,
			 struct smc_llc_qentry *req_qentry);
void smc_llc_add_link_local(struct smc_link *link);
int smc_llc_init(void) __init;

Loading