From ffe0e24249d1dbec59f7b2454974a5855043ba95 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 3 Aug 2006 23:10:14 +0000 Subject: [PATCH] Make the UDP senddata() methods return a status code. 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 | 6 +++--- src/interface/pxe/pxe_udp.c | 7 ++++--- src/net/udp.c | 25 ++----------------------- src/net/udp/dhcp.c | 17 ++++++++++------- 4 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/include/gpxe/udp.h b/src/include/gpxe/udp.h index 0104cc06..a0719850 100644 --- a/src/include/gpxe/udp.h +++ b/src/include/gpxe/udp.h @@ -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 ); diff --git a/src/interface/pxe/pxe_udp.c b/src/interface/pxe/pxe_udp.c index 34a24883..8dced9e8 100644 --- a/src/interface/pxe/pxe_udp.c +++ b/src/interface/pxe/pxe_udp.c @@ -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 ); } /** diff --git a/src/net/udp.c b/src/net/udp.c index 9f55c94f..5c2188fa 100644 --- a/src/net/udp.c +++ b/src/net/udp.c @@ -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 ) ); diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index c2a90973..800e9b38 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -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; } /**