From 831e7635de0112f615bc6cfdace8a784b9525d28 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Tue, 20 Feb 2018 12:05:50 +0100 Subject: [PATCH 1/4] netopt: Add link status option --- sys/include/net/netopt.h | 12 ++++++++++++ sys/net/crosslayer/netopt/netopt.c | 1 + 2 files changed, 13 insertions(+) diff --git a/sys/include/net/netopt.h b/sys/include/net/netopt.h index 2f084a0c8c..3d24b2bcc1 100644 --- a/sys/include/net/netopt.h +++ b/sys/include/net/netopt.h @@ -270,6 +270,18 @@ typedef enum { */ NETOPT_IS_WIRED, + /** + * @brief (@ref netopt_enable_t) Phy link status. + * + * Returns NETOPT_ENABLE when the the link of the interface is up, + * NETOPT_DISABLE when the link is down. If the interface is wireless or + * doesn't support link status detection this function will return + * -ENOTSUP. + * + * @note Setting this option will always return -ENOTSUP. + */ + NETOPT_LINK_CONNECTED, + /** * @brief get a device's "type", e.g., ethernet, 802.15.4, ... */ diff --git a/sys/net/crosslayer/netopt/netopt.c b/sys/net/crosslayer/netopt/netopt.c index 6df4bd1d14..dfe7bc983a 100644 --- a/sys/net/crosslayer/netopt/netopt.c +++ b/sys/net/crosslayer/netopt/netopt.c @@ -61,6 +61,7 @@ static const char *_netopt_strmap[] = { [NETOPT_CSMA_MINBE] = "NETOPT_CSMA_MINBE", [NETOPT_MAC_NO_SLEEP] = "NETOPT_MAC_NO_SLEEP", [NETOPT_IS_WIRED] = "NETOPT_IS_WIRED", + [NETOPT_LINK_CONNECTED] = "NETOPT_LINK_CONNECTED", [NETOPT_DEVICE_TYPE] = "NETOPT_DEVICE_TYPE", [NETOPT_CHANNEL_PAGE] = "NETOPT_CHANNEL_PAGE", [NETOPT_CCA_THRESHOLD] = "NETOPT_CCA_THRESHOLD", From 9d61314c09974a17e51b665bf2dcea0c62772fa0 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Tue, 20 Feb 2018 12:08:20 +0100 Subject: [PATCH 2/4] shell/netif: Add link status to interface status output --- sys/shell/commands/sc_gnrc_netif.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/shell/commands/sc_gnrc_netif.c b/sys/shell/commands/sc_gnrc_netif.c index 1db230b7cd..27b992a4c7 100644 --- a/sys/shell/commands/sc_gnrc_netif.c +++ b/sys/shell/commands/sc_gnrc_netif.c @@ -426,6 +426,10 @@ static void _netif_list(kernel_pid_t iface) if (res >= 0) { printf(" CR: %s ", _netopt_coding_rate_str[u8]); } + res = gnrc_netapi_get(iface, NETOPT_LINK_CONNECTED, 0, &u8, sizeof(u8)); + if (res >= 0) { + printf(" Link: %s ", (netopt_enable_t)u8 ? "up" : "down" ); + } line_thresh = _newline(0U, line_thresh); res = gnrc_netapi_get(iface, NETOPT_ADDRESS_LONG, 0, hwaddr, sizeof(hwaddr)); if (res >= 0) { From 8735adee7dcc5dfb6f94b5d1dce0df61d7b3973e Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Tue, 20 Feb 2018 12:08:38 +0100 Subject: [PATCH 3/4] enc28j60: add link status support --- drivers/enc28j60/enc28j60.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/enc28j60/enc28j60.c b/drivers/enc28j60/enc28j60.c index 2b9dd9312d..a70729977b 100644 --- a/drivers/enc28j60/enc28j60.c +++ b/drivers/enc28j60/enc28j60.c @@ -454,6 +454,14 @@ static int nd_get(netdev_t *netdev, netopt_t opt, void *value, size_t max_len) assert(max_len >= ETHERNET_ADDR_LEN); mac_get(dev, (uint8_t *)value); return ETHERNET_ADDR_LEN; + case NETOPT_LINK_CONNECTED: + if (cmd_r_phy(dev, REG_PHY_PHSTAT2) & PHSTAT2_LSTAT) { + *((netopt_enable_t *)value) = NETOPT_ENABLE; + } + else { + *((netopt_enable_t *)value) = NETOPT_DISABLE; + } + return sizeof(netopt_enable_t); default: return netdev_eth_get(netdev, opt, value, max_len); } From eb9e2dadf17a27ad2989802972d47f1e8d415800 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Tue, 20 Feb 2018 12:51:04 +0100 Subject: [PATCH 4/4] encx24j600: add link status support --- drivers/encx24j600/encx24j600.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/encx24j600/encx24j600.c b/drivers/encx24j600/encx24j600.c index 491fdcbdd0..7214b0eac0 100644 --- a/drivers/encx24j600/encx24j600.c +++ b/drivers/encx24j600/encx24j600.c @@ -401,6 +401,14 @@ static int _get(netdev_t *dev, netopt_t opt, void *value, size_t max_len) res = ETHERNET_ADDR_LEN; } break; + case NETOPT_LINK_CONNECTED: + if (reg_get((encx24j600_t *)dev, ENC_ESTAT) & ENC_PHYLNK) { + *((netopt_enable_t *)value) = NETOPT_ENABLE; + } + else { + *((netopt_enable_t *)value) = NETOPT_DISABLE; + } + return sizeof(netopt_enable_t); default: res = netdev_eth_get(dev, opt, value, max_len); break;