1bf9a7d
--- net-tools-1.60/config.in.ifconfig_ib	2000-05-21 16:32:12.000000000 +0200
1bf9a7d
+++ net-tools-1.60/config.in	2005-02-09 10:36:26.000000000 +0100
1bf9a7d
@@ -82,6 +82,7 @@
1bf9a7d
 bool '(Cisco)-HDLC/LAPB support' HAVE_HWHDLCLAPB n
1bf9a7d
 bool 'IrDA support' HAVE_HWIRDA y
1bf9a7d
 bool 'Econet hardware support' HAVE_HWEC n
1bf9a7d
+bool 'InfiniBand hardware support' HAVE_HWIB y
1bf9a7d
 *
1bf9a7d
 *
1bf9a7d
 *           Other Features.
1bf9a7d
--- net-tools-1.60/lib/hw.c.ifconfig_ib	2000-05-20 20:27:25.000000000 +0200
1bf9a7d
+++ net-tools-1.60/lib/hw.c	2005-02-09 10:36:26.000000000 +0100
1bf9a7d
@@ -73,6 +73,8 @@
1bf9a7d
 
1bf9a7d
 extern struct hwtype ec_hwtype;
1bf9a7d
 
1bf9a7d
+extern struct hwtype ib_hwtype;
1bf9a7d
+
1bf9a7d
 static struct hwtype *hwtypes[] =
1bf9a7d
 {
1bf9a7d
 
1bf9a7d
@@ -144,6 +146,9 @@
1bf9a7d
 #if HAVE_HWX25
1bf9a7d
     &x25_hwtype,
1bf9a7d
 #endif
1bf9a7d
+#if HAVE_HWIB
1bf9a7d
+    &ib_hwtype,
1bf9a7d
+#endif
1bf9a7d
     &unspec_hwtype,
1bf9a7d
     NULL
1bf9a7d
 };
1bf9a7d
@@ -217,6 +222,9 @@
1bf9a7d
 #if HAVE_HWEC
1bf9a7d
     ec_hwtype.title = _("Econet");
1bf9a7d
 #endif
1bf9a7d
+#if HAVE_HWIB
1bf9a7d
+    ib_hwtype.title = _("InfiniBand");
1bf9a7d
+#endif
1bf9a7d
     sVhwinit = 1;
1bf9a7d
 }
1bf9a7d
 
