diff options
author | Michael Brown <mcb30@ipxe.org> | 2015-06-25 16:41:39 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2015-06-25 16:46:47 +0100 |
commit | f3812395a261b80fe77d19ebb9045e790c434773 (patch) | |
tree | d68ece89cfa39a4976b5dad99d2cb466dee704ca /src/include/ipxe/netdevice.h | |
parent | 7e7870984b4e63eeaf8416289c11bc386a77d5ba (diff) | |
download | ipxe-f3812395a261b80fe77d19ebb9045e790c434773.tar.gz |
[netdevice] Add a generic concept of a "blocked link"
When Spanning Tree Protocol (STP) is used, there may be a substantial
delay (tens of seconds) from the time that the link goes up to the
time that the port starts forwarding packets.
Add a generic concept of a "blocked link" (i.e. a link which is up but
which is not expected to communicate successfully), and allow "ifstat"
to indicate when a link is blocked.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/netdevice.h')
-rw-r--r-- | src/include/ipxe/netdevice.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/include/ipxe/netdevice.h b/src/include/ipxe/netdevice.h index 8e615c941..f20a81f79 100644 --- a/src/include/ipxe/netdevice.h +++ b/src/include/ipxe/netdevice.h @@ -15,6 +15,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/refcnt.h> #include <ipxe/settings.h> #include <ipxe/interface.h> +#include <ipxe/retry.h> struct io_buffer; struct net_device; @@ -392,6 +393,8 @@ struct net_device { * indicates the error preventing link-up. */ int link_rc; + /** Link block timer */ + struct retry_timer link_block; /** Maximum packet length * * This length includes any link-layer headers. @@ -614,6 +617,17 @@ netdev_link_ok ( struct net_device *netdev ) { } /** + * Check link block state of network device + * + * @v netdev Network device + * @ret link_blocked Link is blocked + */ +static inline __attribute__ (( always_inline )) int +netdev_link_blocked ( struct net_device *netdev ) { + return ( timer_running ( &netdev->link_block ) ); +} + +/** * Check whether or not network device is open * * @v netdev Network device @@ -661,6 +675,9 @@ extern void netdev_rx_freeze ( struct net_device *netdev ); extern void netdev_rx_unfreeze ( struct net_device *netdev ); extern void netdev_link_err ( struct net_device *netdev, int rc ); extern void netdev_link_down ( struct net_device *netdev ); +extern void netdev_link_block ( struct net_device *netdev, + unsigned long timeout ); +extern void netdev_link_unblock ( struct net_device *netdev ); extern int netdev_tx ( struct net_device *netdev, struct io_buffer *iobuf ); extern void netdev_tx_defer ( struct net_device *netdev, struct io_buffer *iobuf ); |