Download raw body.
ether_addmulti/delmulti error handling fix
While porting some ixl(4) code to ice(4) I noticed that some drivers
are hiding errors from ether_addmulti() and ether_delmulti().
Shouldn't an error be returned to userland if these functions fail in
ways other than ENETRESET? Other possible errors include EAFNOSUPPORT,
EINVAL (not a multicast address), and ENOBUFS. Currently, such errors
result in userland assuming that the operation did succeed.
diff /usr/src
path + /usr/src
commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5
blob - 703096356465279f43ac54c6f5a8ff68cd5d1b4f
file + sys/dev/pci/if_iavf.c
--- sys/dev/pci/if_iavf.c
+++ sys/dev/pci/if_iavf.c
@@ -1005,7 +1005,8 @@ iavf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data
break;
case SIOCADDMULTI:
- if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_addmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
return (error);
@@ -1021,7 +1022,8 @@ iavf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data
break;
case SIOCDELMULTI:
- if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_delmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
return (error);
commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5
blob - 12c84ba2c7939499681f847274306f21a8a4f8c0
file + sys/dev/pci/if_ixl.c
--- sys/dev/pci/if_ixl.c
+++ sys/dev/pci/if_ixl.c
@@ -2137,7 +2137,8 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
case SIOCADDMULTI:
- if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_addmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
return (error);
@@ -2157,7 +2158,8 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
case SIOCDELMULTI:
- if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_delmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
return (error);
commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5
blob - b3b0e18458d2d740c1f2b8b8c552e8f0b6c81ca9
file + sys/dev/pci/if_mcx.c
--- sys/dev/pci/if_mcx.c
+++ sys/dev/pci/if_mcx.c
@@ -7626,7 +7626,8 @@ mcx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
case SIOCADDMULTI:
- if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_addmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
break;
@@ -7664,7 +7665,8 @@ mcx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
case SIOCDELMULTI:
- if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) {
+ error = ether_delmulti(ifr, &sc->sc_ac);
+ if (error == ENETRESET) {
error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi);
if (error != 0)
break;
ether_addmulti/delmulti error handling fix