[rtems-libbsd commit] Add rtems_bsd_get_ethernet_addr()

Sebastian Huber sebh at rtems.org
Thu Jan 30 15:35:13 UTC 2014


Module:    rtems-libbsd
Branch:    master
Commit:    c50f1b42fe25f4debc203f1fd78b93fea67ca56a
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=c50f1b42fe25f4debc203f1fd78b93fea67ca56a

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Jan 20 13:09:13 2014 +0100

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(+), 0 deletions(-)

diff --git a/Makefile b/Makefile
index 618c5c5..d4b2d95 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 df92583..6489923 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 a5bd2ec..2b1e6ee 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 0000000..b6b5380
--- /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 at 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;
+}




More information about the vc mailing list