aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Eckenfels <net-tools@lina.inka.de>2008-10-03 01:52:03 +0000
committerBernd Eckenfels <net-tools@lina.inka.de>2008-10-03 01:52:03 +0000
commit24f959e792182b70e6e1032ff247c0bf39bfd2b5 (patch)
tree714584d0ba1ee01e062449993bb32035ac1c550a
parentavoid unused filetype, fix formatting of -p headers (diff)
downloadnet-tools-24f959e792182b70e6e1032ff247c0bf39bfd2b5.tar.gz
net-tools-24f959e792182b70e6e1032ff247c0bf39bfd2b5.tar.bz2
net-tools-24f959e792182b70e6e1032ff247c0bf39bfd2b5.zip
Add hardware support for InfiniBand (Debian Bug #294252 Tom Duffy from Sun).
-rw-r--r--config.in1
-rw-r--r--lib/Makefile2
-rw-r--r--lib/hw.c10
-rw-r--r--lib/ib.c147
4 files changed, 158 insertions, 2 deletions
diff --git a/config.in b/config.in
index 2999cd1..594db80 100644
--- a/config.in
+++ b/config.in
@@ -59,6 +59,7 @@ bool 'X.25 (CCITT) protocol family' HAVE_AFX25 y
bool 'Econet protocol family' HAVE_AFECONET y
bool 'DECnet protocol family' HAVE_AFDECnet n
bool 'Ash protocol family' HAVE_AFASH y
+bool 'InfiniBand hardware support' HAVE_HWIB y
*
*
* Device Hardware types.
diff --git a/lib/Makefile b/lib/Makefile
index f4b5cbd..976ebb8 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -16,7 +16,7 @@
#
-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 eui64.o
+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 eui64.o ib.o
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
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
AFSROBJS = inet_sr.o inet6_sr.o netrom_sr.o ipx_sr.o setroute.o x25_sr.o
diff --git a/lib/hw.c b/lib/hw.c
index c714313..e9ba0be 100644
--- a/lib/hw.c
+++ b/lib/hw.c
@@ -2,7 +2,7 @@
* lib/hw.c This file contains the top-level part of the hardware
* support functions module.
*
- * Version: $Id: hw.c,v 1.18 2001/11/12 02:12:05 ecki Exp $
+ * Version: $Id: hw.c,v 1.19 2008/10/03 01:52:04 ecki Exp $
*
* Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de>
*
@@ -73,6 +73,8 @@ extern struct hwtype irda_hwtype;
extern struct hwtype ec_hwtype;
+extern struct hwtype ib_hwtype;
+
extern struct hwtype eui64_hwtype;
static struct hwtype *hwtypes[] =
@@ -146,6 +148,9 @@ static struct hwtype *hwtypes[] =
#if HAVE_HWX25
&x25_hwtype,
#endif
+#if HAVE_HWIB
+ &ib_hwtype,
+#endif
#if HAVE_HWEUI64
&eui64_hwtype,
#endif
@@ -222,6 +227,9 @@ void hwinit()
#if HAVE_HWEC
ec_hwtype.title = _("Econet");
#endif
+#if HAVE_HWIB
+ ib_hwtype.title = _("InfiniBand");
+#endif
#if HAVE_HWEUI64
eui64_hwtype.title = _("Generic EUI-64");
#endif
diff --git a/lib/ib.c b/lib/ib.c
new file mode 100644
index 0000000..72281a1
--- /dev/null
+++ b/lib/ib.c
@@ -0,0 +1,147 @@
+/*
+ * lib/ib.c This file contains an implementation of the "Infiniband"
+ * support functions.
+ *
+ * Version: $Id: ib.c,v 1.1 2008/10/03 01:52:03 ecki Exp $
+ *
+ * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
+ * Copyright 1993 MicroWalt Corporation
+ * Tom Duffy <tduffy@sun.com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ */
+#include "config.h"
+
+#if HAVE_HWIB
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if_arp.h>
+#include <linux/if_infiniband.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include "net-support.h"
+#include "pathnames.h"
+#include "intl.h"
+#include "util.h"
+
+extern struct hwtype ib_hwtype;
+
+
+/* Display an InfiniBand address in readable format. */
+static char *pr_ib(unsigned char *ptr)
+{
+ static char buff[128];
+ char *pos;
+ unsigned int i;
+
+ pos = buff;
+ for (i = 0; i < INFINIBAND_ALEN; i++) {
+ pos += sprintf(pos, "%02X:", (*ptr++ & 0377));
+ }
+ buff[strlen(buff) - 1] = '\0';
+
+ /* snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
+ (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
+ (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
+ );
+ */
+ return (buff);
+}
+
+
+/* Input an Infiniband address and convert to binary. */
+static int in_ib(char *bufp, struct sockaddr *sap)
+{
+ unsigned char *ptr;
+ char c, *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 {
+#ifdef DEBUG
+ fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
+#endif
+ 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 {
+#ifdef DEBUG
+ fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
+#endif
+ errno = EINVAL;
+ return (-1);
+ }
+ if (c != 0)
+ bufp++;
+ *ptr++ = (unsigned char) (val & 0377);
+ i++;
+
+ /* We might get a semicolon here - not required. */
+ if (*bufp == ':') {
+ if (i == INFINIBAND_ALEN) {
+#ifdef DEBUG
+ fprintf(stderr, _("in_ib(%s): trailing : ignored!\n"),
+ orig)
+#endif
+ ; /* nothing */
+ }
+ bufp++;
+ }
+ }
+
+ /* That's it. Any trailing junk? */
+ if ((i == INFINIBAND_ALEN) && (*bufp != '\0')) {
+#ifdef DEBUG
+ fprintf(stderr, _("in_ib(%s): trailing junk!\n"), orig);
+ errno = EINVAL;
+ return (-1);
+#endif
+ }
+#ifdef DEBUG
+ fprintf(stderr, "in_ib(%s): %s\n", orig, pr_ib(sap->sa_data));
+#endif
+
+ return (0);
+}
+
+
+struct hwtype ib_hwtype =
+{
+ "infiniband", NULL, ARPHRD_INFINIBAND, INFINIBAND_ALEN,
+ pr_ib, in_ib, NULL
+};
+
+
+#endif /* HAVE_HWIB */