1 /* 2 * Copyright (c) 2006 - 2014 Intel Corporation. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 * 32 */ 33 34 #ifndef NES_CM_H 35 #define NES_CM_H 36 37 #define QUEUE_EVENTS 38 39 #define NES_MANAGE_APBVT_DEL 0 40 #define NES_MANAGE_APBVT_ADD 1 41 42 #define NES_MPA_REQUEST_ACCEPT 1 43 #define NES_MPA_REQUEST_REJECT 2 44 45 /* IETF MPA -- defines, enums, structs */ 46 #define IEFT_MPA_KEY_REQ "MPA ID Req Frame" 47 #define IEFT_MPA_KEY_REP "MPA ID Rep Frame" 48 #define IETF_MPA_KEY_SIZE 16 49 #define IETF_MPA_VERSION 1 50 #define IETF_MAX_PRIV_DATA_LEN 512 51 #define IETF_MPA_FRAME_SIZE 20 52 #define IETF_RTR_MSG_SIZE 4 53 #define IETF_MPA_V2_FLAG 0x10 54 55 /* IETF RTR MSG Fields */ 56 #define IETF_PEER_TO_PEER 0x8000 57 #define IETF_FLPDU_ZERO_LEN 0x4000 58 #define IETF_RDMA0_WRITE 0x8000 59 #define IETF_RDMA0_READ 0x4000 60 #define IETF_NO_IRD_ORD 0x3FFF 61 #define NES_MAX_IRD 0x40 62 #define NES_MAX_ORD 0x7F 63 64 enum ietf_mpa_flags { 65 IETF_MPA_FLAGS_MARKERS = 0x80, /* receive Markers */ 66 IETF_MPA_FLAGS_CRC = 0x40, /* receive Markers */ 67 IETF_MPA_FLAGS_REJECT = 0x20, /* Reject */ 68 }; 69 70 struct ietf_mpa_v1 { 71 u8 key[IETF_MPA_KEY_SIZE]; 72 u8 flags; 73 u8 rev; 74 __be16 priv_data_len; 75 u8 priv_data[0]; 76 }; 77 78 #define ietf_mpa_req_resp_frame ietf_mpa_frame 79 80 struct ietf_rtr_msg { 81 __be16 ctrl_ird; 82 __be16 ctrl_ord; 83 }; 84 85 struct ietf_mpa_v2 { 86 u8 key[IETF_MPA_KEY_SIZE]; 87 u8 flags; 88 u8 rev; 89 __be16 priv_data_len; 90 struct ietf_rtr_msg rtr_msg; 91 u8 priv_data[0]; 92 }; 93 94 struct nes_v4_quad { 95 u32 rsvd0; 96 __le32 DstIpAdrIndex; /* Only most significant 5 bits are valid */ 97 __be32 SrcIpadr; 98 __be16 TcpPorts[2]; /* src is low, dest is high */ 99 }; 100 101 struct nes_cm_node; 102 enum nes_timer_type { 103 NES_TIMER_TYPE_SEND, 104 NES_TIMER_TYPE_RECV, 105 NES_TIMER_NODE_CLEANUP, 106 NES_TIMER_TYPE_CLOSE, 107 }; 108 109 #define NES_PASSIVE_STATE_INDICATED 0 110 #define NES_DO_NOT_SEND_RESET_EVENT 1 111 #define NES_SEND_RESET_EVENT 2 112 113 #define MAX_NES_IFS 4 114 115 #define SET_ACK 1 116 #define SET_SYN 2 117 #define SET_FIN 4 118 #define SET_RST 8 119 120 #define TCP_OPTIONS_PADDING 3 121 122 struct option_base { 123 u8 optionnum; 124 u8 length; 125 }; 126 127 enum option_numbers { 128 OPTION_NUMBER_END, 129 OPTION_NUMBER_NONE, 130 OPTION_NUMBER_MSS, 131 OPTION_NUMBER_WINDOW_SCALE, 132 OPTION_NUMBER_SACK_PERM, 133 OPTION_NUMBER_SACK, 134 OPTION_NUMBER_WRITE0 = 0xbc 135 }; 136 137 struct option_mss { 138 u8 optionnum; 139 u8 length; 140 __be16 mss; 141 }; 142 143 struct option_windowscale { 144 u8 optionnum; 145 u8 length; 146 u8 shiftcount; 147 }; 148 149 union all_known_options { 150 char as_end; 151 struct option_base as_base; 152 struct option_mss as_mss; 153 struct option_windowscale as_windowscale; 154 }; 155 156 struct nes_timer_entry { 157 struct list_head list; 158 unsigned long timetosend; /* jiffies */ 159 struct sk_buff *skb; 160 u32 type; 161 u32 retrycount; 162 u32 retranscount; 163 u32 context; 164 u32 seq_num; 165 u32 send_retrans; 166 int close_when_complete; 167 struct net_device *netdev; 168 }; 169 170 #define NES_DEFAULT_RETRYS 64 171 #define NES_DEFAULT_RETRANS 8 172 #ifdef CONFIG_INFINIBAND_NES_DEBUG 173 #define NES_RETRY_TIMEOUT (1000*HZ/1000) 174 #else 175 #define NES_RETRY_TIMEOUT (3000*HZ/1000) 176 #endif 177 #define NES_SHORT_TIME (10) 178 #define NES_LONG_TIME (2000*HZ/1000) 179 #define NES_MAX_TIMEOUT ((unsigned long) (12*HZ)) 180 181 #define NES_CM_HASHTABLE_SIZE 1024 182 #define NES_CM_TCP_TIMER_INTERVAL 3000 183 #define NES_CM_DEFAULT_MTU 1540 184 #define NES_CM_DEFAULT_FRAME_CNT 10 185 #define NES_CM_THREAD_STACK_SIZE 256 186 #define NES_CM_DEFAULT_RCV_WND 64240 // before we know that window scaling is allowed 187 #define NES_CM_DEFAULT_RCV_WND_SCALED 256960 // after we know that window scaling is allowed 188 #define NES_CM_DEFAULT_RCV_WND_SCALE 2 189 #define NES_CM_DEFAULT_FREE_PKTS 0x000A 190 #define NES_CM_FREE_PKT_LO_WATERMARK 2 191 192 #define NES_CM_DEFAULT_MSS 536 193 194 #define NES_CM_DEF_SEQ 0x159bf75f 195 #define NES_CM_DEF_LOCAL_ID 0x3b47 196 197 #define NES_CM_DEF_SEQ2 0x18ed5740 198 #define NES_CM_DEF_LOCAL_ID2 0xb807 199 #define MAX_CM_BUFFER (IETF_MPA_FRAME_SIZE + IETF_RTR_MSG_SIZE + IETF_MAX_PRIV_DATA_LEN) 200 201 typedef u32 nes_addr_t; 202 203 #define nes_cm_tsa_context nes_qp_context 204 205 struct nes_qp; 206 207 /* cm node transition states */ 208 enum nes_cm_node_state { 209 NES_CM_STATE_UNKNOWN, 210 NES_CM_STATE_INITED, 211 NES_CM_STATE_LISTENING, 212 NES_CM_STATE_SYN_RCVD, 213 NES_CM_STATE_SYN_SENT, 214 NES_CM_STATE_ONE_SIDE_ESTABLISHED, 215 NES_CM_STATE_ESTABLISHED, 216 NES_CM_STATE_ACCEPTING, 217 NES_CM_STATE_MPAREQ_SENT, 218 NES_CM_STATE_MPAREQ_RCVD, 219 NES_CM_STATE_MPAREJ_RCVD, 220 NES_CM_STATE_TSA, 221 NES_CM_STATE_FIN_WAIT1, 222 NES_CM_STATE_FIN_WAIT2, 223 NES_CM_STATE_CLOSE_WAIT, 224 NES_CM_STATE_TIME_WAIT, 225 NES_CM_STATE_LAST_ACK, 226 NES_CM_STATE_CLOSING, 227 NES_CM_STATE_LISTENER_DESTROYED, 228 NES_CM_STATE_CLOSED 229 }; 230 231 enum mpa_frame_version { 232 IETF_MPA_V1 = 1, 233 IETF_MPA_V2 = 2 234 }; 235 236 enum mpa_frame_key { 237 MPA_KEY_REQUEST, 238 MPA_KEY_REPLY 239 }; 240 241 enum send_rdma0 { 242 SEND_RDMA_READ_ZERO = 1, 243 SEND_RDMA_WRITE_ZERO = 2 244 }; 245 246 enum nes_tcpip_pkt_type { 247 NES_PKT_TYPE_UNKNOWN, 248 NES_PKT_TYPE_SYN, 249 NES_PKT_TYPE_SYNACK, 250 NES_PKT_TYPE_ACK, 251 NES_PKT_TYPE_FIN, 252 NES_PKT_TYPE_RST 253 }; 254 255 256 /* type of nes connection */ 257 enum nes_cm_conn_type { 258 NES_CM_IWARP_CONN_TYPE, 259 }; 260 261 /* CM context params */ 262 struct nes_cm_tcp_context { 263 u8 client; 264 265 u32 loc_seq_num; 266 u32 loc_ack_num; 267 u32 rem_ack_num; 268 u32 rcv_nxt; 269 270 u32 loc_id; 271 u32 rem_id; 272 273 u32 snd_wnd; 274 u32 max_snd_wnd; 275 276 u32 rcv_wnd; 277 u32 mss; 278 u8 snd_wscale; 279 u8 rcv_wscale; 280 281 struct nes_cm_tsa_context tsa_cntxt; 282 }; 283 284 285 enum nes_cm_listener_state { 286 NES_CM_LISTENER_PASSIVE_STATE = 1, 287 NES_CM_LISTENER_ACTIVE_STATE = 2, 288 NES_CM_LISTENER_EITHER_STATE = 3 289 }; 290 291 struct nes_cm_listener { 292 struct list_head list; 293 struct nes_cm_core *cm_core; 294 u8 loc_mac[ETH_ALEN]; 295 nes_addr_t loc_addr; 296 u16 loc_port; 297 struct iw_cm_id *cm_id; 298 enum nes_cm_conn_type conn_type; 299 atomic_t ref_count; 300 struct nes_vnic *nesvnic; 301 atomic_t pend_accepts_cnt; 302 int backlog; 303 enum nes_cm_listener_state listener_state; 304 u32 reused_node; 305 u8 tos; 306 }; 307 308 /* per connection node and node state information */ 309 struct nes_cm_node { 310 nes_addr_t loc_addr, rem_addr; 311 u16 loc_port, rem_port; 312 313 u8 loc_mac[ETH_ALEN]; 314 u8 rem_mac[ETH_ALEN]; 315 316 enum nes_cm_node_state state; 317 struct nes_cm_tcp_context tcp_cntxt; 318 struct nes_cm_core *cm_core; 319 struct sk_buff_head resend_list; 320 atomic_t ref_count; 321 struct net_device *netdev; 322 323 struct nes_cm_node *loopbackpartner; 324 325 struct nes_timer_entry *send_entry; 326 struct nes_timer_entry *recv_entry; 327 spinlock_t retrans_list_lock; 328 enum send_rdma0 send_rdma0_op; 329 330 union { 331 struct ietf_mpa_v1 mpa_frame; 332 struct ietf_mpa_v2 mpa_v2_frame; 333 u8 mpa_frame_buf[MAX_CM_BUFFER]; 334 }; 335 enum mpa_frame_version mpa_frame_rev; 336 u16 ird_size; 337 u16 ord_size; 338 u16 mpav2_ird_ord; 339 340 u16 mpa_frame_size; 341 struct iw_cm_id *cm_id; 342 struct list_head list; 343 bool accelerated; 344 struct nes_cm_listener *listener; 345 enum nes_cm_conn_type conn_type; 346 struct nes_vnic *nesvnic; 347 int apbvt_set; 348 int accept_pend; 349 struct list_head timer_entry; 350 struct list_head reset_entry; 351 struct nes_qp *nesqp; 352 atomic_t passive_state; 353 u8 tos; 354 }; 355 356 /* structure for client or CM to fill when making CM api calls. */ 357 /* - only need to set relevant data, based on op. */ 358 struct nes_cm_info { 359 union { 360 struct iw_cm_id *cm_id; 361 struct net_device *netdev; 362 }; 363 364 u16 loc_port; 365 u16 rem_port; 366 nes_addr_t loc_addr; 367 nes_addr_t rem_addr; 368 enum nes_cm_conn_type conn_type; 369 int backlog; 370 }; 371 372 /* CM event codes */ 373 enum nes_cm_event_type { 374 NES_CM_EVENT_UNKNOWN, 375 NES_CM_EVENT_ESTABLISHED, 376 NES_CM_EVENT_MPA_REQ, 377 NES_CM_EVENT_MPA_CONNECT, 378 NES_CM_EVENT_MPA_ACCEPT, 379 NES_CM_EVENT_MPA_REJECT, 380 NES_CM_EVENT_MPA_ESTABLISHED, 381 NES_CM_EVENT_CONNECTED, 382 NES_CM_EVENT_CLOSED, 383 NES_CM_EVENT_RESET, 384 NES_CM_EVENT_DROPPED_PKT, 385 NES_CM_EVENT_CLOSE_IMMED, 386 NES_CM_EVENT_CLOSE_HARD, 387 NES_CM_EVENT_CLOSE_CLEAN, 388 NES_CM_EVENT_ABORTED, 389 NES_CM_EVENT_SEND_FIRST 390 }; 391 392 /* event to post to CM event handler */ 393 struct nes_cm_event { 394 enum nes_cm_event_type type; 395 396 struct nes_cm_info cm_info; 397 struct work_struct event_work; 398 struct nes_cm_node *cm_node; 399 }; 400 401 struct nes_cm_core { 402 enum nes_cm_node_state state; 403 404 atomic_t listen_node_cnt; 405 struct nes_cm_node listen_list; 406 spinlock_t listen_list_lock; 407 408 u32 mtu; 409 u32 free_tx_pkt_max; 410 u32 rx_pkt_posted; 411 atomic_t ht_node_cnt; 412 struct list_head connected_nodes; 413 /* struct list_head hashtable[NES_CM_HASHTABLE_SIZE]; */ 414 spinlock_t ht_lock; 415 416 struct timer_list tcp_timer; 417 418 const struct nes_cm_ops *api; 419 420 int (*post_event)(struct nes_cm_event *event); 421 atomic_t events_posted; 422 struct workqueue_struct *event_wq; 423 struct workqueue_struct *disconn_wq; 424 425 atomic_t node_cnt; 426 u64 aborted_connects; 427 u32 options; 428 429 struct nes_cm_node *current_listen_node; 430 }; 431 432 433 #define NES_CM_SET_PKT_SIZE (1 << 1) 434 #define NES_CM_SET_FREE_PKT_Q_SIZE (1 << 2) 435 436 /* CM ops/API for client interface */ 437 struct nes_cm_ops { 438 int (*accelerated)(struct nes_cm_core *, struct nes_cm_node *); 439 struct nes_cm_listener * (*listen)(struct nes_cm_core *, struct nes_vnic *, 440 struct nes_cm_info *); 441 int (*stop_listener)(struct nes_cm_core *, struct nes_cm_listener *); 442 struct nes_cm_node * (*connect)(struct nes_cm_core *, 443 struct nes_vnic *, u16, void *, 444 struct nes_cm_info *); 445 int (*close)(struct nes_cm_core *, struct nes_cm_node *); 446 int (*accept)(struct nes_cm_core *, struct nes_cm_node *); 447 int (*reject)(struct nes_cm_core *, struct nes_cm_node *); 448 int (*recv_pkt)(struct nes_cm_core *, struct nes_vnic *, 449 struct sk_buff *); 450 int (*destroy_cm_core)(struct nes_cm_core *); 451 int (*get)(struct nes_cm_core *); 452 int (*set)(struct nes_cm_core *, u32, u32); 453 }; 454 455 int schedule_nes_timer(struct nes_cm_node *, struct sk_buff *, 456 enum nes_timer_type, int, int); 457 458 int nes_accept(struct iw_cm_id *, struct iw_cm_conn_param *); 459 int nes_reject(struct iw_cm_id *, const void *, u8); 460 int nes_connect(struct iw_cm_id *, struct iw_cm_conn_param *); 461 int nes_create_listen(struct iw_cm_id *, int); 462 int nes_destroy_listen(struct iw_cm_id *); 463 464 int nes_cm_recv(struct sk_buff *, struct net_device *); 465 int nes_cm_start(void); 466 int nes_cm_stop(void); 467 int nes_add_ref_cm_node(struct nes_cm_node *cm_node); 468 int nes_rem_ref_cm_node(struct nes_cm_node *cm_node); 469 470 #endif /* NES_CM_H */ 471