From ba76aa63573f4aeb8fbea6dc85548660cc6d083b Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Mon, 14 Oct 2019 20:21:02 +0000 Subject: [PATCH] Convert if_foreach_llmaddr() KPI. Reviewed by: erj --- sys/dev/ixgbe/if_ix.c | 16 ++++----- sys/dev/ixl/if_iavf.c | 27 ++++++--------- sys/dev/ixl/if_ixl.c | 22 +++++------- sys/dev/ixl/ixl_pf_main.c | 70 ++++++++++++++++----------------------- 4 files changed, 55 insertions(+), 80 deletions(-) diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c index de76ca7f443..62f5e517148 100644 --- a/sys/dev/ixgbe/if_ix.c +++ b/sys/dev/ixgbe/if_ix.c @@ -2333,7 +2333,7 @@ ixgbe_if_promisc_set(if_ctx_t ctx, int flags) if (ifp->if_flags & IFF_ALLMULTI) mcnt = MAX_NUM_MULTICAST_ADDRESSES; else { - mcnt = if_multiaddr_count(ifp, MAX_NUM_MULTICAST_ADDRESSES); + mcnt = min(if_llmaddr_count(ifp), MAX_NUM_MULTICAST_ADDRESSES); } if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) rctl &= (~IXGBE_FCTRL_MPE); @@ -3207,18 +3207,15 @@ ixgbe_config_delay_values(struct adapter *adapter) * * Called whenever multicast address list is updated. ************************************************************************/ -static int -ixgbe_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count) +static u_int +ixgbe_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count) { struct adapter *adapter = arg; struct ixgbe_mc_addr *mta = adapter->mta; - if (ifma->ifma_addr->sa_family != AF_LINK) - return (0); if (count == MAX_NUM_MULTICAST_ADDRESSES) return (0); - bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), - mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS); + bcopy(LLADDR(sdl), mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS); mta[count].vmdq = adapter->pool; return (1); @@ -3231,15 +3228,16 @@ ixgbe_if_multi_set(if_ctx_t ctx) struct ixgbe_mc_addr *mta; struct ifnet *ifp = iflib_get_ifp(ctx); u8 *update_ptr; - int mcnt = 0; u32 fctrl; + u_int mcnt; IOCTL_DEBUGOUT("ixgbe_if_multi_set: begin"); mta = adapter->mta; bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES); - mcnt = if_multi_apply(iflib_get_ifp(ctx), ixgbe_mc_filter_apply, adapter); + mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixgbe_mc_filter_apply, + adapter); fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); diff --git a/sys/dev/ixl/if_iavf.c b/sys/dev/ixl/if_iavf.c index be2b3934584..7ff659b78e4 100644 --- a/sys/dev/ixl/if_iavf.c +++ b/sys/dev/ixl/if_iavf.c @@ -1225,18 +1225,13 @@ iavf_if_update_admin_status(if_ctx_t ctx) iavf_enable_adminq_irq(hw); } -static int -iavf_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count __unused) +static u_int +iavf_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count __unused) { struct iavf_sc *sc = arg; - int error = 0; - - if (ifma->ifma_addr->sa_family != AF_LINK) - return (0); - error = iavf_add_mac_filter(sc, - (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr), - IXL_FILTER_MC); + int error; + error = iavf_add_mac_filter(sc, (u8*)LLADDR(sdl), IXL_FILTER_MC); return (!error); } @@ -1244,12 +1239,11 @@ static void iavf_if_multi_set(if_ctx_t ctx) { struct iavf_sc *sc = iflib_get_softc(ctx); - int mcnt = 0; IOCTL_DEBUGOUT("iavf_if_multi_set: begin"); - mcnt = if_multiaddr_count(iflib_get_ifp(ctx), MAX_MULTICAST_ADDR); - if (__predict_false(mcnt == MAX_MULTICAST_ADDR)) { + if (__predict_false(if_llmaddr_count(iflib_get_ifp(ctx)) >= + MAX_MULTICAST_ADDR)) { /* Delete MC filters and enable mulitcast promisc instead */ iavf_init_multi(sc); sc->promisc_flags |= FLAG_VF_MULTICAST_PROMISC; @@ -1261,9 +1255,8 @@ iavf_if_multi_set(if_ctx_t ctx) iavf_init_multi(sc); /* And (re-)install filters for all mcast addresses */ - mcnt = if_multi_apply(iflib_get_ifp(ctx), iavf_mc_filter_apply, sc); - - if (mcnt > 0) + if (if_foreach_llmaddr(iflib_get_ifp(ctx), iavf_mc_filter_apply, sc) > + 0) iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_MAC_FILTER); } @@ -1358,8 +1351,8 @@ iavf_if_promisc_set(if_ctx_t ctx, int flags) sc->promisc_flags = 0; - if (flags & IFF_ALLMULTI || - if_multiaddr_count(ifp, MAX_MULTICAST_ADDR) == MAX_MULTICAST_ADDR) + if (flags & IFF_ALLMULTI || if_llmaddr_count(ifp) >= + MAX_MULTICAST_ADDR) sc->promisc_flags |= FLAG_VF_MULTICAST_PROMISC; if (flags & IFF_PROMISC) sc->promisc_flags |= FLAG_VF_UNICAST_PROMISC; diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c index ed1513f3a51..9e63e9a2355 100644 --- a/sys/dev/ixl/if_ixl.c +++ b/sys/dev/ixl/if_ixl.c @@ -122,7 +122,7 @@ static void ixl_if_vflr_handle(if_ctx_t ctx); #endif /*** Other ***/ -static int ixl_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int); +static u_int ixl_mc_filter_apply(void *, struct sockaddr_dl *, u_int); static void ixl_save_pf_tunables(struct ixl_pf *); static int ixl_allocate_pci_resources(struct ixl_pf *); @@ -1298,12 +1298,12 @@ ixl_if_multi_set(if_ctx_t ctx) struct ixl_pf *pf = iflib_get_softc(ctx); struct ixl_vsi *vsi = &pf->vsi; struct i40e_hw *hw = vsi->hw; - int mcnt = 0, flags; + int mcnt, flags; int del_mcnt; IOCTL_DEBUGOUT("ixl_if_multi_set: begin"); - mcnt = if_multiaddr_count(iflib_get_ifp(ctx), MAX_MULTICAST_ADDR); + mcnt = min(if_llmaddr_count(iflib_get_ifp(ctx)), MAX_MULTICAST_ADDR); /* Delete filters for removed multicast addresses */ del_mcnt = ixl_del_multi(vsi); vsi->num_macs -= del_mcnt; @@ -1315,8 +1315,7 @@ ixl_if_multi_set(if_ctx_t ctx) } /* (re-)install filters for all mcast addresses */ /* XXX: This bypasses filter count tracking code! */ - mcnt = if_multi_apply(iflib_get_ifp(ctx), ixl_mc_filter_apply, vsi); - + mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixl_mc_filter_apply, vsi); if (mcnt > 0) { vsi->num_macs += mcnt; flags = (IXL_FILTER_ADD | IXL_FILTER_USED | IXL_FILTER_MC); @@ -1504,8 +1503,8 @@ ixl_if_promisc_set(if_ctx_t ctx, int flags) if (flags & IFF_PROMISC) uni = multi = TRUE; - else if (flags & IFF_ALLMULTI || - if_multiaddr_count(ifp, MAX_MULTICAST_ADDR) == MAX_MULTICAST_ADDR) + else if (flags & IFF_ALLMULTI || if_llmaddr_count(ifp) >= + MAX_MULTICAST_ADDR) multi = TRUE; err = i40e_aq_set_vsi_unicast_promiscuous(hw, @@ -1634,15 +1633,12 @@ ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_t data) return (error); } -static int -ixl_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count __unused) +static u_int +ixl_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count __unused) { struct ixl_vsi *vsi = arg; - if (ifma->ifma_addr->sa_family != AF_LINK) - return (0); - ixl_add_mc_filter(vsi, - (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr)); + ixl_add_mc_filter(vsi, (u8*)LLADDR(sdl)); return (1); } diff --git a/sys/dev/ixl/ixl_pf_main.c b/sys/dev/ixl/ixl_pf_main.c index 8182cf210b8..f385877ffa7 100644 --- a/sys/dev/ixl/ixl_pf_main.c +++ b/sys/dev/ixl/ixl_pf_main.c @@ -637,6 +637,16 @@ ixl_msix_adminq(void *arg) return (FILTER_HANDLED); } +static u_int +ixl_add_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct ixl_vsi *vsi = arg; + + ixl_add_mc_filter(vsi, (u8*)LLADDR(sdl)); + + return (1); +} + /********************************************************************* * Filter Routines * @@ -646,25 +656,17 @@ ixl_msix_adminq(void *arg) void ixl_add_multi(struct ixl_vsi *vsi) { - struct ifmultiaddr *ifma; struct ifnet *ifp = vsi->ifp; struct i40e_hw *hw = vsi->hw; int mcnt = 0, flags; IOCTL_DEBUGOUT("ixl_add_multi: begin"); - if_maddr_rlock(ifp); /* ** First just get a count, to decide if we ** we simply use multicast promiscuous. */ - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - mcnt++; - } - if_maddr_runlock(ifp); - + mcnt = if_llmaddr_count(ifp); if (__predict_false(mcnt >= MAX_MULTICAST_ADDR)) { /* delete existing MC filters */ ixl_del_hw_filters(vsi, mcnt); @@ -673,16 +675,7 @@ ixl_add_multi(struct ixl_vsi *vsi) return; } - mcnt = 0; - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - ixl_add_mc_filter(vsi, - (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr)); - mcnt++; - } - if_maddr_runlock(ifp); + mcnt = if_foreach_llmaddr(ifp, ixl_add_maddr, vsi); if (mcnt > 0) { flags = (IXL_FILTER_ADD | IXL_FILTER_USED | IXL_FILTER_MC); ixl_add_hw_filters(vsi, flags, mcnt); @@ -691,38 +684,33 @@ ixl_add_multi(struct ixl_vsi *vsi) IOCTL_DEBUGOUT("ixl_add_multi: end"); } +static u_int +ixl_match_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct ixl_mac_filter *f = arg; + + if (cmp_etheraddr(f->macaddr, (u8 *)LLADDR(sdl))) + return (1); + else + return (0); +} + int ixl_del_multi(struct ixl_vsi *vsi) { struct ifnet *ifp = vsi->ifp; - struct ifmultiaddr *ifma; struct ixl_mac_filter *f; int mcnt = 0; - bool match = FALSE; IOCTL_DEBUGOUT("ixl_del_multi: begin"); - /* Search for removed multicast addresses */ - if_maddr_rlock(ifp); - SLIST_FOREACH(f, &vsi->ftl, next) { - if ((f->flags & IXL_FILTER_USED) && (f->flags & IXL_FILTER_MC)) { - match = FALSE; - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - u8 *mc_addr = (u8 *)LLADDR((struct sockaddr_dl *)ifma->ifma_addr); - if (cmp_etheraddr(f->macaddr, mc_addr)) { - match = TRUE; - break; - } - } - if (match == FALSE) { - f->flags |= IXL_FILTER_DEL; - mcnt++; - } + SLIST_FOREACH(f, &vsi->ftl, next) + if ((f->flags & IXL_FILTER_USED) && + (f->flags & IXL_FILTER_MC) && + (if_foreach_llmaddr(ifp, ixl_match_maddr, f) == 0)) { + f->flags |= IXL_FILTER_DEL; + mcnt++; } - } - if_maddr_runlock(ifp); if (mcnt > 0) ixl_del_hw_filters(vsi, mcnt); -- 2.45.0