iPXE
ip.h
Go to the documentation of this file.
1 #ifndef _IPXE_IP_H
2 #define _IPXE_IP_H
3 
4 /** @file
5  *
6  * IP protocol
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_SECBOOT ( PERMITTED );
12 
13 #include <stdint.h>
14 #include <ipxe/in.h>
15 #include <ipxe/list.h>
16 #include <ipxe/retry.h>
17 #include <ipxe/netdevice.h>
18 
19 struct io_buffer;
20 
21 /* IP constants */
22 
23 #define IP_VER 0x40U
24 #define IP_MASK_VER 0xf0U
25 #define IP_MASK_HLEN 0x0fU
26 #define IP_MASK_OFFSET 0x1fffU
27 #define IP_MASK_DONOTFRAG 0x4000U
28 #define IP_MASK_MOREFRAGS 0x2000U
29 #define IP_PSHLEN 12
30 
31 /* IP header defaults */
32 #define IP_TOS 0
33 #define IP_TTL 64
34 
35 /** An IPv4 packet header */
36 struct iphdr {
45  struct in_addr src;
46  struct in_addr dest;
47 } __attribute__ (( packed ));
48 
49 /** An IPv4 pseudo header */
51  struct in_addr src;
52  struct in_addr dest;
56 };
57 
58 /** An IPv4 address/routing table entry
59  *
60  * Routing table entries are maintained in order of specificity. For
61  * a given destination address, the first matching table entry will be
62  * used as the egress route.
63  */
65  /** List of miniroutes */
66  struct list_head list;
67 
68  /** Network device
69  *
70  * When this routing table entry is matched, this is the
71  * egress network device to be used.
72  */
73  struct net_device *netdev;
74 
75  /** IPv4 address
76  *
77  * When this routing table entry is matched, this is the
78  * source address to be used.
79  *
80  * The presence of this routing table entry also indicates
81  * that this address is a valid local destination address for
82  * the matching network device.
83  */
84  struct in_addr address;
85  /** Subnet network address
86  *
87  * A subnet is a range of addresses defined by a network
88  * address and subnet mask. A destination address with all of
89  * the subnet mask bits in common with the network address is
90  * within the subnet and therefore matches this routing table
91  * entry.
92  */
93  struct in_addr network;
94  /** Subnet mask
95  *
96  * An address with all of these bits in common with the
97  * network address matches this routing table entry.
98  */
99  struct in_addr netmask;
100  /** Gateway address, or zero
101  *
102  * When this routing table entry is matched and this address
103  * is non-zero, it will be used as the next-hop address.
104  *
105  * When this routing table entry is matched and this address
106  * is zero, the subnet is local (on-link) and the next-hop
107  * address will be the original destination address.
108  */
109  struct in_addr gateway;
110  /** Host mask
111  *
112  * An address in a local subnet with all of these bits set to
113  * zero represents the network address, and an address in a
114  * local subnet with all of these bits set to one represents
115  * the local directed broadcast address. All other addresses
116  * in a local subnet are valid host addresses.
117  *
118  * For most local subnets, this is the inverse of the subnet
119  * mask. In a small subnet (/31 or /32) there is no network
120  * address or directed broadcast address, and all addresses in
121  * the subnet are valid host addresses.
122  *
123  * When this routing table entry is matched and the subnet is
124  * local, a next-hop address with all of these bits set to one
125  * will be treated as a local broadcast address. All other
126  * next-hop addresses will be treated as unicast addresses.
127  *
128  * When this routing table entry is matched and the subnet is
129  * non-local, the next-hop address is always a unicast
130  * address. The host mask for non-local subnets is therefore
131  * set to @c INADDR_NONE to allow the same logic to be used as
132  * for local subnets.
133  */
135 };
136 
137 extern struct list_head ipv4_miniroutes;
138 
139 extern struct net_protocol ipv4_protocol __net_protocol;
140 
141 extern struct ipv4_miniroute * ipv4_route ( unsigned int scope_id,
142  struct in_addr *dest );
143 extern int ipv4_has_any_addr ( struct net_device *netdev );
144 extern int parse_ipv4_setting ( const struct setting_type *type,
145  const char *value, void *buf, size_t len );
146 extern int format_ipv4_setting ( const struct setting_type *type,
147  const void *raw, size_t raw_len, char *buf,
148  size_t len );
149 
150 #endif /* _IPXE_IP_H */
struct in_addr netmask
Subnet mask.
Definition: ip.h:99
#define __attribute__(x)
Definition: compiler.h:10
unsigned short uint16_t
Definition: stdint.h:11
int ipv4_has_any_addr(struct net_device *netdev)
Check if network device has any IPv4 address.
Definition: ipv4.c:589
struct list_head list
List of miniroutes.
Definition: ip.h:66
struct in_addr src
Definition: ip.h:45
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
uint8_t zero_padding
Definition: ip.h:53
uint32_t type
Operating system type.
Definition: ena.h:12
Retry timers.
struct net_device * netdev
Network device.
Definition: ip.h:73
uint16_t chksum
Definition: ip.h:44
int format_ipv4_setting(const struct setting_type *type, const void *raw, size_t raw_len, char *buf, size_t len)
struct net_protocol ipv4_protocol __net_protocol
AoE protocol.
Definition: aoe.c:56
uint16_t ident
Definition: ip.h:40
uint16_t frags
Definition: ip.h:41
An IPv4 packet header.
Definition: ip.h:36
struct in_addr address
IPv4 address.
Definition: ip.h:84
struct in_addr hostmask
Host mask.
Definition: ip.h:134
A doubly-linked list entry (or list head)
Definition: list.h:19
uint16_t len
Definition: ip.h:55
struct in_addr dest
Definition: ip.h:52
An IPv4 address/routing table entry.
Definition: ip.h:64
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
uint16_t len
Definition: ip.h:39
struct in_addr gateway
Gateway address, or zero.
Definition: ip.h:109
ring len
Length.
Definition: dwmac.h:231
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t verhdrlen
Definition: ip.h:37
Linked lists.
static size_t raw_len
Definition: base16.h:54
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:58
IP address structure.
Definition: in.h:42
FILE_SECBOOT(PERMITTED)
A network device.
Definition: netdevice.h:353
int parse_ipv4_setting(const struct setting_type *type, const char *value, void *buf, size_t len)
unsigned char uint8_t
Definition: stdint.h:10
struct in_addr dest
Definition: ip.h:46
struct in_addr network
Subnet network address.
Definition: ip.h:93
An IPv4 pseudo header.
Definition: ip.h:50
A network-layer protocol.
Definition: netdevice.h:65
Network device management.
uint8_t protocol
Definition: ip.h:43
uint8_t protocol
Definition: ip.h:54
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:151
__be32 raw[7]
Definition: CIB_PRM.h:28
struct ipv4_miniroute * ipv4_route(unsigned int scope_id, struct in_addr *dest)
Perform IPv4 routing.
Definition: ipv4.c:310
uint8_t ttl
Definition: ip.h:42
struct in_addr src
Definition: ip.h:51
uint8_t service
Definition: ip.h:38
A setting type.
Definition: settings.h:192
A persistent I/O buffer.
Definition: iobuf.h:38