Module Name:    src
Committed By:   yamaguchi
Date:           Fri Dec 20 01:49:30 UTC 2019

Modified Files:
        src/sys/dev/pci: if_ixl.c

Log Message:
Fix ixl(4) to set ENETRESET when IFF_ALLMULTI is changed


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/pci/if_ixl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_ixl.c
diff -u src/sys/dev/pci/if_ixl.c:1.7 src/sys/dev/pci/if_ixl.c:1.8
--- src/sys/dev/pci/if_ixl.c:1.7	Fri Dec 20 01:45:20 2019
+++ src/sys/dev/pci/if_ixl.c	Fri Dec 20 01:49:30 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ixl.c,v 1.7 2019/12/20 01:45:20 yamaguchi Exp $	*/
+/*	$NetBSD: if_ixl.c,v 1.8 2019/12/20 01:49:30 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -1442,7 +1442,7 @@ ixl_add_multi(struct ixl_softc *sc, uint
 	if (memcmp(addrlo, addrhi, ETHER_ADDR_LEN) != 0) {
 		ixl_del_all_multiaddr(sc);
 		SET(ifp->if_flags, IFF_ALLMULTI);
-		return 0;
+		return ENETRESET;
 	}
 
 	rv = ixl_add_macvlan(sc, addrlo, 0,
@@ -1451,25 +1451,25 @@ ixl_add_multi(struct ixl_softc *sc, uint
 	if (rv == ENOSPC) {
 		ixl_del_all_multiaddr(sc);
 		SET(ifp->if_flags, IFF_ALLMULTI);
-		return 0;
+		return ENETRESET;
 	}
 
 	return rv;
 }
 
-static void
+static int
 ixl_del_multi(struct ixl_softc *sc, uint8_t *addrlo, uint8_t *addrhi)
 {
 	struct ifnet *ifp = &sc->sc_ec.ec_if;
 	struct ethercom *ec = &sc->sc_ec;
 	struct ether_multi *enm, *enm_last;
 	struct ether_multistep step;
-	int rv;
+	int error, rv = 0;
 
 	if (!ISSET(ifp->if_flags, IFF_ALLMULTI)) {
 		ixl_remove_macvlan(sc, addrlo, 0,
 		    IXL_AQ_OP_REMOVE_MACVLAN_IGNORE_VLAN);
-		return;
+		return 0;
 	}
 
 	ETHER_LOCK(ec);
@@ -1477,16 +1477,15 @@ ixl_del_multi(struct ixl_softc *sc, uint
 	    ETHER_NEXT_MULTI(step, enm)) {
 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    ETHER_ADDR_LEN) != 0) {
-			ETHER_UNLOCK(ec);
-			return;
+			goto out;
 		}
 	}
 
 	for (ETHER_FIRST_MULTI(step, ec, enm); enm != NULL;
 	    ETHER_NEXT_MULTI(step, enm)) {
-		rv = ixl_add_macvlan(sc, enm->enm_addrlo, 0,
+		error = ixl_add_macvlan(sc, enm->enm_addrlo, 0,
 		    IXL_AQ_OP_ADD_MACVLAN_IGNORE_VLAN);
-		if (rv != 0)
+		if (error != 0)
 			break;
 	}
 
@@ -1502,9 +1501,12 @@ ixl_del_multi(struct ixl_softc *sc, uint
 		}
 	} else {
 		CLR(ifp->if_flags, IFF_ALLMULTI);
+		rv = ENETRESET;
 	}
 
+out:
 	ETHER_UNLOCK(ec);
+	return rv;
 }
 
 static int
@@ -1527,7 +1529,8 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd,
 			if (error != 0)
 				return error;
 
-			if (ixl_add_multi(sc, addrlo, addrhi) != 0) {
+			error = ixl_add_multi(sc, addrlo, addrhi);
+			if (error != 0 && error != ENETRESET) {
 				ether_delmulti(sa, &sc->sc_ec);
 				error = EIO;
 			}
@@ -1541,7 +1544,7 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd,
 			if (error != 0)
 				return error;
 
-			ixl_del_multi(sc, addrlo, addrhi);
+			error = ixl_del_multi(sc, addrlo, addrhi);
 		}
 		break;
 

Reply via email to