VirtualBox

source: vbox/trunk/include/iprt/net.h@ 48418

Last change on this file since 48418 was 45716, checked in by vboxsync, 12 years ago

IntNet: Integration of wireless IPv6 support patch + unicast ND solicitation fix + 32-bit compile fix + formatting (#3060)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.8 KB
Line 
1/** @file
2 * IPRT - Network Protocols.
3 */
4
5/*
6 * Copyright (C) 2008-2013 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_net_h
27#define ___iprt_net_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31#include <iprt/assert.h>
32
33
34RT_C_DECLS_BEGIN
35
36/** @defgroup grp_rt_net RTNet - Network Protocols
37 * @ingroup grp_rt
38 * @{
39 */
40
41/**
42 * IPv4 address.
43 */
44typedef RTUINT32U RTNETADDRIPV4;
45AssertCompileSize(RTNETADDRIPV4, 4);
46/** Pointer to a IPv4 address. */
47typedef RTNETADDRIPV4 *PRTNETADDRIPV4;
48/** Pointer to a const IPv4 address. */
49typedef RTNETADDRIPV4 const *PCRTNETADDRIPV4;
50
51/**
52 * Tests if the given string is an IPv4 address.
53 *
54 * @returns boolean.
55 * @param pszAddress String which may be an IPv4 address.
56 */
57RTDECL(bool) RTNetIsIPv4AddrStr(const char *pszAddress);
58
59/**
60 * Converts an stringified IPv4 address into the RTNETADDRIPV4 representation.
61 *
62 * @returns VINF_SUCCESS on success, VERR_INVALID_PARAMETER on
63 * failure.
64 *
65 * @param pszAddr The value to convert.
66 * @param pAddr Where to store the result.
67 */
68RTDECL(int) RTNetStrToIPv4Addr(const char *pszAddr, PRTNETADDRIPV4 pAddr);
69
70
71/**
72 * IPv6 address.
73 */
74typedef RTUINT128U RTNETADDRIPV6;
75AssertCompileSize(RTNETADDRIPV6, 16);
76/** Pointer to a IPv6 address. */
77typedef RTNETADDRIPV6 *PRTNETADDRIPV6;
78/** Pointer to a const IPv6 address. */
79typedef RTNETADDRIPV6 const *PCRTNETADDRIPV6;
80
81/**
82 * Tests if the given string is a valid IPv6 address.
83 *
84 * @returns @c true if it is, @c false if not.
85 * @param pszAddress String which may be an IPv6 address.
86 */
87RTDECL(bool) RTNetIsIPv6AddrStr(const char *pszAddress);
88
89
90/**
91 * IPX address.
92 */
93#pragma pack(1)
94typedef struct RTNETADDRIPX
95{
96 /** The network ID. */
97 uint32_t Network;
98 /** The node ID. (Defaults to the MAC address apparently.) */
99 RTMAC Node;
100} RTNETADDRIPX;
101#pragma pack()
102AssertCompileSize(RTNETADDRIPX, 4+6);
103/** Pointer to an IPX address. */
104typedef RTNETADDRIPX *PRTNETADDRIPX;
105/** Pointer to a const IPX address. */
106typedef RTNETADDRIPX const *PCRTNETADDRIPX;
107
108/**
109 * Network address union.
110 *
111 * @remarks The size of this structure may change in the future.
112 */
113typedef union RTNETADDRU
114{
115 /** 64-bit view. */
116 uint64_t au64[2];
117 /** 32-bit view. */
118 uint32_t au32[4];
119 /** 16-bit view. */
120 uint16_t au16[8];
121 /** 8-bit view. */
122 uint8_t au8[16];
123 /** IPv4 view. */
124 RTNETADDRIPV4 IPv4;
125#ifndef IPv6 /* Work around X11 and RDP defining IPv6 to 1. */
126 /** IPv6 view. */
127 RTNETADDRIPV6 IPv6;
128#endif
129 /** IPX view. */
130 RTNETADDRIPX Ipx;
131 /** MAC address view. */
132 RTMAC Mac;
133} RTNETADDRU;
134AssertCompileSize(RTNETADDRU, 16);
135/** Pointer to an address union. */
136typedef RTNETADDRU *PRTNETADDRU;
137/** Pointer to a const address union. */
138typedef RTNETADDRU const *PCRTNETADDRU;
139
140/**
141 * Network address type.
142 *
143 * @remarks The value assignments may change in the future.
144 */
145typedef enum RTNETADDRTYPE
146{
147 /** The invalid 0 entry. */
148 RTNETADDRTYPE_INVALID = 0,
149 /** IP version 4. */
150 RTNETADDRTYPE_IPV4,
151 /** IP version 6. */
152 RTNETADDRTYPE_IPV6,
153 /** IPX. */
154 RTNETADDRTYPE_IPX,
155 /** MAC address. */
156 RTNETADDRTYPE_MAC,
157 /** The end of the valid values. */
158 RTNETADDRTYPE_END,
159 /** The usual 32-bit hack. */
160 RTNETADDRTYPE_32_BIT_HACK = 0x7fffffff
161} RTNETADDRTYPE;
162/** Pointer to a network address type. */
163typedef RTNETADDRTYPE *PRTNETADDRTYPE;
164/** Pointer to a const network address type. */
165typedef RTNETADDRTYPE const *PCRTNETADDRTYPE;
166
167/**
168 * Network address.
169 *
170 * @remarks The size and type values may change.
171 */
172typedef struct RTNETADDR
173{
174 /** The address union. */
175 RTNETADDRU uAddr;
176 /** Indicates which view of @a u that is valid. */
177 RTNETADDRTYPE enmType;
178 /** The port number for IPv4 and IPv6 addresses. This is set to
179 * RTNETADDR_NA_PORT if not applicable. */
180 uint32_t uPort;
181} RTNETADDR;
182/** Pointer to a network address. */
183typedef RTNETADDR *PRTNETADDR;
184/** Pointer to a const network address. */
185typedef RTNETADDR const *PCRTNETADDR;
186
187/** The not applicable value of RTNETADDR::uPort value use to inid. */
188#define RTNETADDR_PORT_NA UINT32_MAX
189
190/**
191 * Ethernet header.
192 */
193#pragma pack(1)
194typedef struct RTNETETHERHDR
195{
196 RTMAC DstMac;
197 RTMAC SrcMac;
198 /** Ethernet frame type or frame size, depending on the kind of ethernet.
199 * This is big endian on the wire. */
200 uint16_t EtherType;
201} RTNETETHERHDR;
202#pragma pack()
203AssertCompileSize(RTNETETHERHDR, 14);
204/** Pointer to an ethernet header. */
205typedef RTNETETHERHDR *PRTNETETHERHDR;
206/** Pointer to a const ethernet header. */
207typedef RTNETETHERHDR const *PCRTNETETHERHDR;
208
209/** @name EtherType (RTNETETHERHDR::EtherType)
210 * @{ */
211#define RTNET_ETHERTYPE_IPV4 UINT16_C(0x0800)
212#define RTNET_ETHERTYPE_ARP UINT16_C(0x0806)
213#define RTNET_ETHERTYPE_IPV6 UINT16_C(0x86dd)
214#define RTNET_ETHERTYPE_VLAN UINT16_C(0x8100)
215#define RTNET_ETHERTYPE_IPX_1 UINT16_C(0x8037)
216#define RTNET_ETHERTYPE_IPX_2 UINT16_C(0x8137)
217#define RTNET_ETHERTYPE_IPX_3 UINT16_C(0x8138)
218/** @} */
219
220
221/**
222 * IPv4 header.
223 * All is bigendian on the wire.
224 */
225#pragma pack(1)
226typedef struct RTNETIPV4
227{
228#ifdef RT_BIG_ENDIAN
229 unsigned int ip_v : 4;
230 unsigned int ip_hl : 4;
231 unsigned int ip_tos : 8;
232 unsigned int ip_len : 16;
233#else
234 /** 00:0 - Header length given as a 32-bit word count. */
235 unsigned int ip_hl : 4;
236 /** 00:4 - Header version. */
237 unsigned int ip_v : 4;
238 /** 01 - Type of service. */
239 unsigned int ip_tos : 8;
240 /** 02 - Total length (header + data). */
241 unsigned int ip_len : 16;
242#endif
243 /** 04 - Packet idenficiation. */
244 uint16_t ip_id;
245 /** 06 - Offset if fragmented. */
246 uint16_t ip_off;
247 /** 08 - Time to live. */
248 uint8_t ip_ttl;
249 /** 09 - Protocol. */
250 uint8_t ip_p;
251 /** 0a - Header check sum. */
252 uint16_t ip_sum;
253 /** 0c - Source address. */
254 RTNETADDRIPV4 ip_src;
255 /** 10 - Destination address. */
256 RTNETADDRIPV4 ip_dst;
257 /** 14 - Options (optional). */
258 uint32_t ip_options[1];
259} RTNETIPV4;
260#pragma pack()
261AssertCompileSize(RTNETIPV4, 6 * 4);
262/** Pointer to a IPv4 header. */
263typedef RTNETIPV4 *PRTNETIPV4;
264/** Pointer to a const IPv4 header. */
265typedef RTNETIPV4 const *PCRTNETIPV4;
266
267/** The minimum IPv4 header length (in bytes).
268 * Up to and including RTNETIPV4::ip_dst. */
269#define RTNETIPV4_MIN_LEN (20)
270
271
272/** @name IPv4 Protocol Numbers
273 * @{ */
274/** IPv4: ICMP */
275#define RTNETIPV4_PROT_ICMP (1)
276/** IPv4: TCP */
277#define RTNETIPV4_PROT_TCP (6)
278/** IPv4: UDP */
279#define RTNETIPV4_PROT_UDP (17)
280/** @} */
281
282/** @name Common IPv4 Port Assignments
283 * @{
284 */
285/** Boostrap Protocol / DHCP) Server. */
286#define RTNETIPV4_PORT_BOOTPS (67)
287/** Boostrap Protocol / DHCP) Client. */
288#define RTNETIPV4_PORT_BOOTPC (68)
289/** @} */
290
291/** @name IPv4 Flags
292 * @{ */
293/** IPv4: Don't fragment */
294#define RTNETIPV4_FLAGS_DF (0x4000)
295/** IPv4: More fragments */
296#define RTNETIPV4_FLAGS_MF (0x2000)
297/** @} */
298
299RTDECL(uint16_t) RTNetIPv4HdrChecksum(PCRTNETIPV4 pIpHdr);
300RTDECL(bool) RTNetIPv4IsHdrValid(PCRTNETIPV4 pIpHdr, size_t cbHdrMax, size_t cbPktMax, bool fChecksum);
301RTDECL(uint32_t) RTNetIPv4PseudoChecksum(PCRTNETIPV4 pIpHdr);
302RTDECL(uint32_t) RTNetIPv4PseudoChecksumBits(RTNETADDRIPV4 SrcAddr, RTNETADDRIPV4 DstAddr, uint8_t bProtocol, uint16_t cbPkt);
303RTDECL(uint32_t) RTNetIPv4AddDataChecksum(void const *pvData, size_t cbData, uint32_t u32Sum, bool *pfOdd);
304RTDECL(uint16_t) RTNetIPv4FinalizeChecksum(uint32_t u32Sum);
305
306
307/**
308 * IPv6 header.
309 * All is bigendian on the wire.
310 */
311#pragma pack(1)
312typedef struct RTNETIPV6
313{
314 /** Version (4 bits), Traffic Class (8 bits) and Flow Lable (20 bits).
315 * @todo this is probably mislabeled - ip6_flow vs. ip6_vfc, fix later. */
316 uint32_t ip6_vfc;
317 /** 04 - Payload length, including extension headers. */
318 uint16_t ip6_plen;
319 /** 06 - Next header type (RTNETIPV4_PROT_XXX). */
320 uint8_t ip6_nxt;
321 /** 07 - Hop limit. */
322 uint8_t ip6_hlim;
323 /** xx - Source address. */
324 RTNETADDRIPV6 ip6_src;
325 /** xx - Destination address. */
326 RTNETADDRIPV6 ip6_dst;
327} RTNETIPV6;
328#pragma pack()
329AssertCompileSize(RTNETIPV6, 8 + 16 + 16);
330/** Pointer to a IPv6 header. */
331typedef RTNETIPV6 *PRTNETIPV6;
332/** Pointer to a const IPv6 header. */
333typedef RTNETIPV6 const *PCRTNETIPV6;
334
335/** The minimum IPv6 header length (in bytes).
336 * Up to and including RTNETIPV6::ip6_dst. */
337#define RTNETIPV6_MIN_LEN (40)
338#define RTNETIPV6_ICMPV6_ND_WITH_LLA_OPT_MIN_LEN (32)
339
340RTDECL(uint32_t) RTNetIPv6PseudoChecksum(PCRTNETIPV6 pIpHdr);
341RTDECL(uint32_t) RTNetIPv6PseudoChecksumEx(PCRTNETIPV6 pIpHdr, uint8_t bProtocol, uint16_t cbPkt);
342RTDECL(uint32_t) RTNetIPv6PseudoChecksumBits(PCRTNETADDRIPV6 pSrcAddr, PCRTNETADDRIPV6 pDstAddr,
343 uint8_t bProtocol, uint16_t cbPkt);
344
345
346/**
347 * UDP header.
348 */
349#pragma pack(1)
350typedef struct RTNETUDP
351{
352 /** The source port. */
353 uint16_t uh_sport;
354 /** The destination port. */
355 uint16_t uh_dport;
356 /** The length of the UDP header and associated data. */
357 uint16_t uh_ulen;
358 /** The checksum of the pseudo header, the UDP header and the data. */
359 uint16_t uh_sum;
360} RTNETUDP;
361#pragma pack()
362AssertCompileSize(RTNETUDP, 8);
363/** Pointer to an UDP header. */
364typedef RTNETUDP *PRTNETUDP;
365/** Pointer to a const UDP header. */
366typedef RTNETUDP const *PCRTNETUDP;
367
368/** The minimum UDP packet length (in bytes). (RTNETUDP::uh_ulen) */
369#define RTNETUDP_MIN_LEN (8)
370
371RTDECL(uint16_t) RTNetUDPChecksum(uint32_t u32Sum, PCRTNETUDP pUdpHdr);
372RTDECL(uint32_t) RTNetIPv4AddUDPChecksum(PCRTNETUDP pUdpHdr, uint32_t u32Sum);
373RTDECL(uint16_t) RTNetIPv4UDPChecksum(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, void const *pvData);
374RTDECL(bool) RTNetIPv4IsUDPSizeValid(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, size_t cbPktMax);
375RTDECL(bool) RTNetIPv4IsUDPValid(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, void const *pvData, size_t cbPktMax, bool fChecksum);
376
377
378/**
379 * IPv4 BOOTP / DHCP packet.
380 */
381#pragma pack(1)
382typedef struct RTNETBOOTP
383{
384 /** 00 - The packet opcode (RTNETBOOTP_OP_*). */
385 uint8_t bp_op;
386 /** 01 - Hardware address type. Same as RTNETARPHDR::ar_htype. */
387 uint8_t bp_htype;
388 /** 02 - Hardware address length. */
389 uint8_t bp_hlen;
390 /** 03 - Gateway hops. */
391 uint8_t bp_hops;
392 /** 04 - Transaction ID. */
393 uint32_t bp_xid;
394 /** 08 - Seconds since boot started. */
395 uint16_t bp_secs;
396 /** 0a - Unused (BOOTP) / Flags (DHCP) (RTNET_DHCP_FLAGS_*). */
397 uint16_t bp_flags;
398 /** 0c - Client IPv4 address. */
399 RTNETADDRIPV4 bp_ciaddr;
400 /** 10 - Your IPv4 address. */
401 RTNETADDRIPV4 bp_yiaddr;
402 /** 14 - Server IPv4 address. */
403 RTNETADDRIPV4 bp_siaddr;
404 /** 18 - Gateway IPv4 address. */
405 RTNETADDRIPV4 bp_giaddr;
406 /** 1c - Client hardware address. */
407 union
408 {
409 uint8_t au8[16];
410 RTMAC Mac;
411 } bp_chaddr;
412 /** 2c - Server name. */
413 uint8_t bp_sname[64];
414 /** 6c - File name / more DHCP options. */
415 uint8_t bp_file[128];
416 /** ec - Vendor specific area (BOOTP) / Options (DHCP).
417 * @remark This is really 312 bytes in the DHCP version. */
418 union
419 {
420 uint8_t au8[128];
421 struct DHCP
422 {
423 /** ec - The DHCP cookie (RTNET_DHCP_COOKIE). */
424 uint32_t dhcp_cookie;
425 /** f0 - The DHCP options. */
426 uint8_t dhcp_opts[124];
427 } Dhcp;
428 } bp_vend;
429
430} RTNETBOOTP;
431#pragma pack()
432AssertCompileSize(RTNETBOOTP, 0xec + 128);
433/** Pointer to a BOOTP / DHCP packet. */
434typedef RTNETBOOTP *PRTNETBOOTP;
435/** Pointer to a const BOOTP / DHCP packet. */
436typedef RTNETBOOTP const *PCRTNETBOOTP;
437
438/** Minimum BOOTP packet length. For quick validation, no standard thing really. */
439#define RTNETBOOTP_MIN_LEN 0xec
440/** Minimum DHCP packet length. For quick validation, no standard thing really. */
441#define RTNETBOOTP_DHCP_MIN_LEN 0xf1
442
443/** The normal size of the a DHCP packet (i.e. a RTNETBOOTP).
444 * Same as RTNET_DHCP_OPT_SIZE, just expressed differently. */
445#define RTNET_DHCP_NORMAL_SIZE (0xec + 4 + RTNET_DHCP_OPT_SIZE)
446/** The normal size of RTNETBOOTP::bp_vend::Dhcp::dhcp_opts. */
447#define RTNET_DHCP_OPT_SIZE (312 - 4)
448
449/** @name BOOTP packet opcode values
450 * @{ */
451#define RTNETBOOTP_OP_REQUEST 1
452#define RTNETBOOTP_OP_REPLY 2
453/** @} */
454
455/** @name DHCP flags (RTNETBOOTP::bp_flags)
456 * @{ */
457#define RTNET_DHCP_FLAGS_NO_BROADCAST UINT16_C(0x8000) /** @todo check test!!! */
458/** @} */
459
460/** The DHCP cookie (network endian). */
461#define RTNET_DHCP_COOKIE UINT32_C(0x63825363)
462
463/**
464 * An IPv4 DHCP option header.
465 */
466typedef struct RTNETDHCPOPT
467{
468 /** 00 - The DHCP option. */
469 uint8_t dhcp_opt;
470 /** 01 - The data length (excluding this header). */
471 uint8_t dhcp_len;
472 /* 02 - The option data follows here, optional and of variable length. */
473} RTNETDHCPOPT;
474AssertCompileSize(RTNETDHCPOPT, 2);
475/** Pointer to a DHCP option header. */
476typedef RTNETDHCPOPT *PRTNETDHCPOPT;
477/** Pointer to a const DHCP option header. */
478typedef RTNETDHCPOPT const *PCRTNETDHCPOPT;
479
480/** @name DHCP options
481 * @{ */
482/** 1 byte padding, this has no dhcp_len field. */
483#define RTNET_DHCP_OPT_PAD 0
484
485/** The subnet mask. */
486#define RTNET_DHCP_OPT_SUBNET_MASK 1
487/** The time offset. */
488#define RTNET_DHCP_OPT_TIME_OFFSET 2
489/** The routers for the subnet. */
490#define RTNET_DHCP_OPT_ROUTERS 3
491/** Domain Name Server. */
492#define RTNET_DHCP_OPT_DNS 6
493/** Host name. */
494#define RTNET_DHCP_OPT_HOST_NAME 12
495/** Domain name. */
496#define RTNET_DHCP_OPT_DOMAIN_NAME 15
497
498/** The requested address. */
499#define RTNET_DHCP_OPT_REQ_ADDR 50
500/** The lease time in seconds. */
501#define RTNET_DHCP_OPT_LEASE_TIME 51
502/** Option overload.
503 * Indicates that the bp_file and/or bp_sname holds contains DHCP options. */
504#define RTNET_DHCP_OPT_OPTION_OVERLOAD 52
505/** Have a 8-bit message type value as data, see RTNET_DHCP_MT_*. */
506#define RTNET_DHCP_OPT_MSG_TYPE 53
507/** Server ID. */
508#define RTNET_DHCP_OPT_SERVER_ID 54
509/** Parameter request list. */
510#define RTNET_DHCP_OPT_PARAM_REQ_LIST 55
511/** The maximum DHCP message size a client is willing to accept. */
512#define RTNET_DHCP_OPT_MAX_DHCP_MSG_SIZE 57
513/** Client ID. */
514#define RTNET_DHCP_OPT_CLIENT_ID 61
515/** TFTP server name. */
516#define RTNET_DHCP_OPT_TFTP_SERVER_NAME 66
517/** Bootfile name. */
518#define RTNET_DHCP_OPT_BOOTFILE_NAME 67
519
520/** Marks the end of the DHCP options, this has no dhcp_len field. */
521#define RTNET_DHCP_OPT_END 255
522/** @} */
523
524/** @name DHCP Message Types (option 53)
525 * @{ */
526#define RTNET_DHCP_MT_DISCOVER 1
527#define RTNET_DHCP_MT_OFFER 2
528#define RTNET_DHCP_MT_REQUEST 3
529#define RTNET_DHCP_MT_DECLINE 4
530#define RTNET_DHCP_MT_ACK 5
531#define RTNET_DHCP_MT_NAC 6
532#define RTNET_DHCP_MT_RELEASE 7
533#define RTNET_DHCP_MT_INFORM 8
534/** @} */
535
536/** @name DHCP Flags
537 * @{ */
538#define RTNET_DHCP_FLAG_BROADCAST 0x8000
539/** @} */
540
541RTDECL(bool) RTNetIPv4IsDHCPValid(PCRTNETUDP pUdpHdr, PCRTNETBOOTP pDhcp, size_t cbDhcp, uint8_t *pMsgType);
542
543
544/**
545 * IPv4 DHCP packet.
546 * @deprecated Use RTNETBOOTP.
547 */
548#pragma pack(1)
549typedef struct RTNETDHCP
550{
551 /** 00 - The packet opcode. */
552 uint8_t Op;
553 /** Hardware address type. */
554 uint8_t HType;
555 /** Hardware address length. */
556 uint8_t HLen;
557 uint8_t Hops;
558 uint32_t XID;
559 uint16_t Secs;
560 uint16_t Flags;
561 /** Client IPv4 address. */
562 RTNETADDRIPV4 CIAddr;
563 /** Your IPv4 address. */
564 RTNETADDRIPV4 YIAddr;
565 /** Server IPv4 address. */
566 RTNETADDRIPV4 SIAddr;
567 /** Gateway IPv4 address. */
568 RTNETADDRIPV4 GIAddr;
569 /** Client hardware address. */
570 uint8_t CHAddr[16];
571 /** Server name. */
572 uint8_t SName[64];
573 uint8_t File[128];
574 uint8_t abMagic[4];
575 uint8_t DhcpOpt;
576 uint8_t DhcpLen; /* 1 */
577 uint8_t DhcpReq;
578 uint8_t abOptions[57];
579} RTNETDHCP;
580#pragma pack()
581/** @todo AssertCompileSize(RTNETDHCP, ); */
582/** Pointer to a DHCP packet. */
583typedef RTNETDHCP *PRTNETDHCP;
584/** Pointer to a const DHCP packet. */
585typedef RTNETDHCP const *PCRTNETDHCP;
586
587
588/**
589 * TCP packet.
590 */
591#pragma pack(1)
592typedef struct RTNETTCP
593{
594 /** 00 - The source port. */
595 uint16_t th_sport;
596 /** 02 - The destination port. */
597 uint16_t th_dport;
598 /** 04 - The sequence number. */
599 uint32_t th_seq;
600 /** 08 - The acknowledgement number. */
601 uint32_t th_ack;
602#ifdef RT_BIG_ENDIAN
603 unsigned int th_win : 16;
604 unsigned int th_flags : 8;
605 unsigned int th_off : 4;
606 unsigned int th_x2 : 4;
607#else
608 /** 0c:0 - Reserved. */
609 unsigned int th_x2 : 4;
610 /** 0c:4 - The data offset given as a dword count from the start of this header. */
611 unsigned int th_off : 4;
612 /** 0d - flags. */
613 unsigned int th_flags : 8;
614 /** 0e - The window. */
615 unsigned int th_win : 16;
616#endif
617 /** 10 - The checksum of the pseudo header, the TCP header and the data. */
618 uint16_t th_sum;
619 /** 12 - The urgent pointer. */
620 uint16_t th_urp;
621 /* (options follows here and then the data (aka text).) */
622} RTNETTCP;
623#pragma pack()
624AssertCompileSize(RTNETTCP, 20);
625/** Pointer to a TCP packet. */
626typedef RTNETTCP *PRTNETTCP;
627/** Pointer to a const TCP packet. */
628typedef RTNETTCP const *PCRTNETTCP;
629
630/** The minimum TCP header length (in bytes). (RTNETTCP::th_off * 4) */
631#define RTNETTCP_MIN_LEN (20)
632
633/** @name TCP flags (RTNETTCP::th_flags)
634 * @{ */
635#define RTNETTCP_F_FIN 0x01
636#define RTNETTCP_F_SYN 0x02
637#define RTNETTCP_F_RST 0x04
638#define RTNETTCP_F_PSH 0x08
639#define RTNETTCP_F_ACK 0x10
640#define RTNETTCP_F_URG 0x20
641#define RTNETTCP_F_ECE 0x40
642#define RTNETTCP_F_CWR 0x80
643/** @} */
644
645RTDECL(uint16_t) RTNetTCPChecksum(uint32_t u32Sum, PCRTNETTCP pTcpHdr, void const *pvData, size_t cbData);
646RTDECL(uint32_t) RTNetIPv4AddTCPChecksum(PCRTNETTCP pTcpHdr, uint32_t u32Sum);
647RTDECL(uint16_t) RTNetIPv4TCPChecksum(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, void const *pvData);
648RTDECL(bool) RTNetIPv4IsTCPSizeValid(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, size_t cbHdrMax, size_t cbPktMax);
649RTDECL(bool) RTNetIPv4IsTCPValid(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, size_t cbHdrMax, void const *pvData,
650 size_t cbPktMax, bool fChecksum);
651
652
653/**
654 * IPv4 ICMP packet header.
655 */
656#pragma pack(1)
657typedef struct RTNETICMPV4HDR
658{
659 /** 00 - The ICMP message type. */
660 uint8_t icmp_type;
661 /** 01 - Type specific code that further qualifies the message. */
662 uint8_t icmp_code;
663 /** 02 - Checksum of the ICMP message. */
664 uint16_t icmp_cksum;
665} RTNETICMPV4HDR;
666#pragma pack()
667AssertCompileSize(RTNETICMPV4HDR, 4);
668/** Pointer to an ICMP packet header. */
669typedef RTNETICMPV4HDR *PRTNETICMPV4HDR;
670/** Pointer to a const ICMP packet header. */
671typedef RTNETICMPV4HDR const *PCRTNETICMPV4HDR;
672
673/** @name ICMP (v4) message types.
674 * @{ */
675#define RTNETICMPV4_TYPE_ECHO_REPLY 0
676#define RTNETICMPV4_TYPE_ECHO_REQUEST 8
677#define RTNETICMPV4_TYPE_TRACEROUTE 30
678/** @} */
679
680/**
681 * IPv4 ICMP ECHO Reply & Request packet.
682 */
683#pragma pack(1)
684typedef struct RTNETICMPV4ECHO
685{
686 /** 00 - The ICMP header. */
687 RTNETICMPV4HDR Hdr;
688 /** 04 - The identifier to help the requestor match up the reply.
689 * Can be 0. Typically fixed value. */
690 uint16_t icmp_id;
691 /** 06 - The sequence number to help the requestor match up the reply.
692 * Can be 0. Typically incrementing between requests. */
693 uint16_t icmp_seq;
694 /** 08 - Variable length data that is to be returned unmodified in the reply. */
695 uint8_t icmp_data[1];
696} RTNETICMPV4ECHO;
697#pragma pack()
698AssertCompileSize(RTNETICMPV4ECHO, 9);
699/** Pointer to an ICMP ECHO packet. */
700typedef RTNETICMPV4ECHO *PRTNETICMPV4ECHO;
701/** Pointer to a const ICMP ECHO packet. */
702typedef RTNETICMPV4ECHO const *PCRTNETICMPV4ECHO;
703
704/**
705 * IPv4 ICMP TRACEROUTE packet.
706 * This is an reply to an IP packet with the traceroute option set.
707 */
708#pragma pack(1)
709typedef struct RTNETICMPV4TRACEROUTE
710{
711 /** 00 - The ICMP header. */
712 RTNETICMPV4HDR Hdr;
713 /** 04 - Identifier copied from the traceroute option's ID number. */
714 uint16_t icmp_id;
715 /** 06 - Unused. (Possibly an icmp_seq?) */
716 uint16_t icmp_void;
717 /** 08 - Outbound hop count. From the IP packet causing this message. */
718 uint16_t icmp_ohc;
719 /** 0a - Return hop count. From the IP packet causing this message. */
720 uint16_t icmp_rhc;
721 /** 0c - Output link speed, 0 if not known. */
722 uint32_t icmp_speed;
723 /** 10 - Output link MTU, 0 if not known. */
724 uint32_t icmp_mtu;
725} RTNETICMPV4TRACEROUTE;
726#pragma pack()
727AssertCompileSize(RTNETICMPV4TRACEROUTE, 20);
728/** Pointer to an ICMP TRACEROUTE packet. */
729typedef RTNETICMPV4TRACEROUTE *PRTNETICMPV4TRACEROUTE;
730/** Pointer to a const ICMP TRACEROUTE packet. */
731typedef RTNETICMPV4TRACEROUTE const *PCRTNETICMPV4TRACEROUTE;
732
733/** @todo add more ICMPv4 as needed. */
734
735/**
736 * IPv4 ICMP union packet.
737 */
738typedef union RTNETICMPV4
739{
740 RTNETICMPV4HDR Hdr;
741 RTNETICMPV4ECHO Echo;
742 RTNETICMPV4TRACEROUTE Traceroute;
743} RTNETICMPV4;
744/** Pointer to an ICMP union packet. */
745typedef RTNETICMPV4 *PRTNETICMPV4;
746/** Pointer to a const ICMP union packet. */
747typedef RTNETICMPV4 const *PCRTNETICMPV4;
748
749
750/** @todo add ICMPv6 when needed. */
751
752#define RTNETIPV6_PROT_ICMPV6 (58)
753#define RTNETIPV6_ICMPV6_CODE_0 (0)
754#define RTNETIPV6_ICMP_NS_TYPE (135)
755#define RTNETIPV6_ICMP_NA_TYPE (136)
756#define RTNETIPV6_ICMP_ND_SLLA_OPT (1)
757#define RTNETIPV6_ICMP_ND_TLLA_OPT (2)
758#define RTNETIPV6_ICMP_ND_LLA_LEN (1)
759
760/** ICMPv6 ND Source Link Layer Address option */
761#pragma pack(1)
762typedef struct RTNETNDP_SLLA_OPT
763{
764 uint8_t type;
765 uint8_t len;
766 RTMAC slla;
767} RTNETNDP_SLLA_OPT;
768#pragma pack()
769
770AssertCompileSize(RTNETNDP_SLLA_OPT, 1+1+6);
771
772typedef RTNETNDP_SLLA_OPT *PRTNETNDP_SLLA_OPT;
773typedef RTNETNDP_SLLA_OPT const *PCRTNETNDP_SLLA_OPT;
774
775/** ICMPv6 ND Neighbor Sollicitation */
776#pragma pack(1)
777typedef struct RTNETNDP
778{
779 /** ICMPv6 type. */
780 uint8_t icmp6_type;
781 /** ICMPv6 code. */
782 uint8_t icmp6_code;
783 /** ICMPv6 checksum */
784 uint16_t icmp6_cksum;
785 /** reserved */
786 uint32_t reserved;
787 /** target address */
788 RTNETADDRIPV6 target_address;
789} RTNETNDP;
790#pragma pack()
791AssertCompileSize(RTNETNDP, 1+1+2+4+16);
792/** Pointer to a NDP ND packet. */
793typedef RTNETNDP *PRTNETNDP;
794/** Pointer to a const NDP NS packet. */
795typedef RTNETNDP const *PCRTNETNDP;
796
797
798/**
799 * Ethernet ARP header.
800 */
801#pragma pack(1)
802typedef struct RTNETARPHDR
803{
804 /** The hardware type. */
805 uint16_t ar_htype;
806 /** The protocol type (ethertype). */
807 uint16_t ar_ptype;
808 /** The hardware address length. */
809 uint8_t ar_hlen;
810 /** The protocol address length. */
811 uint8_t ar_plen;
812 /** The operation. */
813 uint16_t ar_oper;
814} RTNETARPHDR;
815#pragma pack()
816AssertCompileSize(RTNETARPHDR, 8);
817/** Pointer to an ethernet ARP header. */
818typedef RTNETARPHDR *PRTNETARPHDR;
819/** Pointer to a const ethernet ARP header. */
820typedef RTNETARPHDR const *PCRTNETARPHDR;
821
822/** ARP hardware type - ethernet. */
823#define RTNET_ARP_ETHER UINT16_C(1)
824
825/** @name ARP operations
826 * @{ */
827#define RTNET_ARPOP_REQUEST UINT16_C(1) /**< Request hardware address given a protocol address (ARP). */
828#define RTNET_ARPOP_REPLY UINT16_C(2)
829#define RTNET_ARPOP_REVREQUEST UINT16_C(3) /**< Request protocol address given a hardware address (RARP). */
830#define RTNET_ARPOP_REVREPLY UINT16_C(4)
831#define RTNET_ARPOP_INVREQUEST UINT16_C(8) /**< Inverse ARP. */
832#define RTNET_ARPOP_INVREPLY UINT16_C(9)
833/** Check if an ARP operation is a request or not. */
834#define RTNET_ARPOP_IS_REQUEST(Op) ((Op) & 1)
835/** Check if an ARP operation is a reply or not. */
836#define RTNET_ARPOP_IS_REPLY(Op) (!RTNET_ARPOP_IS_REQUEST(Op))
837/** @} */
838
839
840/**
841 * Ethernet IPv4 + 6-byte MAC ARP request packet.
842 */
843#pragma pack(1)
844typedef struct RTNETARPIPV4
845{
846 /** ARP header. */
847 RTNETARPHDR Hdr;
848 /** The sender hardware address. */
849 RTMAC ar_sha;
850 /** The sender protocol address. */
851 RTNETADDRIPV4 ar_spa;
852 /** The target hardware address. */
853 RTMAC ar_tha;
854 /** The arget protocol address. */
855 RTNETADDRIPV4 ar_tpa;
856} RTNETARPIPV4;
857#pragma pack()
858AssertCompileSize(RTNETARPIPV4, 8+6+4+6+4);
859/** Pointer to an ethernet IPv4+MAC ARP request packet. */
860typedef RTNETARPIPV4 *PRTNETARPIPV4;
861/** Pointer to a const ethernet IPv4+MAC ARP request packet. */
862typedef RTNETARPIPV4 const *PCRTNETARPIPV4;
863
864
865/** @} */
866
867RT_C_DECLS_END
868
869#endif
870
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette