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