diff options
| author | Michael Brown | 2010-06-16 02:31:29 +0200 |
|---|---|---|
| committer | Michael Brown | 2010-06-22 16:50:31 +0200 |
| commit | 4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 (patch) | |
| tree | ccf92bdfd23046b6c7f64f87b57350f02f63ad6f /src/net/udp | |
| parent | [interface] Convert all name-resolution interfaces to generic interfaces (diff) | |
| download | ipxe-4327d5d39f101f1df0ace6c03f3b3ada5f6a6213.tar.gz ipxe-4327d5d39f101f1df0ace6c03f3b3ada5f6a6213.tar.xz ipxe-4327d5d39f101f1df0ace6c03f3b3ada5f6a6213.zip | |
[interface] Convert all data-xfer interfaces to generic interfaces
Remove data-xfer as an interface type, and replace data-xfer
interfaces with generic interfaces supporting the data-xfer methods.
Filter interfaces (as used by the TLS layer) are handled using the
generic pass-through interface capability. A side-effect of this is
that deliver_raw() no longer exists as a data-xfer method. (In
practice this doesn't lose any efficiency, since there are no
instances within the current codebase where xfer_deliver_raw() is used
to pass data to an interface supporting the deliver_raw() method.)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/udp')
| -rw-r--r-- | src/net/udp/dhcp.c | 37 | ||||
| -rw-r--r-- | src/net/udp/dns.c | 81 | ||||
| -rw-r--r-- | src/net/udp/slam.c | 134 | ||||
| -rw-r--r-- | src/net/udp/tftp.c | 134 |
4 files changed, 146 insertions, 240 deletions
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 991983197..fb62bef53 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <assert.h> #include <byteswap.h> #include <ipxe/if_ether.h> +#include <ipxe/iobuf.h> #include <ipxe/netdevice.h> #include <ipxe/device.h> #include <ipxe/xfer.h> @@ -240,7 +241,7 @@ struct dhcp_session { /** Job control interface */ struct interface job; /** Data transfer interface */ - struct xfer_interface xfer; + struct interface xfer; /** Network device being configured */ struct net_device *netdev; @@ -298,8 +299,7 @@ static void dhcp_finished ( struct dhcp_session *dhcp, int rc ) { stop_timer ( &dhcp->timer ); /* Shut down interfaces */ - xfer_nullify ( &dhcp->xfer ); - xfer_close ( &dhcp->xfer, rc ); + intf_shutdown ( &dhcp->xfer, rc ); intf_shutdown ( &dhcp->job, rc ); } @@ -1241,8 +1241,8 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) { /* Transmit the packet */ iob_put ( iobuf, dhcppkt.len ); - if ( ( rc = xfer_deliver_iob_meta ( &dhcp->xfer, iob_disown ( iobuf ), - &meta ) ) != 0 ) { + if ( ( rc = xfer_deliver ( &dhcp->xfer, iob_disown ( iobuf ), + &meta ) ) != 0 ) { DBGC ( dhcp, "DHCP %p could not transmit UDP packet: %s\n", dhcp, strerror ( rc ) ); goto done; @@ -1256,16 +1256,14 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) { /** * Receive new data * - * @v xfer Data transfer interface + * @v dhcp DHCP session * @v iobuf I/O buffer * @v meta Transfer metadata * @ret rc Return status code */ -static int dhcp_deliver_iob ( struct xfer_interface *xfer, - struct io_buffer *iobuf, - struct xfer_metadata *meta ) { - struct dhcp_session *dhcp = - container_of ( xfer, struct dhcp_session, xfer ); +static int dhcp_deliver ( struct dhcp_session *dhcp, + struct io_buffer *iobuf, + struct xfer_metadata *meta ) { struct sockaddr_in *peer; size_t data_len; struct dhcp_packet *dhcppkt; @@ -1328,15 +1326,14 @@ static int dhcp_deliver_iob ( struct xfer_interface *xfer, } /** DHCP data transfer interface operations */ -static struct xfer_interface_operations dhcp_xfer_operations = { - .close = ignore_xfer_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = dhcp_deliver_iob, - .deliver_raw = xfer_deliver_as_iob, +static struct interface_operation dhcp_xfer_operations[] = { + INTF_OP ( xfer_deliver, struct dhcp_session *, dhcp_deliver ), }; +/** DHCP data transfer interface descriptor */ +static struct interface_descriptor dhcp_xfer_desc = + INTF_DESC ( struct dhcp_session, xfer, dhcp_xfer_operations ); + /** * Handle DHCP retry timer expiry * @@ -1427,7 +1424,7 @@ int start_dhcp ( struct interface *job, struct net_device *netdev ) { return -ENOMEM; ref_init ( &dhcp->refcnt, dhcp_free ); intf_init ( &dhcp->job, &dhcp_job_desc, &dhcp->refcnt ); - xfer_init ( &dhcp->xfer, &dhcp_xfer_operations, &dhcp->refcnt ); + intf_init ( &dhcp->xfer, &dhcp_xfer_desc, &dhcp->refcnt ); timer_init ( &dhcp->timer, dhcp_timer_expired ); dhcp->netdev = netdev_get ( netdev ); dhcp->local.sin_family = AF_INET; @@ -1530,7 +1527,7 @@ int start_pxebs ( struct interface *job, struct net_device *netdev, return -ENOMEM; ref_init ( &dhcp->refcnt, dhcp_free ); intf_init ( &dhcp->job, &dhcp_job_desc, &dhcp->refcnt ); - xfer_init ( &dhcp->xfer, &dhcp_xfer_operations, &dhcp->refcnt ); + intf_init ( &dhcp->xfer, &dhcp_xfer_desc, &dhcp->refcnt ); timer_init ( &dhcp->timer, dhcp_timer_expired ); dhcp->netdev = netdev_get ( netdev ); dhcp->local.sin_family = AF_INET; diff --git a/src/net/udp/dns.c b/src/net/udp/dns.c index fd1ea0a28..8283e6fba 100644 --- a/src/net/udp/dns.c +++ b/src/net/udp/dns.c @@ -28,6 +28,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <errno.h> #include <byteswap.h> #include <ipxe/refcnt.h> +#include <ipxe/iobuf.h> #include <ipxe/xfer.h> #include <ipxe/open.h> #include <ipxe/resolv.h> @@ -60,7 +61,7 @@ struct dns_request { /** Name resolution interface */ struct interface resolv; /** Data transfer interface */ - struct xfer_interface socket; + struct interface socket; /** Retry timer */ struct retry_timer timer; @@ -89,11 +90,8 @@ static void dns_done ( struct dns_request *dns, int rc ) { /* Stop the retry timer */ stop_timer ( &dns->timer ); - /* Close data transfer interface */ - xfer_nullify ( &dns->socket ); - xfer_close ( &dns->socket, rc ); - /* Shut down interfaces */ + intf_shutdown ( &dns->socket, rc ); intf_shutdown ( &dns->resolv, rc ); } @@ -322,25 +320,26 @@ static void dns_timer_expired ( struct retry_timer *timer, int fail ) { /** * Receive new data * - * @v socket UDP socket - * @v data DNS reply - * @v len Length of DNS reply + * @v dns DNS request + * @v iobuf I/O buffer + * @v meta Data transfer metadata * @ret rc Return status code */ -static int dns_xfer_deliver_raw ( struct xfer_interface *socket, - const void *data, size_t len ) { - struct dns_request *dns = - container_of ( socket, struct dns_request, socket ); - const struct dns_header *reply = data; +static int dns_xfer_deliver ( struct dns_request *dns, + struct io_buffer *iobuf, + struct xfer_metadata *meta __unused ) { + const struct dns_header *reply = iobuf->data; union dns_rr_info *rr_info; struct sockaddr_in *sin; unsigned int qtype = dns->qinfo->qtype; + int rc; /* Sanity check */ - if ( len < sizeof ( *reply ) ) { + if ( iob_len ( iobuf ) < sizeof ( *reply ) ) { DBGC ( dns, "DNS %p received underlength packet length %zd\n", - dns, len ); - return -EINVAL; + dns, iob_len ( iobuf ) ); + rc = -EINVAL; + goto done; } /* Check reply ID matches query ID */ @@ -348,7 +347,8 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, DBGC ( dns, "DNS %p received unexpected reply ID %d " "(wanted %d)\n", dns, ntohs ( reply->id ), ntohs ( dns->query.dns.id ) ); - return -EINVAL; + rc = -EINVAL; + goto done; } DBGC ( dns, "DNS %p received reply ID %d\n", dns, ntohs ( reply->id )); @@ -382,7 +382,8 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, /* Mark operation as complete */ dns_done ( dns, 0 ); - return 0; + rc = 0; + goto done; case htons ( DNS_TYPE_CNAME ): @@ -399,7 +400,8 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, DBGC ( dns, "DNS %p recursion exceeded\n", dns ); dns_done ( dns, -ELOOP ); - return 0; + rc = 0; + goto done; } break; @@ -422,7 +424,8 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, DBGC ( dns, "DNS %p found no A record; trying CNAME\n", dns ); dns->qinfo->qtype = htons ( DNS_TYPE_CNAME ); dns_send_packet ( dns ); - return 0; + rc = 0; + goto done; case htons ( DNS_TYPE_CNAME ): /* We asked for a CNAME record. If we got a response @@ -431,29 +434,35 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, */ if ( dns->qinfo->qtype == htons ( DNS_TYPE_A ) ) { dns_send_packet ( dns ); - return 0; + rc = 0; + goto done; } else { DBGC ( dns, "DNS %p found no CNAME record\n", dns ); dns_done ( dns, -ENXIO ); - return 0; + rc = 0; + goto done; } default: assert ( 0 ); dns_done ( dns, -EINVAL ); - return 0; + rc = -EINVAL; + goto done; } + + done: + /* Free I/O buffer */ + free_iob ( iobuf ); + return rc; } /** * Receive new data * - * @v socket UDP socket + * @v dns DNS request * @v rc Reason for close */ -static void dns_xfer_close ( struct xfer_interface *socket, int rc ) { - struct dns_request *dns = - container_of ( socket, struct dns_request, socket ); +static void dns_xfer_close ( struct dns_request *dns, int rc ) { if ( ! rc ) rc = -ECONNABORTED; @@ -461,16 +470,16 @@ static void dns_xfer_close ( struct xfer_interface *socket, int rc ) { dns_done ( dns, rc ); } -/** DNS socket operations */ -static struct xfer_interface_operations dns_socket_operations = { - .close = dns_xfer_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = xfer_deliver_as_raw, - .deliver_raw = dns_xfer_deliver_raw, +/** DNS socket interface operations */ +static struct interface_operation dns_socket_operations[] = { + INTF_OP ( xfer_deliver, struct dns_request *, dns_xfer_deliver ), + INTF_OP ( intf_close, struct dns_request *, dns_xfer_close ), }; +/** DNS socket interface descriptor */ +static struct interface_descriptor dns_socket_desc = + INTF_DESC ( struct dns_request, socket, dns_socket_operations ); + /** DNS resolver interface operations */ static struct interface_operation dns_resolv_op[] = { INTF_OP ( intf_close, struct dns_request *, dns_done ), @@ -517,7 +526,7 @@ static int dns_resolv ( struct interface *resolv, } ref_init ( &dns->refcnt, NULL ); intf_init ( &dns->resolv, &dns_resolv_desc, &dns->refcnt ); - xfer_init ( &dns->socket, &dns_socket_operations, &dns->refcnt ); + intf_init ( &dns->socket, &dns_socket_desc, &dns->refcnt ); timer_init ( &dns->timer, dns_timer_expired ); memcpy ( &dns->sa, sa, sizeof ( dns->sa ) ); diff --git a/src/net/udp/slam.c b/src/net/udp/slam.c index a5a2421fa..84bb9cba3 100644 --- a/src/net/udp/slam.c +++ b/src/net/udp/slam.c @@ -119,11 +119,11 @@ struct slam_request { struct refcnt refcnt; /** Data transfer interface */ - struct xfer_interface xfer; + struct interface xfer; /** Unicast socket */ - struct xfer_interface socket; + struct interface socket; /** Multicast socket */ - struct xfer_interface mc_socket; + struct interface mc_socket; /** Master client retry timer */ struct retry_timer master_timer; @@ -184,12 +184,9 @@ static void slam_finished ( struct slam_request *slam, int rc ) { stop_timer ( &slam->slave_timer ); /* Close all data transfer interfaces */ - xfer_nullify ( &slam->socket ); - xfer_close ( &slam->socket, rc ); - xfer_nullify ( &slam->mc_socket ); - xfer_close ( &slam->mc_socket, rc ); - xfer_nullify ( &slam->xfer ); - xfer_close ( &slam->xfer, rc ); + intf_shutdown ( &slam->socket, rc ); + intf_shutdown ( &slam->mc_socket, rc ); + intf_shutdown ( &slam->xfer, rc ); } /**************************************************************************** @@ -473,15 +470,13 @@ static int slam_pull_header ( struct slam_request *slam, /** * Receive SLAM data packet * - * @v mc_socket SLAM multicast socket + * @v slam SLAM request * @v iobuf I/O buffer * @ret rc Return status code */ -static int slam_mc_socket_deliver ( struct xfer_interface *mc_socket, +static int slam_mc_socket_deliver ( struct slam_request *slam, struct io_buffer *iobuf, struct xfer_metadata *rx_meta __unused ) { - struct slam_request *slam = - container_of ( mc_socket, struct slam_request, mc_socket ); struct xfer_metadata meta; unsigned long packet; size_t len; @@ -533,8 +528,7 @@ static int slam_mc_socket_deliver ( struct xfer_interface *mc_socket, memset ( &meta, 0, sizeof ( meta ) ); meta.whence = SEEK_SET; meta.offset = ( packet * slam->block_size ); - if ( ( rc = xfer_deliver_iob_meta ( &slam->xfer, iobuf, - &meta ) ) != 0 ) + if ( ( rc = xfer_deliver ( &slam->xfer, iobuf, &meta ) ) != 0 ) goto err; /* Mark block as received */ @@ -556,15 +550,13 @@ static int slam_mc_socket_deliver ( struct xfer_interface *mc_socket, /** * Receive SLAM non-data packet * - * @v socket SLAM unicast socket + * @v slam SLAM request * @v iobuf I/O buffer * @ret rc Return status code */ -static int slam_socket_deliver ( struct xfer_interface *socket, +static int slam_socket_deliver ( struct slam_request *slam, struct io_buffer *iobuf, struct xfer_metadata *rx_meta __unused ) { - struct slam_request *slam = - container_of ( socket, struct slam_request, socket ); int rc; /* Restart the master client timer */ @@ -597,90 +589,41 @@ static int slam_socket_deliver ( struct xfer_interface *socket, } -/** - * Close SLAM unicast socket - * - * @v socket SLAM unicast socket - * @v rc Reason for close - */ -static void slam_socket_close ( struct xfer_interface *socket, int rc ) { - struct slam_request *slam = - container_of ( socket, struct slam_request, socket ); - - DBGC ( slam, "SLAM %p unicast socket closed: %s\n", - slam, strerror ( rc ) ); - - slam_finished ( slam, rc ); -} - -/** SLAM unicast socket data transfer operations */ -static struct xfer_interface_operations slam_socket_operations = { - .close = slam_socket_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = slam_socket_deliver, - .deliver_raw = xfer_deliver_as_iob, +/** SLAM unicast socket interface operations */ +static struct interface_operation slam_socket_operations[] = { + INTF_OP ( xfer_deliver, struct slam_request *, slam_socket_deliver ), + INTF_OP ( intf_close, struct slam_request *, slam_finished ), }; -/** - * Close SLAM multicast socket - * - * @v mc_socket SLAM multicast socket - * @v rc Reason for close - */ -static void slam_mc_socket_close ( struct xfer_interface *mc_socket, int rc ){ - struct slam_request *slam = - container_of ( mc_socket, struct slam_request, mc_socket ); - - DBGC ( slam, "SLAM %p multicast socket closed: %s\n", - slam, strerror ( rc ) ); - - slam_finished ( slam, rc ); -} +/** SLAM unicast socket interface descriptor */ +static struct interface_descriptor slam_socket_desc = + INTF_DESC ( struct slam_request, socket, slam_socket_operations ); -/** SLAM multicast socket data transfer operations */ -static struct xfer_interface_operations slam_mc_socket_operations = { - .close = slam_mc_socket_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = slam_mc_socket_deliver, - .deliver_raw = xfer_deliver_as_iob, +/** SLAM multicast socket interface operations */ +static struct interface_operation slam_mc_socket_operations[] = { + INTF_OP ( xfer_deliver, struct slam_request *, slam_mc_socket_deliver ), + INTF_OP ( intf_close, struct slam_request *, slam_finished ), }; +/** SLAM multicast socket interface descriptor */ +static struct interface_descriptor slam_mc_socket_desc = + INTF_DESC ( struct slam_request, mc_socket, slam_mc_socket_operations ); + /**************************************************************************** * * Data transfer interface * */ -/** - * Close SLAM data transfer interface - * - * @v xfer SLAM data transfer interface - * @v rc Reason for close - */ -static void slam_xfer_close ( struct xfer_interface *xfer, int rc ) { - struct slam_request *slam = - container_of ( xfer, struct slam_request, xfer ); - - DBGC ( slam, "SLAM %p data transfer interface closed: %s\n", - slam, strerror ( rc ) ); - - slam_finished ( slam, rc ); -} - -/** SLAM data transfer operations */ -static struct xfer_interface_operations slam_xfer_operations = { - .close = slam_xfer_close, - .vredirect = ignore_xfer_vredirect, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = xfer_deliver_as_raw, - .deliver_raw = ignore_xfer_deliver_raw, +/** SLAM data transfer interface operations */ +static struct interface_operation slam_xfer_operations[] = { + INTF_OP ( intf_close, struct slam_request *, slam_finished ), }; +/** SLAM data transfer interface descriptor */ +static struct interface_descriptor slam_xfer_desc = + INTF_DESC ( struct slam_request, xfer, slam_xfer_operations ); + /** * Parse SLAM URI multicast address * @@ -729,7 +672,7 @@ static int slam_parse_multicast_address ( struct slam_request *slam, * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int slam_open ( struct xfer_interface *xfer, struct uri *uri ) { +static int slam_open ( struct interface *xfer, struct uri *uri ) { static const struct sockaddr_in default_multicast = { .sin_family = AF_INET, .sin_port = htons ( SLAM_DEFAULT_MULTICAST_PORT ), @@ -749,10 +692,9 @@ static int slam_open ( struct xfer_interface *xfer, struct uri *uri ) { if ( ! slam ) return -ENOMEM; ref_init ( &slam->refcnt, slam_free ); - xfer_init ( &slam->xfer, &slam_xfer_operations, &slam->refcnt ); - xfer_init ( &slam->socket, &slam_socket_operations, &slam->refcnt ); - xfer_init ( &slam->mc_socket, &slam_mc_socket_operations, - &slam->refcnt ); + intf_init ( &slam->xfer, &slam_xfer_desc, &slam->refcnt ); + intf_init ( &slam->socket, &slam_socket_desc, &slam->refcnt ); + intf_init ( &slam->mc_socket, &slam_mc_socket_desc, &slam->refcnt ); timer_init ( &slam->master_timer, slam_master_timer_expired ); timer_init ( &slam->slave_timer, slam_slave_timer_expired ); /* Fake an invalid cached header of { 0x00, ... } */ @@ -795,7 +737,7 @@ static int slam_open ( struct xfer_interface *xfer, struct uri *uri ) { start_timer_fixed ( &slam->slave_timer, SLAM_SLAVE_TIMEOUT ); /* Attach to parent interface, mortalise self, and return */ - xfer_plug_plug ( &slam->xfer, xfer ); + intf_plug_plug ( &slam->xfer, xfer ); ref_put ( &slam->refcnt ); return 0; diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c index 5e98f58cd..3bcd0a258 100644 --- a/src/net/udp/tftp.c +++ b/src/net/udp/tftp.c @@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <errno.h> #include <assert.h> #include <ipxe/refcnt.h> +#include <ipxe/iobuf.h> #include <ipxe/xfer.h> #include <ipxe/open.h> #include <ipxe/uri.h> @@ -79,14 +80,14 @@ struct tftp_request { /** Reference count */ struct refcnt refcnt; /** Data transfer interface */ - struct xfer_interface xfer; + struct interface xfer; /** URI being fetched */ struct uri *uri; /** Transport layer interface */ - struct xfer_interface socket; + struct interface socket; /** Multicast transport layer interface */ - struct xfer_interface mc_socket; + struct interface mc_socket; /** Data block size * @@ -183,12 +184,9 @@ static void tftp_done ( struct tftp_request *tftp, int rc ) { stop_timer ( &tftp->timer ); /* Close all data transfer interfaces */ - xfer_nullify ( &tftp->socket ); - xfer_close ( &tftp->socket, rc ); - xfer_nullify ( &tftp->mc_socket ); - xfer_close ( &tftp->mc_socket, rc ); - xfer_nullify ( &tftp->xfer ); - xfer_close ( &tftp->xfer, rc ); + intf_shutdown ( &tftp->socket, rc ); + intf_shutdown ( &tftp->mc_socket, rc ); + intf_shutdown ( &tftp->xfer, rc ); } /** @@ -202,7 +200,7 @@ static int tftp_reopen ( struct tftp_request *tftp ) { int rc; /* Close socket */ - xfer_close ( &tftp->socket, 0 ); + intf_restart ( &tftp->socket, 0 ); /* Disable ACK sending. */ tftp->flags &= ~TFTP_FL_SEND_ACK; @@ -236,7 +234,7 @@ static int tftp_reopen_mc ( struct tftp_request *tftp, int rc; /* Close multicast socket */ - xfer_close ( &tftp->mc_socket, 0 ); + intf_restart ( &tftp->mc_socket, 0 ); /* Open multicast socket. We never send via this socket, so * use the local address as the peer address (since the peer @@ -423,7 +421,7 @@ static int tftp_send_ack ( struct tftp_request *tftp ) { ack->block = htons ( block ); /* ACK always goes to the peer recorded from the RRQ response */ - return xfer_deliver_iob_meta ( &tftp->socket, iobuf, &meta ); + return xfer_deliver ( &tftp->socket, iobuf, &meta ); } /** @@ -459,7 +457,7 @@ static int tftp_send_error ( struct tftp_request *tftp, int errcode, strcpy ( err->errmsg, errmsg ); /* ERR always goes to the peer recorded from the RRQ response */ - return xfer_deliver_iob_meta ( &tftp->socket, iobuf, &meta ); + return xfer_deliver ( &tftp->socket, iobuf, &meta ); } /** @@ -525,7 +523,7 @@ static void tftp_timer_expired ( struct retry_timer *timer, int fail ) { tftp->flags = TFTP_FL_RRQ_SIZES; /* Close multicast socket */ - xfer_close ( &tftp->mc_socket, 0 ); + intf_restart ( &tftp->mc_socket, 0 ); /* Reset retry timer */ start_timer_nodelay ( &tftp->timer ); @@ -858,8 +856,8 @@ static int tftp_rx_data ( struct tftp_request *tftp, memset ( &meta, 0, sizeof ( meta ) ); meta.whence = SEEK_SET; meta.offset = offset; - if ( ( rc = xfer_deliver_iob_meta ( &tftp->xfer, iob_disown ( iobuf ), - &meta ) ) != 0 ) { + if ( ( rc = xfer_deliver ( &tftp->xfer, iob_disown ( iobuf ), + &meta ) ) != 0 ) { DBGC ( tftp, "TFTP %p could not deliver data: %s\n", tftp, strerror ( rc ) ); goto done; @@ -998,16 +996,14 @@ static int tftp_rx ( struct tftp_request *tftp, /** * Receive new data via socket * - * @v socket Transport layer interface + * @v tftp TFTP connection * @v iobuf I/O buffer * @v meta Transfer metadata * @ret rc Return status code */ -static int tftp_socket_deliver_iob ( struct xfer_interface *socket, - struct io_buffer *iobuf, - struct xfer_metadata *meta ) { - struct tftp_request *tftp = - container_of ( socket, struct tftp_request, socket ); +static int tftp_socket_deliver ( struct tftp_request *tftp, + struct io_buffer *iobuf, + struct xfer_metadata *meta ) { /* Enable sending ACKs when we receive a unicast packet. This * covers three cases: @@ -1030,67 +1026,30 @@ static int tftp_socket_deliver_iob ( struct xfer_interface *socket, } /** TFTP socket operations */ -static struct xfer_interface_operations tftp_socket_operations = { - .close = ignore_xfer_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = tftp_socket_deliver_iob, - .deliver_raw = xfer_deliver_as_iob, +static struct interface_operation tftp_socket_operations[] = { + INTF_OP ( xfer_deliver, struct tftp_request *, tftp_socket_deliver ), }; -/** - * Receive new data via multicast socket - * - * @v mc_socket Multicast transport layer interface - * @v iobuf I/O buffer - * @v meta Transfer metadata - * @ret rc Return status code - */ -static int tftp_mc_socket_deliver_iob ( struct xfer_interface *mc_socket, - struct io_buffer *iobuf, - struct xfer_metadata *meta ) { - struct tftp_request *tftp = - container_of ( mc_socket, struct tftp_request, mc_socket ); - - return tftp_rx ( tftp, iobuf, meta ); -} +/** TFTP socket interface descriptor */ +static struct interface_descriptor tftp_socket_desc = + INTF_DESC ( struct tftp_request, socket, tftp_socket_operations ); /** TFTP multicast socket operations */ -static struct xfer_interface_operations tftp_mc_socket_operations = { - .close = ignore_xfer_close, - .vredirect = xfer_vreopen, - .window = unlimited_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = tftp_mc_socket_deliver_iob, - .deliver_raw = xfer_deliver_as_iob, +static struct interface_operation tftp_mc_socket_operations[] = { + INTF_OP ( xfer_deliver, struct tftp_request *, tftp_rx ), }; -/** - * Close TFTP data transfer interface - * - * @v xfer Data transfer interface - * @v rc Reason for close - */ -static void tftp_xfer_close ( struct xfer_interface *xfer, int rc ) { - struct tftp_request *tftp = - container_of ( xfer, struct tftp_request, xfer ); - - DBGC ( tftp, "TFTP %p interface closed: %s\n", - tftp, strerror ( rc ) ); - - tftp_done ( tftp, rc ); -} +/** TFTP multicast socket interface descriptor */ +static struct interface_descriptor tftp_mc_socket_desc = + INTF_DESC ( struct tftp_request, mc_socket, tftp_mc_socket_operations ); /** * Check flow control window * - * @v xfer Data transfer interface + * @v tftp TFTP connection * @ret len Length of window */ -static size_t tftp_xfer_window ( struct xfer_interface *xfer ) { - struct tftp_request *tftp = - container_of ( xfer, struct tftp_request, xfer ); +static size_t tftp_xfer_window ( struct tftp_request *tftp ) { /* We abuse this data-xfer method to convey the blocksize to * the caller. This really should be done using some kind of @@ -1101,15 +1060,15 @@ static size_t tftp_xfer_window ( struct xfer_interface *xfer ) { } /** TFTP data transfer interface operations */ -static struct xfer_interface_operations tftp_xfer_operations = { - .close = tftp_xfer_close, - .vredirect = ignore_xfer_vredirect, - .window = tftp_xfer_window, - .alloc_iob = default_xfer_alloc_iob, - .deliver_iob = xfer_deliver_as_raw, - .deliver_raw = ignore_xfer_deliver_raw, +static struct interface_operation tftp_xfer_operations[] = { + INTF_OP ( xfer_window, struct tftp_request *, tftp_xfer_window ), + INTF_OP ( intf_close, struct tftp_request *, tftp_done ), }; +/** TFTP data transfer interface descriptor */ +static struct interface_descriptor tftp_xfer_desc = + INTF_DESC ( struct tftp_request, xfer, tftp_xfer_operations ); + /** * Initiate TFTP/TFTM/MTFTP download * @@ -1117,7 +1076,7 @@ static struct xfer_interface_operations tftp_xfer_operations = { * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int tftp_core_open ( struct xfer_interface *xfer, struct uri *uri, +static int tftp_core_open ( struct interface *xfer, struct uri *uri, unsigned int default_port, struct sockaddr *multicast, unsigned int flags ) { @@ -1135,10 +1094,9 @@ static int tftp_core_open ( struct xfer_interface *xfer, struct uri *uri, if ( ! tftp ) return -ENOMEM; ref_init ( &tftp->refcnt, tftp_free ); - xfer_init ( &tftp->xfer, &tftp_xfer_operations, &tftp->refcnt ); - xfer_init ( &tftp->socket, &tftp_socket_operations, &tftp->refcnt ); - xfer_init ( &tftp->mc_socket, &tftp_mc_socket_operations, - &tftp->refcnt ); + intf_init ( &tftp->xfer, &tftp_xfer_desc, &tftp->refcnt ); + intf_init ( &tftp->socket, &tftp_socket_desc, &tftp->refcnt ); + intf_init ( &tftp->mc_socket, &tftp_mc_socket_desc, &tftp->refcnt ); timer_init ( &tftp->timer, tftp_timer_expired ); tftp->uri = uri_get ( uri ); tftp->blksize = TFTP_DEFAULT_BLKSIZE; @@ -1159,7 +1117,7 @@ static int tftp_core_open ( struct xfer_interface *xfer, struct uri *uri, start_timer_nodelay ( &tftp->timer ); /* Attach to parent interface, mortalise self, and return */ - xfer_plug_plug ( &tftp->xfer, xfer ); + intf_plug_plug ( &tftp->xfer, xfer ); ref_put ( &tftp->refcnt ); return 0; @@ -1178,7 +1136,7 @@ static int tftp_core_open ( struct xfer_interface *xfer, struct uri *uri, * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int tftp_open ( struct xfer_interface *xfer, struct uri *uri ) { +static int tftp_open ( struct interface *xfer, struct uri *uri ) { return tftp_core_open ( xfer, uri, TFTP_PORT, NULL, TFTP_FL_RRQ_SIZES ); @@ -1197,7 +1155,7 @@ struct uri_opener tftp_uri_opener __uri_opener = { * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int tftpsize_open ( struct xfer_interface *xfer, struct uri *uri ) { +static int tftpsize_open ( struct interface *xfer, struct uri *uri ) { return tftp_core_open ( xfer, uri, TFTP_PORT, NULL, ( TFTP_FL_RRQ_SIZES | TFTP_FL_SIZEONLY ) ); @@ -1217,7 +1175,7 @@ struct uri_opener tftpsize_uri_opener __uri_opener = { * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int tftm_open ( struct xfer_interface *xfer, struct uri *uri ) { +static int tftm_open ( struct interface *xfer, struct uri *uri ) { return tftp_core_open ( xfer, uri, TFTP_PORT, NULL, ( TFTP_FL_RRQ_SIZES | TFTP_FL_RRQ_MULTICAST ) ); @@ -1237,7 +1195,7 @@ struct uri_opener tftm_uri_opener __uri_opener = { * @v uri Uniform Resource Identifier * @ret rc Return status code */ -static int mtftp_open ( struct xfer_interface *xfer, struct uri *uri ) { +static int mtftp_open ( struct interface *xfer, struct uri *uri ) { return tftp_core_open ( xfer, uri, MTFTP_PORT, ( struct sockaddr * ) &tftp_mtftp_socket, TFTP_FL_MTFTP_RECOVERY ); |
