summaryrefslogtreecommitdiffstats
path: root/qemu/roms/ipxe/src/include/ipxe/in.h
blob: de96ca22a3cb565168a3b30107813b11da819254 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef	_IPXE_IN_H
#define	_IPXE_IN_H

FILE_LICENCE ( GPL2_OR_LATER );

#include <stdint.h>
#include <ipxe/socket.h>

/* Protocol numbers */

#define IP_ICMP		1
#define IP_TCP		6
#define IP_UDP		17
#define IP_ICMP6	58

/* IP address constants */

#define INADDR_NONE 0xffffffff

#define INADDR_BROADCAST 0xffffffff

#define	IN_CLASSA(addr)		( ( (addr) & 0x80000000 ) == 0x00000000 )
#define	IN_CLASSA_NET		0xff000000
#define	IN_CLASSB(addr)		( ( (addr) & 0xc0000000 ) == 0x80000000 )
#define	IN_CLASSB_NET		0xffff0000
#define	IN_CLASSC(addr)		( ( (addr) & 0xe0000000 ) == 0xc0000000 )
#define	IN_CLASSC_NET		0xffffff00
#define IN_MULTICAST(addr)	( ( (addr) & 0xf0000000 ) == 0xe0000000 )

/**
 * IP address structure
 */
struct in_addr {
	uint32_t	s_addr;
};

typedef struct in_addr in_addr;

/**
 * IP6 address structure
 */
struct in6_addr {
        union {
                uint8_t u6_addr8[16];
                uint16_t u6_addr16[8];
                uint32_t u6_addr32[4];
        } in6_u;
#define s6_addr         in6_u.u6_addr8
#define s6_addr16       in6_u.u6_addr16
#define s6_addr32       in6_u.u6_addr32
};

#define IN6_IS_ADDR_UNSPECIFIED( addr )					\
	( ( ( ( ( const uint32_t * ) (addr) )[0] ) |			\
	    ( ( ( const uint32_t * ) (addr) )[1] ) |			\
	    ( ( ( const uint32_t * ) (addr) )[2] ) |			\
	    ( ( ( const uint32_t * ) (addr) )[3] ) ) == 0 )

#define IN6_IS_ADDR_MULTICAST( addr )					\
	( *( ( const uint8_t * ) (addr) ) == 0xff )

#define IN6_IS_ADDR_LINKLOCAL( addr )					\
	( ( *( ( const uint16_t * ) (addr) ) & htons ( 0xffc0 ) ) ==	\
	  htons ( 0xfe80 ) )

/**
 * IPv4 socket address
 */
struct sockaddr_in {
	/** Socket address family (part of struct @c sockaddr)
	 *
	 * Always set to @c AF_INET for IPv4 addresses
	 */
	sa_family_t sin_family;
	/** Flags (part of struct @c sockaddr_tcpip) */
	uint16_t sin_flags;
	/** TCP/IP port (part of struct @c sockaddr_tcpip) */
	uint16_t sin_port;
	/** IPv4 address */
	struct in_addr sin_addr;
	/** Padding
	 *
	 * This ensures that a struct @c sockaddr_in is large enough
	 * to hold a socket address for any TCP/IP address family.
	 */
	char pad[ sizeof ( struct sockaddr ) -
		  ( sizeof ( sa_family_t ) /* sin_family */ +
		    sizeof ( uint16_t ) /* sin_flags */ +
		    sizeof ( uint16_t ) /* sin_port */ +
		    sizeof ( struct in_addr ) /* sin_addr */ ) ];
} __attribute__ (( packed, may_alias ));

/**
 * IPv6 socket address
 */
struct sockaddr_in6 {
	/** Socket address family (part of struct @c sockaddr)
	 *
	 * Always set to @c AF_INET6 for IPv6 addresses
	 */
	sa_family_t sin6_family;
	/** Flags (part of struct @c sockaddr_tcpip) */
	uint16_t sin6_flags;
	/** TCP/IP port (part of struct @c sockaddr_tcpip) */
	uint16_t sin6_port;
	/** Scope ID
	 *
	 * For link-local addresses, this is the network device index.
	 */
        uint16_t sin6_scope_id;
	/** IPv6 address */
        struct in6_addr sin6_addr;
	/** Padding
	 *
	 * This ensures that a struct @c sockaddr_in6 is large
	 * enough to hold a socket address for any TCP/IP address
	 * family.
	 */
	char pad[ sizeof ( struct sockaddr ) -
		  ( sizeof ( sa_family_t ) /* sin6_family */ +
		    sizeof ( uint16_t ) /* sin6_flags */ +
		    sizeof ( uint16_t ) /* sin6_port */ +
		    sizeof ( uint16_t ) /* sin6_scope_id */ +
		    sizeof ( struct in6_addr ) /* sin6_addr */ ) ];
} __attribute__ (( packed, may_alias ));

extern int inet_aton ( const char *cp, struct in_addr *inp );
extern char * inet_ntoa ( struct in_addr in );
extern int inet6_aton ( const char *string, struct in6_addr *in );
extern char * inet6_ntoa ( const struct in6_addr *in );

#endif	/* _IPXE_IN_H */