From c821a7b20d8763c7d0de07e762ffae2e97f644dc Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 10 Jan 2007 02:31:38 +0000 Subject: [PATCH] Add udp_sendto_via() to allow e.g. DHCP to transmit without first having to set up dummy routing entries. --- src/include/gpxe/udp.h | 5 +++++ src/net/udp.c | 28 +++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/include/gpxe/udp.h b/src/include/gpxe/udp.h index d32c8782..074c5e1d 100644 --- a/src/include/gpxe/udp.h +++ b/src/include/gpxe/udp.h @@ -14,6 +14,8 @@ #include #include +struct net_device; + /** * UDP constants */ @@ -161,5 +163,8 @@ extern int udp_send ( struct udp_connection *conn, extern int udp_sendto ( struct udp_connection *conn, struct sockaddr_tcpip *peer, const void *data, size_t len ); +int udp_sendto_via ( struct udp_connection *conn, struct sockaddr_tcpip *peer, + struct net_device *netdev, const void *data, + size_t len ); #endif /* _GPXE_UDP_H */ diff --git a/src/net/udp.c b/src/net/udp.c index 32dfaec3..05e288bf 100644 --- a/src/net/udp.c +++ b/src/net/udp.c @@ -115,6 +115,7 @@ int udp_senddata ( struct udp_connection *conn ) { * * @v conn UDP connection * @v peer Destination address + * @v netdev Net device via which to send (or NULL) * @v data Data to send * @v len Length of data * @ret rc Return status code @@ -125,8 +126,9 @@ int udp_senddata ( struct udp_connection *conn ) { * call udp_senddata() and wait for its senddata() method to be * called. */ -int udp_sendto ( struct udp_connection *conn, struct sockaddr_tcpip *peer, - const void *data, size_t len ) { +int udp_sendto_via ( struct udp_connection *conn, struct sockaddr_tcpip *peer, + struct net_device *netdev, const void *data, + size_t len ) { struct udp_header *udphdr; struct pk_buff *pkb; @@ -162,7 +164,27 @@ int udp_sendto ( struct udp_connection *conn, struct sockaddr_tcpip *peer, ntohs ( udphdr->len ) ); /* Send it to the next layer for processing */ - return tcpip_tx ( pkb, &udp_protocol, peer, NULL, &udphdr->chksum ); + return tcpip_tx ( pkb, &udp_protocol, peer, netdev, &udphdr->chksum ); +} + +/** + * Transmit data via a UDP connection to a specified address + * + * @v conn UDP connection + * @v peer Destination address + * @v data Data to send + * @v len Length of data + * @ret rc Return status code + * + * This function fills up the UDP headers and sends the data. It may + * be called only from within the context of an application's + * senddata() method; if the application wishes to send data it must + * call udp_senddata() and wait for its senddata() method to be + * called. + */ +int udp_sendto ( struct udp_connection *conn, struct sockaddr_tcpip *peer, + const void *data, size_t len ) { + return udp_sendto_via ( conn, peer, NULL, data, len ); } /**