diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-01-20 13:09:13 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-01-30 15:04:19 +0100 |
commit | c50f1b42fe25f4debc203f1fd78b93fea67ca56a (patch) | |
tree | 11a45e0ff02a7145350d42ecd989454044375594 | |
parent | Add <rtems/bsd/util.h> (diff) | |
download | rtems-libbsd-c50f1b42fe25f4debc203f1fd78b93fea67ca56a.tar.bz2 |
Add rtems_bsd_get_ethernet_addr()
-rw-r--r-- | Makefile | 1 | ||||
-rwxr-xr-x | freebsd-to-rtems.py | 1 | ||||
-rw-r--r-- | rtemsbsd/include/rtems/bsd/util.h | 21 | ||||
-rw-r--r-- | rtemsbsd/rtems/rtems-bsd-get-ethernet-addr.c | 74 |
4 files changed, 97 insertions, 0 deletions
@@ -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 <sys/types.h> + +#include <net/ethernet.h> + +#include <stdint.h> + #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 + * <rtems@embedded-brains.de> + * + * 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 <rtems/bsd/util.h> + +#include <sys/cdefs.h> +#include <sys/types.h> +#include <sys/socket.h> + +#include <net/if_dl.h> + +#include <errno.h> +#include <ifaddrs.h> +#include <string.h> + +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; +} |