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

Don Lewis <truck...@freebsd.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |truck...@freebsd.org

--- Comment #1 from Don Lewis <truck...@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.
_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to