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

Reply via email to