62662b3df347a56c1e309ce9efd53a58e611df92
[project/netifd.git] / package / network / config / netifd / patches / 001-system-linux-add-interface-protocol.patch
1 --- a/system-linux.c
2 +++ b/system-linux.c
3 @@ -2395,6 +2395,50 @@ system_if_force_external(const char *ifn
4 return stat(dev_sysfs_path(ifname, "phy80211"), &s) == 0;
5 }
6
7 +static inline unsigned short
8 +system_netdevtype_to_pos(unsigned short dev_type)
9 +{
10 + int i;
11 +
12 + for (i = 0; i < ARRAY_SIZE(netdev_type_number); i++)
13 + if (netdev_type_number[i] == dev_type)
14 + return i;
15 + /* the last key is used by default */
16 + return ARRAY_SIZE(netdev_type_number) - 1;
17 +}
18 +
19 +static void
20 +system_add_devtype(struct blob_buf *b, const char *ifname)
21 +{
22 + char buf[100];
23 + bool found = false;
24 +
25 + if (!system_get_dev_sysfs("uevent", ifname, buf, sizeof(buf))) {
26 + const char *info = "DEVTYPE=";
27 + char* context = NULL;
28 + const char *line = strtok_r(buf, "\r\n", &context);
29 + while( line != NULL ) {
30 + char *index = strstr(line, info);
31 + if(index != NULL) {
32 + blobmsg_add_string(b, "devtype", index + strlen(info));
33 + found = true;
34 + break;
35 + }
36 + line = strtok_r(NULL, "\r\n", &context);
37 + }
38 + }
39 +
40 + if (!found) {
41 + int i;
42 + unsigned short number = 0;
43 + if (!system_get_dev_sysfs("type", ifname, buf, sizeof(buf))) {
44 + number = strtoul(buf, NULL, 0);
45 + i = system_netdevtype_to_pos(number);
46 + blobmsg_add_string(b, "devtype", netdev_type_name[i]);
47 + }
48 + }
49 +}
50 +
51 int
52 system_if_dump_info(struct device *dev, struct blob_buf *b)
53 {
54 @@ -2430,6 +2474,8 @@ system_if_dump_info(struct device *dev,
55 blobmsg_add_u8(b, "autoneg", !!ecmd.autoneg);
56 }
57
58 + system_add_devtype(b, dev->ifname);
59 +
60 return 0;
61 }
62
63 --- a/system.h
64 +++ b/system.h
65 @@ -23,6 +23,42 @@
66 #include "iprule.h"
67 #include "utils.h"
68
69 +static const unsigned short netdev_type_number[] = {
70 + ARPHRD_NETROM, ARPHRD_ETHER, ARPHRD_EETHER, ARPHRD_AX25,
71 + ARPHRD_PRONET, ARPHRD_CHAOS, ARPHRD_IEEE802, ARPHRD_ARCNET,
72 + ARPHRD_APPLETLK, ARPHRD_DLCI, ARPHRD_ATM, ARPHRD_METRICOM,
73 + ARPHRD_IEEE1394, ARPHRD_EUI64, ARPHRD_INFINIBAND, ARPHRD_SLIP,
74 + ARPHRD_CSLIP, ARPHRD_SLIP6, ARPHRD_CSLIP6, ARPHRD_RSRVD,
75 + ARPHRD_ADAPT, ARPHRD_ROSE, ARPHRD_X25, ARPHRD_HWX25,
76 + ARPHRD_PPP, ARPHRD_CISCO, ARPHRD_LAPB, ARPHRD_DDCMP,
77 + ARPHRD_RAWHDLC, ARPHRD_TUNNEL, ARPHRD_TUNNEL6, ARPHRD_FRAD,
78 + ARPHRD_SKIP, ARPHRD_LOOPBACK, ARPHRD_LOCALTLK, ARPHRD_FDDI,
79 + ARPHRD_BIF, ARPHRD_SIT, ARPHRD_IPDDP, ARPHRD_IPGRE,
80 + ARPHRD_PIMREG, ARPHRD_HIPPI, ARPHRD_ASH, ARPHRD_ECONET,
81 + ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL,
82 + ARPHRD_FCFABRIC, ARPHRD_IEEE80211, ARPHRD_IEEE80211_PRISM,
83 + ARPHRD_IEEE80211_RADIOTAP, ARPHRD_PHONET, ARPHRD_PHONET_PIPE,
84 + ARPHRD_IEEE802154, ARPHRD_VOID, ARPHRD_NONE
85 +};
86 +
87 +static const char *const netdev_type_name[] = {
88 + "netrom", "ethernet", "eethernet", "ax25",
89 + "pronet", "chaos", "ieee802", "arcnet",
90 + "appletlk", "dlci", "atm", "metricom",
91 + "ieee1394", "eui64", "infiniband", "slip",
92 + "cslip", "slip6", "cslip6", "rsrvd",
93 + "adapt", "rose", "x25", "hwx25",
94 + "ppp", "cisco", "lapb", "ddcmp",
95 + "rawhdlc", "tunnel", "tunnel6", "frad",
96 + "skip", "loopback", "localtlk", "fddi",
97 + "bif", "sit", "ipddp", "ipgre",
98 + "pimreg", "hippi", "ash", "econet",
99 + "irda", "fcpp", "fcal", "fcpl",
100 + "fcfabric", "ieee80211", "ie80211-prism",
101 + "ieee80211-radiotap", "phonet", "phonet-pipe",
102 + "ieee802154", "void", "none"
103 +};
104 +
105 enum tunnel_param {
106 TUNNEL_ATTR_TYPE,
107 TUNNEL_ATTR_REMOTE,