aboutsummaryrefslogtreecommitdiffstats
path: root/roms/ipxe/src/include/ipxe/ndp.h
diff options
context:
space:
mode:
Diffstat (limited to 'roms/ipxe/src/include/ipxe/ndp.h')
-rw-r--r--roms/ipxe/src/include/ipxe/ndp.h206
1 files changed, 206 insertions, 0 deletions
diff --git a/roms/ipxe/src/include/ipxe/ndp.h b/roms/ipxe/src/include/ipxe/ndp.h
new file mode 100644
index 000000000..1815236f5
--- /dev/null
+++ b/roms/ipxe/src/include/ipxe/ndp.h
@@ -0,0 +1,206 @@
+#ifndef _IPXE_NDP_H
+#define _IPXE_NDP_H
+
+/** @file
+ *
+ * Neighbour discovery protocol
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#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 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;
+ /** 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
+ * @v ll_source Source link-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,
+ const void *ll_source ) {
+
+ return neighbour_tx ( iobuf, netdev, &ipv6_protocol, net_dest,
+ &ndp_discovery, net_source, ll_source );
+}
+
+/** NDP settings block name */
+#define NDP_SETTINGS_NAME "ndp"
+
+#endif /* _IPXE_NDP_H */