X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_fdir_filter.c;h=6342b560c9e2f11ec27c4906b438914715da8e40;hb=1d6cf7df2adb8d6e77a69be859917b0f34a29f35;hp=42b9628630a9b771aa400d99c3dd52fa3a0b70fa;hpb=1f0bc0592ae59d5d809ade9044d886c7c6f6186d;p=dpdk.git diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 42b9628630..6342b560c9 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -67,10 +67,11 @@ ICE_FDIR_INSET_VXLAN_IPV4 | \ ICE_INSET_TUN_SCTP_SRC_PORT | ICE_INSET_TUN_SCTP_DST_PORT) -#define ICE_FDIR_INSET_GTPU_IPV4 (\ - ICE_INSET_GTPU_TEID) +#define ICE_FDIR_INSET_GTPU (\ + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_GTPU_TEID) -#define ICE_FDIR_INSET_GTPU_EH_IPV4 (\ +#define ICE_FDIR_INSET_GTPU_EH (\ + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ ICE_INSET_GTPU_TEID | ICE_INSET_GTPU_QFI) static struct ice_pattern_match_item ice_fdir_pattern_os[] = { @@ -125,14 +126,16 @@ static struct ice_pattern_match_item ice_fdir_pattern_comms[] = { ICE_FDIR_INSET_VXLAN_IPV4_TCP, ICE_INSET_NONE}, {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_FDIR_INSET_VXLAN_IPV4_SCTP, ICE_INSET_NONE}, - {pattern_eth_ipv4_gtpu_ipv4, ICE_FDIR_INSET_GTPU_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_gtpu_eh_ipv4, - ICE_FDIR_INSET_GTPU_EH_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu, ICE_FDIR_INSET_GTPU, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh, ICE_FDIR_INSET_GTPU_EH, ICE_INSET_NONE}, }; static struct ice_flow_parser ice_fdir_parser_os; static struct ice_flow_parser ice_fdir_parser_comms; +static int +ice_fdir_is_tunnel_profile(enum ice_fdir_tunnel_type tunnel_type); + static const struct rte_memzone * ice_memzone_reserve(const char *name, uint32_t len, int socket_id) { @@ -915,7 +918,7 @@ ice_fdir_input_set_parse(uint64_t inset, enum ice_flow_field *field) {ICE_INSET_TUN_UDP_DST_PORT, ICE_FLOW_FIELD_IDX_UDP_DST_PORT}, {ICE_INSET_TUN_SCTP_SRC_PORT, ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT}, {ICE_INSET_TUN_SCTP_DST_PORT, ICE_FLOW_FIELD_IDX_SCTP_DST_PORT}, - {ICE_INSET_GTPU_TEID, ICE_FLOW_FIELD_IDX_GTPU_EH_TEID}, + {ICE_INSET_GTPU_TEID, ICE_FLOW_FIELD_IDX_GTPU_IP_TEID}, {ICE_INSET_GTPU_QFI, ICE_FLOW_FIELD_IDX_GTPU_EH_QFI}, }; @@ -928,11 +931,12 @@ ice_fdir_input_set_parse(uint64_t inset, enum ice_flow_field *field) static int ice_fdir_input_set_conf(struct ice_pf *pf, enum ice_fltr_ptype flow, - uint64_t input_set, bool is_tunnel) + uint64_t input_set, enum ice_fdir_tunnel_type ttype) { struct ice_flow_seg_info *seg; struct ice_flow_seg_info *seg_tun = NULL; enum ice_flow_field field[ICE_FLOW_FIELD_IDX_MAX]; + bool is_tunnel; int i, ret; if (!input_set) @@ -984,9 +988,15 @@ ice_fdir_input_set_conf(struct ice_pf *pf, enum ice_fltr_ptype flow, case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP: case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER: - ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_GTPU_EH | - ICE_FLOW_SEG_HDR_GTPU_IP | - ICE_FLOW_SEG_HDR_IPV4); + if (ttype == ICE_FDIR_TUNNEL_TYPE_GTPU) + ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_GTPU_IP | + ICE_FLOW_SEG_HDR_IPV4); + else if (ttype == ICE_FDIR_TUNNEL_TYPE_GTPU_EH) + ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_GTPU_EH | + ICE_FLOW_SEG_HDR_GTPU_IP | + ICE_FLOW_SEG_HDR_IPV4); + else + PMD_DRV_LOG(ERR, "not supported tunnel type."); break; default: PMD_DRV_LOG(ERR, "not supported filter type."); @@ -1000,6 +1010,7 @@ ice_fdir_input_set_conf(struct ice_pf *pf, enum ice_fltr_ptype flow, ICE_FLOW_FLD_OFF_INVAL, false); } + is_tunnel = ice_fdir_is_tunnel_profile(ttype); if (!is_tunnel) { ret = ice_fdir_hw_tbl_conf(pf, pf->main_vsi, pf->fdir.fdir_vsi, seg, flow, false); @@ -1224,7 +1235,7 @@ ice_fdir_create_filter(struct ice_adapter *ad, is_tun = ice_fdir_is_tunnel_profile(filter->tunnel_type); ret = ice_fdir_input_set_conf(pf, filter->input.flow_type, - filter->input_set, is_tun); + filter->input_set, filter->tunnel_type); if (ret) { rte_flow_error_set(error, -ret, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, @@ -1488,8 +1499,7 @@ ice_fdir_parse_action(struct ice_adapter *ad, dest_num++; filter->input.dest_ctl = - ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX; - filter->input.q_index = 0; + ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER; break; case RTE_FLOW_ACTION_TYPE_RSS: dest_num++; @@ -1897,6 +1907,7 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, filter->input.gtpu_data.qfi = gtp_psc_spec->qfi; } + tunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU_EH; break; default: rte_flow_error_set(error, EINVAL, @@ -1907,7 +1918,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, } } - if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_GTPU) + if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_GTPU || + tunnel_type == ICE_FDIR_TUNNEL_TYPE_GTPU_EH) flow_type = ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER; filter->tunnel_type = tunnel_type; @@ -1939,23 +1951,26 @@ ice_fdir_parse(struct ice_adapter *ad, ret = ice_fdir_parse_pattern(ad, pattern, error, filter); if (ret) - return ret; + goto error; input_set = filter->input_set; if (!input_set || input_set & ~item->input_set_mask) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_SPEC, pattern, "Invalid input set"); - return -rte_errno; + ret = -rte_errno; + goto error; } ret = ice_fdir_parse_action(ad, actions, error, filter); if (ret) - return ret; - - *meta = filter; + goto error; - return 0; + if (meta) + *meta = filter; +error: + rte_free(item); + return ret; } static struct ice_flow_parser ice_fdir_parser_os = {