diff --git a/src/include/ipxe/tcpip.h b/src/include/ipxe/tcpip.h index 3cfc8e3ac..c3528c9c9 100644 --- a/src/include/ipxe/tcpip.h +++ b/src/include/ipxe/tcpip.h @@ -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, diff --git a/src/net/ipv4.c b/src/net/ipv4.c index a54784049..7959cf355 100644 --- a/src/net/ipv4.c +++ b/src/net/ipv4.c @@ -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, }; diff --git a/src/net/ipv6.c b/src/net/ipv6.c index a75e72ddb..012ba5921 100644 --- a/src/net/ipv6.c +++ b/src/net/ipv6.c @@ -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, }; diff --git a/src/net/tcpip.c b/src/net/tcpip.c index 5ad982fd1..c9e4ee789 100644 --- a/src/net/tcpip.c +++ b/src/net/tcpip.c @@ -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;