Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/vmware/vmxnet3/if_vmx.c
Show First 20 Lines • Show All 1,989 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
vmxnet3_vlan_unregister(if_ctx_t ctx, uint16_t tag) | vmxnet3_vlan_unregister(if_ctx_t ctx, uint16_t tag) | ||||
{ | { | ||||
vmxnet3_update_vlan_filter(iflib_get_softc(ctx), 0, tag); | vmxnet3_update_vlan_filter(iflib_get_softc(ctx), 0, tag); | ||||
} | } | ||||
static u_int | |||||
vmxnet3_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int count) | |||||
{ | |||||
struct vmxnet3_softc *sc = arg; | |||||
if (count < VMXNET3_MULTICAST_MAX) | |||||
bcopy(LLADDR(sdl), &sc->vmx_mcast[count * ETHER_ADDR_LEN], | |||||
ETHER_ADDR_LEN); | |||||
return (1); | |||||
} | |||||
static void | static void | ||||
vmxnet3_set_rxfilter(struct vmxnet3_softc *sc, int flags) | vmxnet3_set_rxfilter(struct vmxnet3_softc *sc, int flags) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct vmxnet3_driver_shared *ds; | struct vmxnet3_driver_shared *ds; | ||||
struct ifmultiaddr *ifma; | |||||
u_int mode; | u_int mode; | ||||
ifp = sc->vmx_ifp; | ifp = sc->vmx_ifp; | ||||
ds = sc->vmx_ds; | ds = sc->vmx_ds; | ||||
mode = VMXNET3_RXMODE_UCAST | VMXNET3_RXMODE_BCAST; | mode = VMXNET3_RXMODE_UCAST | VMXNET3_RXMODE_BCAST; | ||||
if (flags & IFF_PROMISC) | if (flags & IFF_PROMISC) | ||||
mode |= VMXNET3_RXMODE_PROMISC; | mode |= VMXNET3_RXMODE_PROMISC; | ||||
if (flags & IFF_ALLMULTI) | if (flags & IFF_ALLMULTI) | ||||
mode |= VMXNET3_RXMODE_ALLMULTI; | mode |= VMXNET3_RXMODE_ALLMULTI; | ||||
else { | else { | ||||
int cnt = 0, overflow = 0; | int cnt; | ||||
if_maddr_rlock(ifp); | cnt = if_foreach_llmaddr(ifp, vmxnet3_hash_maddr, sc); | ||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { | if (cnt >= VMXNET3_MULTICAST_MAX) { | ||||
if (ifma->ifma_addr->sa_family != AF_LINK) | |||||
continue; | |||||
else if (cnt == VMXNET3_MULTICAST_MAX) { | |||||
overflow = 1; | |||||
break; | |||||
} | |||||
bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), | |||||
&sc->vmx_mcast[cnt*ETHER_ADDR_LEN], ETHER_ADDR_LEN); | |||||
cnt++; | |||||
} | |||||
if_maddr_runlock(ifp); | |||||
if (overflow != 0) { | |||||
cnt = 0; | cnt = 0; | ||||
mode |= VMXNET3_RXMODE_ALLMULTI; | mode |= VMXNET3_RXMODE_ALLMULTI; | ||||
} else if (cnt > 0) | } else if (cnt > 0) | ||||
mode |= VMXNET3_RXMODE_MCAST; | mode |= VMXNET3_RXMODE_MCAST; | ||||
ds->mcast_tablelen = cnt * ETHER_ADDR_LEN; | ds->mcast_tablelen = cnt * ETHER_ADDR_LEN; | ||||
} | } | ||||
ds->rxmode = mode; | ds->rxmode = mode; | ||||
▲ Show 20 Lines • Show All 379 Lines • Show Last 20 Lines |