Sunday, January 7, 2018 1:05 PM, Moti Haimovsky > Subject: [dpdk-stable] [PATCH] net/mlx4: fix no broadcasts reception in > promisc > > This patch fixes the issue of mlx4 not receiving broadcast packets when > configured to work promiscuous mode. > > Fixes: eacaac7bae36 ("net/mlx4: restore promisc and allmulti support") > Cc: sta...@dpdk.org > > Signed-off-by: Moti Haimovsky <mo...@mellanox.com> > --- > drivers/net/mlx4/mlx4_flow.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c > index 69025da..ec13f5a 100644 > --- a/drivers/net/mlx4/mlx4_flow.c > +++ b/drivers/net/mlx4/mlx4_flow.c > @@ -1223,9 +1223,12 @@ struct mlx4_drop { > * > * Various flow rules are created depending on the mode the device is in: > * > - * 1. Promiscuous: port MAC + catch-all (VLAN filtering is ignored). > - * 2. All multicast: port MAC/VLAN + catch-all multicast. > - * 3. Otherwise: port MAC/VLAN + broadcast MAC/VLAN. > + * 1. Promiscuous: > + * port MAC + broadcast + catch-all (VLAN filtering is ignored). > + * 2. All multicast: > + * port MAC/VLAN + broadcast + catch-all multicast. > + * 3. Otherwise: > + * port MAC/VLAN + broadcast MAC/VLAN. > * > * About MAC flow rules: > * > @@ -1304,9 +1307,6 @@ struct mlx4_drop { > !priv->dev->data->promiscuous ? > &vlan_spec.tci : > NULL; > - int broadcast = > - !priv->dev->data->promiscuous && > - !priv->dev->data->all_multicast; > uint16_t vlan = 0; > struct rte_flow *flow; > unsigned int i; > @@ -1340,7 +1340,7 @@ struct mlx4_drop { > rule_vlan = NULL; > } > } > - for (i = 0; i != RTE_DIM(priv->mac) + broadcast; ++i) { > + for (i = 0; i != RTE_DIM(priv->mac) + 1; ++i) { > const struct ether_addr *mac; > > /* Broadcasts are handled by an extra iteration. */ @@ - > 1404,7 +1404,7 @@ struct mlx4_drop { > goto next_vlan; > } > /* Take care of promiscuous and all multicast flow rules. */ > - if (!broadcast) { > + if (priv->dev->data->promiscuous || priv->dev->data->all_multicast)
Please help me to understand the issue. The promisc and allmulti spec and mask contains the broadcast addresses. They are not received because of the ibv flow rule type (MC_DEFAULT / ALL_DEFAULT) ? > { > for (flow = LIST_FIRST(&priv->flows); > flow && flow->internal; > flow = LIST_NEXT(flow, next)) { > -- > 1.8.3.1