A handler for ioctl(SIOCSIFCAP) should not alter a bit in

if_capenable unless the interface driver is actually able
to toggle the respective capability on and off.

Reviewed by:	ru
This commit is contained in:
Yaroslav Tykhiy 2004-05-23 21:05:08 +00:00
parent a5820ecb77
commit 25fbb2c38c
8 changed files with 17 additions and 8 deletions

View file

@ -3708,7 +3708,8 @@ dc_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
#endif
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);

View file

@ -2496,7 +2496,8 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:

View file

@ -2167,7 +2167,8 @@ nge_ioctl(ifp, command, data)
}
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);

View file

@ -2315,7 +2315,9 @@ re_ioctl(ifp, command, data)
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~(IFCAP_HWCSUM | IFCAP_POLLING);
ifp->if_capenable |=
ifr->ifr_reqcap & (IFCAP_HWCSUM | IFCAP_POLLING);
if (ifp->if_capenable & IFCAP_TXCSUM)
ifp->if_hwassist = RE_CSUM_FEATURES;
else

View file

@ -3708,7 +3708,8 @@ dc_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
#endif
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);

View file

@ -1830,7 +1830,8 @@ rl_ioctl(ifp, command, data)
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);

View file

@ -2340,7 +2340,8 @@ sis_ioctl(ifp, command, data)
SIS_UNLOCK(sc);
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);

View file

@ -1555,7 +1555,8 @@ ste_ioctl(ifp, command, data)
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
break;
case SIOCSIFCAP:
ifp->if_capenable = ifr->ifr_reqcap;
ifp->if_capenable &= ~IFCAP_POLLING;
ifp->if_capenable |= ifr->ifr_reqcap & IFCAP_POLLING;
break;
default:
error = ether_ioctl(ifp, command, data);