]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[neighbour] Return success when deferring a packet
authorMichael Brown <mcb30@ipxe.org>
Wed, 20 May 2015 14:19:47 +0000 (15:19 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 20 May 2015 14:29:36 +0000 (15:29 +0100)
Deferral of a packet for neighbour discovery is not really an error.
If we fail to discover a neighbour then the failure will eventually be
reported by the call to neighbour_destroy() when any outstanding I/O
buffers are discarded.

The current behaviour breaks PXE booting on FreeBSD, which seems to
treat the error return from PXENV_UDP_WRITE as a fatal error and so
never proceeds to poll PXENV_UDP_READ (and hence never allows iPXE to
receive the ARP reply and send the deferred UDP packet).

Change neighbour_tx() to return success when deferring a packet.  This
fixes interoperability with FreeBSD and removes transient neighbour
cache misses from the "ifstat" error output, while leaving genuine
neighbour discovery failures visible via "ifstat" (once neighbour
discovery times out, or the interface is closed).

Debugged-by: Wissam Shoukair <wissams@mellanox.com>
Tested-by: Wissam Shoukair <wissams@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/neighbour.c

index f70896a1956152ce72a18d5ac43d59ed9dd45ffb..7f66d9992c081166a8430e782a5dd01a97bc961c 100644 (file)
@@ -322,7 +322,7 @@ int neighbour_tx ( struct io_buffer *iobuf, struct net_device *netdev,
                        netdev->name, net_protocol->name,
                        net_protocol->ntoa ( net_dest ) );
                list_add_tail ( &iobuf->list, &neighbour->tx_queue );
-               return -EAGAIN;
+               return 0;
        }
 }