]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[tcpip] Allow supported address families to be detected at runtime
authorMichael Brown <mcb30@ipxe.org>
Tue, 1 Sep 2015 15:18:32 +0000 (16:18 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 1 Sep 2015 20:04:45 +0000 (21:04 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/tcpip.h
src/net/ipv4.c
src/net/ipv6.c
src/net/tcpip.c

index 3cfc8e3ac9064187135e902e3c04382227caf10d..c3528c9c9d477f295ea42bf96f3b6bb1d59bf1f4 100644 (file)
@@ -106,6 +106,8 @@ struct tcpip_net_protocol {
        sa_family_t sa_family;
        /** Fixed header length */
        size_t header_len;
+       /** Network-layer protocol */
+       struct net_protocol *net_protocol;
        /**
         * Transmit packet
         *
@@ -156,6 +158,7 @@ extern int tcpip_tx ( struct io_buffer *iobuf, struct tcpip_protocol *tcpip,
                      struct sockaddr_tcpip *st_dest,
                      struct net_device *netdev,
                      uint16_t *trans_csum );
+extern struct tcpip_net_protocol * tcpip_net_protocol ( sa_family_t sa_family );
 extern struct net_device * tcpip_netdev ( struct sockaddr_tcpip *st_dest );
 extern size_t tcpip_mtu ( struct sockaddr_tcpip *st_dest );
 extern uint16_t generic_tcpip_continue_chksum ( uint16_t partial,
index a54784049f4f401bff857ae5ac44706edff7622b..7959cf3554ba07a85eb261e5942d3b7c7a5461de 100644 (file)
@@ -714,6 +714,7 @@ struct tcpip_net_protocol ipv4_tcpip_protocol __tcpip_net_protocol = {
        .name = "IPv4",
        .sa_family = AF_INET,
        .header_len = sizeof ( struct iphdr ),
+       .net_protocol = &ipv4_protocol,
        .tx = ipv4_tx,
        .netdev = ipv4_netdev,
 };
index a75e72ddba2541ce38b42c3e3a59c6b3f5383b91..012ba592178ecc00d6f091cd456946be1b73fb1d 100644 (file)
@@ -1001,6 +1001,7 @@ struct tcpip_net_protocol ipv6_tcpip_protocol __tcpip_net_protocol = {
        .name = "IPv6",
        .sa_family = AF_INET6,
        .header_len = sizeof ( struct ipv6_header ),
+       .net_protocol = &ipv6_protocol,
        .tx = ipv6_tx,
        .netdev = ipv6_netdev,
 };
index 5ad982fd165086413c952a87410457f308865b2f..c9e4ee789c979fde93ace4b80d5c8a0406a4252b 100644 (file)
@@ -62,19 +62,18 @@ int tcpip_rx ( struct io_buffer *iobuf, struct net_device *netdev,
 /**
  * Find TCP/IP network-layer protocol
  *
- * @v st_dest          Destination address
+ * @v sa_family                Address family
  * @ret tcpip_net      TCP/IP network-layer protocol, or NULL if not found
  */
-static struct tcpip_net_protocol *
-tcpip_net_protocol ( struct sockaddr_tcpip *st_dest ) {
+struct tcpip_net_protocol * tcpip_net_protocol ( sa_family_t sa_family ) {
        struct tcpip_net_protocol *tcpip_net;
 
        for_each_table_entry ( tcpip_net, TCPIP_NET_PROTOCOLS ) {
-               if ( tcpip_net->sa_family == st_dest->st_family )
+               if ( tcpip_net->sa_family == sa_family )
                        return tcpip_net;
        }
 
-       DBG ( "Unrecognised TCP/IP address family %d\n", st_dest->st_family );
+       DBG ( "Unrecognised TCP/IP address family %d\n", sa_family );
        return NULL;
 }
 
@@ -95,7 +94,7 @@ int tcpip_tx ( struct io_buffer *iobuf, struct tcpip_protocol *tcpip_protocol,
        struct tcpip_net_protocol *tcpip_net;
 
        /* Hand off packet to the appropriate network-layer protocol */
-       tcpip_net = tcpip_net_protocol ( st_dest );
+       tcpip_net = tcpip_net_protocol ( st_dest->st_family );
        if ( tcpip_net ) {
                DBG ( "TCP/IP sending %s packet\n", tcpip_net->name );
                return tcpip_net->tx ( iobuf, tcpip_protocol, st_src, st_dest,
@@ -116,7 +115,7 @@ struct net_device * tcpip_netdev ( struct sockaddr_tcpip *st_dest ) {
        struct tcpip_net_protocol *tcpip_net;
 
        /* Hand off to the appropriate network-layer protocol */
-       tcpip_net = tcpip_net_protocol ( st_dest );
+       tcpip_net = tcpip_net_protocol ( st_dest->st_family );
        if ( tcpip_net )
                return tcpip_net->netdev ( st_dest );
 
@@ -135,7 +134,7 @@ size_t tcpip_mtu ( struct sockaddr_tcpip *st_dest ) {
        size_t mtu;
 
        /* Find appropriate network-layer protocol */
-       tcpip_net = tcpip_net_protocol ( st_dest );
+       tcpip_net = tcpip_net_protocol ( st_dest->st_family );
        if ( ! tcpip_net )
                return 0;