iPXE
in.h
Go to the documentation of this file.
1 #ifndef _IPXE_IN_H
2 #define _IPXE_IN_H
3 
4 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
5 
6 #include <stdint.h>
7 #include <byteswap.h>
8 #include <ipxe/socket.h>
9 
10 /* Protocol numbers */
11 
12 #define IP_ICMP 1
13 #define IP_TCP 6
14 #define IP_UDP 17
15 #define IP_ICMP6 58
16 
17 /* IP address constants */
18 
19 #define INADDR_NONE htonl ( 0xffffffff )
20 
21 #define INADDR_BROADCAST htonl ( 0xffffffff )
22 
23 #define INADDR_NET_CLASSA htonl ( 0xff000000 )
24 #define INADDR_NET_CLASSB htonl ( 0xffff0000 )
25 #define INADDR_NET_CLASSC htonl ( 0xffffff00 )
26 
27 #define IN_IS_CLASSA( addr ) \
28  ( ( (addr) & htonl ( 0x80000000 ) ) == htonl ( 0x00000000 ) )
29 #define IN_IS_CLASSB( addr ) \
30  ( ( (addr) & htonl ( 0xc0000000 ) ) == htonl ( 0x80000000 ) )
31 #define IN_IS_CLASSC( addr ) \
32  ( ( (addr) & htonl ( 0xe0000000 ) ) == htonl ( 0xc0000000 ) )
33 #define IN_IS_MULTICAST( addr ) \
34  ( ( (addr) & htonl ( 0xf0000000 ) ) == htonl ( 0xe0000000 ) )
35 
36 /**
37  * IP address structure
38  */
39 struct in_addr {
41 };
42 
43 typedef struct in_addr in_addr;
44 
45 /**
46  * IP6 address structure
47  */
48 struct in6_addr {
49  union {
53  } in6_u;
54 #define s6_addr in6_u.u6_addr8
55 #define s6_addr16 in6_u.u6_addr16
56 #define s6_addr32 in6_u.u6_addr32
57 };
58 
59 #define IN6_IS_ADDR_UNSPECIFIED( addr ) \
60  ( ( ( ( ( const uint32_t * ) (addr) )[0] ) | \
61  ( ( ( const uint32_t * ) (addr) )[1] ) | \
62  ( ( ( const uint32_t * ) (addr) )[2] ) | \
63  ( ( ( const uint32_t * ) (addr) )[3] ) ) == 0 )
64 
65 #define IN6_IS_ADDR_MULTICAST( addr ) \
66  ( *( ( const uint8_t * ) (addr) ) == 0xff )
67 
68 #define IN6_IS_ADDR_LINKLOCAL( addr ) \
69  ( ( *( ( const uint16_t * ) (addr) ) & htons ( 0xffc0 ) ) == \
70  htons ( 0xfe80 ) )
71 
72 #define IN6_IS_ADDR_SITELOCAL( addr ) \
73  ( ( *( ( const uint16_t * ) (addr) ) & htons ( 0xffc0 ) ) == \
74  htons ( 0xfec0 ) )
75 
76 #define IN6_IS_ADDR_ULA( addr ) \
77  ( ( *( ( const uint8_t * ) (addr) ) & 0xfe ) == 0xfc )
78 
79 /**
80  * IPv4 socket address
81  */
82 struct sockaddr_in {
83  /** Socket address family (part of struct @c sockaddr)
84  *
85  * Always set to @c AF_INET for IPv4 addresses
86  */
88  /** Flags (part of struct @c sockaddr_tcpip) */
90  /** TCP/IP port (part of struct @c sockaddr_tcpip) */
92  /** Scope ID (part of struct @c sockaddr_tcpip)
93  *
94  * For multicast addresses, this is the network device index.
95  */
97  /** IPv4 address */
98  struct in_addr sin_addr;
99  /** Padding
100  *
101  * This ensures that a struct @c sockaddr_in is large enough
102  * to hold a socket address for any TCP/IP address family.
103  */
104  char pad[ sizeof ( struct sockaddr ) -
105  ( sizeof ( sa_family_t ) /* sin_family */ +
106  sizeof ( uint16_t ) /* sin_flags */ +
107  sizeof ( uint16_t ) /* sin_port */ +
108  sizeof ( uint16_t ) /* sin_scope_id */ +
109  sizeof ( struct in_addr ) /* sin_addr */ ) ];
110 } __attribute__ (( packed, may_alias ));
111 
112 /**
113  * IPv6 socket address
114  */
115 struct sockaddr_in6 {
116  /** Socket address family (part of struct @c sockaddr)
117  *
118  * Always set to @c AF_INET6 for IPv6 addresses
119  */
121  /** Flags (part of struct @c sockaddr_tcpip) */
123  /** TCP/IP port (part of struct @c sockaddr_tcpip) */
125  /** Scope ID (part of struct @c sockaddr_tcpip)
126  *
127  * For link-local or multicast addresses, this is the network
128  * device index.
129  */
131  /** IPv6 address */
133  /** Padding
134  *
135  * This ensures that a struct @c sockaddr_in6 is large
136  * enough to hold a socket address for any TCP/IP address
137  * family.
138  */
139  char pad[ sizeof ( struct sockaddr ) -
140  ( sizeof ( sa_family_t ) /* sin6_family */ +
141  sizeof ( uint16_t ) /* sin6_flags */ +
142  sizeof ( uint16_t ) /* sin6_port */ +
143  sizeof ( uint16_t ) /* sin6_scope_id */ +
144  sizeof ( struct in6_addr ) /* sin6_addr */ ) ];
145 } __attribute__ (( packed, may_alias ));
146 
147 extern int inet_aton ( const char *cp, struct in_addr *inp );
148 extern char * inet_ntoa ( struct in_addr in );
149 extern int inet6_aton ( const char *string, struct in6_addr *in );
150 extern char * inet6_ntoa ( const struct in6_addr *in );
151 
152 #endif /* _IPXE_IN_H */
#define __attribute__(x)
Definition: compiler.h:10
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
unsigned short uint16_t
Definition: stdint.h:11
__be32 in[4]
Definition: CIB_PRM.h:35
uint16_t sin6_scope_id
Scope ID (part of struct sockaddr_tcpip)
Definition: in.h:130
IPv4 socket address.
Definition: in.h:82
uint16_t u6_addr16[8]
Definition: in.h:51
union in6_addr::@542 in6_u
sa_family_t sin_family
Socket address family (part of struct sockaddr)
Definition: in.h:87
uint16_t sin_scope_id
Scope ID (part of struct sockaddr_tcpip)
Definition: in.h:96
char pad[sizeof(struct sockaddr) -(sizeof(sa_family_t)+sizeof(uint16_t)+sizeof(uint16_t)+sizeof(uint16_t)+sizeof(struct in_addr))]
Padding.
Definition: in.h:109
uint16_t sa_family_t
A socket address family.
Definition: socket.h:85
IP6 address structure.
Definition: in.h:48
int inet_aton(const char *cp, struct in_addr *inp)
Parse IPv4 address.
Definition: ipv4.c:631
uint8_t u6_addr8[16]
Definition: in.h:50
int inet6_aton(const char *string, struct in6_addr *in)
Parse IPv6 address.
Definition: ipv6.c:824
Generalized socket address structure.
Definition: socket.h:96
IP address structure.
Definition: in.h:39
uint16_t sin_port
TCP/IP port (part of struct sockaddr_tcpip)
Definition: in.h:91
uint32_t u6_addr32[4]
Definition: in.h:52
unsigned char uint8_t
Definition: stdint.h:10
char * inet6_ntoa(const struct in6_addr *in)
Convert IPv6 address to standard notation.
Definition: ipv6.c:894
unsigned int uint32_t
Definition: stdint.h:12
uint32_t s_addr
Definition: in.h:40
struct in_addr sin_addr
IPv4 address.
Definition: in.h:98
char pad[sizeof(struct sockaddr) -(sizeof(sa_family_t)+sizeof(uint16_t)+sizeof(uint16_t)+sizeof(uint16_t)+sizeof(struct in6_addr))]
Padding.
Definition: in.h:144
uint16_t sin_flags
Flags (part of struct sockaddr_tcpip)
Definition: in.h:89
IPv6 socket address.
Definition: in.h:115
uint16_t sin6_port
TCP/IP port (part of struct sockaddr_tcpip)
Definition: in.h:124
sa_family_t sin6_family
Socket address family (part of struct sockaddr)
Definition: in.h:120
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:658
Socket addresses.
uint16_t sin6_flags
Flags (part of struct sockaddr_tcpip)
Definition: in.h:122
struct in6_addr sin6_addr
IPv6 address.
Definition: in.h:132