* @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
* 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
*
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 );
* @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;
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 );
}
/**
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
*
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 ) );
}
/**
/* 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 ) );
* @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;
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 */
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;
}
}
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;
}
/**