1bf9a7d
--- net-tools-1.60/lib/ib.c.ifconfig_ib	2005-02-09 10:36:26.000000000 +0100
1bf9a7d
+++ net-tools-1.60/lib/ib.c	2005-02-09 10:42:21.000000000 +0100
1bf9a7d
@@ -0,0 +1,147 @@
1bf9a7d
+/*
1bf9a7d
+ * lib/ib.c        This file contains an implementation of the "Infiniband"
1bf9a7d
+ *              support functions.
1bf9a7d
+ *
1bf9a7d
+ * Version:     $Id: ib.c,v 1.1 2005/02/06 11:00:47 tduffy Exp $
1bf9a7d
+ *
1bf9a7d
+ * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
1bf9a7d
+ *              Copyright 1993 MicroWalt Corporation
1bf9a7d
+ *	  	 Tom Duffy <tduffy@sun.com>
1bf9a7d
+ *
1bf9a7d
+ *              This program is free software; you can redistribute it
1bf9a7d
+ *              and/or  modify it under  the terms of  the GNU General
1bf9a7d
+ *              Public  License as  published  by  the  Free  Software
1bf9a7d
+ *              Foundation;  either  version 2 of the License, or  (at
1bf9a7d
+ *              your option) any later version.
1bf9a7d
+ */
1bf9a7d
+#include "config.h"
1bf9a7d
+
1bf9a7d
+#if HAVE_HWIB
1bf9a7d
+#include <sys/types.h>
1bf9a7d
+#include <sys/socket.h>
1bf9a7d
+#include <net/if_arp.h>
1bf9a7d
+/*#include <linux/if_infiniband.h> - not in gcc-kernheaders*/
1bf9a7d
+#include <stdlib.h>
1bf9a7d
+#include <stdio.h>
1bf9a7d
+#include <errno.h>
1bf9a7d
+#include <ctype.h>
1bf9a7d
+#include <string.h>
1bf9a7d
+#include <unistd.h>
1bf9a7d
+#include "net-support.h"
1bf9a7d
+#include "pathnames.h"
1bf9a7d
+#include "intl.h"
1bf9a7d
+#include "util.h"
1bf9a7d
+
1bf9a7d
+extern struct hwtype ib_hwtype;
1bf9a7d
+
1bf9a7d
+#define INFINIBAND_ALEN         20
1bf9a7d
+
1bf9a7d
+/* Display an InfiniBand address in readable format. */
1bf9a7d
+static char *pr_ib(unsigned char *ptr)
1bf9a7d
+{
1bf9a7d
+    static char buff[128];
1bf9a7d
+    char *pos;
1bf9a7d
+    unsigned int i;
1bf9a7d
+
1bf9a7d
+    pos = buff;
1bf9a7d
+    for (i = 0; i < INFINIBAND_ALEN; i++) {
1bf9a7d
+	pos += sprintf(pos, "%02X:", (*ptr++ & 0377));
1bf9a7d
+    }
1bf9a7d
+    buff[strlen(buff) - 1] = '\0';
1bf9a7d
+
1bf9a7d
+    /* snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
1bf9a7d
+	     (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
1bf9a7d
+	     (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
1bf9a7d
+	);
1bf9a7d
+    */
1bf9a7d
+    return (buff);
1bf9a7d
+}
1bf9a7d
+
1bf9a7d
+
1bf9a7d
+/* Input an Infiniband address and convert to binary. */
1bf9a7d
+static int in_ib(char *bufp, struct sockaddr *sap)
1bf9a7d
+{
1bf9a7d
+    unsigned char *ptr;
1bf9a7d
+    char c, *orig;
1bf9a7d
+    int i;
1bf9a7d
+    unsigned val;
1bf9a7d
+
1bf9a7d
+    sap->sa_family = ib_hwtype.type;
1bf9a7d
+    ptr = sap->sa_data;
1bf9a7d
+
1bf9a7d
+    i = 0;
1bf9a7d
+    orig = bufp;
1bf9a7d
+    while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) {
1bf9a7d
+	val = 0;
1bf9a7d
+	c = *bufp++;
1bf9a7d
+	if (isdigit(c))
1bf9a7d
+	    val = c - '0';
1bf9a7d
+	else if (c >= 'a' && c <= 'f')
1bf9a7d
+	    val = c - 'a' + 10;
1bf9a7d
+	else if (c >= 'A' && c <= 'F')
1bf9a7d
+	    val = c - 'A' + 10;
1bf9a7d
+	else {
1bf9a7d
+#ifdef DEBUG
1bf9a7d
+	    fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
1bf9a7d
+#endif
1bf9a7d
+	    errno = EINVAL;
1bf9a7d
+	    return (-1);
1bf9a7d
+	}
1bf9a7d
+	val <<= 4;
1bf9a7d
+	c = *bufp;
1bf9a7d
+	if (isdigit(c))
1bf9a7d
+	    val |= c - '0';
1bf9a7d
+	else if (c >= 'a' && c <= 'f')
1bf9a7d
+	    val |= c - 'a' + 10;
1bf9a7d
+	else if (c >= 'A' && c <= 'F')
1bf9a7d
+	    val |= c - 'A' + 10;
1bf9a7d
+	else if (c == ':' || c == 0)
1bf9a7d
+	    val >>= 4;
1bf9a7d
+	else {
1bf9a7d
+#ifdef DEBUG
1bf9a7d
+	    fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
1bf9a7d
+#endif
1bf9a7d
+	    errno = EINVAL;
1bf9a7d
+	    return (-1);
1bf9a7d
+	}
1bf9a7d
+	if (c != 0)
1bf9a7d
+	    bufp++;
1bf9a7d
+	*ptr++ = (unsigned char) (val & 0377);
1bf9a7d
+	i++;
1bf9a7d
+
1bf9a7d
+	/* We might get a semicolon here - not required. */
1bf9a7d
+	if (*bufp == ':') {
1bf9a7d
+	    if (i == INFINIBAND_ALEN) {
1bf9a7d
+#ifdef DEBUG
1bf9a7d
+		fprintf(stderr, _("in_ib(%s): trailing : ignored!\n"),
1bf9a7d
+			orig)
1bf9a7d
+#endif
1bf9a7d
+		    ;		/* nothing */
1bf9a7d
+	    }
1bf9a7d
+	    bufp++;
1bf9a7d
+	}
1bf9a7d
+    }
1bf9a7d
+
1bf9a7d
+    /* That's it.  Any trailing junk? */
1bf9a7d
+    if ((i == INFINIBAND_ALEN) && (*bufp != '\0')) {
1bf9a7d
+#ifdef DEBUG
1bf9a7d
+	fprintf(stderr, _("in_ib(%s): trailing junk!\n"), orig);
1bf9a7d
+	errno = EINVAL;
1bf9a7d
+	return (-1);
1bf9a7d
+#endif
1bf9a7d
+    }
1bf9a7d
+#ifdef DEBUG
1bf9a7d
+    fprintf(stderr, "in_ib(%s): %s\n", orig, pr_ib(sap->sa_data));
1bf9a7d
+#endif
1bf9a7d
+
1bf9a7d
+    return (0);
1bf9a7d
+}
1bf9a7d
+
1bf9a7d
+
1bf9a7d
+struct hwtype ib_hwtype =
1bf9a7d
+{
1bf9a7d
+    "infiniband", NULL, ARPHRD_INFINIBAND, INFINIBAND_ALEN,
1bf9a7d
+    pr_ib, in_ib, NULL
1bf9a7d
+};
1bf9a7d
+
1bf9a7d
+#endif /* HAVE_HWIB */
1bf9a7d
--- net-tools-1.60/lib/Makefile.ifconfig_ib	2000-10-28 12:59:42.000000000 +0200
1bf9a7d
+++ net-tools-1.60/lib/Makefile	2005-02-09 10:36:26.000000000 +0100
1bf9a7d
@@ -16,7 +16,7 @@
1bf9a7d
 #
1bf9a7d
 
1bf9a7d
 
1bf9a7d
-HWOBJS	 = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o
1bf9a7d
+HWOBJS	 = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o ib.o
1bf9a7d
 AFOBJS	 = unix.o inet.o inet6.o ax25.o ipx.o ddp.o ipx.o netrom.o af.o rose.o econet.o x25.o
1bf9a7d
 AFGROBJS = inet_gr.o inet6_gr.o ipx_gr.o ddp_gr.o netrom_gr.o ax25_gr.o rose_gr.o getroute.o x25_gr.o
1bf9a7d
 AFSROBJS = inet_sr.o inet6_sr.o netrom_sr.o ipx_sr.o setroute.o x25_sr.o