[ipoib] mcast garbage collector and igmp V2 support.
[mirror/winof/.git] / ulp / ipoib / kernel / ipoib_port.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
4  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
5  *\r
6  * This software is available to you under the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id$\r
32  */\r
33 \r
34 \r
35 \r
36 #ifndef _IPOIB_PORT_H_\r
37 #define _IPOIB_PORT_H_\r
38 \r
39 \r
40 #include <iba/ib_al.h>\r
41 #include <complib/cl_obj.h>\r
42 #include <complib/cl_qmap.h>\r
43 #include <complib/cl_fleximap.h>\r
44 #include <ip_packet.h>\r
45 #include "ipoib_endpoint.h"\r
46 #include "ipoib_xfr_mgr.h"\r
47 \r
48 \r
49 /*\r
50  * Define to place receive buffer inline in receive descriptor.\r
51  */\r
52 #define IPOIB_INLINE_RECV       1\r
53 \r
54 \r
55 /* Max send data segment list size. */\r
56 #define MAX_SEND_SGE    8\r
57 \r
58 \r
59 /*\r
60  * Define to control how transfers are done.  When defined as 1, causes\r
61  * packets to be sent using NDIS DMA facilities (getting the SGL from the\r
62  * packet).  When defined as 0, uses the NDIS_BUFFER structures as MDLs\r
63  * to get the physical page mappings of the buffers.\r
64  */\r
65 #define IPOIB_USE_DMA   1\r
66 \r
67 \r
68 #define IPOIB_PORT_FROM_PACKET( P )     \\r
69         (((ipoib_port_t**)P->MiniportReservedEx)[0])\r
70 #define IPOIB_ENDPT_FROM_PACKET( P )    \\r
71         (((ipoib_endpt_t**)P->MiniportReservedEx)[1])\r
72 #define IPOIB_RECV_FROM_PACKET( P )     \\r
73         (((ipoib_recv_desc_t**)P->MiniportReservedEx)[1])\r
74 #define IPOIB_SEND_FROM_PACKET( P )             \\r
75         (((send_buf_t**)P->MiniportReservedEx)[2])\r
76 #define IPOIB_PACKET_FROM_LIST_ITEM( I ) \\r
77         (PARENT_STRUCT( I, NDIS_PACKET, MiniportReservedEx ))\r
78 #define IPOIB_LIST_ITEM_FROM_PACKET( P ) \\r
79         ((cl_list_item_t*)P->MiniportReservedEx)\r
80 \r
81 \r
82 typedef struct _ipoib_ib_mgr\r
83 {\r
84         ib_ca_handle_t                  h_ca;\r
85         ib_pd_handle_t                  h_pd;\r
86         ib_cq_handle_t                  h_recv_cq;\r
87         ib_cq_handle_t                  h_send_cq;\r
88         ib_qp_handle_t                  h_qp;\r
89         ib_query_handle_t               h_query;\r
90         net32_t                                 qpn;\r
91 \r
92         ib_mr_handle_t                  h_mr;\r
93         net32_t                                 lkey;\r
94 \r
95         uint8_t                                 rate;\r
96         ib_member_rec_t                 bcast_rec;\r
97 \r
98 }       ipoib_ib_mgr_t;\r
99 /*\r
100 * FIELDS\r
101 *       h_ca\r
102 *               CA handle for all IB resources.\r
103 *\r
104 *       h_pd\r
105 *               PD handle for all IB resources.\r
106 *\r
107 *       h_recv_cq\r
108 *               Recv CQ handle.\r
109 *\r
110 *       h_send_cq\r
111 *               Send CQ handle.\r
112 *\r
113 *       h_qp\r
114 *               QP handle for data transfers.\r
115 *\r
116 *       h_query\r
117 *               Query handle for cancelling SA queries.\r
118 *\r
119 *       h_mr\r
120 *               Registration handle for all of physical memory.  Used for\r
121 *               send/receive buffers to simplify growing the receive pool.\r
122 *\r
123 *       lkey\r
124 *               LKey for the memory region.\r
125 *\r
126 *       bcast_rec\r
127 *               Cached information about the broadcast group, used to specify\r
128 *               parameters used to join other multicast groups.\r
129 *********/\r
130 \r
131 \r
132 #include <complib/cl_packon.h>\r
133 /****s* IPoIB Driver/ipoib_hdr_t\r
134 * NAME\r
135 *       ipoib_hdr_t\r
136 *\r
137 * DESCRIPTION\r
138 *       IPoIB packet header.\r
139 *\r
140 * SYNOPSIS\r
141 */\r
142 typedef struct _ipoib_hdr\r
143 {\r
144         net16_t                 type;\r
145         net16_t                 resv;\r
146 \r
147 }       PACK_SUFFIX ipoib_hdr_t;\r
148 /*\r
149 * FIELDS\r
150 *       type\r
151 *               Protocol type.\r
152 *\r
153 *       resv\r
154 *               Reserved portion of IPoIB header.\r
155 *********/\r
156 \r
157 typedef struct _ipoib_arp_pkt\r
158 {\r
159         net16_t                 hw_type;\r
160         net16_t                 prot_type;\r
161         uint8_t                 hw_size;\r
162         uint8_t                 prot_size;\r
163         net16_t                 op;\r
164         ipoib_hw_addr_t src_hw;\r
165         net32_t                 src_ip;\r
166         ipoib_hw_addr_t dst_hw;\r
167         net32_t                 dst_ip;\r
168 \r
169 }       PACK_SUFFIX ipoib_arp_pkt_t;\r
170 \r
171 \r
172 /****s* IPoIB Driver/ipoib_pkt_t\r
173 * NAME\r
174 *       ipoib_pkt_t\r
175 *\r
176 * DESCRIPTION\r
177 *       Represents an IPoIB packet with no GRH.\r
178 *\r
179 * SYNOPSIS\r
180 */\r
181 typedef struct _ipoib_pkt\r
182 {\r
183         ipoib_hdr_t             hdr;\r
184         union _payload\r
185         {\r
186                 uint8_t                 data[MAX_PAYLOAD_MTU];\r
187                 ipoib_arp_pkt_t arp;\r
188                 ip_pkt_t                ip;\r
189 \r
190         }       PACK_SUFFIX type;\r
191 \r
192 }       PACK_SUFFIX ipoib_pkt_t;\r
193 /*\r
194 * FIELDS\r
195 *       hdr\r
196 *               IPoIB header.\r
197 *\r
198 *       type\r
199 *               Union for different types of payloads.\r
200 *\r
201 *       type.data\r
202 *               raw packet.\r
203 *\r
204 *       type.ib_arp\r
205 *               IPoIB ARP packet.\r
206 *\r
207 *       type.arp\r
208 *               Ethernet ARP packet.\r
209 *\r
210 *       type.ip\r
211 *               IP packet.\r
212 *********/\r
213 \r
214 \r
215 /****s* IPoIB Driver/recv_buf_t\r
216 * NAME\r
217 *       recv_buf_t\r
218 *\r
219 * DESCRIPTION\r
220 *       Represents a receive buffer, including the ethernet header\r
221 *       used to indicate the receive to the OS.\r
222 *\r
223 * SYNOPSIS\r
224 */\r
225 typedef union _recv_buf\r
226 {\r
227         struct _recv_buf_type_eth\r
228         {\r
229                 uint8_t                 pad[sizeof(ib_grh_t) +\r
230                                                         sizeof(ipoib_hdr_t) -\r
231                                                         sizeof(eth_hdr_t)];\r
232                 eth_pkt_t               pkt;    /* data starts at sizeof(grh)+sizeof(eth_hdr) */\r
233 \r
234         }       PACK_SUFFIX eth;\r
235 \r
236         struct _recv_buf_type_ib\r
237         {\r
238                 ib_grh_t                grh;    /* Must be same offset as lcl_rt.ib.pkt */\r
239                 ipoib_pkt_t             pkt;    /* data starts at 10+grh+4 */\r
240 \r
241         }       PACK_SUFFIX ib;\r
242 \r
243 }       PACK_SUFFIX recv_buf_t;\r
244 /*\r
245 * FIELDS\r
246 *       eth.pkt\r
247 *               Ethernet packet, used to indicate the receive to the OS.\r
248 *\r
249 *       ib.grh\r
250 *               GRH for a globally routed received packet.\r
251 *\r
252 *       ib.pkt\r
253 *               IPOIB packet representing a globally routed received packet.\r
254 *\r
255 * NOTES\r
256 *       When posting the work request, the address of ib.grh is used.\r
257 *\r
258 *       TODO: Do we need a pad to offset the header so that the data ends up\r
259 *       aligned on a pointer boundary?\r
260 *********/\r
261 \r
262 /****s* IPoIB Driver/send_buf_t\r
263 * NAME\r
264 *       send_buf_t\r
265 *\r
266 * DESCRIPTION\r
267 *       Represents a send buffer, used to convert packets to IPoIB format.\r
268 *\r
269 * SYNOPSIS\r
270 */\r
271 typedef union _send_buf\r
272 {\r
273         uint8_t                 data[MAX_PAYLOAD_MTU];\r
274         ipoib_arp_pkt_t arp;\r
275         ip_pkt_t                ip;\r
276 \r
277 }       PACK_SUFFIX send_buf_t;\r
278 /*\r
279 * FIELDS\r
280 *       data\r
281 *               IP/ARP packet.\r
282 *\r
283 * NOTES\r
284 *       TODO: Do we need a pad to offset the header so that the data ends up\r
285 *       aligned on a pointer boundary?\r
286 *********/\r
287 #include <complib/cl_packoff.h>\r
288 \r
289 \r
290 typedef struct _ipoib_buf_mgr\r
291 {\r
292         cl_qpool_t                      recv_pool;\r
293 \r
294         NDIS_HANDLE                     h_packet_pool;\r
295         NDIS_HANDLE                     h_buffer_pool;\r
296 \r
297         NPAGED_LOOKASIDE_LIST   send_buf_list;\r
298         NDIS_HANDLE                     h_send_pkt_pool;\r
299         NDIS_HANDLE                     h_send_buf_pool;\r
300 \r
301 }       ipoib_buf_mgr_t;\r
302 /*\r
303 * FIELDS\r
304 *       recv_pool\r
305 *               Pool of ipoib_recv_desc_t structures.\r
306 *\r
307 *       h_packet_pool\r
308 *               NDIS packet pool, used to indicate receives to NDIS.\r
309 *\r
310 *       h_buffer_pool\r
311 *               NDIS buffer pool, used to indicate receives to NDIS.\r
312 *\r
313 *       send_buf_list\r
314 *               Lookaside list for dynamically allocating send buffers for send\r
315 *               that require copies (ARP, DHCP, and any with more physical pages\r
316 *               than can fit in the local data segments).\r
317 *********/\r
318 \r
319 \r
320 typedef enum _ipoib_pkt_type\r
321 {\r
322         PKT_TYPE_UCAST,\r
323         PKT_TYPE_BCAST,\r
324         PKT_TYPE_MCAST\r
325 \r
326 }       ipoib_pkt_type_t;\r
327 \r
328 \r
329 typedef struct _ipoib_recv_desc\r
330 {\r
331         cl_pool_item_t          item;   /* Must be first. */\r
332         uint32_t                        len;\r
333         ipoib_pkt_type_t        type;\r
334         ib_recv_wr_t            wr;\r
335         ib_local_ds_t           local_ds[2];\r
336         NDIS_TCP_IP_CHECKSUM_PACKET_INFO        ndis_csum;\r
337 #if IPOIB_INLINE_RECV\r
338         recv_buf_t                      buf;\r
339 #else\r
340         recv_buf_t                      *p_buf;\r
341 #endif\r
342 \r
343 }       ipoib_recv_desc_t;\r
344 /*\r
345 * FIELDS\r
346 *       item\r
347 *               Pool item for storing descriptors in a pool.\r
348 *\r
349 *       len\r
350 *               Length to indicate to NDIS.  This is different than the length of the\r
351 *               received data as some data is IPoIB specific and filtered out.\r
352 *\r
353 *       type\r
354 *               Type of packet, used in filtering received packets against the packet\r
355 *               filter.  Also used to update stats.\r
356 *\r
357 *       wr\r
358 *               Receive work request.\r
359 *\r
360 *       local_ds\r
361 *               Local data segments.  The second segment is only used if a buffer\r
362 *               spans physical pages.\r
363 *\r
364 *       buf\r
365 *               Buffer for the receive.\r
366 *\r
367 * NOTES\r
368 *       The pool item is always first to allow casting form a cl_pool_item_t or\r
369 *       cl_list_item_t to the descriptor.\r
370 *********/\r
371 \r
372 \r
373 typedef struct _ipoib_send_desc\r
374 {\r
375         NDIS_PACKET                     *p_pkt;\r
376         ipoib_endpt_t           *p_endpt;\r
377         send_buf_t                      *p_buf;\r
378         ib_send_wr_t            wr;\r
379         ipoib_hdr_t                     pkt_hdr;\r
380         ib_local_ds_t           local_ds[MAX_SEND_SGE]; /* Must be last. */\r
381 \r
382 }       ipoib_send_desc_t;\r
383 /*\r
384 * FIELDS\r
385 *       p_pkt\r
386 *               Pointer to the NDIS_PACKET associated with the send operation.\r
387 *\r
388 *       p_endpt\r
389 *               Endpoint for this send.\r
390 *\r
391 *       p_buf\r
392 *               Buffer for the send, if allocated.\r
393 *\r
394 *       wr\r
395 *               Send work request.\r
396 *\r
397 *       pkt_hdr\r
398 *               IPoIB packet header, pointed to by the first local datasegment.\r
399 *\r
400 *       local_ds\r
401 *               Local data segment array.  Placed last to allow allocating beyond the\r
402 *               end of the descriptor for additional datasegments.\r
403 *\r
404 * NOTES\r
405 *       The pool item is always first to allow casting form a cl_pool_item_t or\r
406 *       cl_list_item_t to the descriptor.\r
407 *********/\r
408 \r
409 \r
410 typedef struct _ipoib_recv_mgr\r
411 {\r
412         int32_t                 depth;\r
413 \r
414         NDIS_PACKET             **recv_pkt_array;\r
415 \r
416         cl_qlist_t              done_list;\r
417 \r
418 }       ipoib_recv_mgr_t;\r
419 /*\r
420 * FIELDS\r
421 *       depth\r
422 *               Current number of WRs posted.\r
423 *\r
424 *       p_head\r
425 *               Pointer to work completion in descriptor at the head of the QP.\r
426 *\r
427 *       p_tail\r
428 *               Pointer to the work completion in the descriptor at the tail of the QP.\r
429 *\r
430 *       recv_pkt_array\r
431 *               Array of pointers to NDIS_PACKET used to indicate receives.\r
432 *\r
433 *       done_list\r
434 *               List of receive descriptors that need to be indicated to NDIS.\r
435 *********/\r
436 \r
437 \r
438 typedef struct _ipoib_send_mgr\r
439 {\r
440         atomic32_t              depth;\r
441         cl_qlist_t              pending_list;\r
442 \r
443 }       ipoib_send_mgr_t;\r
444 /*\r
445 * FIELDS\r
446 *       depth\r
447 *               Current number of WRs posted, used to queue pending requests.\r
448 *\r
449 *       pending_list\r
450 *               List of NDIS_PACKET structures that are awaiting available WRs to send.\r
451 *********/\r
452 \r
453 \r
454 typedef struct _ipoib_endpt_mgr\r
455 {\r
456         cl_qmap_t                               mac_endpts;\r
457         cl_fmap_t                               gid_endpts;\r
458         cl_qmap_t                               lid_endpts;\r
459 \r
460 }       ipoib_endpt_mgr_t;\r
461 /*\r
462 * FIELDS\r
463 *       mac_endpts\r
464 *               Map of enpoints, keyed by MAC address.\r
465 *\r
466 *       gid_endpts\r
467 *               Map of enpoints, keyed by GID.\r
468 *\r
469 *       lid_endpts\r
470 *               Map of enpoints, keyed by LID.  Only enpoints on the same subnet\r
471 *               are inserted in the LID map.\r
472 *********/\r
473 \r
474 \r
475 typedef struct _ipoib_port\r
476 {\r
477         cl_obj_t                                obj;\r
478         cl_obj_rel_t                    rel;\r
479 \r
480         ib_qp_state_t                   state;\r
481 \r
482         cl_spinlock_t                   recv_lock;\r
483         cl_spinlock_t                   send_lock;\r
484 \r
485         struct _ipoib_adapter   *p_adapter;\r
486         uint8_t                                 port_num;\r
487 \r
488         KEVENT                                  sa_event;\r
489 \r
490         atomic32_t                              mcast_cnt;\r
491         KEVENT                                  leave_mcast_event;\r
492         \r
493         ipoib_ib_mgr_t                  ib_mgr;\r
494 \r
495         ipoib_buf_mgr_t                 buf_mgr;\r
496 \r
497         ipoib_recv_mgr_t                recv_mgr;\r
498         ipoib_send_mgr_t                send_mgr;\r
499 \r
500         ipoib_endpt_mgr_t               endpt_mgr;\r
501 \r
502         ipoib_endpt_t                   *p_local_endpt;\r
503 \r
504 #if DBG\r
505         atomic32_t                              ref[ref_array_size];\r
506 #endif\r
507 \r
508         atomic32_t                              endpt_rdr;\r
509 \r
510         atomic32_t                              hdr_idx;\r
511         uint16_t                                pkey_index;\r
512         KDPC                                    gc_dpc;\r
513         KTIMER                                  gc_timer;\r
514         ipoib_hdr_t                             hdr[1]; /* Must be last! */\r
515 \r
516 }       ipoib_port_t;\r
517 /*\r
518 * FIELDS\r
519 *       obj\r
520 *               Complib object for reference counting, relationships,\r
521 *               and destruction synchronization.\r
522 *\r
523 *       rel\r
524 *               Relationship to associate the port with the adapter.\r
525 *\r
526 *       state\r
527 *               State of the port object.  Tracks QP state fairly closely.\r
528 *\r
529 *       recv_lock\r
530 *               Spinlock to protect receive operations.\r
531 *\r
532 *       send_lock\r
533 *               Spinlock to protect send operations.\r
534 *\r
535 *       p_adapter\r
536 *               Parent adapter.  Used to get AL handle.\r
537 *\r
538 *       port_num\r
539 *               Port number of this adapter.\r
540 *\r
541 *       ib_mgr\r
542 *               IB resource manager.\r
543 *\r
544 *       recv_mgr\r
545 *               Receive manager.\r
546 *\r
547 *       send_mgr\r
548 *               Send manager.\r
549 *\r
550 *       endpt_mgr\r
551 *               Endpoint manager.\r
552 *********/\r
553 \r
554 \r
555 ib_api_status_t\r
556 ipoib_create_port(\r
557         IN                              struct _ipoib_adapter* const    p_adapter,\r
558         IN                              ib_pnp_port_rec_t* const        p_pnp_rec,\r
559                 OUT                     ipoib_port_t** const            pp_port );\r
560 \r
561 void\r
562 ipoib_port_destroy(\r
563         IN                              ipoib_port_t* const                     p_port );\r
564 \r
565 void\r
566 ipoib_port_up(\r
567         IN                              ipoib_port_t* const                     p_port,\r
568         IN              const   ib_pnp_port_rec_t* const        p_pnp_rec );\r
569 \r
570 void\r
571 ipoib_port_down(\r
572         IN                              ipoib_port_t* const                     p_port );\r
573 \r
574 ib_api_status_t\r
575 ipoib_port_join_mcast(\r
576         IN                              ipoib_port_t* const                     p_port,\r
577         IN              const   mac_addr_t                              mac,\r
578         IN              const   uint8_t                                 state );\r
579 \r
580 \r
581 void\r
582 ipoib_leave_mcast_cb(\r
583         IN                              void                            *context );\r
584 \r
585 \r
586 void\r
587 ipoib_port_remove_endpt(\r
588         IN                              ipoib_port_t* const                     p_port,\r
589         IN              const   mac_addr_t                                      mac );\r
590 \r
591 void\r
592 ipoib_port_flush_endpts(\r
593         IN                              ipoib_port_t* const                     p_port );\r
594 \r
595 void\r
596 ipoib_port_send(\r
597         IN                              ipoib_port_t* const                     p_port,\r
598         IN                              NDIS_PACKET                                     **p_packet_array,\r
599         IN                              uint32_t                                        num_packets );\r
600 \r
601 void\r
602 ipoib_return_packet(\r
603         IN                              NDIS_HANDLE                                     adapter_context,\r
604         IN                              NDIS_PACKET                                     *p_packet );\r
605 \r
606 void\r
607 ipoib_port_resume(\r
608         IN                              ipoib_port_t* const                     p_port );\r
609 \r
610 NTSTATUS\r
611 ipoib_mac_to_gid(\r
612         IN                              ipoib_port_t* const                     p_port,\r
613         IN              const   mac_addr_t                                      mac,\r
614                 OUT                     ib_gid_t*                                       p_gid );\r
615 \r
616 inline void ipoib_port_ref(\r
617         IN                              ipoib_port_t *                          p_port, \r
618         IN                              int                                             type);\r
619 \r
620 inline void ipoib_port_deref(\r
621         IN                              ipoib_port_t *                          p_port,\r
622         IN                              int                                             type);\r
623 \r
624 \r
625 #endif  /* _IPOIB_PORT_H_ */\r