summaryrefslogtreecommitdiff
path: root/package/network/config/netifd/patches/001-system-linux-add-interface-protocol.patch
blob: 62662b3df347a56c1e309ce9efd53a58e611df92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--- a/system-linux.c
+++ b/system-linux.c
@@ -2395,6 +2395,50 @@ system_if_force_external(const char *ifn
 	return stat(dev_sysfs_path(ifname, "phy80211"), &s) == 0;
 }
 
+static inline unsigned short
+system_netdevtype_to_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;
+}
+
+static void
+system_add_devtype(struct blob_buf *b, const char *ifname)
+{
+	char buf[100];
+	bool found = false;
+
+	if (!system_get_dev_sysfs("uevent", ifname, buf, sizeof(buf))) {
+		const char *info = "DEVTYPE=";
+		char* context = NULL;
+		const char *line = strtok_r(buf, "\r\n", &context);
+		while( line != NULL ) {
+			char *index = strstr(line, info);
+			if(index != NULL) {
+				blobmsg_add_string(b, "devtype", index + strlen(info));
+				found = true;
+				break;
+			}
+			line = strtok_r(NULL, "\r\n", &context);
+		}
+	}
+
+	if (!found) {
+		int i;
+		unsigned short number = 0;
+		if (!system_get_dev_sysfs("type", ifname, buf, sizeof(buf))) {
+			number = strtoul(buf, NULL, 0);
+			i = system_netdevtype_to_pos(number);
+			blobmsg_add_string(b, "devtype", netdev_type_name[i]);
+		}
+	}
+}
+
 int
 system_if_dump_info(struct device *dev, struct blob_buf *b)
 {
@@ -2430,6 +2474,8 @@ system_if_dump_info(struct device *dev,
 		blobmsg_add_u8(b, "autoneg", !!ecmd.autoneg);
 	}
 
+	system_add_devtype(b, dev->ifname);
+
 	return 0;
 }
 
--- 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", "ethernet", "eethernet", "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", "ie80211-prism",
+	"ieee80211-radiotap", "phonet", "phonet-pipe",
+	"ieee802154", "void", "none"
+};
+
 enum tunnel_param {
 	TUNNEL_ATTR_TYPE,
 	TUNNEL_ATTR_REMOTE,