| #ifndef _IPXE_NDP_H | |
| #define _IPXE_NDP_H | |
| /** @file | |
| * | |
| * Neighbour discovery protocol | |
| * | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| FILE_SECBOOT ( PERMITTED ); | |
| #include <stdint.h> | |
| #include <ipxe/in.h> | |
| #include <ipxe/ipv6.h> | |
| #include <ipxe/icmpv6.h> | |
| #include <ipxe/neighbour.h> | |
| /** An NDP option header */ | |
| struct ndp_option_header { | |
| /** Type */ | |
| uint8_t type; | |
| /** Length (in blocks of 8 bytes) */ | |
| uint8_t blocks; | |
| } __attribute__ (( packed )); | |
| /** NDP option block size */ | |
| #define NDP_OPTION_BLKSZ 8U | |
| /** NDP source link-layer address option */ | |
| #define NDP_OPT_LL_SOURCE 1 | |
| /** NDP target link-layer address option */ | |
| #define NDP_OPT_LL_TARGET 2 | |
| /** NDP source or target link-layer address option */ | |
| struct ndp_ll_addr_option { | |
| /** NDP option header */ | |
| struct ndp_option_header header; | |
| /** Link-layer address */ | |
| uint8_t ll_addr[0]; | |
| } __attribute__ (( packed )); | |
| /** NDP prefix information option */ | |
| #define NDP_OPT_PREFIX 3 | |
| /** NDP prefix information */ | |
| struct ndp_prefix_information_option { | |
| /** NDP option header */ | |
| struct ndp_option_header header; | |
| /** Prefix length */ | |
| uint8_t prefix_len; | |
| /** Flags */ | |
| uint8_t flags; | |
| /** Valid lifetime */ | |
| uint32_t valid; | |
| /** Preferred lifetime */ | |
| uint32_t preferred; | |
| /** Reserved */ | |
| uint32_t reserved; | |
| /** Prefix */ | |
| struct in6_addr prefix; | |
| } __attribute__ (( packed )); | |
| /** NDP on-link flag */ | |
| #define NDP_PREFIX_ON_LINK 0x80 | |
| /** NDP autonomous address configuration flag */ | |
| #define NDP_PREFIX_AUTONOMOUS 0x40 | |
| /** NDP MTU option */ | |
| #define NDP_OPT_MTU 5 | |
| /** NDP MTU */ | |
| struct ndp_mtu_option { | |
| /** NDP option header */ | |
| struct ndp_option_header header; | |
| /** Reserved */ | |
| uint16_t reserved; | |
| /** MTU */ | |
| uint32_t mtu; | |
| } __attribute__ (( packed )); | |
| /** NDP recursive DNS server option */ | |
| #define NDP_OPT_RDNSS 25 | |
| /** NDP recursive DNS server */ | |
| struct ndp_rdnss_option { | |
| /** NDP option header */ | |
| struct ndp_option_header header; | |
| /** Reserved */ | |
| uint16_t reserved; | |
| /** Lifetime */ | |
| uint32_t lifetime; | |
| /** Addresses */ | |
| struct in6_addr addresses[0]; | |
| } __attribute__ (( packed )); | |
| /** NDP DNS search list option */ | |
| #define NDP_OPT_DNSSL 31 | |
| /** NDP DNS search list */ | |
| struct ndp_dnssl_option { | |
| /** NDP option header */ | |
| struct ndp_option_header header; | |
| /** Reserved */ | |
| uint16_t reserved; | |
| /** Lifetime */ | |
| uint32_t lifetime; | |
| /** Domain names */ | |
| uint8_t names[0]; | |
| } __attribute__ (( packed )); | |
| /** An NDP option */ | |
| union ndp_option { | |
| /** Option header */ | |
| struct ndp_option_header header; | |
| /** Source or target link-layer address option */ | |
| struct ndp_ll_addr_option ll_addr; | |
| /** Prefix information option */ | |
| struct ndp_prefix_information_option prefix; | |
| /** MTU option */ | |
| struct ndp_mtu_option mtu; | |
| /** Recursive DNS server option */ | |
| struct ndp_rdnss_option rdnss; | |
| /** DNS search list option */ | |
| struct ndp_dnssl_option dnssl; | |
| } __attribute__ (( packed )); | |
| /** An NDP neighbour solicitation or advertisement header */ | |
| struct ndp_neighbour_header { | |
| /** ICMPv6 header */ | |
| struct icmp_header icmp; | |
| /** Flags */ | |
| uint8_t flags; | |
| /** Reserved */ | |
| uint8_t reserved[3]; | |
| /** Target address */ | |
| struct in6_addr target; | |
| /** Options */ | |
| union ndp_option option[0]; | |
| } __attribute__ (( packed )); | |
| /** NDP router flag */ | |
| #define NDP_NEIGHBOUR_ROUTER 0x80 | |
| /** NDP solicited flag */ | |
| #define NDP_NEIGHBOUR_SOLICITED 0x40 | |
| /** NDP override flag */ | |
| #define NDP_NEIGHBOUR_OVERRIDE 0x20 | |
| /** An NDP router advertisement header */ | |
| struct ndp_router_advertisement_header { | |
| /** ICMPv6 header */ | |
| struct icmp_header icmp; | |
| /** Current hop limit */ | |
| uint8_t hop_limit; | |
| /** Flags */ | |
| uint8_t flags; | |
| /** Router lifetime */ | |
| uint16_t lifetime; | |
| /** Reachable time */ | |
| uint32_t reachable; | |
| /** Retransmission timer */ | |
| uint32_t retransmit; | |
| /** Options */ | |
| union ndp_option option[0]; | |
| } __attribute__ (( packed )); | |
| /** NDP managed address configuration */ | |
| #define NDP_ROUTER_MANAGED 0x80 | |
| /** NDP other configuration */ | |
| #define NDP_ROUTER_OTHER 0x40 | |
| /** An NDP router solicitation header */ | |
| struct ndp_router_solicitation_header { | |
| /** ICMPv6 header */ | |
| struct icmp_header icmp; | |
| /** Reserved */ | |
| uint32_t reserved; | |
| /** Options */ | |
| union ndp_option option[0]; | |
| } __attribute__ (( packed )); | |
| /** An NDP header */ | |
| union ndp_header { | |
| /** ICMPv6 header */ | |
| struct icmp_header icmp; | |
| /** Neighbour solicitation or advertisement header */ | |
| struct ndp_neighbour_header neigh; | |
| /** Router solicitation header */ | |
| struct ndp_router_solicitation_header rsol; | |
| /** Router advertisement header */ | |
| struct ndp_router_advertisement_header radv; | |
| } __attribute__ (( packed )); | |
| extern struct neighbour_discovery ndp_discovery; | |
| /** | |
| * Transmit packet, determining link-layer address via NDP | |
| * | |
| * @v iobuf I/O buffer | |
| * @v netdev Network device | |
| * @v net_dest Destination network-layer address | |
| * @v net_source Source network-layer address | |
| * @ret rc Return status code | |
| */ | |
| static inline int ndp_tx ( struct io_buffer *iobuf, struct net_device *netdev, | |
| const void *net_dest, const void *net_source ) { | |
| return neighbour_tx ( iobuf, netdev, &ipv6_protocol, net_dest, | |
| &ndp_discovery, net_source ); | |
| } | |
| /** NDP settings block name */ | |
| #define NDP_SETTINGS_NAME "ndp" | |
| #endif /* _IPXE_NDP_H */ |