Skip to content

Commit

Permalink
[xfer] Make consistent assumptions that xfer metadata can never be NULL
Browse files Browse the repository at this point in the history
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.