Hi Olivier, > -----Original Message----- > From: Olivier Matz <olivier.m...@6wind.com> > Sent: Thursday, September 29, 2022 8:22 PM > To: dev@dpdk.org > Cc: Yang, Qiming <qiming.y...@intel.com>; Wu, Wenjun1 > <wenjun1...@intel.com>; Zhao1, Wei <wei.zh...@intel.com> > Subject: [PATCH] net/ixgbevf: fix promiscuous and allmulti > > The configuration of allmulti and promiscuous modes conflicts together. For > instance, if we enable promiscuous mode, then enable and disable allmulti, > then the promiscuous mode is wrongly disabled. > > Fix this behavior by: > - doing nothing when we set/unset allmulti if promiscuous mode is on > - restorting the proper mode (none or allmulti) when we disable > promiscuous mode > > Fixes: 1f4564ed7696 ("net/ixgbevf: enable promiscuous mode") > > Signed-off-by: Olivier Matz <olivier.m...@6wind.com> > --- > > Hi, > > For reference, this was tested with this plan: > > echo 8 > "/sys/bus/pci/devices/0000:01:00.1/sriov_numvfs" > ip link set dev eno2 up > ip link set dev eno2 promisc on > bridge link set dev eno2 hwmode veb > ip link set dev eno2 mtu 9000 > > ip link set dev eno2 vf 0 mac ac:1f:6b:fe:ba:b0 ip link set dev eno2 vf 0 > spoofchk off ip link set dev eno2 vf 0 trust on > > ip link set dev eno2 vf 1 mac ac:1f:6b:fe:ba:b1 ip link set dev eno2 vf 1 > spoofchk off ip link set dev eno2 vf 1 trust on > > python3 usertools/dpdk-devbind.py -s > python3 usertools/dpdk-devbind.py -b vfio-pci 0000:01:10.1 # vf 0 > python3 usertools/dpdk-devbind.py -b ixgbevf 0000:01:10.3 # vf 1 > > > # in another terminal > scapy > while True: > sendp(Ether(dst='ac:1f:6b:00:00:00'), iface='eno2v1') # wrong mac > sendp(Ether(dst='ac:1f:6b:fe:ba:b0'), iface='eno2v1') # correct mac > time.sleep(1) > > > ./build/app/dpdk-testpmd -l 1,2 -a 0000:01:10.1 -- -i --total-num- > mbufs=32768 show port info all set fwd rxonly set verbose 1 set promisc all > off set allmulti all off start > > # ok, only packets to dst='ac:1f:6b:fe:ba:b0' are received > > > # ok, both packets are received > set promisc all on > > > # nok, only packets to dst='ac:1f:6b:fe:ba:b0' are received set allmulti all > on > set allmulti all off > > > drivers/net/ixgbe/ixgbe_ethdev.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c > b/drivers/net/ixgbe/ixgbe_ethdev.c > index 8cec951d94..cc8383c5a9 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.c > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c > @@ -7785,9 +7785,13 @@ static int > ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev) { > struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data- > >dev_private); > + int mode = IXGBEVF_XCAST_MODE_NONE; > int ret; > > - switch (hw->mac.ops.update_xcast_mode(hw, > IXGBEVF_XCAST_MODE_NONE)) { > + if (dev->data->all_multicast) > + mode = IXGBEVF_XCAST_MODE_ALLMULTI; > + > + switch (hw->mac.ops.update_xcast_mode(hw, mode)) { > case IXGBE_SUCCESS: > ret = 0; > break; > @@ -7809,6 +7813,9 @@ ixgbevf_dev_allmulticast_enable(struct > rte_eth_dev *dev) > int ret; > int mode = IXGBEVF_XCAST_MODE_ALLMULTI; > > + if (dev->data->promiscuous) > + return 0; > + > switch (hw->mac.ops.update_xcast_mode(hw, mode)) { > case IXGBE_SUCCESS: > ret = 0; > @@ -7830,6 +7837,9 @@ ixgbevf_dev_allmulticast_disable(struct > rte_eth_dev *dev) > struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data- > >dev_private); > int ret; > > + if (dev->data->promiscuous) > + return 0; > +
It seems that we cannot actually turn off allmulticast mode when promiscuous mode is enabled, so can we return error and add a log message here as a reminder? Thanks, Wenjun > switch (hw->mac.ops.update_xcast_mode(hw, > IXGBEVF_XCAST_MODE_MULTI)) { > case IXGBE_SUCCESS: > ret = 0; > -- > 2.30.2