Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hv_netvsc: propagate rx filters to VF

The netvsc device should propagate filters to the SR-IOV VF
device (if present). The flags also need to be propagated to the
VF device as well. This only really matters on local Hyper-V
since Azure does not support multiple addresses.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Stephen Hemminger and committed by
David S. Miller
bee9d41b 009f766c

+36 -4
+36 -4
drivers/net/hyperv/netvsc_drv.c
··· 66 66 module_param(debug, int, S_IRUGO); 67 67 MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); 68 68 69 - static void netvsc_set_multicast_list(struct net_device *net) 69 + static void netvsc_change_rx_flags(struct net_device *net, int change) 70 70 { 71 - struct net_device_context *net_device_ctx = netdev_priv(net); 72 - struct netvsc_device *nvdev = rtnl_dereference(net_device_ctx->nvdev); 71 + struct net_device_context *ndev_ctx = netdev_priv(net); 72 + struct net_device *vf_netdev = rtnl_dereference(ndev_ctx->vf_netdev); 73 + int inc; 74 + 75 + if (!vf_netdev) 76 + return; 77 + 78 + if (change & IFF_PROMISC) { 79 + inc = (net->flags & IFF_PROMISC) ? 1 : -1; 80 + dev_set_promiscuity(vf_netdev, inc); 81 + } 82 + 83 + if (change & IFF_ALLMULTI) { 84 + inc = (net->flags & IFF_ALLMULTI) ? 1 : -1; 85 + dev_set_allmulti(vf_netdev, inc); 86 + } 87 + } 88 + 89 + static void netvsc_set_rx_mode(struct net_device *net) 90 + { 91 + struct net_device_context *ndev_ctx = netdev_priv(net); 92 + struct net_device *vf_netdev = rtnl_dereference(ndev_ctx->vf_netdev); 93 + struct netvsc_device *nvdev = rtnl_dereference(ndev_ctx->nvdev); 94 + 95 + if (vf_netdev) { 96 + dev_uc_sync(vf_netdev, net); 97 + dev_mc_sync(vf_netdev, net); 98 + } 73 99 74 100 rndis_filter_update(nvdev); 75 101 } ··· 1612 1586 .ndo_open = netvsc_open, 1613 1587 .ndo_stop = netvsc_close, 1614 1588 .ndo_start_xmit = netvsc_start_xmit, 1615 - .ndo_set_rx_mode = netvsc_set_multicast_list, 1589 + .ndo_change_rx_flags = netvsc_change_rx_flags, 1590 + .ndo_set_rx_mode = netvsc_set_rx_mode, 1616 1591 .ndo_change_mtu = netvsc_change_mtu, 1617 1592 .ndo_validate_addr = eth_validate_addr, 1618 1593 .ndo_set_mac_address = netvsc_set_mac_addr, ··· 1843 1816 if (ret) 1844 1817 netdev_warn(vf_netdev, 1845 1818 "unable to change mtu to %u\n", ndev->mtu); 1819 + 1820 + /* set multicast etc flags on VF */ 1821 + dev_change_flags(vf_netdev, ndev->flags | IFF_SLAVE); 1822 + dev_uc_sync(vf_netdev, ndev); 1823 + dev_mc_sync(vf_netdev, ndev); 1846 1824 1847 1825 if (netif_running(ndev)) { 1848 1826 ret = dev_open(vf_netdev);