diff --git a/sys/net/if.c b/sys/net/if.c index 951349b97ffb..8bb5ed0043e5 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -4466,6 +4466,25 @@ if_lladdr_count(if_t ifp) return (count); } +int +if_foreach(if_foreach_cb_t cb, void *cb_arg) +{ + if_t ifp; + int error; + + NET_EPOCH_ASSERT(); + MPASS(cb); + + error = 0; + CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { + error = cb(ifp, cb_arg); + if (error != 0) + break; + } + + return (error); +} + u_int if_foreach_lladdr(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 4c3d4138f7ec..b4cdcf27253f 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -665,6 +665,9 @@ struct ifaddr * if_getifaddr(const if_t ifp); typedef u_int if_addr_cb_t(void *, struct ifaddr *, u_int); u_int if_foreach_addr_type(if_t ifp, int type, if_addr_cb_t cb, void *cb_arg); +typedef int (*if_foreach_cb_t)(if_t, void *); +int if_foreach(if_foreach_cb_t, void *); + /* Functions */ void if_setinitfn(if_t ifp, if_init_fn_t); void if_setinputfn(if_t ifp, if_input_fn_t);