[Bug 205264] XOR logic error in ixgb(4)

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Dec 12 21:35:25 UTC 2015


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=205264

Don Lewis <truckman at FreeBSD.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |truckman at FreeBSD.org

--- Comment #1 from Don Lewis <truckman at FreeBSD.org> ---
IFCAP_HWCSUM is defined as (IFCAP_RXCSUM | IFCAP_TXCSUM), so this code:

    case SIOCSIFCAP:
        IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
        mask = ifr->ifr_reqcap ^ ifp->if_capenable;
        [snip]
        if (mask & IFCAP_HWCSUM) {
            if (IFCAP_HWCSUM & ifp->if_capenable)
                ifp->if_capenable &= ~IFCAP_HWCSUM;
            else
                ifp->if_capenable |= IFCAP_HWCSUM;
            if (ifp->if_drv_flags & IFF_DRV_RUNNING)
                ixgb_init(adapter);
        }

will set both bits even if the request only specifies one bit, and it
will clear both bits even if the request only wants to clear one bit.

Replacing the inner if/else block with this should fix the problem:

            ifp->if_capenable ^= (mask & IFCAP_HWCSUM);

or alternatively:

            ifp->if_capenable = (ifr->ifr_reqcap & IFCAP_HWCSUM) |
                (ifp->if_capenable & ~IFCAP_HWCSUM);

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-net mailing list