svn commit: r353802 - head/sys/dev/virtio/network

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 21 17:59:03 UTC 2019


Author: glebius
Date: Mon Oct 21 17:59:02 2019
New Revision: 353802
URL: https://svnweb.freebsd.org/changeset/base/353802

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/virtio/network/if_vtnet.c

Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c	Mon Oct 21 17:54:53 2019	(r353801)
+++ head/sys/dev/virtio/network/if_vtnet.c	Mon Oct 21 17:59:02 2019	(r353802)
@@ -3285,6 +3285,34 @@ vtnet_rx_filter(struct vtnet_softc *sc)
 		    ifp->if_flags & IFF_ALLMULTI ? "enable" : "disable");
 }
 
+static u_int
+vtnet_copy_ifaddr(void *arg, struct sockaddr_dl *sdl, u_int ucnt)
+{
+	struct vtnet_softc *sc = arg;
+
+	if (memcmp(LLADDR(sdl), sc->vtnet_hwaddr, ETHER_ADDR_LEN) == 0)
+		return (0);
+
+	if (ucnt < VTNET_MAX_MAC_ENTRIES)
+		bcopy(LLADDR(sdl),
+		    &sc->vtnet_mac_filter->vmf_unicast.macs[ucnt],
+		    ETHER_ADDR_LEN);
+
+	return (1);
+}
+
+static u_int
+vtnet_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int mcnt)
+{
+	struct vtnet_mac_filter *filter = arg;
+
+	if (mcnt < VTNET_MAX_MAC_ENTRIES)
+		bcopy(LLADDR(sdl), &filter->vmf_multicast.macs[mcnt],
+		    ETHER_ADDR_LEN);
+
+	return (1);
+}
+
 static void
 vtnet_rx_filter_mac(struct vtnet_softc *sc)
 {
@@ -3293,42 +3321,23 @@ vtnet_rx_filter_mac(struct vtnet_softc *sc)
 	struct sglist_seg segs[4];
 	struct sglist sg;
 	struct ifnet *ifp;
-	struct ifaddr *ifa;
-	struct ifmultiaddr *ifma;
-	int ucnt, mcnt, promisc, allmulti, error;
+	bool promisc, allmulti;
+	u_int ucnt, mcnt;
+	int error;
 	uint8_t ack;
 
 	ifp = sc->vtnet_ifp;
 	filter = sc->vtnet_mac_filter;
-	ucnt = 0;
-	mcnt = 0;
-	promisc = 0;
-	allmulti = 0;
 
 	VTNET_CORE_LOCK_ASSERT(sc);
 	KASSERT(sc->vtnet_flags & VTNET_FLAG_CTRL_RX,
 	    ("%s: CTRL_RX feature not negotiated", __func__));
 
 	/* Unicast MAC addresses: */
-	if_addr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
-		if (ifa->ifa_addr->sa_family != AF_LINK)
-			continue;
-		else if (memcmp(LLADDR((struct sockaddr_dl *)ifa->ifa_addr),
-		    sc->vtnet_hwaddr, ETHER_ADDR_LEN) == 0)
-			continue;
-		else if (ucnt == VTNET_MAX_MAC_ENTRIES) {
-			promisc = 1;
-			break;
-		}
+	ucnt = if_foreach_lladdr(ifp, vtnet_copy_ifaddr, sc);
+	promisc = (ucnt > VTNET_MAX_MAC_ENTRIES);
 
-		bcopy(LLADDR((struct sockaddr_dl *)ifa->ifa_addr),
-		    &filter->vmf_unicast.macs[ucnt], ETHER_ADDR_LEN);
-		ucnt++;
-	}
-	if_addr_runlock(ifp);
-
-	if (promisc != 0) {
+	if (promisc) {
 		filter->vmf_unicast.nentries = 0;
 		if_printf(ifp, "more than %d MAC addresses assigned, "
 		    "falling back to promiscuous mode\n",
@@ -3337,22 +3346,10 @@ vtnet_rx_filter_mac(struct vtnet_softc *sc)
 		filter->vmf_unicast.nentries = ucnt;
 
 	/* Multicast MAC addresses: */
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		else if (mcnt == VTNET_MAX_MAC_ENTRIES) {
-			allmulti = 1;
-			break;
-		}
+	mcnt = if_foreach_llmaddr(ifp, vtnet_copy_maddr, filter);
+	allmulti = (mcnt > VTNET_MAX_MAC_ENTRIES);
 
-		bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
-		    &filter->vmf_multicast.macs[mcnt], ETHER_ADDR_LEN);
-		mcnt++;
-	}
-	if_maddr_runlock(ifp);
-
-	if (allmulti != 0) {
+	if (allmulti) {
 		filter->vmf_multicast.nentries = 0;
 		if_printf(ifp, "more than %d multicast MAC addresses "
 		    "assigned, falling back to all-multicast mode\n",
@@ -3360,7 +3357,7 @@ vtnet_rx_filter_mac(struct vtnet_softc *sc)
 	} else
 		filter->vmf_multicast.nentries = mcnt;
 
-	if (promisc != 0 && allmulti != 0)
+	if (promisc && allmulti)
 		goto out;
 
 	hdr.class = VIRTIO_NET_CTRL_MAC;


More information about the svn-src-head mailing list