Skip to content

Commit a0cc3c1

Browse files
shemmingergregkh
authored andcommitted
hv_netvsc: propagate rx filters to VF
[ Upstream commit bee9d41 ] 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 <[email protected]> Signed-off-by: David S. Miller <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent ed85935 commit a0cc3c1

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

drivers/net/hyperv/netvsc_drv.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,36 @@ static int debug = -1;
6666
module_param(debug, int, S_IRUGO);
6767
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
6868

69-
static void netvsc_set_multicast_list(struct net_device *net)
69+
static void netvsc_change_rx_flags(struct net_device *net, int change)
7070
{
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+
}
7399

74100
rndis_filter_update(nvdev);
75101
}
@@ -1582,7 +1608,8 @@ static const struct net_device_ops device_ops = {
15821608
.ndo_open = netvsc_open,
15831609
.ndo_stop = netvsc_close,
15841610
.ndo_start_xmit = netvsc_start_xmit,
1585-
.ndo_set_rx_mode = netvsc_set_multicast_list,
1611+
.ndo_change_rx_flags = netvsc_change_rx_flags,
1612+
.ndo_set_rx_mode = netvsc_set_rx_mode,
15861613
.ndo_change_mtu = netvsc_change_mtu,
15871614
.ndo_validate_addr = eth_validate_addr,
15881615
.ndo_set_mac_address = netvsc_set_mac_addr,
@@ -1814,6 +1841,11 @@ static void __netvsc_vf_setup(struct net_device *ndev,
18141841
netdev_warn(vf_netdev,
18151842
"unable to change mtu to %u\n", ndev->mtu);
18161843

1844+
/* set multicast etc flags on VF */
1845+
dev_change_flags(vf_netdev, ndev->flags | IFF_SLAVE);
1846+
dev_uc_sync(vf_netdev, ndev);
1847+
dev_mc_sync(vf_netdev, ndev);
1848+
18171849
if (netif_running(ndev)) {
18181850
ret = dev_open(vf_netdev);
18191851
if (ret)

0 commit comments

Comments
 (0)