Allowed zero-cost enforced ordering of features in startup banner
[people/xl0/gpxe.git] / src / net / udp / tftp.c
index a756004..ea4d1df 100644 (file)
@@ -30,6 +30,7 @@
 #include <gpxe/uri.h>
 #include <gpxe/tcpip.h>
 #include <gpxe/retry.h>
+#include <gpxe/features.h>
 #include <gpxe/tftp.h>
 
 /** @file
@@ -38,6 +39,8 @@
  *
  */
 
+FEATURE ( FEATURE_PROTOCOL, "TFTP", DHCP_EB_FEATURE_TFTP, 1 );
+
 /**
  * A TFTP request
  *
@@ -111,6 +114,9 @@ static void tftp_free ( struct refcnt *refcnt ) {
  */
 static void tftp_done ( struct tftp_request *tftp, int rc ) {
 
+       DBGC ( tftp, "TFTP %p finished with status %d (%s)\n",
+              tftp, rc, strerror ( rc ) );
+
        /* Stop the retry timer */
        stop_timer ( &tftp->timer );
 
@@ -188,6 +194,9 @@ static int tftp_send_ack ( struct tftp_request *tftp ) {
                .dest = ( struct sockaddr * ) &tftp->peer,
        };
 
+       DBGC2 ( tftp, "TFTP %p sending ACK for block %d\n",
+               tftp, tftp->state );
+
        /* Allocate buffer */
        iobuf = xfer_alloc_iob ( &tftp->socket, sizeof ( *ack ) );
        if ( ! iobuf )
@@ -576,8 +585,8 @@ static void tftp_socket_close ( struct xfer_interface *socket, int rc ) {
 static struct xfer_interface_operations tftp_socket_operations = {
        .close          = tftp_socket_close,
        .vredirect      = xfer_vopen,
-       .request        = ignore_xfer_request,
        .seek           = ignore_xfer_seek,
+       .window         = unlimited_xfer_window,
        .alloc_iob      = default_xfer_alloc_iob,
        .deliver_iob    = tftp_socket_deliver_iob,
        .deliver_raw    = xfer_deliver_as_iob,
@@ -603,8 +612,8 @@ static void tftp_xfer_close ( struct xfer_interface *xfer, int rc ) {
 static struct xfer_interface_operations tftp_xfer_operations = {
        .close          = tftp_xfer_close,
        .vredirect      = ignore_xfer_vredirect,
-       .request        = ignore_xfer_request,
        .seek           = ignore_xfer_seek,
+       .window         = unlimited_xfer_window,
        .alloc_iob      = default_xfer_alloc_iob,
        .deliver_iob    = xfer_deliver_as_raw,
        .deliver_raw    = ignore_xfer_deliver_raw,
@@ -629,10 +638,9 @@ int tftp_open ( struct xfer_interface *xfer, struct uri *uri ) {
                return -EINVAL;
 
        /* Allocate and populate TFTP structure */
-       tftp = malloc ( sizeof ( *tftp ) );
+       tftp = zalloc ( sizeof ( *tftp ) );
        if ( ! tftp )
                return -ENOMEM;
-       memset ( tftp, 0, sizeof ( *tftp ) );
        tftp->refcnt.free = tftp_free;
        xfer_init ( &tftp->xfer, &tftp_xfer_operations, &tftp->refcnt );
        tftp->uri = uri_get ( uri );