[tcpip] Pass through network device to transport layer protocols
NDP requires knowledge of the network device on which a packet was received. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
8a2dc7a588
commit
6bf36f57a0
@ -69,6 +69,7 @@ struct tcpip_protocol {
|
|||||||
* Process received packet
|
* Process received packet
|
||||||
*
|
*
|
||||||
* @v iobuf I/O buffer
|
* @v iobuf I/O buffer
|
||||||
|
* @v netdev Network device
|
||||||
* @v st_src Partially-filled source address
|
* @v st_src Partially-filled source address
|
||||||
* @v st_dest Partially-filled destination address
|
* @v st_dest Partially-filled destination address
|
||||||
* @v pshdr_csum Pseudo-header checksum
|
* @v pshdr_csum Pseudo-header checksum
|
||||||
@ -76,7 +77,8 @@ struct tcpip_protocol {
|
|||||||
*
|
*
|
||||||
* This method takes ownership of the I/O buffer.
|
* This method takes ownership of the I/O buffer.
|
||||||
*/
|
*/
|
||||||
int ( * rx ) ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
|
int ( * rx ) ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
|
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
|
||||||
/**
|
/**
|
||||||
* Transport-layer protocol number
|
* Transport-layer protocol number
|
||||||
@ -128,8 +130,8 @@ struct tcpip_net_protocol {
|
|||||||
/** Declare a TCP/IP network-layer protocol */
|
/** Declare a TCP/IP network-layer protocol */
|
||||||
#define __tcpip_net_protocol __table_entry ( TCPIP_NET_PROTOCOLS, 01 )
|
#define __tcpip_net_protocol __table_entry ( TCPIP_NET_PROTOCOLS, 01 )
|
||||||
|
|
||||||
extern int tcpip_rx ( struct io_buffer *iobuf, uint8_t tcpip_proto,
|
extern int tcpip_rx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
struct sockaddr_tcpip *st_src,
|
uint8_t tcpip_proto, struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
|
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
|
||||||
extern int tcpip_tx ( struct io_buffer *iobuf, struct tcpip_protocol *tcpip,
|
extern int tcpip_tx ( struct io_buffer *iobuf, struct tcpip_protocol *tcpip,
|
||||||
struct sockaddr_tcpip *st_src,
|
struct sockaddr_tcpip *st_src,
|
||||||
|
@ -38,12 +38,15 @@ struct tcpip_protocol icmp_protocol __tcpip_protocol;
|
|||||||
* Process a received packet
|
* Process a received packet
|
||||||
*
|
*
|
||||||
* @v iobuf I/O buffer
|
* @v iobuf I/O buffer
|
||||||
|
* @v netdev Network device
|
||||||
* @v st_src Partially-filled source address
|
* @v st_src Partially-filled source address
|
||||||
* @v st_dest Partially-filled destination address
|
* @v st_dest Partially-filled destination address
|
||||||
* @v pshdr_csum Pseudo-header checksum
|
* @v pshdr_csum Pseudo-header checksum
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int icmp_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
|
static int icmp_rx ( struct io_buffer *iobuf,
|
||||||
|
struct net_device *netdev __unused,
|
||||||
|
struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest,
|
struct sockaddr_tcpip *st_dest,
|
||||||
uint16_t pshdr_csum __unused ) {
|
uint16_t pshdr_csum __unused ) {
|
||||||
struct icmp_header *icmp = iobuf->data;
|
struct icmp_header *icmp = iobuf->data;
|
||||||
|
@ -69,7 +69,7 @@ int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src __unuse
|
|||||||
* @v st_src Source address
|
* @v st_src Source address
|
||||||
* @v st_dest Destination address
|
* @v st_dest Destination address
|
||||||
*/
|
*/
|
||||||
static int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
|
static int icmp6_rx ( struct io_buffer *iobuf, struct net_device *netdev __unused, struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest, __unused uint16_t pshdr_csum ) {
|
struct sockaddr_tcpip *st_dest, __unused uint16_t pshdr_csum ) {
|
||||||
struct icmp6_header *icmp6hdr = iobuf->data;
|
struct icmp6_header *icmp6hdr = iobuf->data;
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ static int ipv4_rx ( struct io_buffer *iobuf,
|
|||||||
dest.sin.sin_addr = iphdr->dest;
|
dest.sin.sin_addr = iphdr->dest;
|
||||||
pshdr_csum = ipv4_pshdr_chksum ( iobuf, TCPIP_EMPTY_CSUM );
|
pshdr_csum = ipv4_pshdr_chksum ( iobuf, TCPIP_EMPTY_CSUM );
|
||||||
iob_pull ( iobuf, hdrlen );
|
iob_pull ( iobuf, hdrlen );
|
||||||
if ( ( rc = tcpip_rx ( iobuf, iphdr->protocol, &src.st,
|
if ( ( rc = tcpip_rx ( iobuf, netdev, iphdr->protocol, &src.st,
|
||||||
&dest.st, pshdr_csum ) ) != 0 ) {
|
&dest.st, pshdr_csum ) ) != 0 ) {
|
||||||
DBGC ( src.sin.sin_addr, "IPv4 received packet rejected by "
|
DBGC ( src.sin.sin_addr, "IPv4 received packet rejected by "
|
||||||
"stack: %s\n", strerror ( rc ) );
|
"stack: %s\n", strerror ( rc ) );
|
||||||
|
@ -260,7 +260,8 @@ static int ipv6_tx ( struct io_buffer *iobuf,
|
|||||||
*
|
*
|
||||||
* Refer http://www.iana.org/assignments/ipv6-parameters for the numbers
|
* 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,
|
static int ipv6_process_nxt_hdr ( struct io_buffer *iobuf,
|
||||||
|
struct net_device *netdev, uint8_t nxt_hdr,
|
||||||
struct sockaddr_tcpip *src, struct sockaddr_tcpip *dest ) {
|
struct sockaddr_tcpip *src, struct sockaddr_tcpip *dest ) {
|
||||||
switch ( nxt_hdr ) {
|
switch ( nxt_hdr ) {
|
||||||
case IP6_HOPBYHOP:
|
case IP6_HOPBYHOP:
|
||||||
@ -278,7 +279,7 @@ static int ipv6_process_nxt_hdr ( struct io_buffer *iobuf, uint8_t nxt_hdr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* Next header is not a IPv6 extension header */
|
/* Next header is not a IPv6 extension header */
|
||||||
return tcpip_rx ( iobuf, nxt_hdr, src, dest, 0 /* fixme */ );
|
return tcpip_rx ( iobuf, netdev, nxt_hdr, src, dest, 0 /* fixme */ );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -344,7 +345,7 @@ static int ipv6_rx ( struct io_buffer *iobuf,
|
|||||||
iob_pull ( iobuf, sizeof ( *ip6hdr ) );
|
iob_pull ( iobuf, sizeof ( *ip6hdr ) );
|
||||||
|
|
||||||
/* Send it to the transport layer */
|
/* Send it to the transport layer */
|
||||||
return ipv6_process_nxt_hdr ( iobuf, ip6hdr->nxt_hdr, &src.st, &dest.st );
|
return ipv6_process_nxt_hdr ( iobuf, netdev, ip6hdr->nxt_hdr, &src.st, &dest.st );
|
||||||
|
|
||||||
drop:
|
drop:
|
||||||
DBG ( "Packet dropped\n" );
|
DBG ( "Packet dropped\n" );
|
||||||
|
@ -1115,12 +1115,14 @@ static void tcp_process_rx_queue ( struct tcp_connection *tcp ) {
|
|||||||
* Process received packet
|
* Process received packet
|
||||||
*
|
*
|
||||||
* @v iobuf I/O buffer
|
* @v iobuf I/O buffer
|
||||||
|
* @v netdev Network device
|
||||||
* @v st_src Partially-filled source address
|
* @v st_src Partially-filled source address
|
||||||
* @v st_dest Partially-filled destination address
|
* @v st_dest Partially-filled destination address
|
||||||
* @v pshdr_csum Pseudo-header checksum
|
* @v pshdr_csum Pseudo-header checksum
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int tcp_rx ( struct io_buffer *iobuf,
|
static int tcp_rx ( struct io_buffer *iobuf,
|
||||||
|
struct net_device *netdev __unused,
|
||||||
struct sockaddr_tcpip *st_src,
|
struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest __unused,
|
struct sockaddr_tcpip *st_dest __unused,
|
||||||
uint16_t pshdr_csum ) {
|
uint16_t pshdr_csum ) {
|
||||||
|
@ -20,6 +20,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
|||||||
/** Process a received TCP/IP packet
|
/** Process a received TCP/IP packet
|
||||||
*
|
*
|
||||||
* @v iobuf I/O buffer
|
* @v iobuf I/O buffer
|
||||||
|
* @v netdev Network device
|
||||||
* @v tcpip_proto Transport-layer protocol number
|
* @v tcpip_proto Transport-layer protocol number
|
||||||
* @v st_src Partially-filled source address
|
* @v st_src Partially-filled source address
|
||||||
* @v st_dest Partially-filled destination address
|
* @v st_dest Partially-filled destination address
|
||||||
@ -32,8 +33,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
|||||||
* address family and the network-layer addresses, but leave the ports
|
* address family and the network-layer addresses, but leave the ports
|
||||||
* and the rest of the structures as zero).
|
* and the rest of the structures as zero).
|
||||||
*/
|
*/
|
||||||
int tcpip_rx ( struct io_buffer *iobuf, uint8_t tcpip_proto,
|
int tcpip_rx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
struct sockaddr_tcpip *st_src,
|
uint8_t tcpip_proto, struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest,
|
struct sockaddr_tcpip *st_dest,
|
||||||
uint16_t pshdr_csum ) {
|
uint16_t pshdr_csum ) {
|
||||||
struct tcpip_protocol *tcpip;
|
struct tcpip_protocol *tcpip;
|
||||||
@ -42,7 +43,8 @@ int tcpip_rx ( struct io_buffer *iobuf, uint8_t tcpip_proto,
|
|||||||
for_each_table_entry ( tcpip, TCPIP_PROTOCOLS ) {
|
for_each_table_entry ( tcpip, TCPIP_PROTOCOLS ) {
|
||||||
if ( tcpip->tcpip_proto == tcpip_proto ) {
|
if ( tcpip->tcpip_proto == tcpip_proto ) {
|
||||||
DBG ( "TCP/IP received %s packet\n", tcpip->name );
|
DBG ( "TCP/IP received %s packet\n", tcpip->name );
|
||||||
return tcpip->rx ( iobuf, st_src, st_dest, pshdr_csum );
|
return tcpip->rx ( iobuf, netdev, st_src, st_dest,
|
||||||
|
pshdr_csum );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,12 +247,15 @@ static struct udp_connection * udp_demux ( struct sockaddr_tcpip *local ) {
|
|||||||
* Process a received packet
|
* Process a received packet
|
||||||
*
|
*
|
||||||
* @v iobuf I/O buffer
|
* @v iobuf I/O buffer
|
||||||
|
* @v netdev Network device
|
||||||
* @v st_src Partially-filled source address
|
* @v st_src Partially-filled source address
|
||||||
* @v st_dest Partially-filled destination address
|
* @v st_dest Partially-filled destination address
|
||||||
* @v pshdr_csum Pseudo-header checksum
|
* @v pshdr_csum Pseudo-header checksum
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int udp_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
|
static int udp_rx ( struct io_buffer *iobuf,
|
||||||
|
struct net_device *netdev __unused,
|
||||||
|
struct sockaddr_tcpip *st_src,
|
||||||
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum ) {
|
struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum ) {
|
||||||
struct udp_header *udphdr = iobuf->data;
|
struct udp_header *udphdr = iobuf->data;
|
||||||
struct udp_connection *udp;
|
struct udp_connection *udp;
|
||||||
|
Reference in New Issue
Block a user