Make the UDP senddata() methods return a status code.
authorMichael Brown <mcb30@etherboot.org>
Thu, 3 Aug 2006 23:10:14 +0000 (23:10 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 3 Aug 2006 23:10:14 +0000 (23:10 +0000)
udp_connect() now follows the standard BSD sockets semantics and simply
sets the default address for outgoing packets; it doesn't filter incoming
packets.

src/include/gpxe/udp.h
src/interface/pxe/pxe_udp.c
src/net/udp.c
src/net/udp/dhcp.c

index 0104cc0..a071985 100644 (file)
@@ -48,6 +48,7 @@ struct udp_operations {
         * @v conn      UDP connection
         * @v buf       Temporary data buffer
         * @v len       Length of temporary data buffer
+        * @ret rc      Return status code
         *
         * The application may use the temporary data buffer to
         * construct the data to be sent.  Note that merely filling
@@ -56,8 +57,8 @@ struct udp_operations {
         * the buffer is not compulsory; the application may call
         * udp_send() on any block of data.
         */
-       void ( * senddata ) ( struct udp_connection *conn, void *buf,
-                             size_t len );
+       int ( * senddata ) ( struct udp_connection *conn, void *buf,
+                            size_t len );
        /**
         * New data received
         *
@@ -98,7 +99,6 @@ extern int udp_bind ( struct udp_connection *conn, uint16_t local_port );
 extern void udp_bind_promisc ( struct udp_connection *conn );
 extern void udp_connect ( struct udp_connection *conn,
                          struct sockaddr_tcpip *peer );
-extern void udp_connect_promisc ( struct udp_connection *conn );
 extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
 extern void udp_close ( struct udp_connection *conn );
 
index 34a2488..8dced9e 100644 (file)
@@ -52,12 +52,13 @@ udp_to_pxe ( struct udp_connection *conn ) {
  * @v conn                     UDP connection
  * @v data                     Temporary data buffer
  * @v len                      Size of temporary data buffer
+ * @ret rc                     Return status code
  *
  * Sends the packet belonging to the current pxenv_udp_write()
  * operation.
  */
-static void pxe_udp_senddata ( struct udp_connection *conn, void *data,
-                              size_t len ) {
+static int pxe_udp_senddata ( struct udp_connection *conn, void *data,
+                             size_t len ) {
        struct pxe_udp_connection *pxe_udp = udp_to_pxe ( conn );
        struct s_PXENV_UDP_WRITE *pxenv_udp_write = pxe_udp->pxenv_udp_write;
        userptr_t buffer;
@@ -68,7 +69,7 @@ static void pxe_udp_senddata ( struct udp_connection *conn, void *data,
        if ( len > pxenv_udp_write->buffer_size )
                len = pxenv_udp_write->buffer_size;
        copy_from_user ( data, buffer, 0, len );
-       udp_send ( conn, data, len );
+       return udp_send ( conn, data, len );
 }
 
 /**
index 9f55c94..5c2188f 100644 (file)
@@ -66,18 +66,6 @@ void udp_connect ( struct udp_connection *conn, struct sockaddr_tcpip *peer ) {
        memcpy ( &conn->peer, peer, sizeof ( conn->peer ) );
 }
 
-/**
- * Connect UDP connection to all remote hosts and ports
- *
- * @v conn             UDP connection
- *
- * This undoes the effect of a call to udp_connect(), i.e. allows the
- * connection to receive packets from all remote hosts and ports.
- */
-void udp_connect_promisc ( struct udp_connection *conn ) {
-       memset ( &conn->peer, 0, sizeof ( conn->peer ) );
-}
-
 /**
  * Open a local port
  *
@@ -140,9 +128,8 @@ int udp_senddata ( struct udp_connection *conn ) {
                return -ENOMEM;
        }
        pkb_reserve ( conn->tx_pkb, UDP_MAX_HLEN );
-       conn->udp_op->senddata ( conn, conn->tx_pkb->data, 
-                                pkb_available ( conn->tx_pkb ) );
-       return 0;
+       return conn->udp_op->senddata ( conn, conn->tx_pkb->data, 
+                                       pkb_available ( conn->tx_pkb ) );
 }
                
 /**
@@ -271,14 +258,6 @@ static int udp_rx ( struct pk_buff *pkb, struct sockaddr_tcpip *st_src,
                        /* Bound to local port and local port doesn't match */
                        continue;
                }
-               if ( conn->peer.st_family &&
-                    ( memcmp ( &conn->peer, st_src,
-                               sizeof ( conn->peer ) ) != 0 ) ) {
-                       /* Connected to remote port and remote port
-                        * doesn't match
-                        */
-                       continue;
-               }
                
                /* Strip off the UDP header */
                pkb_pull ( pkb, sizeof ( *udphdr ) );
index c2a9097..800e9b3 100644 (file)
@@ -508,9 +508,10 @@ static union {
  * @v conn             UDP connection
  * @v buf              Temporary data buffer
  * @v len              Length of temporary data buffer
+ * @ret rc             Return status code
  */
-static void dhcp_senddata ( struct udp_connection *conn,
-                           void *buf, size_t len ) {
+static int dhcp_senddata ( struct udp_connection *conn,
+                          void *buf, size_t len ) {
        struct dhcp_session *dhcp = udp_to_dhcp ( conn );
        struct dhcp_packet dhcppkt;
        int rc;
@@ -524,14 +525,14 @@ static void dhcp_senddata ( struct udp_connection *conn,
        if ( ( rc = create_dhcp_packet ( dhcp, dhcp->state, buf, len,
                                         &dhcppkt ) ) != 0 ) {
                DBG ( "Could not create DHCP packet\n" );
-               return;
+               return rc;
        }
 
        /* Copy in options common to all requests */
        if ( ( rc = copy_dhcp_packet_options ( &dhcppkt,
                                               &dhcp_request_options ) ) != 0){
                DBG ( "Could not set common DHCP options\n" );
-               return;
+               return rc;
        }
 
        /* Copy any required options from previous server repsonse */
@@ -540,13 +541,13 @@ static void dhcp_senddata ( struct udp_connection *conn,
                                            DHCP_SERVER_IDENTIFIER,
                                            DHCP_SERVER_IDENTIFIER ) ) != 0 ) {
                        DBG ( "Could not set server identifier option\n" );
-                       return;
+                       return rc;
                }
                if ( ( rc = copy_dhcp_packet_option ( &dhcppkt, dhcp->options,
                                            DHCP_EB_YIADDR,
                                            DHCP_REQUESTED_ADDRESS ) ) != 0 ) {
                        DBG ( "Could not set requested address option\n" );
-                       return;
+                       return rc;
                }
        }
 
@@ -554,8 +555,10 @@ static void dhcp_senddata ( struct udp_connection *conn,
        if ( ( rc = udp_sendto ( conn, &sa_dhcp_server.st,
                                 dhcppkt.dhcphdr, dhcppkt.len ) ) != 0 ) {
                DBG ( "Could not transmit UDP packet\n" );
-               return;
+               return rc;
        }
+
+       return 0;
 }
 
 /**