X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fi40e%2Fi40e_flow.c;h=8f8df6fae9a12eb7aa7a37338a71199dc8940036;hb=e4ed8de39b31c2a5d2c529726315106421abdc97;hp=8ce21f7b6635dfdc73a2cf593f280e0884a517f4;hpb=103e2c02260cc072f73c93d667a66864e330919d;p=dpdk.git diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index 8ce21f7b66..8f8df6fae9 100644 --- a/drivers/net/i40e/i40e_flow.c +++ b/drivers/net/i40e/i40e_flow.c @@ -3462,6 +3462,10 @@ i40e_flow_parse_fdir_filter(struct rte_eth_dev *dev, } } + /* If create the first fdir rule, enable fdir check for rx queues */ + if (TAILQ_EMPTY(&pf->fdir.fdir_list)) + i40e_fdir_rx_proc_enable(dev, 1); + return 0; err: i40e_fdir_teardown(pf); @@ -4510,6 +4514,7 @@ i40e_flow_parse_rss_pattern(__rte_unused struct rte_eth_dev *dev, { pattern_fdir_ipv6_tcp, ETH_RSS_NONFRAG_IPV6_TCP }, { pattern_fdir_ipv6_udp, ETH_RSS_NONFRAG_IPV6_UDP }, { pattern_fdir_ipv6_sctp, ETH_RSS_NONFRAG_IPV6_SCTP }, + { pattern_ethertype, ETH_RSS_L2_PAYLOAD }, { pattern_fdir_ipv6_esp, ETH_RSS_ESP }, { pattern_fdir_ipv6_udp_esp, ETH_RSS_ESP }, }; @@ -4543,8 +4548,7 @@ i40e_flow_parse_rss_pattern(__rte_unused struct rte_eth_dev *dev, if (i40e_match_pattern(i40e_rss_pctype_patterns[i].item_array, items)) { p_info->types = i40e_rss_pctype_patterns[i].type; - rte_free(items); - return 0; + break; } } @@ -4579,11 +4583,9 @@ i40e_flow_parse_rss_pattern(__rte_unused struct rte_eth_dev *dev, } break; default: - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM, - item, - "Not support range"); - return -rte_errno; + p_info->action_flag = 0; + memset(info, 0, sizeof(struct i40e_queue_regions)); + return 0; } } @@ -4624,6 +4626,34 @@ i40e_flow_parse_rss_action(struct rte_eth_dev *dev, uint32_t index = 0; uint64_t hf_bit = 1; + static const struct { + uint64_t rss_type; + enum i40e_filter_pctype pctype; + } pctype_match_table[] = { + {ETH_RSS_FRAG_IPV4, + I40E_FILTER_PCTYPE_FRAG_IPV4}, + {ETH_RSS_NONFRAG_IPV4_TCP, + I40E_FILTER_PCTYPE_NONF_IPV4_TCP}, + {ETH_RSS_NONFRAG_IPV4_UDP, + I40E_FILTER_PCTYPE_NONF_IPV4_UDP}, + {ETH_RSS_NONFRAG_IPV4_SCTP, + I40E_FILTER_PCTYPE_NONF_IPV4_SCTP}, + {ETH_RSS_NONFRAG_IPV4_OTHER, + I40E_FILTER_PCTYPE_NONF_IPV4_OTHER}, + {ETH_RSS_FRAG_IPV6, + I40E_FILTER_PCTYPE_FRAG_IPV6}, + {ETH_RSS_NONFRAG_IPV6_TCP, + I40E_FILTER_PCTYPE_NONF_IPV6_TCP}, + {ETH_RSS_NONFRAG_IPV6_UDP, + I40E_FILTER_PCTYPE_NONF_IPV6_UDP}, + {ETH_RSS_NONFRAG_IPV6_SCTP, + I40E_FILTER_PCTYPE_NONF_IPV6_SCTP}, + {ETH_RSS_NONFRAG_IPV6_OTHER, + I40E_FILTER_PCTYPE_NONF_IPV6_OTHER}, + {ETH_RSS_L2_PAYLOAD, + I40E_FILTER_PCTYPE_L2_PAYLOAD}, + }; + NEXT_ITEM_OF_ACTION(act, actions, index); rss = act->conf; @@ -4639,10 +4669,11 @@ i40e_flow_parse_rss_action(struct rte_eth_dev *dev, return -rte_errno; } - if (p_info.action_flag) { - for (n = 0; n < 64; n++) { - if (rss->types & (hf_bit << n)) { - conf_info->region[0].hw_flowtype[0] = n; + if (p_info.action_flag && rss->queue_num) { + for (j = 0; j < RTE_DIM(pctype_match_table); j++) { + if (rss->types & pctype_match_table[j].rss_type) { + conf_info->region[0].hw_flowtype[0] = + (uint8_t)pctype_match_table[j].pctype; conf_info->region[0].flowtype_num = 1; conf_info->queue_region_number = 1; break; @@ -5303,9 +5334,6 @@ i40e_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error) return -rte_errno; } - /* Disable FDIR processing as all FDIR rules are now flushed */ - i40e_fdir_rx_proc_enable(dev, 0); - return ret; } @@ -5341,6 +5369,9 @@ i40e_flow_flush_fdir_filter(struct i40e_pf *pf) for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP; pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) pf->fdir.inset_flag[pctype] = 0; + + /* Disable FDIR processing as all FDIR rules are now flushed */ + i40e_fdir_rx_proc_enable(dev, 0); } return ret;