sa_family_t sa_family;
/** Fixed header length */
size_t header_len;
+ /** Network-layer protocol */
+ struct net_protocol *net_protocol;
/**
* Transmit packet
*
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,
/**
* 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;
}
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,
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 );
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;