[ipoib] mcast garbage collector and igmp V2 support.
[mirror/winof/.git] / inc / kernel / ip_packet.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 \r
33 #ifndef _IP_PACKET_H_\r
34 #define _IP_PACKET_H_\r
35 \r
36 \r
37 #include <complib/cl_types.h>\r
38 #include <complib/cl_byteswap.h>\r
39 \r
40 \r
41 #ifndef HW_ADDR_LEN\r
42 #define HW_ADDR_LEN             6\r
43 #endif  /* HW_ADDR_LEN */\r
44 \r
45 \r
46 #define ETH_PROT_TYPE_IP        CL_HTON16(0x800)\r
47 #define ETH_PROT_TYPE_ARP       CL_HTON16(0x806)\r
48 #define ETH_PROT_VLAN_TAG       CL_HTON16(0x8100)\r
49 \r
50 \r
51 #define ETH_IS_LOCALLY_ADMINISTERED(addr) \\r
52         (BOOLEAN)(((PUCHAR)(addr))[0] & ((UCHAR)0x02))\r
53 \r
54 \r
55 #include <complib/cl_packon.h>\r
56 /****s* IB Network Drivers/mac_addr_t\r
57 * NAME\r
58 *       mac_addr_t\r
59 *\r
60 * DESCRIPTION\r
61 *       Defines the ehternet MAC address.\r
62 *\r
63 * SYNOPSIS\r
64 */\r
65 typedef struct _mac_addr\r
66 {\r
67         uint8_t         addr[HW_ADDR_LEN];\r
68 \r
69 }       PACK_SUFFIX mac_addr_t;\r
70 /*\r
71 * FIELDS\r
72 *       addr\r
73 *               Byte array representing the MAC address.\r
74 *\r
75 * NOTES\r
76 *       The HW_ADDR_LEN value must be defined before including this header in order\r
77 *       to support various address lengths.  If not defined, the default length for\r
78 *       ethernet (6 bytes) is used.\r
79 *\r
80 *       addr[0] & 0x1 indicates multicast\r
81 *       addr[0] & 0x2 indicates LAA if not multicast\r
82 *\r
83 * SEE ALSO\r
84 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
85 *********/\r
86 #include <complib/cl_packoff.h>\r
87 \r
88 \r
89 #include <complib/cl_packon.h>\r
90 /****s* IB Network Drivers/eth_hdr_t\r
91 * NAME\r
92 *       eth_hdr_t\r
93 *\r
94 * DESCRIPTION\r
95 *       Defines the ehternet header for IP packets.\r
96 *\r
97 * SYNOPSIS\r
98 */\r
99 typedef struct _eth_hdr\r
100 {\r
101         mac_addr_t      dst;\r
102         mac_addr_t      src;\r
103         net16_t         type;\r
104 \r
105 }       PACK_SUFFIX eth_hdr_t;\r
106 /*\r
107 * FIELDS\r
108 *       dst\r
109 *               Destination address\r
110 *\r
111 *       src\r
112 *               Source address\r
113 *\r
114 *       type\r
115 *               Ethernet protocol type\r
116 *\r
117 * NOTES\r
118 *       The HW_ADDR_LEN value must be defined before including this header in order\r
119 *       to support various address lengths.\r
120 *\r
121 * SEE ALSO\r
122 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
123 *********/\r
124 #include <complib/cl_packoff.h>\r
125 \r
126 \r
127 #define ARP_HW_TYPE_ETH         CL_HTON16(1)\r
128 #define ARP_HW_TYPE_IB          CL_HTON16(32)\r
129 \r
130 #define ARP_OP_REQ                      CL_HTON16(1)\r
131 #define ARP_OP_REP                      CL_HTON16(2)\r
132 \r
133 \r
134 #include <complib/cl_packon.h>\r
135 /****s* IB Network Drivers/arp_pkt_t\r
136 * NAME\r
137 *       arp_pkt_t\r
138 *\r
139 * DESCRIPTION\r
140 *       Defines the ARP packet for IP packets.\r
141 *\r
142 * SYNOPSIS\r
143 */\r
144 typedef struct _arp_pkt\r
145 {\r
146         net16_t         hw_type;\r
147         net16_t         prot_type;\r
148         uint8_t         hw_size;\r
149         uint8_t         prot_size;\r
150         net16_t         op;\r
151         mac_addr_t      src_hw;\r
152         net32_t         src_ip;\r
153         mac_addr_t      dst_hw;\r
154         net32_t         dst_ip;\r
155 \r
156 }       PACK_SUFFIX arp_pkt_t;\r
157 /*\r
158 * FIELDS\r
159 *       hw_type\r
160 *               Hardware type\r
161 *\r
162 *       prot_type\r
163 *               Protocol type.  See ETH_PROT_TYPE_XXX definitions.\r
164 *\r
165 *       hw_size\r
166 *               Size of the hardware address\r
167 *\r
168 *       prot_size\r
169 *               Size of the protocol address\r
170 *\r
171 *       op\r
172 *               ARP operation\r
173 *\r
174 *       src_hw\r
175 *               Source HW (MAC) address\r
176 *\r
177 *       src_ip\r
178 *               Source IP address\r
179 *\r
180 *       dst_hw\r
181 *               Destination HW (MAC) address\r
182 *\r
183 *       dst_ip\r
184 *               Destination IP address\r
185 *\r
186 * NOTES\r
187 *       The HW_ADDR_LEN value must be defined before including this header in order\r
188 *       to support various MAC address lengths.\r
189 *\r
190 * SEE ALSO\r
191 *       IB Network Drivers, eth_hdr_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
192 *********/\r
193 #include <complib/cl_packoff.h>\r
194 \r
195 \r
196 #define IP_PROT_IP                      4\r
197 #define IP_PROT_TCP                     6\r
198 #define IP_PROT_UDP                     17\r
199 #define IP_PROT_IGMP            2\r
200 \r
201 \r
202 #include <complib/cl_packon.h>\r
203 /****s* IB Network Drivers/ip_hdr_t\r
204 * NAME\r
205 *       ip_hdr_t\r
206 *\r
207 * DESCRIPTION\r
208 *       Defines the IP header for IP packets.\r
209 *\r
210 * SYNOPSIS\r
211 */\r
212 typedef struct _ip_hdr\r
213 {\r
214         uint8_t         ver_hl;\r
215         uint8_t         svc_type;\r
216         net16_t         length;\r
217         net16_t         id;\r
218         net16_t         offset;\r
219         uint8_t         ttl;\r
220         uint8_t         prot;\r
221         net16_t         chksum;\r
222         net32_t         src_ip;\r
223         net32_t         dst_ip;\r
224 \r
225 }       PACK_SUFFIX ip_hdr_t;\r
226 /*\r
227 * FIELDS\r
228 *       ver_hl\r
229 *               Header version and length.\r
230 *\r
231 *       svc_type\r
232 *               Service type.\r
233 *\r
234 *       length\r
235 *               Total length.\r
236 *\r
237 *       id\r
238 *               Packet identification.\r
239 *\r
240 *       offset\r
241 *               Fragment offset.\r
242 *\r
243 *       ttl\r
244 *               Time to live.\r
245 *\r
246 *       prot\r
247 *               Protocol.\r
248 *\r
249 *       chksum\r
250 *               Checksum.\r
251 *\r
252 *       src_ip\r
253 *               Source IP address\r
254 *\r
255 *       dst_ip\r
256 *               Destination IP address\r
257 *\r
258 * SEE ALSO\r
259 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, tcp_hdr_t, udp_hdr_t\r
260 *********/\r
261 #include <complib/cl_packoff.h>\r
262 \r
263 \r
264 #include <complib/cl_packon.h>\r
265 /****s* IB Network Drivers/tcp_hdr_t\r
266 * NAME\r
267 *       tcp_hdr_t\r
268 *\r
269 * DESCRIPTION\r
270 *       Defines the IP header for IP packets.\r
271 *\r
272 * SYNOPSIS\r
273 */\r
274 typedef struct _tcp_hdr\r
275 {\r
276         net16_t         src_port;\r
277         net16_t         dst_port;\r
278         net32_t         seq_num;\r
279         net32_t         ack_num;\r
280         uint8_t         offset;\r
281         uint8_t         flags;\r
282         net16_t         window;\r
283         net16_t         chksum;\r
284         net16_t         urp;\r
285 \r
286 }       PACK_SUFFIX tcp_hdr_t;\r
287 /*\r
288 * FIELDS\r
289 *       src_port\r
290 *               Source port.\r
291 *\r
292 *       dst_port\r
293 *               Destination port.\r
294 *\r
295 *       seq_num\r
296 *               Sequence number.\r
297 *\r
298 *       ack_num\r
299 *               Acknowledge number.\r
300 *\r
301 *       offset\r
302 *               data offset.\r
303 *\r
304 *       flags\r
305 *               TCP flags.\r
306 *\r
307 *       window\r
308 *               Window number.\r
309 *\r
310 *       chksum\r
311 *               Checksum.\r
312 *\r
313 *       urp\r
314 *               Urgent pointer.\r
315 *\r
316 * SEE ALSO\r
317 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
318 *********/\r
319 #include <complib/cl_packoff.h>\r
320 \r
321 \r
322 #include <complib/cl_packon.h>\r
323 /****s* IB Network Drivers/udp_hdr_t\r
324 * NAME\r
325 *       udp_hdr_t\r
326 *\r
327 * DESCRIPTION\r
328 *       Defines the IP header for IP packets.\r
329 *\r
330 * SYNOPSIS\r
331 */\r
332 typedef struct _udp_hdr\r
333 {\r
334         net16_t         src_port;\r
335         net16_t         dst_port;\r
336         net16_t         length;\r
337         net16_t         chksum;\r
338 \r
339 }       PACK_SUFFIX udp_hdr_t;\r
340 /*\r
341 * FIELDS\r
342 *       src_port\r
343 *               Source port.\r
344 *\r
345 *       dst_port\r
346 *               Destination port.\r
347 *\r
348 *       length\r
349 *               Length of datagram.\r
350 *\r
351 *       chksum\r
352 *               Checksum.\r
353 *\r
354 * SEE ALSO\r
355 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
356 *********/\r
357 #include <complib/cl_packoff.h>\r
358 \r
359 #define IGMP_V2_MEMBERSHIP_QUERY        0x11\r
360 #define IGMP_V2_MEMBERSHIP_REPORT       0x16\r
361 #define IGMP_V1_MEMBERSHIP_REPORT       0x12    // for backward compatibility with IGMPv1\r
362 #define IGMP_V2_LEAVE_GROUP                     0x17\r
363 #include <complib/cl_packon.h>\r
364 /****s* IB Network Drivers/igmp__v2_hdr_t\r
365 * NAME\r
366 *       igmp_v2_hdr_t\r
367 *\r
368 * DESCRIPTION\r
369 *       Defines the IGMPv2 header for IP packets.\r
370 *\r
371 * SYNOPSIS\r
372 */\r
373 typedef struct _igmp_v2_hdr\r
374 {\r
375         uint8_t         type;\r
376         uint8_t         max_resp_time;\r
377         net16_t         chksum;\r
378         net32_t         group_address;\r
379 }       PACK_SUFFIX igmp_v2_hdr_t;\r
380 /*\r
381 * FIELDS\r
382 *       type\r
383 *               type of IGMPv2 message: query/report/leave\r
384 *\r
385 *       max_resp_time\r
386 *               The Max Response Time field is meaningful only in Membership Query\r
387 *               messages, and specifies the maximum allowed time before sending a\r
388 *               responding report in units of 1/10 second.  In all other messages, it\r
389 *               is set to zero by the sender and ignored by receivers.\r
390 *\r
391 *       checksum\r
392 *               The checksum is the 16-bit one's complement of the one's complement\r
393 *       sum of the whole IGMP message (the entire IP payload).  \r
394 *\r
395 *       group_address\r
396 *               In a Membership Query message, the group address field is set to zero\r
397 *       when sending a General Query, and set to the group address being\r
398 *       queried when sending a Group-Specific Query.\r
399 *\r
400 *       In a Membership Report or Leave Group message, the group address\r
401 *       field holds the IP multicast group address of the group being\r
402 *       reported or left.\r
403 *\r
404 * SEE ALSO\r
405 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
406 *********/\r
407 #include <complib/cl_packoff.h>\r
408 \r
409 #define DHCP_PORT_SERVER                CL_HTON16(67)\r
410 #define DHCP_PORT_CLIENT                CL_HTON16(68)\r
411 \r
412 #define DHCP_REQUEST                    1\r
413 #define DHCP_REPLY                              2\r
414 #define DHCP_HW_TYPE_ETH                1\r
415 #define DHCP_HW_TYPE_IB                 32\r
416 #define DHCP_OPT_PAD                    0\r
417 #define DHCP_OPT_END                    255\r
418 #define DHCP_OPT_MSG                    53\r
419 #define DHCP_OPT_CLIENT_ID              61\r
420 \r
421 #define DHCPDISCOVER                    1\r
422 #define DHCPOFFER                               2\r
423 #define DHCPREQUEST                             3\r
424 #define DHCPDECLINE                             4\r
425 #define DHCPACK                                 5\r
426 #define DHCPNAK                                 6\r
427 #define DHCPRELEASE                             7\r
428 #define DHCPINFORM                              8\r
429 \r
430 #define DHCP_FLAGS_BROADCAST    CL_HTON16(0x8000)\r
431 #define DHCP_COOKIE                             0x63538263\r
432 #define DHCP_OPTIONS_SIZE               312\r
433 #define DHCP_COOKIE_SIZE                4\r
434 \r
435 \r
436 /* Minimum DHCP size is without options (but with 4-byte magic cookie). */\r
437 #define DHCP_MIN_SIZE                   (sizeof(dhcp_pkt_t) + DHCP_COOKIE_SIZE - DHCP_OPTIONS_SIZE )\r
438 \r
439 #include <complib/cl_packon.h>\r
440 /****s* IB Network Drivers/dhcp_pkt_t\r
441 * NAME\r
442 *       dhcp_pkt_t\r
443 *\r
444 * DESCRIPTION\r
445 *       Defines the DHCP packet format as documented in RFC 2131\r
446 *       http://www.zvon.org/tmRFC/RFC2131/Output/index.html\r
447 *\r
448 * SYNOPSIS\r
449 */\r
450 typedef struct _dhcp_pkt\r
451 {\r
452         uint8_t         op;\r
453         uint8_t         htype;\r
454         uint8_t         hlen;\r
455         uint8_t         hops;\r
456         net32_t         xid;\r
457         net16_t         secs;\r
458         net16_t         flags;\r
459         net32_t         ciaddr;\r
460         net32_t         yiaddr;\r
461         net32_t         siaddr;\r
462         net32_t         giaddr;\r
463         uint8_t         chaddr[16];\r
464         uint8_t         sname[64];\r
465         uint8_t         file[128];\r
466         uint8_t         options[312];\r
467 \r
468 }       PACK_SUFFIX dhcp_pkt_t;\r
469 /*\r
470 * SEE ALSO\r
471 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
472 *********/\r
473 #include <complib/cl_packoff.h>\r
474 \r
475 \r
476 #include <complib/cl_packon.h>\r
477 typedef struct _udp_pkt\r
478 {\r
479         udp_hdr_t       hdr;\r
480         dhcp_pkt_t      dhcp;\r
481 \r
482 }       PACK_SUFFIX udp_pkt_t;\r
483 \r
484 typedef struct _ip_pkt\r
485 {\r
486         ip_hdr_t                hdr;\r
487         union _ip_payload\r
488         {\r
489                 tcp_hdr_t       tcp;\r
490                 udp_pkt_t       udp;\r
491 \r
492         }       PACK_SUFFIX prot;\r
493 \r
494 }       PACK_SUFFIX ip_pkt_t;\r
495 \r
496 typedef struct _eth_pkt\r
497 {\r
498         eth_hdr_t       hdr;\r
499         union _eth_payload\r
500         {\r
501                 arp_pkt_t       arp;\r
502                 ip_pkt_t        ip;\r
503 \r
504         }       PACK_SUFFIX type;\r
505 \r
506 }       PACK_SUFFIX eth_pkt_t;\r
507 #include <complib/cl_packoff.h>\r
508 \r
509 \r
510 #endif  /* _IP_PACKET_H_ */\r