From fb3fc771f6fcfda3e55b4abbbc2c3a0503af2619 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Thu, 10 Oct 2019 23:44:56 +0000 Subject: [PATCH] Add two extra functions that basically give count of addresses on interface. Such function could been implemented on top of the if_foreach_llm?addr(), but several drivers need counting, so avoid copy-n-paste inside the drivers. --- sys/net/if.c | 34 ++++++++++++++++++++++++++++++++++ sys/net/if_var.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/sys/net/if.c b/sys/net/if.c index 427871db3b1..9610fd69ecb 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -4268,6 +4268,23 @@ if_getmtu_family(if_t ifp, int family) * link level addresses. Driver shall not know 'struct ifaddr' neither * 'struct ifmultiaddr'. */ +u_int +if_lladdr_count(if_t ifp) +{ + struct epoch_tracker et; + struct ifaddr *ifa; + u_int count; + + count = 0; + NET_EPOCH_ENTER(et); + CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) + if (ifa->ifa_addr->sa_family == AF_LINK) + count++; + NET_EPOCH_EXIT(et); + + return (count); +} + u_int if_foreach_lladdr(if_t ifp, iflladdr_cb_t cb, void *cb_arg) { @@ -4290,6 +4307,23 @@ if_foreach_lladdr(if_t ifp, iflladdr_cb_t cb, void *cb_arg) return (count); } +u_int +if_llmaddr_count(if_t ifp) +{ + struct epoch_tracker et; + struct ifmultiaddr *ifma; + int count; + + count = 0; + NET_EPOCH_ENTER(et); + CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) + if (ifma->ifma_addr->sa_family == AF_LINK) + count++; + NET_EPOCH_EXIT(et); + + return (count); +} + u_int if_foreach_llmaddr(if_t ifp, iflladdr_cb_t cb, void *cb_arg) { diff --git a/sys/net/if_var.h b/sys/net/if_var.h index ab34d03d6d6..f1bf84ffdea 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -772,6 +772,8 @@ struct sockaddr_dl; typedef u_int iflladdr_cb_t(void *, struct sockaddr_dl *, u_int); u_int if_foreach_lladdr(if_t, iflladdr_cb_t, void *); u_int if_foreach_llmaddr(if_t, iflladdr_cb_t, void *); +u_int if_lladdr_count(if_t); +u_int if_llmaddr_count(if_t); int if_multiaddr_count(if_t ifp, int max); /* Obsoleted multicast management functions. */