X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fi40e%2Fi40e_flow.c;h=8f8df6fae9a12eb7aa7a37338a71199dc8940036;hb=8c7449779c4526d27205043560a21f0e2c2f622b;hp=d1bc96084355697e2ae801fe1db5973f47045143;hpb=14faf8e998297aed331f2eb4687bd9917c4e82ce;p=dpdk.git diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index d1bc960843..8f8df6fae9 100644 --- a/drivers/net/i40e/i40e_flow.c +++ b/drivers/net/i40e/i40e_flow.c @@ -2643,7 +2643,8 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev, filter->input.flow.l2_flow.src = eth_spec->src; input_set |= (I40E_INSET_DMAC | I40E_INSET_SMAC); - } else { + } else if (!rte_is_zero_ether_addr(ð_mask->src) || + !rte_is_zero_ether_addr(ð_mask->dst)) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -2666,7 +2667,6 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev, if (next_type == RTE_FLOW_ITEM_TYPE_VLAN || ether_type == RTE_ETHER_TYPE_IPV4 || ether_type == RTE_ETHER_TYPE_IPV6 || - ether_type == RTE_ETHER_TYPE_ARP || ether_type == outer_tpid) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, @@ -2711,7 +2711,6 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev, if (ether_type == RTE_ETHER_TYPE_IPV4 || ether_type == RTE_ETHER_TYPE_IPV6 || - ether_type == RTE_ETHER_TYPE_ARP || ether_type == outer_tpid) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, @@ -3445,8 +3444,7 @@ i40e_flow_parse_fdir_filter(struct rte_eth_dev *dev, cons_filter_type = RTE_ETH_FILTER_FDIR; - if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT || - pf->fdir.fdir_vsi == NULL) { + if (pf->fdir.fdir_vsi == NULL) { /* Enable fdir when fdir flow is added at first time. */ ret = i40e_fdir_setup(pf); if (ret != I40E_SUCCESS) { @@ -3462,10 +3460,12 @@ i40e_flow_parse_fdir_filter(struct rte_eth_dev *dev, NULL, "Failed to configure fdir."); goto err; } - - dev->data->dev_conf.fdir_conf.mode = RTE_FDIR_MODE_PERFECT; } + /* 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); @@ -4514,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 }, }; @@ -4547,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; } } @@ -4583,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; } } @@ -4628,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; @@ -4643,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; @@ -5150,9 +5177,6 @@ i40e_flow_destroy(struct rte_eth_dev *dev, /* If the last flow is destroyed, disable fdir. */ if (!ret && TAILQ_EMPTY(&pf->fdir.fdir_list)) { - i40e_fdir_teardown(pf); - dev->data->dev_conf.fdir_conf.mode = - RTE_FDIR_MODE_NONE; i40e_fdir_rx_proc_enable(dev, 0); } break; @@ -5310,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; } @@ -5348,9 +5369,10 @@ 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; - } - i40e_fdir_teardown(pf); + /* Disable FDIR processing as all FDIR rules are now flushed */ + i40e_fdir_rx_proc_enable(dev, 0); + } return ret; }