net/if: introduce if_bylla to find an interface by hardware address
authorRoy Marples <roy@marples.name>
Thu, 8 Aug 2019 16:38:21 +0000 (17:38 +0100)
committerRoy Marples <roy@marples.name>
Thu, 8 Aug 2019 16:41:25 +0000 (17:41 +0100)
sys/net/if.c
sys/net/if_var.h

index be6670c..d82d23f 100644 (file)
@@ -2815,6 +2815,31 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
        return (0);
 }
 
+
+/*
+ * Locate an interface based on a complete address.
+ */
+struct ifnet *
+if_bylla(const void *lla, unsigned char lla_len)
+{
+       const struct ifnet_array *arr;
+       struct ifnet *ifp;
+       struct sockaddr_dl *sdl;
+       int i;
+
+       arr = ifnet_array_get();
+       for (i = 0; i < arr->ifnet_count; ++i) {
+               ifp = arr->ifnet_arr[i];
+               if (ifp->if_addrlen != lla_len)
+                       continue;
+
+               sdl = IF_LLSOCKADDR(ifp);
+               if (memcmp(lla, LLADDR(sdl), lla_len) == 0)
+                       return (ifp);
+       }
+       return (NULL);
+}
+
 struct ifmultiaddr *
 ifmaof_ifpforaddr(struct sockaddr *sa, struct ifnet *ifp)
 {
index 4e2c7ca..1f26883 100644 (file)
@@ -945,6 +945,7 @@ struct ifnet *if_alloc(uint8_t);
 void   if_free(struct ifnet *);
 void   if_route(struct ifnet *, int flag, int fam);
 int    if_setlladdr(struct ifnet *, const u_char *, int);
+struct ifnet *if_bylla(const void *, unsigned char);
 void   if_unroute(struct ifnet *, int flag, int fam);
 void   if_up(struct ifnet *);
 /*void ifinit(void);*/ /* declared in systm.h for main() */