doc: remove reference to pcapng init function
[dpdk.git] / lib / ethdev / rte_flow.c
index 7ec7a95..2c35a2f 100644 (file)
@@ -1396,6 +1396,7 @@ rte_flow_flex_item_release(uint16_t port_id,
 int
 rte_flow_info_get(uint16_t port_id,
                  struct rte_flow_port_info *port_info,
+                 struct rte_flow_queue_info *queue_info,
                  struct rte_flow_error *error)
 {
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -1415,7 +1416,7 @@ rte_flow_info_get(uint16_t port_id,
        }
        if (likely(!!ops->info_get)) {
                return flow_err(port_id,
-                               ops->info_get(dev, port_info, error),
+                               ops->info_get(dev, port_info, queue_info, error),
                                error);
        }
        return rte_flow_error_set(error, ENOTSUP,
@@ -1426,6 +1427,8 @@ rte_flow_info_get(uint16_t port_id,
 int
 rte_flow_configure(uint16_t port_id,
                   const struct rte_flow_port_attr *port_attr,
+                  uint16_t nb_queue,
+                  const struct rte_flow_queue_attr *queue_attr[],
                   struct rte_flow_error *error)
 {
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -1450,8 +1453,12 @@ rte_flow_configure(uint16_t port_id,
                RTE_FLOW_LOG(ERR, "Port %"PRIu16" info is NULL.\n", port_id);
                return -EINVAL;
        }
+       if (queue_attr == NULL) {
+               RTE_FLOW_LOG(ERR, "Port %"PRIu16" queue info is NULL.\n", port_id);
+               return -EINVAL;
+       }
        if (likely(!!ops->configure)) {
-               ret = ops->configure(dev, port_attr, error);
+               ret = ops->configure(dev, port_attr, nb_queue, queue_attr, error);
                if (ret == 0)
                        dev->data->flow_configured = 1;
                return flow_err(port_id, ret, error);
@@ -1460,3 +1467,382 @@ rte_flow_configure(uint16_t port_id,
                                  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
                                  NULL, rte_strerror(ENOTSUP));
 }
+
+struct rte_flow_pattern_template *
+rte_flow_pattern_template_create(uint16_t port_id,
+               const struct rte_flow_pattern_template_attr *template_attr,
+               const struct rte_flow_item pattern[],
+               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow_pattern_template *template;
+
+       if (unlikely(!ops))
+               return NULL;
+       if (dev->data->flow_configured == 0) {
+               RTE_FLOW_LOG(INFO,
+                       "Flow engine on port_id=%"PRIu16" is not configured.\n",
+                       port_id);
+               rte_flow_error_set(error, EINVAL,
+                               RTE_FLOW_ERROR_TYPE_STATE,
+                               NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (template_attr == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" template attr is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (pattern == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" pattern is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (likely(!!ops->pattern_template_create)) {
+               template = ops->pattern_template_create(dev, template_attr,
+                                                       pattern, error);
+               if (template == NULL)
+                       flow_err(port_id, -rte_errno, error);
+               return template;
+       }
+       rte_flow_error_set(error, ENOTSUP,
+                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                          NULL, rte_strerror(ENOTSUP));
+       return NULL;
+}
+
+int
+rte_flow_pattern_template_destroy(uint16_t port_id,
+               struct rte_flow_pattern_template *pattern_template,
+               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops))
+               return -rte_errno;
+       if (unlikely(pattern_template == NULL))
+               return 0;
+       if (likely(!!ops->pattern_template_destroy)) {
+               return flow_err(port_id,
+                               ops->pattern_template_destroy(dev,
+                                                             pattern_template,
+                                                             error),
+                               error);
+       }
+       return rte_flow_error_set(error, ENOTSUP,
+                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                 NULL, rte_strerror(ENOTSUP));
+}
+
+struct rte_flow_actions_template *
+rte_flow_actions_template_create(uint16_t port_id,
+                       const struct rte_flow_actions_template_attr *template_attr,
+                       const struct rte_flow_action actions[],
+                       const struct rte_flow_action masks[],
+                       struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow_actions_template *template;
+
+       if (unlikely(!ops))
+               return NULL;
+       if (dev->data->flow_configured == 0) {
+               RTE_FLOW_LOG(INFO,
+                       "Flow engine on port_id=%"PRIu16" is not configured.\n",
+                       port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_STATE,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (template_attr == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" template attr is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (actions == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" actions is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (masks == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" masks is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+
+       }
+       if (likely(!!ops->actions_template_create)) {
+               template = ops->actions_template_create(dev, template_attr,
+                                                       actions, masks, error);
+               if (template == NULL)
+                       flow_err(port_id, -rte_errno, error);
+               return template;
+       }
+       rte_flow_error_set(error, ENOTSUP,
+                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                          NULL, rte_strerror(ENOTSUP));
+       return NULL;
+}
+
+int
+rte_flow_actions_template_destroy(uint16_t port_id,
+                       struct rte_flow_actions_template *actions_template,
+                       struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops))
+               return -rte_errno;
+       if (unlikely(actions_template == NULL))
+               return 0;
+       if (likely(!!ops->actions_template_destroy)) {
+               return flow_err(port_id,
+                               ops->actions_template_destroy(dev,
+                                                             actions_template,
+                                                             error),
+                               error);
+       }
+       return rte_flow_error_set(error, ENOTSUP,
+                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                 NULL, rte_strerror(ENOTSUP));
+}
+
+struct rte_flow_template_table *
+rte_flow_template_table_create(uint16_t port_id,
+                       const struct rte_flow_template_table_attr *table_attr,
+                       struct rte_flow_pattern_template *pattern_templates[],
+                       uint8_t nb_pattern_templates,
+                       struct rte_flow_actions_template *actions_templates[],
+                       uint8_t nb_actions_templates,
+                       struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow_template_table *table;
+
+       if (unlikely(!ops))
+               return NULL;
+       if (dev->data->flow_configured == 0) {
+               RTE_FLOW_LOG(INFO,
+                       "Flow engine on port_id=%"PRIu16" is not configured.\n",
+                       port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_STATE,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (table_attr == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" table attr is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (pattern_templates == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" pattern templates is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (actions_templates == NULL) {
+               RTE_FLOW_LOG(ERR,
+                            "Port %"PRIu16" actions templates is NULL.\n",
+                            port_id);
+               rte_flow_error_set(error, EINVAL,
+                                  RTE_FLOW_ERROR_TYPE_ATTR,
+                                  NULL, rte_strerror(EINVAL));
+               return NULL;
+       }
+       if (likely(!!ops->template_table_create)) {
+               table = ops->template_table_create(dev, table_attr,
+                                       pattern_templates, nb_pattern_templates,
+                                       actions_templates, nb_actions_templates,
+                                       error);
+               if (table == NULL)
+                       flow_err(port_id, -rte_errno, error);
+               return table;
+       }
+       rte_flow_error_set(error, ENOTSUP,
+                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                          NULL, rte_strerror(ENOTSUP));
+       return NULL;
+}
+
+int
+rte_flow_template_table_destroy(uint16_t port_id,
+                               struct rte_flow_template_table *template_table,
+                               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops))
+               return -rte_errno;
+       if (unlikely(template_table == NULL))
+               return 0;
+       if (likely(!!ops->template_table_destroy)) {
+               return flow_err(port_id,
+                               ops->template_table_destroy(dev,
+                                                           template_table,
+                                                           error),
+                               error);
+       }
+       return rte_flow_error_set(error, ENOTSUP,
+                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                 NULL, rte_strerror(ENOTSUP));
+}
+
+struct rte_flow *
+rte_flow_async_create(uint16_t port_id,
+                     uint32_t queue_id,
+                     const struct rte_flow_op_attr *op_attr,
+                     struct rte_flow_template_table *template_table,
+                     const struct rte_flow_item pattern[],
+                     uint8_t pattern_template_index,
+                     const struct rte_flow_action actions[],
+                     uint8_t actions_template_index,
+                     void *user_data,
+                     struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow *flow;
+
+       flow = ops->async_create(dev, queue_id,
+                                op_attr, template_table,
+                                pattern, pattern_template_index,
+                                actions, actions_template_index,
+                                user_data, error);
+       if (flow == NULL)
+               flow_err(port_id, -rte_errno, error);
+       return flow;
+}
+
+int
+rte_flow_async_destroy(uint16_t port_id,
+                      uint32_t queue_id,
+                      const struct rte_flow_op_attr *op_attr,
+                      struct rte_flow *flow,
+                      void *user_data,
+                      struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       return flow_err(port_id,
+                       ops->async_destroy(dev, queue_id,
+                                          op_attr, flow,
+                                          user_data, error),
+                       error);
+}
+
+int
+rte_flow_push(uint16_t port_id,
+             uint32_t queue_id,
+             struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       return flow_err(port_id,
+                       ops->push(dev, queue_id, error),
+                       error);
+}
+
+int
+rte_flow_pull(uint16_t port_id,
+             uint32_t queue_id,
+             struct rte_flow_op_result res[],
+             uint16_t n_res,
+             struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       int ret;
+
+       ret = ops->pull(dev, queue_id, res, n_res, error);
+       return ret ? ret : flow_err(port_id, ret, error);
+}
+
+struct rte_flow_action_handle *
+rte_flow_async_action_handle_create(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               const struct rte_flow_indir_action_conf *indir_action_conf,
+               const struct rte_flow_action *action,
+               void *user_data,
+               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow_action_handle *handle;
+
+       handle = ops->async_action_handle_create(dev, queue_id, op_attr,
+                                            indir_action_conf, action, user_data, error);
+       if (handle == NULL)
+               flow_err(port_id, -rte_errno, error);
+       return handle;
+}
+
+int
+rte_flow_async_action_handle_destroy(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               struct rte_flow_action_handle *action_handle,
+               void *user_data,
+               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       int ret;
+
+       ret = ops->async_action_handle_destroy(dev, queue_id, op_attr,
+                                          action_handle, user_data, error);
+       return flow_err(port_id, ret, error);
+}
+
+int
+rte_flow_async_action_handle_update(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               struct rte_flow_action_handle *action_handle,
+               const void *update,
+               void *user_data,
+               struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       int ret;
+
+       ret = ops->async_action_handle_update(dev, queue_id, op_attr,
+                                         action_handle, update, user_data, error);
+       return flow_err(port_id, ret, error);
+}