Add udp_sendto_via() to allow e.g. DHCP to transmit without first having
authorMichael Brown <mcb30@etherboot.org>
Wed, 10 Jan 2007 02:31:38 +0000 (02:31 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 10 Jan 2007 02:31:38 +0000 (02:31 +0000)
to set up dummy routing entries.

src/include/gpxe/udp.h
src/net/udp.c

index d32c878..074c5e1 100644 (file)
@@ -14,6 +14,8 @@
 #include <gpxe/tcpip.h>
 #include <gpxe/if_ether.h>
 
+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 */
index 32dfaec..05e288b 100644 (file)
@@ -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 );
 }
 
 /**