- fix bug where we incorrectly rejected ifconfig eth0 hw ether $whatever - add support for printing ipoib to ifconfig
No binary (build failed)
—
(log yok)
| @@ -924,6 +924,9 @@ struct hwtype { | |
| }; | |
| extern smallint interface_opt_a; | |
| int display_interfaces(char *ifname); | |
| + | #if ENABLE_FEATURE_HWIB |
| + | int in_ib(const char *bufp, struct sockaddr *sap); |
| + | #endif |
| const struct aftype *get_aftype(const char *name); | |
| const struct hwtype *get_hwtype(const char *name); | |
| const struct hwtype *get_hwntype(int type); | |
| @@ -1628,7 +1628,7 @@ | |
| " [netmask ADDRESS] [dstaddr ADDRESS]\n" \ | |
| USE_FEATURE_IFCONFIG_SLIP( \ | |
| " [outfill NN] [keepalive NN]\n") \ | |
| - | " " USE_FEATURE_IFCONFIG_HW("[hw ether ADDRESS] ") "[metric NN] [mtu NN]\n" \ |
| + | " " USE_FEATURE_IFCONFIG_HW("[hw ether" USE_FEATURE_HWIB("|infiniband")" ADDRESS] ") "[metric NN] [mtu NN]\n" \ |
| " [[-]trailers] [[-]arp] [[-]allmulti]\n" \ | |
| " [multicast] [[-]promisc] [txqueuelen NN] [[-]dynamic]\n" \ | |
| USE_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ( \ | |
| @@ -144,4 +144,11 @@ config IOCTL_HEX2STR_ERROR | |
| Use ioctl names rather than hex values in error messages | |
| (e.g. VT_DISALLOCATE rather than 0x5608). If disabled this | |
| saves about 1400 bytes. | |
| + | |
| + | config FEATURE_HWIB |
| + | bool "Support infiniband HW" |
| + | default y |
| + | help |
| + | Support for printing infiniband addresses in |
| + | network applets. |
| endmenu | |
| @@ -220,7 +220,7 @@ static const struct options OptArray[] = { | |
| { "netmask", N_ARG, ARG_NETMASK, 0 }, | |
| { "broadcast", N_ARG | M_CLR, ARG_BROADCAST, IFF_BROADCAST }, | |
| #if ENABLE_FEATURE_IFCONFIG_HW | |
| - | { "hw", N_ARG, ARG_HW, 0 }, |
| + | { "hw", N_ARG, ARG_HW, 0 }, |
| #endif | |
| { "pointopoint", N_ARG | M_CLR, ARG_POINTOPOINT, IFF_POINTOPOINT }, | |
| #ifdef SIOCSKEEPALIVE | |
| @@ -255,6 +255,11 @@ static const struct options OptArray[] = { | |
| #if ENABLE_FEATURE_IFCONFIG_HW | |
| static int in_ether(const char *bufp, struct sockaddr *sap); | |
| + | # if ENABLE_FEATURE_HWIB |
| + | extern int in_ib(const char *bufp, struct sockaddr *sap); |
| + | # else |
| + | # define in_ib(a, b) 1 /* fail */ |
| + | # endif |
| #endif | |
| /* | |
| @@ -425,11 +430,14 @@ int ifconfig_main(int argc, char **argv) | |
| #if ENABLE_FEATURE_IFCONFIG_HW | |
| } else { /* A_CAST_HOST_COPY_IN_ETHER */ | |
| /* This is the "hw" arg case. */ | |
| - | if (strcmp("ether", *argv) || !*++argv) |
| + | smalluint hw_class= index_in_substrings("ether\0" |
| + | USE_FEATURE_HWIB("infiniband\0"), *argv) + 1; |
| + | if (!hw_class || !*++argv) |
| bb_show_usage(); | |
| /*safe_strncpy(host, *argv, sizeof(host));*/ | |
| host = *argv; | |
| - | if (in_ether(host, &sa)) |
| + | if (hw_class == 1 ? in_ether(host, &sa) |
| + | : in_ib(host, &sa)) |
| bb_error_msg_and_die("invalid hw-addr %s", host); | |
| p = (char *) &sa; | |
| } | |
| @@ -36,6 +36,13 @@ | |
| #include "inet_common.h" | |
| #include "libbb.h" | |
| + | |
| + | #if ENABLE_FEATURE_HWIB |
| + | /* #include <linux/if_infiniband.h> */ |
| + | #undef INFINIBAND_ALEN |
| + | #define INFINIBAND_ALEN 20 |
| + | #endif |
| + | |
| #if ENABLE_FEATURE_IPV6 | |
| # define HAVE_AFINET6 1 | |
| #else | |
| @@ -805,6 +812,17 @@ static const struct hwtype sit_hwtype = { | |
| .suppress_null_addr = 1 | |
| }; | |
| #endif | |
| + | #if ENABLE_FEATURE_HWIB |
| + | static const struct hwtype ib_hwtype = { |
| + | .name = "infiniband", |
| + | .title = "InfiniBand", |
| + | .type = ARPHRD_INFINIBAND, |
| + | .alen = INFINIBAND_ALEN, |
| + | .print = UNSPEC_print, |
| + | .input = in_ib, |
| + | }; |
| + | #endif |
| + | |
| static const struct hwtype *const hwtypes[] = { | |
| &loop_hwtype, | |
| @@ -813,6 +831,9 @@ static const struct hwtype *const hwtypes[] = { | |
| &unspec_hwtype, | |
| #if ENABLE_FEATURE_IPV6 | |
| &sit_hwtype, | |
| + | #endif |
| + | #if ENABLE_FEATURE_HWIB |
| + | &ib_hwtype, |
| #endif | |
| NULL | |
| }; | |
| @@ -1192,6 +1213,67 @@ static int if_print(char *ifname) | |
| return res; | |
| } | |
| + | #if ENABLE_FEATURE_HWIB |
| + | /* Input an Infiniband address and convert to binary. */ |
| + | int in_ib(const char *bufp, struct sockaddr *sap) |
| + | { |
| + | unsigned char *ptr; |
| + | char c; |
| + | const char *orig; |
| + | int i; |
| + | unsigned val; |
| + | |
| + | sap->sa_family = ib_hwtype.type; |
| + | ptr = sap->sa_data; |
| + | |
| + | i = 0; |
| + | orig = bufp; |
| + | while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) { |
| + | val = 0; |
| + | c = *bufp++; |
| + | if (isdigit(c)) |
| + | val = c - '0'; |
| + | else if (c >= 'a' && c <= 'f') |
| + | val = c - 'a' + 10; |
| + | else if (c >= 'A' && c <= 'F') |
| + | val = c - 'A' + 10; |
| + | else { |
| + | errno = EINVAL; |
| + | return (-1); |
| + | } |
| + | val <<= 4; |
| + | c = *bufp; |
| + | if (isdigit(c)) |
| + | val |= c - '0'; |
| + | else if (c >= 'a' && c <= 'f') |
| + | val |= c - 'a' + 10; |
| + | else if (c >= 'A' && c <= 'F') |
| + | val |= c - 'A' + 10; |
| + | else if (c == ':' || c == 0) |
| + | val >>= 4; |
| + | else { |
| + | errno = EINVAL; |
| + | return (-1); |
| + | } |
| + | if (c != 0) |
| + | bufp++; |
| + | *ptr++ = (unsigned char) (val & 0377); |
| + | i++; |
| + | |
| + | /* We might get a semicolon here - not required. */ |
| + | if (*bufp == ':') { |
| + | bufp++; |
| + | } |
| + | } |
| + | #ifdef DEBUG |
| + | fprintf(stderr, "in_ib(%s): %s\n", orig, UNSPEC_print(sap->sa_data)); |
| + | #endif |
| + | return (0); |
| + | } |
| + | #endif |
| + | |
| + | |
| + | |
| int display_interfaces(char *ifname) | |
| { | |
| int status; | |
| @@ -86,6 +86,7 @@ CONFIG_FEATURE_TAB_COMPLETION=y | |
| CONFIG_FEATURE_COPYBUF_KB=4 | |
| # CONFIG_MONOTONIC_SYSCALL is not set | |
| CONFIG_IOCTL_HEX2STR_ERROR=y | |
| + | CONFIG_FEATURE_HWIB=y |
| # | |
| # Applets | |