net/mlx5: improve flow item IP validation
[dpdk.git] / drivers / net / mlx5 / mlx5_flow_verbs.c
index fd27f6c..147436d 100644 (file)
@@ -1037,6 +1037,7 @@ flow_verbs_validate(struct rte_eth_dev *dev,
        uint64_t item_flags = 0;
        uint64_t last_item = 0;
        uint8_t next_protocol = 0xff;
+       uint16_t ether_type = 0;
 
        if (items == NULL)
                return -1;
@@ -1057,6 +1058,17 @@ flow_verbs_validate(struct rte_eth_dev *dev,
                                return ret;
                        last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
                                             MLX5_FLOW_LAYER_OUTER_L2;
+                       if (items->mask != NULL && items->spec != NULL) {
+                               ether_type =
+                                       ((const struct rte_flow_item_eth *)
+                                        items->spec)->type;
+                               ether_type &=
+                                       ((const struct rte_flow_item_eth *)
+                                        items->mask)->type;
+                               ether_type = rte_be_to_cpu_16(ether_type);
+                       } else {
+                               ether_type = 0;
+                       }
                        break;
                case RTE_FLOW_ITEM_TYPE_VLAN:
                        ret = mlx5_flow_validate_item_vlan(items, item_flags,
@@ -1067,10 +1079,23 @@ flow_verbs_validate(struct rte_eth_dev *dev,
                                              MLX5_FLOW_LAYER_INNER_VLAN) :
                                             (MLX5_FLOW_LAYER_OUTER_L2 |
                                              MLX5_FLOW_LAYER_OUTER_VLAN);
+                       if (items->mask != NULL && items->spec != NULL) {
+                               ether_type =
+                                       ((const struct rte_flow_item_vlan *)
+                                        items->spec)->inner_type;
+                               ether_type &=
+                                       ((const struct rte_flow_item_vlan *)
+                                        items->mask)->inner_type;
+                               ether_type = rte_be_to_cpu_16(ether_type);
+                       } else {
+                               ether_type = 0;
+                       }
                        break;
                case RTE_FLOW_ITEM_TYPE_IPV4:
                        ret = mlx5_flow_validate_item_ipv4(items, item_flags,
-                                                          NULL, error);
+                                                          last_item,
+                                                          ether_type, NULL,
+                                                          error);
                        if (ret < 0)
                                return ret;
                        last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
@@ -1091,7 +1116,9 @@ flow_verbs_validate(struct rte_eth_dev *dev,
                        break;
                case RTE_FLOW_ITEM_TYPE_IPV6:
                        ret = mlx5_flow_validate_item_ipv6(items, item_flags,
-                                                          NULL, error);
+                                                          last_item,
+                                                          ether_type, NULL,
+                                                          error);
                        if (ret < 0)
                                return ret;
                        last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :