Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[xfer] Make consistent assumptions that xfer metadata can never be NULL
The documentation in xfer.h and xfer.c does not say that the metadata
parameter is optional in calls such as xfer_deliver_iob_meta() and the
deliver_iob() method.  However, some code in net/ is prepared to
accept a NULL pointer, and xfer_deliver_as_iob() passes a NULL pointer
directly to the deliver_iob() method.

Fix this mess of conflicting assumptions by making everything assume
that the metadata parameter is mandatory, and fixing
xfer_deliver_as_iob() to pass in a dummy metadata structure (as is
already done in xfer_deliver_iob()).
  • Loading branch information
Michael Brown committed Feb 15, 2009
1 parent 46da517 commit 8ae1cac
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 32 deletions.
11 changes: 9 additions & 2 deletions src/core/xfer.c
Expand Up @@ -27,6 +27,14 @@
*
*/

/**
* Dummy transfer metadata
*
* This gets passed to xfer_interface::deliver_iob() and equivalents
* when no metadata is available.
*/
static struct xfer_metadata dummy_metadata;

/**
* Close data transfer interface
*
Expand Down Expand Up @@ -159,7 +167,6 @@ int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
*/
int xfer_deliver_iob ( struct xfer_interface *xfer,
struct io_buffer *iobuf ) {
static struct xfer_metadata dummy_metadata;
return xfer_deliver_iob_meta ( xfer, iobuf, &dummy_metadata );
}

Expand Down Expand Up @@ -366,7 +373,7 @@ int xfer_deliver_as_iob ( struct xfer_interface *xfer,
return -ENOMEM;

memcpy ( iob_put ( iobuf, len ), data, len );
return xfer->op->deliver_iob ( xfer, iobuf, NULL );
return xfer->op->deliver_iob ( xfer, iobuf, &dummy_metadata );
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/net/tcp.c
Expand Up @@ -1033,7 +1033,7 @@ static size_t tcp_xfer_window ( struct xfer_interface *xfer ) {
*
* @v xfer Data transfer interface
* @v iobuf Datagram I/O buffer
* @v meta Data transfer metadata, or NULL
* @v meta Data transfer metadata
* @ret rc Return status code
*/
static int tcp_xfer_deliver_iob ( struct xfer_interface *xfer,
Expand Down
2 changes: 1 addition & 1 deletion src/net/tcp/ftp.c
Expand Up @@ -380,7 +380,7 @@ static void ftp_data_closed ( struct xfer_interface *data, int rc ) {
*
* @v xfer FTP data channel interface
* @v iobuf I/O buffer
* @v meta Data transfer metadata, or NULL
* @v meta Data transfer metadata
* @ret rc Return status code
*/
static int ftp_data_deliver_iob ( struct xfer_interface *data,
Expand Down
2 changes: 1 addition & 1 deletion src/net/tcp/http.c
Expand Up @@ -321,7 +321,7 @@ static int http_rx_data ( struct http_request *http,
*
* @v socket Transport layer interface
* @v iobuf I/O buffer
* @v meta Data transfer metadata, or NULL
* @v meta Data transfer metadata
* @ret rc Return status code
*/
static int http_socket_deliver_iob ( struct xfer_interface *socket,
Expand Down
15 changes: 3 additions & 12 deletions src/net/udp.c
Expand Up @@ -390,27 +390,18 @@ static struct io_buffer * udp_alloc_iob ( struct xfer_interface *xfer,
*
* @v xfer Data transfer interface
* @v iobuf Datagram I/O buffer
* @v meta Data transfer metadata, or NULL
* @v meta Data transfer metadata
* @ret rc Return status code
*/
static int udp_xfer_deliver_iob ( struct xfer_interface *xfer,
struct io_buffer *iobuf,
struct xfer_metadata *meta ) {
struct udp_connection *udp =
container_of ( xfer, struct udp_connection, xfer );
struct sockaddr_tcpip *src = NULL;
struct sockaddr_tcpip *dest = NULL;
struct net_device *netdev = NULL;

/* Apply xfer metadata */
if ( meta ) {
src = ( struct sockaddr_tcpip * ) meta->src;
dest = ( struct sockaddr_tcpip * ) meta->dest;
netdev = meta->netdev;
}

/* Transmit data, if possible */
udp_tx ( udp, iobuf, src, dest, netdev );
udp_tx ( udp, iobuf, ( ( struct sockaddr_tcpip * ) meta->src ),
( ( struct sockaddr_tcpip * ) meta->dest ), meta->netdev );

return 0;
}
Expand Down
7 changes: 0 additions & 7 deletions src/net/udp/dhcp.c
Expand Up @@ -1052,12 +1052,6 @@ static int dhcp_deliver_iob ( struct xfer_interface *xfer,
int rc = 0;

/* Sanity checks */
if ( ! meta ) {
DBGC ( dhcp, "DHCP %p received packet without metadata\n",
dhcp );
rc = -EINVAL;
goto err_no_meta;
}
if ( ! meta->src ) {
DBGC ( dhcp, "DHCP %p received packet without source port\n",
dhcp );
Expand Down Expand Up @@ -1106,7 +1100,6 @@ static int dhcp_deliver_iob ( struct xfer_interface *xfer,
dhcppkt_put ( dhcppkt );
err_alloc_dhcppkt:
err_no_src:
err_no_meta:
free_iob ( iobuf );
return rc;
}
Expand Down
11 changes: 3 additions & 8 deletions src/net/udp/tftp.c
Expand Up @@ -839,7 +839,7 @@ static int tftp_rx_error ( struct tftp_request *tftp, void *buf, size_t len ) {
*
* @v tftp TFTP connection
* @v iobuf I/O buffer
* @v meta Transfer metadata, or NULL
* @v meta Transfer metadata
* @ret rc Return status code
*/
static int tftp_rx ( struct tftp_request *tftp,
Expand All @@ -856,11 +856,6 @@ static int tftp_rx ( struct tftp_request *tftp,
"%zd\n", tftp, len );
goto done;
}
if ( ! meta ) {
DBGC ( tftp, "TFTP %p received packet without metadata\n",
tftp );
goto done;
}
if ( ! meta->src ) {
DBGC ( tftp, "TFTP %p received packet without source port\n",
tftp );
Expand Down Expand Up @@ -907,7 +902,7 @@ static int tftp_rx ( struct tftp_request *tftp,
*
* @v socket Transport layer interface
* @v iobuf I/O buffer
* @v meta Transfer metadata, or NULL
* @v meta Transfer metadata
* @ret rc Return status code
*/
static int tftp_socket_deliver_iob ( struct xfer_interface *socket,
Expand Down Expand Up @@ -951,7 +946,7 @@ static struct xfer_interface_operations tftp_socket_operations = {
*
* @v mc_socket Multicast transport layer interface
* @v iobuf I/O buffer
* @v meta Transfer metadata, or NULL
* @v meta Transfer metadata
* @ret rc Return status code
*/
static int tftp_mc_socket_deliver_iob ( struct xfer_interface *mc_socket,
Expand Down

0 comments on commit 8ae1cac

Please sign in to comment.