initial implementation
[mirror/winof/.git] / ulp / ipoib / 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         $Revision$\r
34 */\r
35 \r
36 #ifndef _IP_PACKET_H_\r
37 #define _IP_PACKET_H_\r
38 \r
39 \r
40 #include <complib/cl_types.h>\r
41 #include <complib/cl_byteswap.h>\r
42 \r
43 \r
44 #ifndef HW_ADDR_LEN\r
45 #define HW_ADDR_LEN             6\r
46 #endif  /* HW_ADDR_LEN */\r
47 \r
48 \r
49 #define ETH_PROT_TYPE_IP        CL_HTON16(0x800)\r
50 #define ETH_PROT_TYPE_ARP       CL_HTON16(0x806)\r
51 \r
52 \r
53 #include <complib/cl_packon.h>\r
54 /****s* IB Network Drivers/mac_addr_t\r
55 * NAME\r
56 *       mac_addr_t\r
57 *\r
58 * DESCRIPTION\r
59 *       Defines the ehternet MAC address.\r
60 *\r
61 * SYNOPSIS\r
62 */\r
63 typedef struct _mac_addr\r
64 {\r
65         uint8_t         addr[HW_ADDR_LEN];\r
66 \r
67 }       PACK_SUFFIX mac_addr_t;\r
68 /*\r
69 * FIELDS\r
70 *       addr\r
71 *               Byte array representing the MAC address.\r
72 *\r
73 * NOTES\r
74 *       The HW_ADDR_LEN value must be defined before including this header in order\r
75 *       to support various address lengths.  If not defined, the default length for\r
76 *       ethernet (6 bytes) is used.\r
77 *\r
78 * SEE ALSO\r
79 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
80 *********/\r
81 #include <complib/cl_packoff.h>\r
82 \r
83 \r
84 #include <complib/cl_packon.h>\r
85 /****s* IB Network Drivers/eth_hdr_t\r
86 * NAME\r
87 *       eth_hdr_t\r
88 *\r
89 * DESCRIPTION\r
90 *       Defines the ehternet header for IP packets.\r
91 *\r
92 * SYNOPSIS\r
93 */\r
94 typedef struct _eth_hdr\r
95 {\r
96         mac_addr_t      dst;\r
97         mac_addr_t      src;\r
98         net16_t         type;\r
99 \r
100 }       PACK_SUFFIX eth_hdr_t;\r
101 /*\r
102 * FIELDS\r
103 *       dst\r
104 *               Destination address\r
105 *\r
106 *       src\r
107 *               Source address\r
108 *\r
109 *       type\r
110 *               Ethernet protocol type\r
111 *\r
112 * NOTES\r
113 *       The HW_ADDR_LEN value must be defined before including this header in order\r
114 *       to support various address lengths.\r
115 *\r
116 * SEE ALSO\r
117 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
118 *********/\r
119 #include <complib/cl_packoff.h>\r
120 \r
121 \r
122 #define ARP_HW_TYPE_ETH         CL_HTON16(1)\r
123 #define ARP_HW_TYPE_IB          CL_HTON16(32)\r
124 \r
125 #define ARP_OP_REQ                      CL_HTON16(1)\r
126 #define ARP_OP_REP                      CL_HTON16(2)\r
127 \r
128 \r
129 #include <complib/cl_packon.h>\r
130 /****s* IB Network Drivers/arp_pkt_t\r
131 * NAME\r
132 *       arp_pkt_t\r
133 *\r
134 * DESCRIPTION\r
135 *       Defines the ARP packet for IP packets.\r
136 *\r
137 * SYNOPSIS\r
138 */\r
139 typedef struct _arp_pkt\r
140 {\r
141         net16_t         hw_type;\r
142         net16_t         prot_type;\r
143         uint8_t         hw_size;\r
144         uint8_t         prot_size;\r
145         net16_t         op;\r
146         mac_addr_t      src_hw;\r
147         net32_t         src_ip;\r
148         mac_addr_t      dst_hw;\r
149         net32_t         dst_ip;\r
150 \r
151 }       PACK_SUFFIX arp_pkt_t;\r
152 /*\r
153 * FIELDS\r
154 *       hw_type\r
155 *               Hardware type\r
156 *\r
157 *       prot_type\r
158 *               Protocol type.  See ETH_PROT_TYPE_XXX definitions.\r
159 *\r
160 *       hw_size\r
161 *               Size of the hardware address\r
162 *\r
163 *       prot_size\r
164 *               Size of the protocol address\r
165 *\r
166 *       op\r
167 *               ARP operation\r
168 *\r
169 *       src_hw\r
170 *               Source HW (MAC) address\r
171 *\r
172 *       src_ip\r
173 *               Source IP address\r
174 *\r
175 *       dst_hw\r
176 *               Destination HW (MAC) address\r
177 *\r
178 *       dst_ip\r
179 *               Destination IP address\r
180 *\r
181 * NOTES\r
182 *       The HW_ADDR_LEN value must be defined before including this header in order\r
183 *       to support various MAC address lengths.\r
184 *\r
185 * SEE ALSO\r
186 *       IB Network Drivers, eth_hdr_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
187 *********/\r
188 #include <complib/cl_packoff.h>\r
189 \r
190 \r
191 #define IP_PROT_IP                      4\r
192 #define IP_PROT_TCP                     6\r
193 #define IP_PROT_UDP                     17\r
194 \r
195 \r
196 #include <complib/cl_packon.h>\r
197 /****s* IB Network Drivers/ip_hdr_t\r
198 * NAME\r
199 *       ip_hdr_t\r
200 *\r
201 * DESCRIPTION\r
202 *       Defines the IP header for IP packets.\r
203 *\r
204 * SYNOPSIS\r
205 */\r
206 typedef struct _ip_hdr\r
207 {\r
208         uint8_t         ver_hl;\r
209         uint8_t         svc_type;\r
210         net16_t         length;\r
211         net16_t         id;\r
212         net16_t         offset;\r
213         uint8_t         ttl;\r
214         uint8_t         prot;\r
215         net16_t         chksum;\r
216         net32_t         src_ip;\r
217         net32_t         dst_ip;\r
218 \r
219 }       PACK_SUFFIX ip_hdr_t;\r
220 /*\r
221 * FIELDS\r
222 *       ver_hl\r
223 *               Header version and length.\r
224 *\r
225 *       svc_type\r
226 *               Service type.\r
227 *\r
228 *       length\r
229 *               Total length.\r
230 *\r
231 *       id\r
232 *               Packet identification.\r
233 *\r
234 *       offset\r
235 *               Fragment offset.\r
236 *\r
237 *       ttl\r
238 *               Time to live.\r
239 *\r
240 *       prot\r
241 *               Protocol.\r
242 *\r
243 *       chksum\r
244 *               Checksum.\r
245 *\r
246 *       src_ip\r
247 *               Source IP address\r
248 *\r
249 *       dst_ip\r
250 *               Destination IP address\r
251 *\r
252 * SEE ALSO\r
253 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, tcp_hdr_t, udp_hdr_t\r
254 *********/\r
255 #include <complib/cl_packoff.h>\r
256 \r
257 \r
258 #include <complib/cl_packon.h>\r
259 /****s* IB Network Drivers/tcp_hdr_t\r
260 * NAME\r
261 *       tcp_hdr_t\r
262 *\r
263 * DESCRIPTION\r
264 *       Defines the IP header for IP packets.\r
265 *\r
266 * SYNOPSIS\r
267 */\r
268 typedef struct _tcp_hdr\r
269 {\r
270         net16_t         src_port;\r
271         net16_t         dst_port;\r
272         net32_t         seq_num;\r
273         net32_t         ack_num;\r
274         uint8_t         offset;\r
275         uint8_t         flags;\r
276         net16_t         window;\r
277         net16_t         chksum;\r
278         net16_t         urp;\r
279 \r
280 }       PACK_SUFFIX tcp_hdr_t;\r
281 /*\r
282 * FIELDS\r
283 *       src_port\r
284 *               Source port.\r
285 *\r
286 *       dst_port\r
287 *               Destination port.\r
288 *\r
289 *       seq_num\r
290 *               Sequence number.\r
291 *\r
292 *       ack_num\r
293 *               Acknowledge number.\r
294 *\r
295 *       offset\r
296 *               data offset.\r
297 *\r
298 *       flags\r
299 *               TCP flags.\r
300 *\r
301 *       window\r
302 *               Window number.\r
303 *\r
304 *       chksum\r
305 *               Checksum.\r
306 *\r
307 *       urp\r
308 *               Urgent pointer.\r
309 *\r
310 * SEE ALSO\r
311 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
312 *********/\r
313 #include <complib/cl_packoff.h>\r
314 \r
315 \r
316 #include <complib/cl_packon.h>\r
317 /****s* IB Network Drivers/udp_hdr_t\r
318 * NAME\r
319 *       udp_hdr_t\r
320 *\r
321 * DESCRIPTION\r
322 *       Defines the IP header for IP packets.\r
323 *\r
324 * SYNOPSIS\r
325 */\r
326 typedef struct _udp_hdr\r
327 {\r
328         net16_t         src_port;\r
329         net16_t         dst_port;\r
330         net16_t         length;\r
331         net16_t         chksum;\r
332 \r
333 }       PACK_SUFFIX udp_hdr_t;\r
334 /*\r
335 * FIELDS\r
336 *       src_port\r
337 *               Source port.\r
338 *\r
339 *       dst_port\r
340 *               Destination port.\r
341 *\r
342 *       length\r
343 *               Length of datagram.\r
344 *\r
345 *       chksum\r
346 *               Checksum.\r
347 *\r
348 * SEE ALSO\r
349 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
350 *********/\r
351 #include <complib/cl_packoff.h>\r
352 \r
353 \r
354 #define DHCP_PORT_SERVER                CL_HTON16(67)\r
355 #define DHCP_PORT_CLIENT                CL_HTON16(68)\r
356 \r
357 #define DHCP_REQUEST                    1\r
358 #define DHCP_REPLY                              2\r
359 #define DHCP_HW_TYPE_ETH                1\r
360 #define DHCP_HW_TYPE_IB                 32\r
361 #define DHCP_OPT_PAD                    0\r
362 #define DHCP_OPT_END                    255\r
363 #define DHCP_OPT_MSG                    53\r
364 #define DHCP_OPT_CLIENT_ID              61\r
365 \r
366 #define DHCPDISCOVER                    1\r
367 #define DHCPOFFER                               2\r
368 #define DHCPREQUEST                             3\r
369 #define DHCPDECLINE                             4\r
370 #define DHCPACK                                 5\r
371 #define DHCPNAK                                 6\r
372 #define DHCPRELEASE                             7\r
373 #define DHCPINFORM                              8\r
374 \r
375 #define DHCP_FLAGS_BROADCAST    CL_HTON16(0x8000)\r
376 #define DHCP_COOKIE                             0x63538263\r
377 #define DHCP_OPTIONS_SIZE               312\r
378 #define DHCP_COOKIE_SIZE                4\r
379 \r
380 \r
381 /* Minimum DHCP size is without options (but with 4-byte magic cookie). */\r
382 #define DHCP_MIN_SIZE                   (sizeof(dhcp_pkt_t) + DHCP_COOKIE_SIZE - DHCP_OPTIONS_SIZE )\r
383 \r
384 #include <complib/cl_packon.h>\r
385 /****s* IB Network Drivers/dhcp_pkt_t\r
386 * NAME\r
387 *       dhcp_pkt_t\r
388 *\r
389 * DESCRIPTION\r
390 *       Defines the DHCP packet format as documented in RFC 2131\r
391 *       http://www.zvon.org/tmRFC/RFC2131/Output/index.html\r
392 *\r
393 * SYNOPSIS\r
394 */\r
395 typedef struct _dhcp_pkt\r
396 {\r
397         uint8_t         op;\r
398         uint8_t         htype;\r
399         uint8_t         hlen;\r
400         uint8_t         hops;\r
401         net32_t         xid;\r
402         net16_t         secs;\r
403         net16_t         flags;\r
404         net32_t         ciaddr;\r
405         net32_t         yiaddr;\r
406         net32_t         siaddr;\r
407         net32_t         giaddr;\r
408         uint8_t         chaddr[16];\r
409         uint8_t         sname[64];\r
410         uint8_t         file[128];\r
411         uint8_t         options[312];\r
412 \r
413 }       PACK_SUFFIX dhcp_pkt_t;\r
414 /*\r
415 * SEE ALSO\r
416 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
417 *********/\r
418 #include <complib/cl_packoff.h>\r
419 \r
420 \r
421 #include <complib/cl_packon.h>\r
422 typedef struct _udp_pkt\r
423 {\r
424         udp_hdr_t       hdr;\r
425         dhcp_pkt_t      dhcp;\r
426 \r
427 }       PACK_SUFFIX udp_pkt_t;\r
428 \r
429 typedef struct _ip_pkt\r
430 {\r
431         ip_hdr_t                hdr;\r
432         union _ip_payload\r
433         {\r
434                 tcp_hdr_t       tcp;\r
435                 udp_pkt_t       udp;\r
436 \r
437         }       PACK_SUFFIX prot;\r
438 \r
439 }       PACK_SUFFIX ip_pkt_t;\r
440 \r
441 typedef struct _eth_pkt\r
442 {\r
443         eth_hdr_t       hdr;\r
444         union _eth_payload\r
445         {\r
446                 arp_pkt_t       arp;\r
447                 ip_pkt_t        ip;\r
448 \r
449         }       PACK_SUFFIX type;\r
450 \r
451 }       PACK_SUFFIX eth_pkt_t;\r
452 #include <complib/cl_packoff.h>\r
453 \r
454 \r
455 #endif  /* _IP_PACKET_H_ */\r