diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-05-16 16:10:31 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-05-16 16:10:31 +0000 |
commit | f3b778a4dcfe49dbb294365e7f026674a91f9a32 (patch) | |
tree | d68b08af40a70399b5027949541d1f08696d4925 /networking/interface.c | |
parent | 825968f92c603357e2e1e1d73c3ec26d89004381 (diff) | |
download | busybox-w32-f3b778a4dcfe49dbb294365e7f026674a91f9a32.tar.gz busybox-w32-f3b778a4dcfe49dbb294365e7f026674a91f9a32.tar.bz2 busybox-w32-f3b778a4dcfe49dbb294365e7f026674a91f9a32.zip |
- fix bug where we incorrectly rejected ifconfig eth0 hw ether $whatever
- add support for printing ipoib to ifconfig
Diffstat (limited to 'networking/interface.c')
-rw-r--r-- | networking/interface.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/networking/interface.c b/networking/interface.c index a24ab01fe..dff6add20 100644 --- a/networking/interface.c +++ b/networking/interface.c | |||
@@ -36,6 +36,13 @@ | |||
36 | #include "inet_common.h" | 36 | #include "inet_common.h" |
37 | #include "libbb.h" | 37 | #include "libbb.h" |
38 | 38 | ||
39 | |||
40 | #if ENABLE_FEATURE_HWIB | ||
41 | /* #include <linux/if_infiniband.h> */ | ||
42 | #undef INFINIBAND_ALEN | ||
43 | #define INFINIBAND_ALEN 20 | ||
44 | #endif | ||
45 | |||
39 | #if ENABLE_FEATURE_IPV6 | 46 | #if ENABLE_FEATURE_IPV6 |
40 | # define HAVE_AFINET6 1 | 47 | # define HAVE_AFINET6 1 |
41 | #else | 48 | #else |
@@ -805,6 +812,17 @@ static const struct hwtype sit_hwtype = { | |||
805 | .suppress_null_addr = 1 | 812 | .suppress_null_addr = 1 |
806 | }; | 813 | }; |
807 | #endif | 814 | #endif |
815 | #if ENABLE_FEATURE_HWIB | ||
816 | static const struct hwtype ib_hwtype = { | ||
817 | .name = "infiniband", | ||
818 | .title = "InfiniBand", | ||
819 | .type = ARPHRD_INFINIBAND, | ||
820 | .alen = INFINIBAND_ALEN, | ||
821 | .print = UNSPEC_print, | ||
822 | .input = in_ib, | ||
823 | }; | ||
824 | #endif | ||
825 | |||
808 | 826 | ||
809 | static const struct hwtype *const hwtypes[] = { | 827 | static const struct hwtype *const hwtypes[] = { |
810 | &loop_hwtype, | 828 | &loop_hwtype, |
@@ -814,6 +832,9 @@ static const struct hwtype *const hwtypes[] = { | |||
814 | #if ENABLE_FEATURE_IPV6 | 832 | #if ENABLE_FEATURE_IPV6 |
815 | &sit_hwtype, | 833 | &sit_hwtype, |
816 | #endif | 834 | #endif |
835 | #if ENABLE_FEATURE_HWIB | ||
836 | &ib_hwtype, | ||
837 | #endif | ||
817 | NULL | 838 | NULL |
818 | }; | 839 | }; |
819 | 840 | ||
@@ -1192,6 +1213,67 @@ static int if_print(char *ifname) | |||
1192 | return res; | 1213 | return res; |
1193 | } | 1214 | } |
1194 | 1215 | ||
1216 | #if ENABLE_FEATURE_HWIB | ||
1217 | /* Input an Infiniband address and convert to binary. */ | ||
1218 | int in_ib(const char *bufp, struct sockaddr *sap) | ||
1219 | { | ||
1220 | unsigned char *ptr; | ||
1221 | char c; | ||
1222 | const char *orig; | ||
1223 | int i; | ||
1224 | unsigned val; | ||
1225 | |||
1226 | sap->sa_family = ib_hwtype.type; | ||
1227 | ptr = sap->sa_data; | ||
1228 | |||
1229 | i = 0; | ||
1230 | orig = bufp; | ||
1231 | while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) { | ||
1232 | val = 0; | ||
1233 | c = *bufp++; | ||
1234 | if (isdigit(c)) | ||
1235 | val = c - '0'; | ||
1236 | else if (c >= 'a' && c <= 'f') | ||
1237 | val = c - 'a' + 10; | ||
1238 | else if (c >= 'A' && c <= 'F') | ||
1239 | val = c - 'A' + 10; | ||
1240 | else { | ||
1241 | errno = EINVAL; | ||
1242 | return (-1); | ||
1243 | } | ||
1244 | val <<= 4; | ||
1245 | c = *bufp; | ||
1246 | if (isdigit(c)) | ||
1247 | val |= c - '0'; | ||
1248 | else if (c >= 'a' && c <= 'f') | ||
1249 | val |= c - 'a' + 10; | ||
1250 | else if (c >= 'A' && c <= 'F') | ||
1251 | val |= c - 'A' + 10; | ||
1252 | else if (c == ':' || c == 0) | ||
1253 | val >>= 4; | ||
1254 | else { | ||
1255 | errno = EINVAL; | ||
1256 | return (-1); | ||
1257 | } | ||
1258 | if (c != 0) | ||
1259 | bufp++; | ||
1260 | *ptr++ = (unsigned char) (val & 0377); | ||
1261 | i++; | ||
1262 | |||
1263 | /* We might get a semicolon here - not required. */ | ||
1264 | if (*bufp == ':') { | ||
1265 | bufp++; | ||
1266 | } | ||
1267 | } | ||
1268 | #ifdef DEBUG | ||
1269 | fprintf(stderr, "in_ib(%s): %s\n", orig, UNSPEC_print(sap->sa_data)); | ||
1270 | #endif | ||
1271 | return (0); | ||
1272 | } | ||
1273 | #endif | ||
1274 | |||
1275 | |||
1276 | |||
1195 | int display_interfaces(char *ifname) | 1277 | int display_interfaces(char *ifname) |
1196 | { | 1278 | { |
1197 | int status; | 1279 | int status; |