From c50f1b42fe25f4debc203f1fd78b93fea67ca56a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 20 Jan 2014 13:09:13 +0100 Subject: [PATCH] Add rtems_bsd_get_ethernet_addr() --- Makefile | 1 + freebsd-to-rtems.py | 1 + rtemsbsd/include/rtems/bsd/util.h | 21 ++++++ rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c | 74 ++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c diff --git a/Makefile b/Makefile index 618c5c5c..d4b2d95d 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,7 @@ LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-chunk.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-condvar.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-conf.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-delay.c +LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-get-file.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-init.c LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-jail.c diff --git a/freebsd-to-rtems.py b/freebsd-to-rtems.py index df925837..64899230 100755 --- a/freebsd-to-rtems.py +++ b/freebsd-to-rtems.py @@ -647,6 +647,7 @@ rtems.addRTEMSSourceFiles( 'rtems/rtems-bsd-condvar.c', 'rtems/rtems-bsd-conf.c', 'rtems/rtems-bsd-delay.c', + 'rtems/rtems-bsd-get-ethernet-addr.c', 'rtems/rtems-bsd-get-file.c', 'rtems/rtems-bsd-init.c', 'rtems/rtems-bsd-jail.c', diff --git a/rtemsbsd/include/rtems/bsd/util.h b/rtemsbsd/include/rtems/bsd/util.h index a5bd2ecd..2b1e6eeb 100644 --- a/rtemsbsd/include/rtems/bsd/util.h +++ b/rtemsbsd/include/rtems/bsd/util.h @@ -32,10 +32,31 @@ #ifndef _RTEMS_BSD_UTIL_H_ #define _RTEMS_BSD_UTIL_H_ +#include + +#include + +#include + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ +/** + * @brief Gets the Ethernet address of an interface identified by its name. + * + * This function uses getifaddrs(). The interface type is not checked, so it + * is only safe to use this function for Ethernet type interfaces. + * + * @param[in] ifname The name of the interface. + * @parma[out] eaddr The Ethernet address of this interface. + * + * @retval 0 Successful operation. + * @retval -1 An error occurred. The errno is set to indicate the error. + */ +int +rtems_bsd_get_ethernet_addr(const char *ifname, uint8_t eaddr[ETHER_ADDR_LEN]); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c b/rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c new file mode 100644 index 00000000..b6b5380b --- /dev/null +++ b/rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include +#include + +#include + +#include +#include +#include + +int +rtems_bsd_get_ethernet_addr(const char *ifname, uint8_t eaddr[ETHER_ADDR_LEN]) +{ + int rv; + struct ifaddrs *ifa; + + rv = getifaddrs(&ifa); + if (rv == 0) { + struct ifaddrs *cur; + + for (cur = ifa; cur != NULL; cur = cur->ifa_next) { + if (strcmp(cur->ifa_name, ifname) == 0 && + cur->ifa_addr->sa_family == AF_LINK) { + const struct sockaddr_dl *dl = + (const struct sockaddr_dl *) cur->ifa_addr; + + memcpy(&eaddr[0], LLADDR(dl), ETHER_ADDR_LEN); + break; + } + } + + freeifaddrs(ifa); + + if (cur == NULL) { + errno = ENXIO; + rv = -1; + } + } + + return rv; +}