[dpdk-dev] [PATCH v2 6/7] net/mlx5: fix reception when VLAN is added
Yongseok Koh
yskoh at mellanox.com
Mon Oct 23 21:25:45 CEST 2017
On Mon, Oct 23, 2017 at 04:49:56PM +0200, Nelio Laranjeiro wrote:
> @@ -261,75 +284,59 @@ priv_dev_traffic_enable(struct priv *priv, struct rte_eth_dev *dev)
> };
>
> claim_zero(mlx5_ctrl_flow(dev, &promisc, &promisc));
> - } else if (dev->data->all_multicast) {
> + return 0;
> + }
> + if (dev->data->all_multicast) {
> struct rte_flow_item_eth multicast = {
> .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00",
> - .src.addr_bytes = "\x01\x00\x00\x00\x00\x00",
> + .src.addr_bytes = "\x00\x00\x00\x00\x00\x00",
> .type = 0,
> };
>
> claim_zero(mlx5_ctrl_flow(dev, &multicast, &multicast));
Just curious. No need to consider VLAN for multicast here?
> - } else {
> - struct rte_flow_item_eth bcast = {
> - .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
> - };
> - struct rte_flow_item_eth ipv6_multi_spec = {
> - .dst.addr_bytes = "\x33\x33\x00\x00\x00\x00",
> - };
> - struct rte_flow_item_eth ipv6_multi_mask = {
> - .dst.addr_bytes = "\xff\xff\x00\x00\x00\x00",
> - };
> - struct rte_flow_item_eth unicast = {
> - .src.addr_bytes = "\x00\x00\x00\x00\x00\x00",
> - };
> - struct rte_flow_item_eth unicast_mask = {
> - .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
> - };
> - const unsigned int vlan_filter_n = priv->vlan_filter_n;
> - const struct ether_addr cmp = {
> - .addr_bytes = "\x00\x00\x00\x00\x00\x00",
> - };
> - unsigned int i;
> - unsigned int j;
> - unsigned int unicast_flow = 0;
> - int ret;
> -
> - for (i = 0; i != MLX5_MAX_MAC_ADDRESSES; ++i) {
> - struct ether_addr *mac = &dev->data->mac_addrs[i];
> + }
> + for (i = 0; i != MLX5_MAX_MAC_ADDRESSES; ++i) {
> + struct ether_addr *mac = &dev->data->mac_addrs[i];
>
> - if (!memcmp(mac, &cmp, sizeof(*mac)))
> - continue;
> - memcpy(&unicast.dst.addr_bytes,
> - mac->addr_bytes,
> - ETHER_ADDR_LEN);
> - for (j = 0; j != vlan_filter_n; ++j) {
> - uint16_t vlan = priv->vlan_filter[j];
> + if (!memcmp(mac, &cmp, sizeof(*mac)))
> + continue;
> + memcpy(&unicast.dst.addr_bytes,
> + mac->addr_bytes,
> + ETHER_ADDR_LEN);
> + for (j = 0; j != vlan_filter_n; ++j) {
> + uint16_t vlan = priv->vlan_filter[j];
>
> - struct rte_flow_item_vlan vlan_spec = {
> - .tci = rte_cpu_to_be_16(vlan),
> - };
> - struct rte_flow_item_vlan vlan_mask = {
> - .tci = 0xffff,
> - };
> + struct rte_flow_item_vlan vlan_spec = {
> + .tci = rte_cpu_to_be_16(vlan),
> + };
> + struct rte_flow_item_vlan vlan_mask = {
> + .tci = 0xffff,
> + };
>
> - ret = mlx5_ctrl_flow_vlan(dev, &unicast,
> - &unicast_mask,
> - &vlan_spec,
> - &vlan_mask);
> - if (ret)
> - goto error;
> - unicast_flow = 1;
> - }
> - if (!vlan_filter_n) {
> - ret = mlx5_ctrl_flow(dev, &unicast,
> - &unicast_mask);
> - if (ret)
> - goto error;
> - unicast_flow = 1;
> - }
> + ret = mlx5_ctrl_flow_vlan(dev, &unicast,
> + &unicast_mask,
> + &vlan_spec,
> + &vlan_mask);
> + if (ret)
> + goto error;
> + ret = mlx5_ctrl_flow_vlan(dev, &bcast, &bcast,
> + &vlan_spec, &vlan_mask);
> + if (ret)
> + goto error;
> + ret = mlx5_ctrl_flow_vlan(dev, &ipv6_multi_spec,
> + &ipv6_multi_mask,
> + &vlan_spec, &vlan_mask);
These (bcast and ipv6_multi_mask) can be duplicated multiple times if there are
multiple MAC addrs, is that intended?
Thanks,
Yongseok
More information about the dev
mailing list