summaryrefslogtreecommitdiffstats
path: root/ffd/netif.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/netif.c')
-rw-r--r--ffd/netif.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/ffd/netif.c b/ffd/netif.c
index c63b19b..d521a12 100644
--- a/ffd/netif.c
+++ b/ffd/netif.c
@@ -43,6 +43,7 @@
#define SYSFS_PATH_MAX 256
#define SYSFS_CLASS_NET "/sys/class/net"
+#define SYSFS_BATADV "/sys/kernel/debug/batman_adv"
static bool netif_file_read(const char *ifname, const char *file, const char *format, ...) {
@@ -67,6 +68,19 @@ static bool netif_file_exists(const char *ifname, const char *file) {
return (stat(filename, &st) == 0);
}
+static bool batadv_file_read(const char *ifname, const char *file, const char *format, ...) {
+ char filename[SYSFS_PATH_MAX];
+
+ snprintf(filename, SYSFS_PATH_MAX, SYSFS_BATADV"/%s/%s", ifname, file);
+
+ va_list ap;
+ va_start(ap, format);
+ bool ret = file_readv(filename, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
bool netif_is_mesh(const char *ifname) {
return netif_file_exists(ifname, "mesh");
}
@@ -180,3 +194,13 @@ void netif_foreach(netif_cb cb, void *arg) {
if_freenameindex(ifaces);
}
+
+eth_addr_t netif_mesh_get_primary_addr(const char *ifname) {
+ eth_addr_t ret;
+ uint8_t *a = ret.d;
+
+ if (!batadv_file_read(ifname, "originators", "%*[^,], MainIF/MAC: %*[^/]/%x:%x:%x:%x:%x:%x", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
+ return ETH_ADDR_UNSPEC;
+
+ return ret;
+}