diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/Config.src | 29 | ||||
-rw-r--r-- | networking/nameif.c | 95 |
2 files changed, 94 insertions, 30 deletions
diff --git a/networking/Config.src b/networking/Config.src index 06930f4a6..8aeba0ef9 100644 --- a/networking/Config.src +++ b/networking/Config.src @@ -612,35 +612,6 @@ config FEATURE_IPCALC_LONG_OPTIONS help Support long options for the ipcalc applet. -config NAMEIF - bool "nameif" - default y - select PLATFORM_LINUX - select FEATURE_SYSLOG - help - nameif is used to rename network interface by its MAC address. - Renamed interfaces MUST be in the down state. - It is possible to use a file (default: /etc/mactab) - with list of new interface names and MACs. - Maximum interface name length: IFNAMSIZ = 16 - File fields are separated by space or tab. - File format: - # Comment - new_interface_name XX:XX:XX:XX:XX:XX - -config FEATURE_NAMEIF_EXTENDED - bool "Extended nameif" - default y - depends on NAMEIF - help - This extends the nameif syntax to support the bus_info and driver - checks. The syntax is compatible to the normal nameif. - File format: - new_interface_name driver=asix bus=usb-0000:00:08.2-3 - new_interface_name bus=usb-0000:00:08.2-3 00:80:C8:38:91:B5 - new_interface_name mac=00:80:C8:38:91:B5 - new_interface_name 00:80:C8:38:91:B5 - config NETSTAT bool "netstat" default y diff --git a/networking/nameif.c b/networking/nameif.c index e9bff8b11..78719edac 100644 --- a/networking/nameif.c +++ b/networking/nameif.c @@ -10,6 +10,66 @@ * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config NAMEIF +//config: bool "nameif" +//config: default y +//config: select PLATFORM_LINUX +//config: select FEATURE_SYSLOG +//config: help +//config: nameif is used to rename network interface by its MAC address. +//config: Renamed interfaces MUST be in the down state. +//config: It is possible to use a file (default: /etc/mactab) +//config: with list of new interface names and MACs. +//config: Maximum interface name length: IFNAMSIZ = 16 +//config: File fields are separated by space or tab. +//config: File format: +//config: # Comment +//config: new_interface_name XX:XX:XX:XX:XX:XX +//config: +//config:config FEATURE_NAMEIF_EXTENDED +//config: bool "Extended nameif" +//config: default y +//config: depends on NAMEIF +//config: help +//config: This extends the nameif syntax to support the bus_info, driver, +//config: phyaddr selectors. The syntax is compatible to the normal nameif. +//config: File format: +//config: new_interface_name driver=asix bus=usb-0000:00:08.2-3 +//config: new_interface_name bus=usb-0000:00:08.2-3 00:80:C8:38:91:B5 +//config: new_interface_name phy_address=2 00:80:C8:38:91:B5 +//config: new_interface_name mac=00:80:C8:38:91:B5 +//config: new_interface_name 00:80:C8:38:91:B5 + +//usage:#define nameif_trivial_usage +//usage: IF_NOT_FEATURE_NAMEIF_EXTENDED( +//usage: "[-s] [-c FILE] [IFNAME HWADDR]..." +//usage: ) +//usage: IF_FEATURE_NAMEIF_EXTENDED( +//usage: "[-s] [-c FILE] [IFNAME SELECTOR]..." +//usage: ) +//usage:#define nameif_full_usage "\n\n" +//usage: "Rename network interface while it in the down state." +//usage: IF_NOT_FEATURE_NAMEIF_EXTENDED( +//usage: "\nThe device with address HWADDR is renamed to IFACE." +//usage: ) +//usage: IF_FEATURE_NAMEIF_EXTENDED( +//usage: "\nThe device matched by SELECTOR is renamed to IFACE." +//usage: "\nSELECTOR can be a combination of:" +//usage: "\n driver=STRING" +//usage: "\n bus=STRING" +//usage: "\n phy_address=NUM" +//usage: "\n [mac=]XX:XX:XX:XX:XX:XX" +//usage: ) +//usage: "\n" +//usage: "\nOptions:" +//usage: "\n -c FILE Configuration file (default: /etc/mactab)" +//usage: "\n -s Log to syslog" +//usage: +//usage:#define nameif_example_usage +//usage: "$ nameif -s dmz0 00:A0:C9:8C:F6:3F\n" +//usage: " or\n" +//usage: "$ nameif -c /etc/my_mactab_file\n" + #include "libbb.h" #include <syslog.h> #include <net/if.h> @@ -38,6 +98,7 @@ typedef struct ethtable_s { #if ENABLE_FEATURE_NAMEIF_EXTENDED char *bus_info; char *driver; + int32_t phy_address; #endif } ethtable_t; @@ -59,6 +120,25 @@ struct ethtool_drvinfo { uint32_t eedump_len; /* Size of data from ETHTOOL_GEEPROM (bytes) */ uint32_t regdump_len; /* Size of data from ETHTOOL_GREGS (bytes) */ }; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; /* Features this interface supports */ + __u32 advertising; /* Features this interface advertises */ + __u16 speed; /* The forced speed, 10Mb, 100Mb, gigabit */ + __u8 duplex; /* Duplex, half or full */ + __u8 port; /* Which connector port */ + __u8 phy_address; + __u8 transceiver; /* Which transceiver to use */ + __u8 autoneg; /* Enable or disable autonegotiation */ + __u32 maxtxpkt; /* Tx pkts before generating tx int */ + __u32 maxrxpkt; /* Rx pkts before generating rx int */ + __u16 speed_hi; + __u16 reserved2; + __u32 reserved[3]; +}; + +#define ETHTOOL_GSET 0x00000001 /* Get settings. */ #define ETHTOOL_GDRVINFO 0x00000003 /* Get driver info. */ #endif @@ -74,6 +154,7 @@ static void nameif_parse_selector(ethtable_t *ch, char *selector) #endif selector = skip_whitespace(selector); #if ENABLE_FEATURE_NAMEIF_EXTENDED + ch->phy_address = -1; if (*selector == '\0') break; /* Search for the end .... */ @@ -87,6 +168,9 @@ static void nameif_parse_selector(ethtable_t *ch, char *selector) } else if (strncmp(selector, "driver=", 7) == 0) { ch->driver = xstrdup(selector + 7); found_selector++; + } else if (strncmp(selector, "phyaddr=", 8) == 0) { + ch->phy_address = xatoi_positive(selector + 8); + found_selector++; } else { #endif lmac = xmalloc(ETH_ALEN); @@ -171,6 +255,7 @@ int nameif_main(int argc UNUSED_PARAM, char **argv) struct ifreq ifr; #if ENABLE_FEATURE_NAMEIF_EXTENDED struct ethtool_drvinfo drvinfo; + struct ethtool_cmd eth_settings; #endif if (parser->lineno <= 2) continue; /* Skip the first two lines */ @@ -180,8 +265,14 @@ int nameif_main(int argc UNUSED_PARAM, char **argv) strncpy_IFNAMSIZ(ifr.ifr_name, token[0]); #if ENABLE_FEATURE_NAMEIF_EXTENDED + /* Check for phy address */ + memset(ð_settings, 0, sizeof(eth_settings)); + eth_settings.cmd = ETHTOOL_GSET; + ifr.ifr_data = (caddr_t) ð_settings; + ioctl(ctl_sk, SIOCETHTOOL, &ifr); + /* Check for driver etc. */ - memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo)); + memset(&drvinfo, 0, sizeof(drvinfo)); drvinfo.cmd = ETHTOOL_GDRVINFO; ifr.ifr_data = (caddr_t) &drvinfo; /* Get driver and businfo first, so we have it in drvinfo */ @@ -196,6 +287,8 @@ int nameif_main(int argc UNUSED_PARAM, char **argv) continue; if (ch->driver && strcmp(ch->driver, drvinfo.driver) != 0) continue; + if (ch->phy_address != -1 && ch->phy_address != eth_settings.phy_address) + continue; #endif if (ch->mac && memcmp(ch->mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN) != 0) continue; |