Every network device has a type. This is stored in the sysfs under
'/sys/class/net/<device>/type' as a number and can be queried.

This commit adds this information as a string to the ubus.
'ubus call network.device status'
{
...
        "eth0": {
                "dev_type": "ETHER",
...
}

Signed-off-by: Florian Eckert <f...@dev.tdt.de>
---
v2: remove debug log output
 system-linux.c | 20 ++++++++++++++++++++
 system.h       | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/system-linux.c b/system-linux.c
index e768853..a1728ab 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -2395,6 +2395,17 @@ system_if_force_external(const char *ifname)
        return stat(dev_sysfs_path(ifname, "phy80211"), &s) == 0;
 }
 
+static inline unsigned short netdev_type_pos(unsigned short dev_type)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(netdev_type_number); i++)
+               if (netdev_type_number[i] == dev_type)
+                       return i;
+       /* the last key is used by default */
+       return ARRAY_SIZE(netdev_type_number) - 1;
+}
+
 int
 system_if_dump_info(struct device *dev, struct blob_buf *b)
 {
@@ -2402,6 +2413,9 @@ system_if_dump_info(struct device *dev, struct blob_buf 
*b)
        struct ifreq ifr;
        char *s;
        void *c;
+       unsigned short dev_type = 0;
+       int i;
+       char buf[10];
 
        memset(&ecmd, 0, sizeof(ecmd));
        memset(&ifr, 0, sizeof(ifr));
@@ -2430,6 +2444,12 @@ system_if_dump_info(struct device *dev, struct blob_buf 
*b)
                blobmsg_add_u8(b, "autoneg", !!ecmd.autoneg);
        }
 
+       if (!system_get_dev_sysfs("type", dev->ifname, buf, sizeof(buf))) {
+               dev_type = strtoul(buf, NULL, 0);
+               i = netdev_type_pos(dev_type);
+               blobmsg_add_string(b, "dev_type", netdev_type_name[i]);
+       }
+
        return 0;
 }
 
diff --git a/system.h b/system.h
index 1f7037d..fdd8a64 100644
--- a/system.h
+++ b/system.h
@@ -23,6 +23,42 @@
 #include "iprule.h"
 #include "utils.h"
 
+static const unsigned short netdev_type_number[] = {
+       ARPHRD_NETROM, ARPHRD_ETHER, ARPHRD_EETHER, ARPHRD_AX25,
+       ARPHRD_PRONET, ARPHRD_CHAOS, ARPHRD_IEEE802, ARPHRD_ARCNET,
+       ARPHRD_APPLETLK, ARPHRD_DLCI, ARPHRD_ATM, ARPHRD_METRICOM,
+       ARPHRD_IEEE1394, ARPHRD_EUI64, ARPHRD_INFINIBAND, ARPHRD_SLIP,
+       ARPHRD_CSLIP, ARPHRD_SLIP6, ARPHRD_CSLIP6, ARPHRD_RSRVD,
+       ARPHRD_ADAPT, ARPHRD_ROSE, ARPHRD_X25, ARPHRD_HWX25,
+       ARPHRD_PPP, ARPHRD_CISCO, ARPHRD_LAPB, ARPHRD_DDCMP,
+       ARPHRD_RAWHDLC, ARPHRD_TUNNEL, ARPHRD_TUNNEL6, ARPHRD_FRAD,
+       ARPHRD_SKIP, ARPHRD_LOOPBACK, ARPHRD_LOCALTLK, ARPHRD_FDDI,
+       ARPHRD_BIF, ARPHRD_SIT, ARPHRD_IPDDP, ARPHRD_IPGRE,
+       ARPHRD_PIMREG, ARPHRD_HIPPI, ARPHRD_ASH, ARPHRD_ECONET,
+       ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL,
+       ARPHRD_FCFABRIC, ARPHRD_IEEE80211, ARPHRD_IEEE80211_PRISM,
+       ARPHRD_IEEE80211_RADIOTAP, ARPHRD_PHONET, ARPHRD_PHONET_PIPE,
+       ARPHRD_IEEE802154, ARPHRD_VOID, ARPHRD_NONE
+};
+
+static const char *const netdev_type_name[] = {
+       "NETROM", "ETHER", "EETHER", "AX25",
+       "PRONET", "CHAOS", "IEEE802", "ARCNET",
+       "APPLETLK", "DLCI", "ATM", "METRICOM",
+       "IEEE1394", "EUI64", "INFINIBAND", "SLIP",
+       "CSLIP", "SLIP6", "CSLIP6", "RSRVD",
+       "ADAPT", "ROSE", "X25", "HWX25",
+       "PPP", "CISCO", "LAPB", "DDCMP",
+       "RAWHDLC", "TUNNEL", "TUNNEL6", "FRAD",
+       "SKIP", "LOOPBACK", "LOCALTLK", "FDDI",
+       "BIF", "SIT", "IPDDP", "IPGRE",
+       "PIMREG", "HIPPI", "ASH", "ECONET",
+       "IRDA", "FCPP", "FCAL", "FCPL",
+       "FCFABRIC", "IEEE80211", "IEEE80211_PRISM",
+       "IEEE80211_RADIOTAP", "PHONET", "PHONET_PIPE",
+       "IEEE802154", "VOID", "NONE"
+};
+
 enum tunnel_param {
        TUNNEL_ATTR_TYPE,
        TUNNEL_ATTR_REMOTE,
-- 
2.20.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to