diff options
| author | Nikhil Chandru Rao | 2006-08-19 17:58:22 +0200 |
|---|---|---|
| committer | Nikhil Chandru Rao | 2006-08-19 17:58:22 +0200 |
| commit | d1d334b8e1ec42a16f1454f1f172f1256485fc01 (patch) | |
| tree | 6895d72d6a0881edb2cf2c27dbec5f7fa8fb9bbb /src/include | |
| parent | Added RX tracing as well. (diff) | |
| download | ipxe-d1d334b8e1ec42a16f1454f1f172f1256485fc01.tar.gz ipxe-d1d334b8e1ec42a16f1454f1f172f1256485fc01.tar.xz ipxe-d1d334b8e1ec42a16f1454f1f172f1256485fc01.zip | |
IP6 support
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/gpxe/icmp6.h | 58 | ||||
| -rw-r--r-- | src/include/gpxe/in.h | 5 | ||||
| -rw-r--r-- | src/include/gpxe/ip6.h | 47 | ||||
| -rw-r--r-- | src/include/gpxe/ndp.h | 23 |
4 files changed, 125 insertions, 8 deletions
diff --git a/src/include/gpxe/icmp6.h b/src/include/gpxe/icmp6.h new file mode 100644 index 000000000..352103647 --- /dev/null +++ b/src/include/gpxe/icmp6.h @@ -0,0 +1,58 @@ +#ifndef _GPXE_ICMP6_H +#define _GPXE_ICMP6_H + +/** @file + * + * ICMP6 protocol + * + */ + +#include <ip.h> +#include <gpxe/ip6.h> +#include <gpxe/ndp.h> + +#define ICMP6_NSOLICIT 135 +#define ICMP6_NADVERT 136 + +extern struct tcpip_protocol icmp6_protocol; + +struct icmp6_header { + uint8_t type; + uint8_t code; + uint16_t csum; + /* Message body */ +}; + +struct neighbour_solicit { + uint8_t type; + uint8_t code; + uint16_t csum; + uint32_t reserved; + struct in6_addr target; + /* "Compulsory" options */ + uint8_t opt_type; + uint8_t opt_len; +#warning hack alert + uint8_t opt_ll_addr[6]; +}; + +struct neighbour_advert { + uint8_t type; + uint8_t code; + uint16_t csum; + uint8_t flags; + uint8_t reserved; + struct in6_addr target; + uint8_t opt_type; + uint8_t opt_len; +#warning hack alert + uint8_t opt_ll_addr[6]; +}; + +#define ICMP6_FLAGS_ROUTER 0x80 +#define ICMP6_FLAGS_SOLICITED 0x40 +#define ICMP6_FLAGS_OVERRIDE 0x20 + +int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest ); + +#endif /* _GPXE_ICMP6_H */ diff --git a/src/include/gpxe/in.h b/src/include/gpxe/in.h index eed9c09b3..d502c4c31 100644 --- a/src/include/gpxe/in.h +++ b/src/include/gpxe/in.h @@ -10,6 +10,7 @@ #define IP_IGMP 2 #define IP_TCP 6 #define IP_UDP 17 +#define IP_ICMP6 58 /* IP address constants */ @@ -36,7 +37,7 @@ struct in6_addr { uint8_t u6_addr8[16]; uint16_t u6_addr16[8]; uint32_t u6_addr32[4]; - } in16_u; + } in6_u; #define s6_addr in6_u.u6_addr8 #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32 @@ -67,7 +68,7 @@ struct sockaddr_in6 { */ sa_family_t sin_family; /** TCP/IP port (part of struct @c sockaddr_tcpip) */ - uint16_t sin_port; + uint16_t sin_port; uint32_t sin6_flowinfo; /* Flow number */ struct in6_addr sin6_addr; /* 128-bit destination address */ uint32_t sin6_scope_id; /* Scope ID */ diff --git a/src/include/gpxe/ip6.h b/src/include/gpxe/ip6.h index 69cbd81bb..0589f8e9d 100644 --- a/src/include/gpxe/ip6.h +++ b/src/include/gpxe/ip6.h @@ -8,18 +8,33 @@ */ #include <ip.h> +#include <gpxe/in.h> /* IP6 constants */ #define IP6_VERSION 0x6 -#define IP6_HOP_LIMIT 64 +#define IP6_HOP_LIMIT 255 -/* IP6 header */ +/** + * Packet buffer contents + * This is duplicated in tcp.h and here. Ideally it should go into pkbuff.h + */ +#define MAX_HDR_LEN 100 +#define MAX_PKB_LEN 1500 +#define MIN_PKB_LEN MAX_HDR_LEN + 100 /* To account for padding by LL */ + +#define IP6_EQUAL( in6_addr1, in6_addr2 ) \ + ( strncmp ( ( char* ) &( in6_addr1 ), ( char* ) &( in6_addr2 ),\ + sizeof ( struct in6_addr ) ) == 0 ) +#define IS_UNSPECIFIED( addr ) \ + ( ( (addr).in6_u.u6_addr32[0] == 0x00000000 ) && \ + ( (addr).in6_u.u6_addr32[1] == 0x00000000 ) && \ + ( (addr).in6_u.u6_addr32[2] == 0x00000000 ) && \ + ( (addr).in6_u.u6_addr32[3] == 0x00000000 ) ) +/* IP6 header */ struct ip6_header { - uint32_t vers:4, - traffic_class:8, - flow_label:20; + uint32_t ver_traffic_class_flow_label; uint16_t payload_len; uint8_t nxt_hdr; uint8_t hop_limit; @@ -27,12 +42,32 @@ struct ip6_header { struct in6_addr dest; }; +/* IP6 pseudo header */ +struct ipv6_pseudo_header { + struct in6_addr src; + struct in6_addr dest; + uint8_t zero_padding; + uint8_t nxt_hdr; + uint16_t len; +}; + +/* Next header numbers */ +#define IP6_HOPBYHOP 0x00 +#define IP6_ROUTING 0x43 +#define IP6_FRAGMENT 0x44 +#define IP6_AUTHENTICATION 0x51 +#define IP6_DEST_OPTS 0x60 +#define IP6_ESP 0x50 +#define IP6_ICMP6 0x58 +#define IP6_NO_HEADER 0x59 + struct pk_buff; struct net_device; struct net_protocol; extern struct net_protocol ipv6_protocol; +extern struct tcpip_net_protocol ipv6_tcpip_protocol; +extern char * inet6_ntoa ( struct in6_addr in6 ); -extern int ipv6_tx ( struct pk_buff *pkb, uint16_t trans_proto, struct in6_addr *dest ); #endif /* _GPXE_IP6_H */ diff --git a/src/include/gpxe/ndp.h b/src/include/gpxe/ndp.h new file mode 100644 index 000000000..ed9411f93 --- /dev/null +++ b/src/include/gpxe/ndp.h @@ -0,0 +1,23 @@ +#include <stdint.h> +#include <byteswap.h> +#include <errno.h> +#include <string.h> +#include <gpxe/icmp6.h> +#include <gpxe/ip6.h> +#include <gpxe/in.h> +#include <gpxe/netdevice.h> +#include <gpxe/pkbuff.h> +#include <gpxe/tcpip.h> + +#define NDP_STATE_INVALID 0 +#define NDP_STATE_INCOMPLETE 1 +#define NDP_STATE_REACHABLE 2 +#define NDP_STATE_DELAY 3 +#define NDP_STATE_PROBE 4 +#define NDP_STATE_STALE 5 + +static struct ndp_entry * ndp_find_entry ( struct in6_addr *in6 ); +int ndp_resolve ( struct net_device *netdev, struct in6_addr *src, + struct in6_addr *dest, void *dest_ll_addr ); +int ndp_process_advert ( struct pk_buff *pkb, struct sockaddr_tcpip *st_src, + struct sockaddr_tcpip *st_dest ); |
