svn commit: trunk/busybox: include libbb networking scripts

aldot at busybox.net aldot at busybox.net
Fri May 16 09:10:33 PDT 2008


Author: aldot
Date: 2008-05-16 09:10:31 -0700 (Fri, 16 May 2008)
New Revision: 21990

Log:
- fix bug where we incorrectly rejected ifconfig eth0 hw ether $whatever
- add support for printing ipoib to ifconfig


Modified:
   trunk/busybox/include/libbb.h
   trunk/busybox/include/usage.h
   trunk/busybox/libbb/Config.in
   trunk/busybox/networking/ifconfig.c
   trunk/busybox/networking/interface.c
   trunk/busybox/scripts/defconfig


Changeset:
Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/include/libbb.h	2008-05-16 16:10:31 UTC (rev 21990)
@@ -924,6 +924,9 @@
 };
 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);

Modified: trunk/busybox/include/usage.h
===================================================================
--- trunk/busybox/include/usage.h	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/include/usage.h	2008-05-16 16:10:31 UTC (rev 21990)
@@ -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( \

Modified: trunk/busybox/libbb/Config.in
===================================================================
--- trunk/busybox/libbb/Config.in	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/libbb/Config.in	2008-05-16 16:10:31 UTC (rev 21990)
@@ -144,4 +144,11 @@
 	  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

Modified: trunk/busybox/networking/ifconfig.c
===================================================================
--- trunk/busybox/networking/ifconfig.c	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/networking/ifconfig.c	2008-05-16 16:10:31 UTC (rev 21990)
@@ -220,7 +220,7 @@
 	{ "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 @@
 
 #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 @@
 #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;
 					}

Modified: trunk/busybox/networking/interface.c
===================================================================
--- trunk/busybox/networking/interface.c	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/networking/interface.c	2008-05-16 16:10:31 UTC (rev 21990)
@@ -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,7 +812,18 @@
 	.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,
 	&ether_hwtype,
@@ -814,6 +832,9 @@
 #if ENABLE_FEATURE_IPV6
 	&sit_hwtype,
 #endif
+#if ENABLE_FEATURE_HWIB
+	&ib_hwtype,
+#endif
 	NULL
 };
 
@@ -1192,6 +1213,67 @@
 	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;

Modified: trunk/busybox/scripts/defconfig
===================================================================
--- trunk/busybox/scripts/defconfig	2008-05-16 16:00:38 UTC (rev 21989)
+++ trunk/busybox/scripts/defconfig	2008-05-16 16:10:31 UTC (rev 21990)
@@ -86,6 +86,7 @@
 CONFIG_FEATURE_COPYBUF_KB=4
 # CONFIG_MONOTONIC_SYSCALL is not set
 CONFIG_IOCTL_HEX2STR_ERROR=y
+CONFIG_FEATURE_HWIB=y
 
 #
 # Applets



More information about the busybox-cvs mailing list