• Maxim Mikityanskiy's avatar
    ethtool: Fix preserving of wanted feature bits in netlink interface · 840110a4
    Maxim Mikityanskiy authored
    Currently, ethtool-netlink calculates new wanted bits as:
    (req_wanted & req_mask) | (old_active & ~req_mask)
    
    It completely discards the old wanted bits, so they are forgotten with
    the next ethtool command. Sample steps to reproduce:
    
    1. ethtool -k eth0
       tx-tcp-segmentation: on # TSO is on from the beginning
    2. ethtool -K eth0 tx off
       tx-tcp-segmentation: off [not requested]
    3. ethtool -k eth0
       tx-tcp-segmentation: off [requested on]
    4. ethtool -K eth0 rx off # Some change unrelated to TSO
    5. ethtool -k eth0
       tx-tcp-segmentation: off # "Wanted on" is forgotten
    
    This commit fixes it by changing the formula to:
    (req_wanted & req_mask) | (old_wanted & ~req_mask),
    where old_active was replaced by old_wanted to account for the wanted
    bits.
    
    The shortcut condition for the case where nothing was changed now
    compares wanted bitmasks, instead of wanted to active.
    
    Fixes: 0980bfcd ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: default avatarMaxim Mikityanskiy <maximmi@mellanox.com>
    Reviewed-by: default avatarMichal Kubecek <mkubecek@suse.cz>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    840110a4
features.c 9.52 KB