From: Matthew Iselin <matt...@theiselins.net> Signed-off-by: Matthew Iselin <matt...@theiselins.net> --- src/include/gpxe/icmp6.h | 4 ++++ src/include/gpxe/ip6.h | 2 +- src/net/icmpv6.c | 10 ++++++---- src/net/ipv6.c | 7 ++++--- 4 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/src/include/gpxe/icmp6.h b/src/include/gpxe/icmp6.h index e8fd1eb..ae309d6 100644 --- a/src/include/gpxe/icmp6.h +++ b/src/include/gpxe/icmp6.h @@ -54,6 +54,10 @@ struct neighbour_advert { #define ICMP6_FLAGS_SOLICITED 0x40 #define ICMP6_FLAGS_OVERRIDE 0x20 +int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, + struct sockaddr_tcpip *st_dest, struct net_device *netdev, + uint16_t pshdr_csum ); + 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/ip6.h b/src/include/gpxe/ip6.h index 3983e52..53811ca 100644 --- a/src/include/gpxe/ip6.h +++ b/src/include/gpxe/ip6.h @@ -55,12 +55,12 @@ struct ipv6_pseudo_header { /* Next header numbers */ #define IP6_HOPBYHOP 0x00 +#define IP6_ICMP6 0x3A #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 io_buffer; diff --git a/src/net/icmpv6.c b/src/net/icmpv6.c index aee4ca0..50a548b 100644 --- a/src/net/icmpv6.c +++ b/src/net/icmpv6.c @@ -67,8 +67,9 @@ int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src __unuse * @v st_src Source address * @v st_dest Destination address */ -static int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, - struct sockaddr_tcpip *st_dest, __unused uint16_t pshdr_csum ) { +int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, + struct sockaddr_tcpip *st_dest, struct net_device *netdev __unused, + uint16_t pshdr_csum __unused ) { struct icmp6_header *icmp6hdr = iobuf->data; /* Sanity check */ @@ -116,9 +117,10 @@ void icmp6_test_nadvert (struct net_device *netdev, struct sockaddr_in6 *server_ } #endif -/** ICMP6 protocol */ +/** ICMP6 protocol (needed for ipv6_tx) */ struct tcpip_protocol icmp6_protocol __tcpip_protocol = { .name = "ICMP6", - .rx = icmp6_rx, + .rx = NULL, /* icmp6_rx if tcpip passes netdev in future */ .tcpip_proto = IP_ICMP6, // 58 }; + diff --git a/src/net/ipv6.c b/src/net/ipv6.c index 5c6b942..85f896b 100644 --- a/src/net/ipv6.c +++ b/src/net/ipv6.c @@ -329,13 +329,14 @@ static int ipv6_tx ( struct io_buffer *iobuf, * @v nxt_hdr Next header number * @v src Source socket address * @v dest Destination socket address + * @v netdev Net device the packet arrived on * @v phcsm Partial checksum over the IPv6 psuedo-header. * * Refer http://www.iana.org/assignments/ipv6-parameters for the numbers */ static int ipv6_process_nxt_hdr ( struct io_buffer *iobuf, uint8_t nxt_hdr, struct sockaddr_tcpip *src, struct sockaddr_tcpip *dest, - uint16_t phcsm ) { + struct net_device *netdev, uint16_t phcsm ) { switch ( nxt_hdr ) { case IP6_HOPBYHOP: case IP6_ROUTING: @@ -346,7 +347,7 @@ static int ipv6_process_nxt_hdr ( struct io_buffer *iobuf, uint8_t nxt_hdr, DBG ( "Function not implemented for header %d\n", nxt_hdr ); return -ENOSYS; case IP6_ICMP6: - break; + return icmp6_rx ( iobuf, src, dest, netdev, phcsm ); case IP6_NO_HEADER: DBG ( "No next header\n" ); return 0; @@ -418,7 +419,7 @@ static int ipv6_rx ( struct io_buffer *iobuf, /* Send it to the transport layer */ return ipv6_process_nxt_hdr ( iobuf, ip6hdr->nxt_hdr, &src.st, &dest.st, - phcsm ); + netdev, phcsm ); drop: DBG ( "IP6 packet dropped\n" ); -- 1.7.2.5 _______________________________________________ gPXE-devel mailing list gPXE-devel@etherboot.org http://etherboot.org/mailman/listinfo/gpxe-devel