X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_acl_filter.c;h=0c15a7036cb31df17a8e52d045db1d2b82c9518d;hb=90bbd7d9545f88ac11f8b89449ad7fd799adbfba;hp=ca483f0e149b1547da7501b5d6cebb2074624982;hpb=40d466fa9f765b203058b81ce26ded7593df7c1e;p=dpdk.git diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c index ca483f0e14..0c15a7036c 100644 --- a/drivers/net/ice/ice_acl_filter.c +++ b/drivers/net/ice/ice_acl_filter.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -50,10 +50,10 @@ struct acl_rule { static struct ice_pattern_match_item ice_acl_pattern[] = { - {pattern_eth_ipv4, ICE_ACL_INSET_ETH_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp, ICE_ACL_INSET_ETH_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_tcp, ICE_ACL_INSET_ETH_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_sctp, ICE_ACL_INSET_ETH_IPV4_SCTP, ICE_INSET_NONE}, + {pattern_eth_ipv4, ICE_ACL_INSET_ETH_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp, ICE_ACL_INSET_ETH_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_tcp, ICE_ACL_INSET_ETH_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_sctp, ICE_ACL_INSET_ETH_IPV4_SCTP, ICE_INSET_NONE, ICE_INSET_NONE}, }; static int @@ -430,7 +430,7 @@ ice_acl_hw_set_conf(struct ice_pf *pf, struct ice_fdir_fltr *input, /* For IPV4_OTHER type, should add entry for all types. * For IPV4_UDP/TCP/SCTP type, only add entry for each. */ - if (slot_id < MAX_ACL_ENTRIES) { + if (slot_id < MAX_ACL_NORMAL_ENTRIES) { entry_id = ((uint64_t)flow_type << 32) | slot_id; ret = ice_flow_add_entry(hw, blk, flow_type, entry_id, pf->main_vsi->idx, @@ -444,7 +444,7 @@ ice_acl_hw_set_conf(struct ice_pf *pf, struct ice_fdir_fltr *input, pf->acl.hw_entry_id[slot_id] = hw_entry; } else { PMD_DRV_LOG(ERR, "Exceed the maximum entry number(%d)" - " HW supported!", MAX_ACL_ENTRIES); + " HW supported!", MAX_ACL_NORMAL_ENTRIES); return -1; } @@ -664,6 +664,14 @@ ice_acl_parse_pattern(__rte_unused struct ice_adapter *ad, eth_mask = item->mask; if (eth_spec && eth_mask) { + if (rte_is_broadcast_ether_addr(ð_mask->src) || + rte_is_broadcast_ether_addr(ð_mask->dst)) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, "Invalid mac addr mask"); + return -rte_errno; + } + if (!rte_is_zero_ether_addr(ð_spec->src) && !rte_is_zero_ether_addr(ð_mask->src)) { input_set |= ICE_INSET_SMAC; @@ -710,6 +718,15 @@ ice_acl_parse_pattern(__rte_unused struct ice_adapter *ad, return -rte_errno; } + if (ipv4_mask->hdr.src_addr == UINT32_MAX || + ipv4_mask->hdr.dst_addr == UINT32_MAX) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid IPv4 mask."); + return -rte_errno; + } + if (ipv4_mask->hdr.src_addr) { filter->input.ip.v4.src_ip = ipv4_spec->hdr.src_addr; @@ -754,6 +771,15 @@ ice_acl_parse_pattern(__rte_unused struct ice_adapter *ad, return -rte_errno; } + if (tcp_mask->hdr.src_port == UINT16_MAX || + tcp_mask->hdr.dst_port == UINT16_MAX) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid TCP mask"); + return -rte_errno; + } + if (l3 == RTE_FLOW_ITEM_TYPE_IPV4 && tcp_mask->hdr.src_port) { input_set |= ICE_INSET_TCP_SRC_PORT; @@ -791,6 +817,15 @@ ice_acl_parse_pattern(__rte_unused struct ice_adapter *ad, return -rte_errno; } + if (udp_mask->hdr.src_port == UINT16_MAX || + udp_mask->hdr.dst_port == UINT16_MAX) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid UDP mask"); + return -rte_errno; + } + if (l3 == RTE_FLOW_ITEM_TYPE_IPV4 && udp_mask->hdr.src_port) { input_set |= ICE_INSET_UDP_SRC_PORT; @@ -818,6 +853,15 @@ ice_acl_parse_pattern(__rte_unused struct ice_adapter *ad, flow_type = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; if (sctp_spec && sctp_mask) { + if (sctp_mask->hdr.src_port == UINT16_MAX || + sctp_mask->hdr.dst_port == UINT16_MAX) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid SCTP mask"); + return -rte_errno; + } + if (l3 == RTE_FLOW_ITEM_TYPE_IPV4 && sctp_mask->hdr.src_port) { input_set |= ICE_INSET_SCTP_SRC_PORT; @@ -860,6 +904,7 @@ ice_acl_parse(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { @@ -870,7 +915,8 @@ ice_acl_parse(struct ice_adapter *ad, int ret; memset(filter, 0, sizeof(*filter)); - item = ice_search_pattern_match_item(pattern, array, array_len, error); + item = ice_search_pattern_match_item(ad, pattern, array, array_len, + error); if (!item) return -rte_errno; @@ -878,7 +924,7 @@ ice_acl_parse(struct ice_adapter *ad, if (ret) goto error; input_set = filter->input_set; - if (!input_set || input_set & ~item->input_set_mask) { + if (!input_set || input_set & ~item->input_set_mask_o) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_SPEC, pattern, @@ -935,6 +981,9 @@ ice_acl_init(struct ice_adapter *ad) struct ice_hw *hw = ICE_PF_TO_HW(pf); struct ice_flow_parser *parser = &ice_acl_parser; + if (!ad->hw.dcf_enabled) + return 0; + ret = ice_acl_prof_alloc(hw); if (ret) { PMD_DRV_LOG(ERR, "Cannot allocate memory for " @@ -979,10 +1028,11 @@ ice_acl_uninit(struct ice_adapter *ad) struct ice_hw *hw = ICE_PF_TO_HW(pf); struct ice_flow_parser *parser = &ice_acl_parser; - ice_unregister_parser(parser, ad); - - ice_deinit_acl(pf); - ice_acl_prof_free(hw); + if (ad->hw.dcf_enabled) { + ice_unregister_parser(parser, ad); + ice_deinit_acl(pf); + ice_acl_prof_free(hw); + } } static struct