},
};
struct ibv_flow *flow;
- struct mlx5_hrxq *drop = mlx5_drop_action_create(dev);
+ struct mlx5_hrxq *drop = priv->drop_queue.hrxq;
uint16_t vprio[] = { 8, 16 };
int i;
int priority = 0;
- if (!drop) {
+ if (!drop->qp) {
rte_errno = ENOTSUP;
return -rte_errno;
}
claim_zero(mlx5_glue->destroy_flow(flow));
priority = vprio[i];
}
- mlx5_drop_action_destroy(dev);
switch (priority) {
case 8:
priority = RTE_DIM(priority_map_3);
uint64_t last_item = 0;
uint8_t next_protocol = 0xff;
uint16_t ether_type = 0;
- char errstr[32];
if (items == NULL)
return -1;
return ret;
last_item = MLX5_FLOW_LAYER_MPLS;
break;
+ case RTE_FLOW_ITEM_TYPE_ICMP:
+ case RTE_FLOW_ITEM_TYPE_ICMP6:
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ NULL, "ICMP/ICMP6 "
+ "item not supported");
default:
- snprintf(errstr, sizeof(errstr), "item type %d not supported",
- items->type);
return rte_flow_error_set(error, ENOTSUP,
RTE_FLOW_ERROR_TYPE_ITEM,
- NULL, errstr);
+ NULL, "item not supported");
}
item_flags |= last_item;
}
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();
struct mlx5_flow_rss_desc *rss_desc;
- char errstr[32];
MLX5_ASSERT(wks);
- rss_desc = &wks->rss_desc[!!wks->flow_nested_idx];
+ rss_desc = &wks->rss_desc;
if (priority == MLX5_FLOW_PRIO_RSVD)
priority = priv->config.flow_prio - 1;
for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
item_flags |= MLX5_FLOW_LAYER_MPLS;
break;
default:
- snprintf(errstr, sizeof(errstr), "item type %d not supported",
- items->type);
return rte_flow_error_set(error, ENOTSUP,
RTE_FLOW_ERROR_TYPE_ITEM,
- NULL, errstr);
+ NULL, "item not supported");
}
}
dev_flow->handle->layers = item_flags;
handle->drv_flow = NULL;
}
/* hrxq is union, don't touch it only the flag is set. */
- if (handle->rix_hrxq) {
- if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- mlx5_drop_action_destroy(dev);
- handle->rix_hrxq = 0;
- } else if (handle->fate_action ==
- MLX5_FLOW_FATE_QUEUE) {
- mlx5_hrxq_release(dev, handle->rix_hrxq);
- handle->rix_hrxq = 0;
- }
+ if (handle->rix_hrxq &&
+ handle->fate_action == MLX5_FLOW_FATE_QUEUE) {
+ mlx5_hrxq_release(dev, handle->rix_hrxq);
+ handle->rix_hrxq = 0;
}
if (handle->vf_vlan.tag && handle->vf_vlan.created)
mlx5_vlan_vmwa_release(dev, &handle->vf_vlan);
struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();
MLX5_ASSERT(wks);
- for (idx = wks->flow_idx - 1; idx >= wks->flow_nested_idx; idx--) {
+ for (idx = wks->flow_idx - 1; idx >= 0; idx--) {
dev_flow = &wks->flows[idx];
handle = dev_flow->handle;
if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- hrxq = mlx5_drop_action_create(dev);
- if (!hrxq) {
- rte_flow_error_set
- (error, errno,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
- "cannot get drop hash queue");
- goto error;
- }
+ MLX5_ASSERT(priv->drop_queue.hrxq);
+ hrxq = priv->drop_queue.hrxq;
} else {
uint32_t hrxq_idx;
- struct mlx5_flow_rss_desc *rss_desc =
- &wks->rss_desc[!!wks->flow_nested_idx];
+ struct mlx5_flow_rss_desc *rss_desc = &wks->rss_desc;
MLX5_ASSERT(rss_desc->queue_num);
- hrxq_idx = mlx5_hrxq_get(dev, rss_desc->key,
- MLX5_RSS_HASH_KEY_LEN,
- dev_flow->hash_fields,
- rss_desc->queue,
- rss_desc->queue_num);
- if (!hrxq_idx)
- hrxq_idx = mlx5_hrxq_new
- (dev, rss_desc->key,
- MLX5_RSS_HASH_KEY_LEN,
- dev_flow->hash_fields,
- rss_desc->queue,
- rss_desc->queue_num,
- !!(handle->layers &
- MLX5_FLOW_LAYER_TUNNEL),
- false);
+ rss_desc->key_len = MLX5_RSS_HASH_KEY_LEN;
+ rss_desc->hash_fields = dev_flow->hash_fields;
+ rss_desc->tunnel = !!(handle->layers &
+ MLX5_FLOW_LAYER_TUNNEL);
+ rss_desc->shared_rss = 0;
+ hrxq_idx = mlx5_hrxq_get(dev, rss_desc);
hrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ],
hrxq_idx);
if (!hrxq) {
SILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], flow->dev_handles,
dev_handles, handle, next) {
/* hrxq is union, don't touch it only the flag is set. */
- if (handle->rix_hrxq) {
- if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- mlx5_drop_action_destroy(dev);
- handle->rix_hrxq = 0;
- } else if (handle->fate_action ==
- MLX5_FLOW_FATE_QUEUE) {
- mlx5_hrxq_release(dev, handle->rix_hrxq);
- handle->rix_hrxq = 0;
- }
+ if (handle->rix_hrxq &&
+ handle->fate_action == MLX5_FLOW_FATE_QUEUE) {
+ mlx5_hrxq_release(dev, handle->rix_hrxq);
+ handle->rix_hrxq = 0;
}
if (handle->vf_vlan.tag && handle->vf_vlan.created)
mlx5_vlan_vmwa_release(dev, &handle->vf_vlan);