Skip to content

Commit

Permalink
net/bonding: fix dropping valid MAC packets
Browse files Browse the repository at this point in the history
[ upstream commit 30bfba5 ]

Currently, by default, bond4 will first try to enable allmulti and
then enable promiscuous if fail to enable allmulti. On reception,
whether unicast and multicast packets should be dropped depends on
which mode has been enabled on the bonding interface.

In fact, if MAC address of packets in mac_addrs array of bonding
interface, these packets should not be dropped. However, now only
check the default MAC address, which will cause the packets with
MAC added by the '.mac_addr_add' are dropped.

Fixes: 68218b8 ("net/bonding: prefer allmulti to promiscuous for LACP")

Signed-off-by: Huisong Li <lihuisong@huawei.com>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
  • Loading branch information
LiHuiSong1 authored and kevintraynor committed Nov 23, 2022
1 parent 185674e commit 194dea7
Showing 1 changed file with 25 additions and 8 deletions.
33 changes: 25 additions & 8 deletions drivers/net/bonding/rte_eth_bond_pmd.c
Expand Up @@ -271,6 +271,24 @@ bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port) {
return 0;
}

static bool
is_bond_mac_addr(const struct rte_ether_addr *ea,
const struct rte_ether_addr *mac_addrs, uint32_t max_mac_addrs)
{
uint32_t i;

for (i = 0; i < max_mac_addrs; i++) {
/* skip zero address */
if (rte_is_zero_ether_addr(&mac_addrs[i]))
continue;

if (rte_is_same_ether_addr(ea, &mac_addrs[i]))
return true;
}

return false;
}

static inline uint16_t
rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
bool dedicated_rxq)
Expand Down Expand Up @@ -331,8 +349,9 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
/* Remove packet from array if:
* - it is slow packet but no dedicated rxq is present,
* - slave is not in collecting state,
* - bonding interface is not in promiscuous mode:
* - packet is unicast and address does not match,
* - bonding interface is not in promiscuous mode and
* packet address isn't in mac_addrs array:
* - packet is unicast,
* - packet is multicast and bonding interface
* is not in allmulti,
*/
Expand All @@ -342,12 +361,10 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
bufs[j])) ||
!collecting ||
(!promisc &&
((rte_is_unicast_ether_addr(&hdr->dst_addr) &&
!rte_is_same_ether_addr(bond_mac,
&hdr->dst_addr)) ||
(!allmulti &&
rte_is_multicast_ether_addr(&hdr->dst_addr)))))) {

!is_bond_mac_addr(&hdr->dst_addr, bond_mac,
BOND_MAX_MAC_ADDRS) &&
(rte_is_unicast_ether_addr(&hdr->dst_addr) ||
!allmulti)))) {
if (hdr->ether_type == ether_type_slow_be) {
bond_mode_8023ad_handle_slow_pkt(
internals, slaves[idx], bufs[j]);
Expand Down

0 comments on commit 194dea7

Please sign in to comment.