]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx4: expose support for flow rule priorities
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Thu, 12 Oct 2017 12:19:19 +0000 (14:19 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 13 Oct 2017 00:18:47 +0000 (01:18 +0100)
This PMD supports up to 4096 flow rule priority levels (0 to 4095).

Applications were not allowed to use them until now due to overlaps with
the default flows (e.g. MAC address, promiscuous mode).

This is not an issue in isolated mode when such flows do not exist.

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
drivers/net/mlx4/mlx4_flow.c
drivers/net/mlx4/mlx4_flow.h
drivers/net/mlx4/mlx4_utils.h

index 018843bda909a8d78aebae651380975abb93ec52..730249b9fac659c5b36a7a9b4e42c71a7ce198b1 100644 (file)
@@ -597,8 +597,8 @@ mlx4_flow_prepare(struct priv *priv,
                .queue = 0,
                .drop = 0,
        };
+       uint32_t priority_override = 0;
 
-       (void)priv;
        if (attr->group) {
                rte_flow_error_set(error, ENOTSUP,
                                   RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
@@ -606,11 +606,22 @@ mlx4_flow_prepare(struct priv *priv,
                                   "groups are not supported");
                return -rte_errno;
        }
-       if (attr->priority) {
+       if (priv->isolated) {
+               priority_override = attr->priority;
+       } else if (attr->priority) {
                rte_flow_error_set(error, ENOTSUP,
                                   RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
                                   NULL,
-                                  "priorities are not supported");
+                                  "priorities are not supported outside"
+                                  " isolated mode");
+               return -rte_errno;
+       }
+       if (attr->priority > MLX4_FLOW_PRIORITY_LAST) {
+               rte_flow_error_set(error, ENOTSUP,
+                                  RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
+                                  NULL,
+                                  "maximum priority level is "
+                                  MLX4_STR_EXPAND(MLX4_FLOW_PRIORITY_LAST));
                return -rte_errno;
        }
        if (attr->egress) {
@@ -680,6 +691,9 @@ mlx4_flow_prepare(struct priv *priv,
                }
                flow->offset += cur_item->dst_sz;
        }
+       /* Use specified priority level when in isolated mode. */
+       if (priv->isolated && flow->ibv_attr)
+               flow->ibv_attr->priority = priority_override;
        /* Go over actions list */
        for (; actions->type != RTE_FLOW_ACTION_TYPE_END; ++actions) {
                if (actions->type == RTE_FLOW_ACTION_TYPE_VOID) {
index 459030c60ccea436087d14b2cfbfab8ffb1f35df..8ac09f1350fa12b4268cb7e206970f0f0d14735c 100644 (file)
@@ -52,6 +52,9 @@
 #include <rte_flow_driver.h>
 #include <rte_byteorder.h>
 
+/** Last and lowest priority level for a flow rule. */
+#define MLX4_FLOW_PRIORITY_LAST UINT32_C(0xfff)
+
 /** PMD-specific (mlx4) definition of a flow rule handle. */
 struct rte_flow {
        LIST_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
index b9c02d59b1fb7655d90afdeaeebb817ab412f7b0..13f731a0db3f4ff590ba0171bf682f781bf08711 100644 (file)
@@ -104,6 +104,12 @@ pmd_drv_log_basename(const char *s)
        \
        snprintf(name, sizeof(name), __VA_ARGS__)
 
+/** Generate a string out of the provided arguments. */
+#define MLX4_STR(...) # __VA_ARGS__
+
+/** Similar to MLX4_STR() with enclosed macros expanded first. */
+#define MLX4_STR_EXPAND(...) MLX4_STR(__VA_ARGS__)
+
 /* mlx4_utils.c */
 
 int mlx4_fd_set_non_blocking(int fd);