summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2009-02-15 09:41:46 +0100
committerMichael Brown2009-02-15 09:44:22 +0100
commit8ae1cac0502c2a4d946f7bafa15a944bb1ef48a2 (patch)
treee271a28b9cb1ecb3749df8fc33e0d6f54eee8c8e /src
parent[umalloc] Avoid problems when _textdata_memsz is a multiple of 4kB (diff)
downloadipxe-8ae1cac0502c2a4d946f7bafa15a944bb1ef48a2.tar.gz
ipxe-8ae1cac0502c2a4d946f7bafa15a944bb1ef48a2.tar.xz
ipxe-8ae1cac0502c2a4d946f7bafa15a944bb1ef48a2.zip
[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()).
Diffstat (limited to 'src')
-rw-r--r--src/core/xfer.c11
-rw-r--r--src/net/tcp.c2
-rw-r--r--src/net/tcp/ftp.c2
-rw-r--r--src/net/tcp/http.c2
-rw-r--r--src/net/udp.c15
-rw-r--r--src/net/udp/dhcp.c7
-rw-r--r--src/net/udp/tftp.c11
7 files changed, 18 insertions, 32 deletions
diff --git a/src/core/xfer.c b/src/core/xfer.c
index 14c77d64..9ed19da2 100644
--- a/src/core/xfer.c
+++ b/src/core/xfer.c
@@ -28,6 +28,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
*
* @v xfer Data transfer interface
@@ -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 );
}
@@ -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 );
}
/**
diff --git a/src/net/tcp.c b/src/net/tcp.c
index 094317b3..6bcd193c 100644
--- a/src/net/tcp.c
+++ b/src/net/tcp.c
@@ -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,
diff --git a/src/net/tcp/ftp.c b/src/net/tcp/ftp.c
index 82dc19ca..445e32bb 100644
--- a/src/net/tcp/ftp.c
+++ b/src/net/tcp/ftp.c
@@ -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,
diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c
index 57487308..0191750b 100644
--- a/src/net/tcp/http.c
+++ b/src/net/tcp/http.c
@@ -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,
diff --git a/src/net/udp.c b/src/net/udp.c
index 57edb9c6..c3a1eba3 100644
--- a/src/net/udp.c
+++ b/src/net/udp.c
@@ -390,7 +390,7 @@ 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,
@@ -398,19 +398,10 @@ static int udp_xfer_deliver_iob ( struct xfer_interface *xfer,
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;
}
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index d1492146..776635c2 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -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 );
@@ -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;
}
diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c
index ec6b1b40..19525f79 100644
--- a/src/net/udp/tftp.c
+++ b/src/net/udp/tftp.c
@@ -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,
@@ -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 );
@@ -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,
@@ -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,