RTE_FLOW_ITEM_TYPE_NVGRE,
RTE_FLOW_ITEM_TYPE_VXLAN,
RTE_FLOW_ITEM_TYPE_GENEVE,
- RTE_FLOW_ITEM_TYPE_VXLAN_GPE,
- RTE_FLOW_ITEM_TYPE_MPLS
+ RTE_FLOW_ITEM_TYPE_VXLAN_GPE
};
static enum rte_flow_item_type L2_next_items[] = {
static enum rte_flow_item_type L4_next_items[] = {
RTE_FLOW_ITEM_TYPE_VXLAN,
RTE_FLOW_ITEM_TYPE_GENEVE,
- RTE_FLOW_ITEM_TYPE_VXLAN_GPE,
- RTE_FLOW_ITEM_TYPE_MPLS
+ RTE_FLOW_ITEM_TYPE_VXLAN_GPE
};
static enum rte_flow_item_type tunnel_next_items[] = {
/*
* This function is used to find rss general action.
* 1. As we know RSS is used to spread packets among several queues, the flow
- * API provide the struct rte_flow_action_rss, user could config it's field
+ * API provide the struct rte_flow_action_rss, user could config its field
* sush as: func/level/types/key/queue to control RSS function.
- * 2. The flow API also support queue region configuration for hns3. It was
+ * 2. The flow API also supports queue region configuration for hns3. It was
* implemented by FDIR + RSS in hns3 hardware, user can create one FDIR rule
* which action is RSS queues region.
* 3. When action is RSS, we use the following rule to distinguish:
rss = act->conf;
if (have_eth && rss->conf.queue_num) {
/*
- * Patter have ETH and action's queue_num > 0, indicate this is
+ * Pattern have ETH and action's queue_num > 0, indicate this is
* queue region configuration.
* Because queue region is implemented by FDIR + RSS in hns3
- * hardware, it need enter FDIR process, so here return NULL to
- * avoid enter RSS process.
+ * hardware, it needs to enter FDIR process, so here return NULL
+ * to avoid enter RSS process.
*/
return NULL;
}
return 0;
}
-/* Parse to get the attr and action info of flow director rule. */
static int
hns3_check_attr(const struct rte_flow_attr *attr, struct rte_flow_error *error)
{
hns3_set_bit(rule->input_set, INNER_IP_PROTO, 1);
rule->key_conf.spec.ip_proto = IPPROTO_UDP;
rule->key_conf.mask.ip_proto = IPPROTO_MASK;
+
/* Only used to describe the protocol stack. */
if (item->spec == NULL && item->mask == NULL)
return 0;
}
/*
- * Check items before tunnel, save inner configs to outer configs,and clear
+ * Check items before tunnel, save inner configs to outer configs, and clear
* inner configs.
* The key consists of two parts: meta_data and tuple keys.
* Meta data uses 15 bits, including vlan_num(2bit), des_port(12bit) and tunnel
if (type == RTE_FLOW_ITEM_TYPE_VXLAN_GPE ||
type == RTE_FLOW_ITEM_TYPE_VXLAN ||
type == RTE_FLOW_ITEM_TYPE_NVGRE ||
- type == RTE_FLOW_ITEM_TYPE_GENEVE ||
- type == RTE_FLOW_ITEM_TYPE_MPLS)
+ type == RTE_FLOW_ITEM_TYPE_GENEVE)
return true;
return false;
}
if (comp->func == RTE_ETH_HASH_FUNCTION_MAX)
func_is_same = false;
else
- func_is_same = (with->func ? (comp->func == with->func) : true);
+ func_is_same = with->func ? (comp->func == with->func) : true;
return (func_is_same &&
comp->types == (with->types & HNS3_ETH_RSS_SUPPORT) &&
*hash_algo = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP;
break;
default:
- hns3_err(hw, "Invalid RSS algorithm configuration(%u)",
+ hns3_err(hw, "Invalid RSS algorithm configuration(%d)",
algo_func);
return -EINVAL;
}
if (ret)
return ret;
- /* Update algorithm of hw */
hw->rss_info.conf.func = rss_config->func;
- /* Set flow type supported */
tuple = &hw->rss_info.rss_tuple_sets;
ret = hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_config->types);
if (ret)
{
struct hns3_adapter *hns = dev->data->dev_private;
struct hns3_hw *hw = &hns->hw;
- uint16_t indir_tbl[HNS3_RSS_IND_TBL_SIZE];
+ uint16_t indir_tbl[HNS3_RSS_IND_TBL_SIZE_MAX];
uint16_t j;
uint32_t i;
/* Fill in redirection table */
memcpy(indir_tbl, hw->rss_info.rss_indirection_tbl,
sizeof(hw->rss_info.rss_indirection_tbl));
- for (i = 0, j = 0; i < HNS3_RSS_IND_TBL_SIZE; i++, j++) {
+ for (i = 0, j = 0; i < hw->rss_ind_tbl_size; i++, j++) {
j %= num;
if (conf->queue[j] >= hw->alloc_rss_size) {
hns3_err(hw, "queue id(%u) set to redirection table "
indir_tbl[i] = conf->queue[j];
}
- return hns3_set_rss_indir_table(hw, indir_tbl, HNS3_RSS_IND_TBL_SIZE);
+ return hns3_set_rss_indir_table(hw, indir_tbl, hw->rss_ind_tbl_size);
}
static int
if (rss_flow_conf.queue_num) {
/*
* Due the content of queue pointer have been reset to
- * 0, the rss_info->conf.queue should be set NULL
+ * 0, the rss_info->conf.queue should be set to NULL
*/
rss_info->conf.queue = NULL;
rss_info->conf.queue_num = 0;
/*
* Create or destroy a flow rule.
* Theorically one rule can match more than one filters.
- * We will let it use the filter which it hitt first.
+ * We will let it use the filter which it hit first.
* So, the sequence matters.
*/
static struct rte_flow *
flow->counter_id = fdir_rule.act_cnt.id;
}
+
+ fdir_rule_ptr = rte_zmalloc("hns3 fdir rule",
+ sizeof(struct hns3_fdir_rule_ele),
+ 0);
+ if (fdir_rule_ptr == NULL) {
+ hns3_err(hw, "failed to allocate fdir_rule memory.");
+ ret = -ENOMEM;
+ goto err_fdir;
+ }
+
ret = hns3_fdir_filter_program(hns, &fdir_rule, false);
if (!ret) {
- fdir_rule_ptr = rte_zmalloc("hns3 fdir rule",
- sizeof(struct hns3_fdir_rule_ele),
- 0);
- if (fdir_rule_ptr == NULL) {
- hns3_err(hw, "Failed to allocate fdir_rule memory");
- ret = -ENOMEM;
- goto err_fdir;
- }
-
memcpy(&fdir_rule_ptr->fdir_conf, &fdir_rule,
sizeof(struct hns3_fdir_rule));
TAILQ_INSERT_TAIL(&process_list->fdir_list,
return flow;
}
+ rte_free(fdir_rule_ptr);
err_fdir:
if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER)
hns3_counter_release(dev, fdir_rule.act_cnt.id);
-
err:
rte_flow_error_set(error, -ret, RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
"Failed to create flow");
return rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_HANDLE,
flow, "Flow is NULL");
+
filter_type = flow->filter_type;
switch (filter_type) {
case RTE_ETH_FILTER_FDIR: