brintos

brintos / linux-shallow public Read only

0
0
Text · 9.9 KiB · 48ee285 Raw
417 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */2/* Copyright (c) 2015 - 2021 Intel Corporation */3#ifndef IRDMA_CM_H4#define IRDMA_CM_H5 6#define IRDMA_MPA_REQUEST_ACCEPT	17#define IRDMA_MPA_REQUEST_REJECT	28 9/* IETF MPA -- defines */10#define IEFT_MPA_KEY_REQ	"MPA ID Req Frame"11#define IEFT_MPA_KEY_REP	"MPA ID Rep Frame"12#define IETF_MPA_KEY_SIZE	1613#define IETF_MPA_VER		114#define IETF_MAX_PRIV_DATA_LEN	51215#define IETF_MPA_FRAME_SIZE	2016#define IETF_RTR_MSG_SIZE	417#define IETF_MPA_V2_FLAG	0x1018#define SNDMARKER_SEQNMASK	0x000001ff19#define IRDMA_MAX_IETF_SIZE	3220 21/* IETF RTR MSG Fields */22#define IETF_PEER_TO_PEER	0x800023#define IETF_FLPDU_ZERO_LEN	0x400024#define IETF_RDMA0_WRITE	0x800025#define IETF_RDMA0_READ		0x400026#define IETF_NO_IRD_ORD		0x3fff27 28#define MAX_PORTS	6553629 30#define IRDMA_PASSIVE_STATE_INDICATED	031#define IRDMA_DO_NOT_SEND_RESET_EVENT	132#define IRDMA_SEND_RESET_EVENT		233 34#define MAX_IRDMA_IFS	435 36#define SET_ACK		137#define SET_SYN		238#define SET_FIN		439#define SET_RST		840 41#define TCP_OPTIONS_PADDING	342 43#define IRDMA_DEFAULT_RETRYS	6444#define IRDMA_DEFAULT_RETRANS	3245#define IRDMA_DEFAULT_TTL		0x4046#define IRDMA_DEFAULT_RTT_VAR		647#define IRDMA_DEFAULT_SS_THRESH		0x3fffffff48#define IRDMA_DEFAULT_REXMIT_THRESH	849 50#define IRDMA_RETRY_TIMEOUT	HZ51#define IRDMA_SHORT_TIME	1052#define IRDMA_LONG_TIME		(2 * HZ)53#define IRDMA_MAX_TIMEOUT	((unsigned long)(12 * HZ))54 55#define IRDMA_CM_HASHTABLE_SIZE		102456#define IRDMA_CM_TCP_TIMER_INTERVAL	300057#define IRDMA_CM_DEFAULT_MTU		154058#define IRDMA_CM_DEFAULT_FRAME_CNT	1059#define IRDMA_CM_THREAD_STACK_SIZE	25660#define IRDMA_CM_DEFAULT_RCV_WND	6424061#define IRDMA_CM_DEFAULT_RCV_WND_SCALED	0x3FFFC62#define IRDMA_CM_DEFAULT_RCV_WND_SCALE	263#define IRDMA_CM_DEFAULT_FREE_PKTS	1064#define IRDMA_CM_FREE_PKT_LO_WATERMARK	265#define IRDMA_CM_DEFAULT_MSS		53666#define IRDMA_CM_DEFAULT_MPA_VER	267#define IRDMA_CM_DEFAULT_SEQ		0x159bf75f68#define IRDMA_CM_DEFAULT_LOCAL_ID	0x3b4769#define IRDMA_CM_DEFAULT_SEQ2		0x18ed574070#define IRDMA_CM_DEFAULT_LOCAL_ID2	0xb80771#define IRDMA_MAX_CM_BUF		(IRDMA_MAX_IETF_SIZE + IETF_MAX_PRIV_DATA_LEN)72 73enum ietf_mpa_flags {74	IETF_MPA_FLAGS_REJECT  = 0x20,75	IETF_MPA_FLAGS_CRC     = 0x40,76	IETF_MPA_FLAGS_MARKERS = 0x80,77};78 79enum irdma_timer_type {80	IRDMA_TIMER_TYPE_SEND,81	IRDMA_TIMER_TYPE_CLOSE,82};83 84enum option_nums {85	OPTION_NUM_EOL,86	OPTION_NUM_NONE,87	OPTION_NUM_MSS,88	OPTION_NUM_WINDOW_SCALE,89	OPTION_NUM_SACK_PERM,90	OPTION_NUM_SACK,91	OPTION_NUM_WRITE0 = 0xbc,92};93 94/* cm node transition states */95enum irdma_cm_node_state {96	IRDMA_CM_STATE_UNKNOWN,97	IRDMA_CM_STATE_INITED,98	IRDMA_CM_STATE_LISTENING,99	IRDMA_CM_STATE_SYN_RCVD,100	IRDMA_CM_STATE_SYN_SENT,101	IRDMA_CM_STATE_ONE_SIDE_ESTABLISHED,102	IRDMA_CM_STATE_ESTABLISHED,103	IRDMA_CM_STATE_ACCEPTING,104	IRDMA_CM_STATE_MPAREQ_SENT,105	IRDMA_CM_STATE_MPAREQ_RCVD,106	IRDMA_CM_STATE_MPAREJ_RCVD,107	IRDMA_CM_STATE_OFFLOADED,108	IRDMA_CM_STATE_FIN_WAIT1,109	IRDMA_CM_STATE_FIN_WAIT2,110	IRDMA_CM_STATE_CLOSE_WAIT,111	IRDMA_CM_STATE_TIME_WAIT,112	IRDMA_CM_STATE_LAST_ACK,113	IRDMA_CM_STATE_CLOSING,114	IRDMA_CM_STATE_LISTENER_DESTROYED,115	IRDMA_CM_STATE_CLOSED,116};117 118enum mpa_frame_ver {119	IETF_MPA_V1 = 1,120	IETF_MPA_V2 = 2,121};122 123enum mpa_frame_key {124	MPA_KEY_REQUEST,125	MPA_KEY_REPLY,126};127 128enum send_rdma0 {129	SEND_RDMA_READ_ZERO  = 1,130	SEND_RDMA_WRITE_ZERO = 2,131};132 133enum irdma_tcpip_pkt_type {134	IRDMA_PKT_TYPE_UNKNOWN,135	IRDMA_PKT_TYPE_SYN,136	IRDMA_PKT_TYPE_SYNACK,137	IRDMA_PKT_TYPE_ACK,138	IRDMA_PKT_TYPE_FIN,139	IRDMA_PKT_TYPE_RST,140};141 142enum irdma_cm_listener_state {143	IRDMA_CM_LISTENER_PASSIVE_STATE = 1,144	IRDMA_CM_LISTENER_ACTIVE_STATE  = 2,145	IRDMA_CM_LISTENER_EITHER_STATE  = 3,146};147 148/* CM event codes */149enum irdma_cm_event_type {150	IRDMA_CM_EVENT_UNKNOWN,151	IRDMA_CM_EVENT_ESTABLISHED,152	IRDMA_CM_EVENT_MPA_REQ,153	IRDMA_CM_EVENT_MPA_CONNECT,154	IRDMA_CM_EVENT_MPA_ACCEPT,155	IRDMA_CM_EVENT_MPA_REJECT,156	IRDMA_CM_EVENT_MPA_ESTABLISHED,157	IRDMA_CM_EVENT_CONNECTED,158	IRDMA_CM_EVENT_RESET,159	IRDMA_CM_EVENT_ABORTED,160};161 162struct ietf_mpa_v1 {163	u8 key[IETF_MPA_KEY_SIZE];164	u8 flags;165	u8 rev;166	__be16 priv_data_len;167	u8 priv_data[];168};169 170struct ietf_rtr_msg {171	__be16 ctrl_ird;172	__be16 ctrl_ord;173};174 175struct ietf_mpa_v2 {176	u8 key[IETF_MPA_KEY_SIZE];177	u8 flags;178	u8 rev;179	__be16 priv_data_len;180	struct ietf_rtr_msg rtr_msg;181	u8 priv_data[];182};183 184struct option_base {185	u8 optionnum;186	u8 len;187};188 189struct option_mss {190	u8 optionnum;191	u8 len;192	__be16 mss;193};194 195struct option_windowscale {196	u8 optionnum;197	u8 len;198	u8 shiftcount;199};200 201union all_known_options {202	char eol;203	struct option_base base;204	struct option_mss mss;205	struct option_windowscale windowscale;206};207 208struct irdma_timer_entry {209	struct list_head list;210	unsigned long timetosend; /* jiffies */211	struct irdma_puda_buf *sqbuf;212	u32 type;213	u32 retrycount;214	u32 retranscount;215	u32 context;216	u32 send_retrans;217	int close_when_complete;218};219 220/* CM context params */221struct irdma_cm_tcp_context {222	u8 client;223	u32 loc_seq_num;224	u32 loc_ack_num;225	u32 rem_ack_num;226	u32 rcv_nxt;227	u32 loc_id;228	u32 rem_id;229	u32 snd_wnd;230	u32 max_snd_wnd;231	u32 rcv_wnd;232	u32 mss;233	u8 snd_wscale;234	u8 rcv_wscale;235};236 237struct irdma_apbvt_entry {238	struct hlist_node hlist;239	u32 use_cnt;240	u16 port;241};242 243struct irdma_cm_listener {244	struct list_head list;245	struct iw_cm_id *cm_id;246	struct irdma_cm_core *cm_core;247	struct irdma_device *iwdev;248	struct list_head child_listen_list;249	struct irdma_apbvt_entry *apbvt_entry;250	enum irdma_cm_listener_state listener_state;251	refcount_t refcnt;252	atomic_t pend_accepts_cnt;253	u32 loc_addr[4];254	u32 reused_node;255	int backlog;256	u16 loc_port;257	u16 vlan_id;258	u8 loc_mac[ETH_ALEN];259	u8 user_pri;260	u8 tos;261	bool qhash_set:1;262	bool ipv4:1;263};264 265struct irdma_kmem_info {266	void *addr;267	u32 size;268};269 270struct irdma_mpa_priv_info {271	const void *addr;272	u32 size;273};274 275struct irdma_cm_node {276	struct irdma_qp *iwqp;277	struct irdma_device *iwdev;278	struct irdma_sc_dev *dev;279	struct irdma_cm_tcp_context tcp_cntxt;280	struct irdma_cm_core *cm_core;281	struct irdma_timer_entry *send_entry;282	struct irdma_timer_entry *close_entry;283	struct irdma_cm_listener *listener;284	struct list_head timer_entry;285	struct list_head reset_entry;286	struct list_head teardown_entry;287	struct irdma_apbvt_entry *apbvt_entry;288	struct rcu_head rcu_head;289	struct irdma_mpa_priv_info pdata;290	struct irdma_sc_ah *ah;291	union {292		struct ietf_mpa_v1 mpa_frame;293		struct ietf_mpa_v2 mpa_v2_frame;294	};295	struct irdma_kmem_info mpa_hdr;296	struct iw_cm_id *cm_id;297	struct hlist_node list;298	struct completion establish_comp;299	spinlock_t retrans_list_lock; /* protect CM node rexmit updates*/300	atomic_t passive_state;301	refcount_t refcnt;302	enum irdma_cm_node_state state;303	enum send_rdma0 send_rdma0_op;304	enum mpa_frame_ver mpa_frame_rev;305	u32 loc_addr[4], rem_addr[4];306	u16 loc_port, rem_port;307	int apbvt_set;308	int accept_pend;309	u16 vlan_id;310	u16 ird_size;311	u16 ord_size;312	u16 mpav2_ird_ord;313	u16 lsmm_size;314	u8 pdata_buf[IETF_MAX_PRIV_DATA_LEN];315	u8 loc_mac[ETH_ALEN];316	u8 rem_mac[ETH_ALEN];317	u8 user_pri;318	u8 tos;319	bool ack_rcvd:1;320	bool qhash_set:1;321	bool ipv4:1;322	bool snd_mark_en:1;323	bool rcv_mark_en:1;324	bool do_lpb:1;325	bool accelerated:1;326};327 328/* Used by internal CM APIs to pass CM information*/329struct irdma_cm_info {330	struct iw_cm_id *cm_id;331	u16 loc_port;332	u16 rem_port;333	u32 loc_addr[4];334	u32 rem_addr[4];335	u32 qh_qpid;336	u16 vlan_id;337	int backlog;338	u8 user_pri;339	u8 tos;340	bool ipv4;341};342 343struct irdma_cm_event {344	enum irdma_cm_event_type type;345	struct irdma_cm_info cm_info;346	struct work_struct event_work;347	struct irdma_cm_node *cm_node;348};349 350struct irdma_cm_core {351	struct irdma_device *iwdev;352	struct irdma_sc_dev *dev;353	struct list_head listen_list;354	DECLARE_HASHTABLE(cm_hash_tbl, 8);355	DECLARE_HASHTABLE(apbvt_hash_tbl, 8);356	struct timer_list tcp_timer;357	struct workqueue_struct *event_wq;358	spinlock_t ht_lock; /* protect CM node (active side) list */359	spinlock_t listen_list_lock; /* protect listener list */360	spinlock_t apbvt_lock; /*serialize apbvt add/del entries*/361	u64 stats_nodes_created;362	u64 stats_nodes_destroyed;363	u64 stats_listen_created;364	u64 stats_listen_destroyed;365	u64 stats_listen_nodes_created;366	u64 stats_listen_nodes_destroyed;367	u64 stats_lpbs;368	u64 stats_accepts;369	u64 stats_rejects;370	u64 stats_connect_errs;371	u64 stats_passive_errs;372	u64 stats_pkt_retrans;373	u64 stats_backlog_drops;374	struct irdma_puda_buf *(*form_cm_frame)(struct irdma_cm_node *cm_node,375						struct irdma_kmem_info *options,376						struct irdma_kmem_info *hdr,377						struct irdma_mpa_priv_info *pdata,378						u8 flags);379	int (*cm_create_ah)(struct irdma_cm_node *cm_node, bool wait);380	void (*cm_free_ah)(struct irdma_cm_node *cm_node);381};382 383int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node,384			    struct irdma_puda_buf *sqbuf,385			    enum irdma_timer_type type, int send_retrans,386			    int close_when_complete);387 388static inline u8 irdma_tos2dscp(u8 tos)389{390#define IRDMA_DSCP_VAL GENMASK(7, 2)391	return (u8)FIELD_GET(IRDMA_DSCP_VAL, tos);392}393 394int irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);395int irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);396int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);397int irdma_create_listen(struct iw_cm_id *cm_id, int backlog);398int irdma_destroy_listen(struct iw_cm_id *cm_id);399int irdma_add_arp(struct irdma_pci_f *rf, u32 *ip, bool ipv4, const u8 *mac);400void irdma_cm_teardown_connections(struct irdma_device *iwdev, u32 *ipaddr,401				   struct irdma_cm_info *nfo,402				   bool disconnect_all);403int irdma_cm_start(struct irdma_device *dev);404int irdma_cm_stop(struct irdma_device *dev);405bool irdma_ipv4_is_lpb(u32 loc_addr, u32 rem_addr);406bool irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr);407int irdma_arp_table(struct irdma_pci_f *rf, u32 *ip_addr, bool ipv4,408		    const u8 *mac_addr, u32 action);409void irdma_if_notify(struct irdma_device *iwdev, struct net_device *netdev,410		     u32 *ipaddr, bool ipv4, bool ifup);411bool irdma_port_in_use(struct irdma_cm_core *cm_core, u16 port);412void irdma_send_ack(struct irdma_cm_node *cm_node);413void irdma_lpb_nop(struct irdma_sc_qp *qp);414void irdma_rem_ref_cm_node(struct irdma_cm_node *cm_node);415void irdma_add_conn_est_qh(struct irdma_cm_node *cm_node);416#endif /* IRDMA_CM_H */417