net/mlx5: create flow rule on Windows
[dpdk.git] / drivers / net / mlx5 / windows / mlx5_flow_os.c
index 0ade518..daf4e15 100644 (file)
@@ -134,10 +134,19 @@ int
 mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,
                                              void **action)
 {
-       RTE_SET_USED(tir);
-       *action = NULL;
-       rte_errno = ENOTSUP;
-       return -rte_errno;
+       struct mlx5_action *mlx5_action =
+               mlx5_malloc(MLX5_MEM_ZERO,
+                      sizeof(struct mlx5_action),
+                      0, SOCKET_ID_ANY);
+
+       if (!mlx5_action) {
+               rte_errno = ENOMEM;
+               return -rte_errno;
+       }
+       mlx5_action->type = MLX5_FLOW_CONTEXT_DEST_TYPE_TIR;
+       mlx5_action->dest_tir.id = tir->id;
+       *action = mlx5_action;
+       return 0;
 }
 
 /**
@@ -152,9 +161,8 @@ mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,
 int
 mlx5_flow_os_destroy_flow_action(void *action)
 {
-       RTE_SET_USED(action);
-       rte_errno = ENOTSUP;
-       return -rte_errno;
+       mlx5_free(action);
+       return 0;
 }
 
 /**
@@ -179,13 +187,41 @@ mlx5_flow_os_create_flow(void *matcher, void *match_value,
                         size_t num_actions,
                         void *actions[], void **flow)
 {
-       RTE_SET_USED(matcher);
-       RTE_SET_USED(match_value);
-       RTE_SET_USED(num_actions);
-       RTE_SET_USED(actions);
-       *flow = NULL;
-       rte_errno = ENOTSUP;
-       return -rte_errno;
+       struct mlx5_action *action;
+       int i;
+       struct mlx5_matcher *mlx5_matcher = matcher;
+       struct mlx5_flow_dv_match_params *mlx5_match_value = match_value;
+       uint32_t in[MLX5_ST_SZ_DW(devx_fs_rule_add_in)] = {0};
+       void *matcher_c = MLX5_ADDR_OF(devx_fs_rule_add_in, in,
+                                      match_criteria);
+       void *matcher_v = MLX5_ADDR_OF(devx_fs_rule_add_in, in,
+                                      match_value);
+
+       MLX5_ASSERT(mlx5_matcher->ctx);
+       memcpy(matcher_c, mlx5_matcher->match_buf,
+              mlx5_match_value->size);
+       /* Use mlx5_match_value->size for match criteria */
+       memcpy(matcher_v, mlx5_match_value->buf,
+              mlx5_match_value->size);
+       for (i = 0; i < num_actions; i++) {
+               action = actions[i];
+               switch (action->type) {
+               case MLX5_FLOW_CONTEXT_DEST_TYPE_TIR:
+                       MLX5_SET(devx_fs_rule_add_in, in,
+                                dest.destination_type,
+                                MLX5_FLOW_CONTEXT_DEST_TYPE_TIR);
+                       MLX5_SET(devx_fs_rule_add_in, in,
+                                dest.destination_id,
+                                action->dest_tir.id);
+                       break;
+               default:
+                       break;
+               }
+               MLX5_SET(devx_fs_rule_add_in, in, match_criteria_enable,
+                        MLX5_MATCH_OUTER_HEADERS);
+       }
+       *flow = mlx5_glue->devx_fs_rule_add(mlx5_matcher->ctx, in, sizeof(in));
+       return (*flow) ? 0 : -1;
 }
 
 /**
@@ -200,7 +236,5 @@ mlx5_flow_os_create_flow(void *matcher, void *match_value,
 int
 mlx5_flow_os_destroy_flow(void *drv_flow_ptr)
 {
-       RTE_SET_USED(dev_flow_ptr);
-       rte_errno = ENOTSUP;
-       return -rte_errno;
+       return mlx5_glue->devx_fs_rule_del(drv_flow_ptr);
 }