From 5fecea6f6c1d6e97bce73230b48e06e99f315b1b Mon Sep 17 00:00:00 2001 From: ecki Date: Mon, 12 Nov 2001 02:12:05 +0000 Subject: [PATCH] added EUI64 Hardware Address Family Daniel Stodden --- config.in | 2 + lib/Makefile | 2 +- lib/eui64.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/hw.c | 10 +++- lib/net-features.h | 7 +++ 5 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 lib/eui64.c diff --git a/config.in b/config.in index f3310d6e8..3e2075ad9 100644 --- a/config.in +++ b/config.in @@ -82,6 +82,8 @@ bool 'Ash hardware support' HAVE_HWASH n bool '(Cisco)-HDLC/LAPB support' HAVE_HWHDLCLAPB n bool 'IrDA support' HAVE_HWIRDA y bool 'Econet hardware support' HAVE_HWEC n +bool 'Generic EUI-64 hardware support' HAVE_HWEUI64 n + * * * Other Features. diff --git a/lib/Makefile b/lib/Makefile index d714b2e9c..f4b5cbd35 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 +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 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/eui64.c b/lib/eui64.c new file mode 100644 index 000000000..64c3614e8 --- /dev/null +++ b/lib/eui64.c @@ -0,0 +1,155 @@ +/* + * lib/eui64.c This file contains support for generic EUI-64 hw addressing + * + * Version: $Id: eui64.c,v 1.1 2001/11/12 02:12:05 ecki Exp $ + * + * Author: Daniel Stodden + * Copyright 2001 Daniel Stodden + * + * blueprinted from ether.c + * Copyright 1993 MicroWalt Corporation + * + * 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_HWEUI64 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "net-support.h" +#include "pathnames.h" +#include "intl.h" + +/* + * EUI-64 constants + */ + +#define EUI64_ALEN 8 + +#ifndef ARPHRD_EUI64 +#define ARPHRD_EUI64 27 +#warning "ARPHRD_EUI64 not defined in . Using private value 27" +#endif + +struct hwtype eui64_hwtype; + +/* Display an EUI-64 address in readable format. */ +static char *pr_eui64( unsigned char *ptr ) +{ + static char buff[64]; + + snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), + (ptr[4] & 0377), (ptr[5] & 0377), (ptr[6] & 0377), (ptr[7] & 0377) + ); + return (buff); +} + +/* Start the PPP encapsulation on the file descriptor. */ +static int in_eui64( char *bufp, struct sockaddr *sap ) +{ + unsigned char *ptr; + char c, *orig; + int i; + unsigned val; + + sap->sa_family = eui64_hwtype.type; + ptr = sap->sa_data; + + i = 0; + orig = bufp; + + while ((*bufp != '\0') && (i < EUI64_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_eui64(%s): invalid eui64 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_eui64(%s): invalid eui64 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 == EUI64_ALEN) { +#ifdef DEBUG + fprintf(stderr, _("in_eui64(%s): trailing : ignored!\n"), + orig) +#endif + ; /* nothing */ + } + bufp++; + } + } + + /* That's it. Any trailing junk? */ + if ((i == EUI64_ALEN) && (*bufp != '\0')) { +#ifdef DEBUG + fprintf(stderr, _("in_eui64(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +#endif + } +#ifdef DEBUG + fprintf(stderr, "in_eui64(%s): %s\n", orig, pr_eui64(sap->sa_data)); +#endif + + return (0); +} + +struct hwtype eui64_hwtype = +{ + "eui64", NULL, /*"EUI-64 addressing", */ ARPHRD_EUI64, EUI64_ALEN, + pr_eui64, in_eui64, NULL, 0 +}; + + +#endif /* HAVE_EUI64 */ diff --git a/lib/hw.c b/lib/hw.c index 498974836..c71431386 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.17 2000/05/20 13:38:10 pb Exp $ + * Version: $Id: hw.c,v 1.18 2001/11/12 02:12:05 ecki Exp $ * * Maintainer: Bernd 'eckes' Eckenfels, * @@ -73,6 +73,8 @@ extern struct hwtype irda_hwtype; extern struct hwtype ec_hwtype; +extern struct hwtype eui64_hwtype; + static struct hwtype *hwtypes[] = { @@ -144,6 +146,9 @@ static struct hwtype *hwtypes[] = #if HAVE_HWX25 &x25_hwtype, #endif +#if HAVE_HWEUI64 + &eui64_hwtype, +#endif &unspec_hwtype, NULL }; @@ -217,6 +222,9 @@ void hwinit() #if HAVE_HWEC ec_hwtype.title = _("Econet"); #endif +#if HAVE_HWEUI64 + eui64_hwtype.title = _("Generic EUI-64"); +#endif sVhwinit = 1; } diff --git a/lib/net-features.h b/lib/net-features.h index 0de273062..e52a3c31d 100644 --- a/lib/net-features.h +++ b/lib/net-features.h @@ -295,6 +295,13 @@ static char *Features = "-" #endif "HDLC/LAPB " + +#if HAVE_HWEUI64 +"+" +#else +"-" +#endif +"EUI64 " ; -- 2.11.4.GIT