#ifndef _IPXE_IP_H #define _IPXE_IP_H /** @file * * IP protocol * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_SECBOOT ( PERMITTED ); #include #include #include #include #include struct io_buffer; /* IP constants */ #define IP_VER 0x40U #define IP_MASK_VER 0xf0U #define IP_MASK_HLEN 0x0fU #define IP_MASK_OFFSET 0x1fffU #define IP_MASK_DONOTFRAG 0x4000U #define IP_MASK_MOREFRAGS 0x2000U #define IP_PSHLEN 12 /* IP header defaults */ #define IP_TOS 0 #define IP_TTL 64 /** An IPv4 packet header */ struct iphdr { uint8_t verhdrlen; uint8_t service; uint16_t len; uint16_t ident; uint16_t frags; uint8_t ttl; uint8_t protocol; uint16_t chksum; struct in_addr src; struct in_addr dest; } __attribute__ (( packed )); /** An IPv4 pseudo header */ struct ipv4_pseudo_header { struct in_addr src; struct in_addr dest; uint8_t zero_padding; uint8_t protocol; uint16_t len; }; /** An IPv4 address/routing table entry * * Routing table entries are maintained in order of specificity. For * a given destination address, the first matching table entry will be * used as the egress route. */ struct ipv4_miniroute { /** List of miniroutes */ struct list_head list; /** Network device * * When this routing table entry is matched, this is the * egress network device to be used. */ struct net_device *netdev; /** IPv4 address * * When this routing table entry is matched, this is the * source address to be used. * * The presence of this routing table entry also indicates * that this address is a valid local destination address for * the matching network device. */ struct in_addr address; /** Subnet network address * * A subnet is a range of addresses defined by a network * address and subnet mask. A destination address with all of * the subnet mask bits in common with the network address is * within the subnet and therefore matches this routing table * entry. */ struct in_addr network; /** Subnet mask * * An address with all of these bits in common with the * network address matches this routing table entry. */ struct in_addr netmask; /** Gateway address, or zero * * When this routing table entry is matched and this address * is non-zero, it will be used as the next-hop address. * * When this routing table entry is matched and this address * is zero, the subnet is local (on-link) and the next-hop * address will be the original destination address. */ struct in_addr gateway; /** Host mask * * An address in a local subnet with all of these bits set to * zero represents the network address, and an address in a * local subnet with all of these bits set to one represents * the local directed broadcast address. All other addresses * in a local subnet are valid host addresses. * * For most local subnets, this is the inverse of the subnet * mask. In a small subnet (/31 or /32) there is no network * address or directed broadcast address, and all addresses in * the subnet are valid host addresses. * * When this routing table entry is matched and the subnet is * local, a next-hop address with all of these bits set to one * will be treated as a local broadcast address. All other * next-hop addresses will be treated as unicast addresses. * * When this routing table entry is matched and the subnet is * non-local, the next-hop address is always a unicast * address. The host mask for non-local subnets is therefore * set to @c INADDR_NONE to allow the same logic to be used as * for local subnets. */ struct in_addr hostmask; }; extern struct list_head ipv4_miniroutes; extern struct net_protocol ipv4_protocol __net_protocol; extern struct ipv4_miniroute * ipv4_route ( unsigned int scope_id, struct in_addr *dest ); extern int ipv4_has_any_addr ( struct net_device *netdev ); extern int parse_ipv4_setting ( const struct setting_type *type, const char *value, void *buf, size_t len ); extern int format_ipv4_setting ( const struct setting_type *type, const void *raw, size_t raw_len, char *buf, size_t len ); #endif /* _IPXE_IP_H */