Skip to content

Commit

Permalink
net/bnxt: fix handling of null flow mask
Browse files Browse the repository at this point in the history
[ upstream commit dea1afc ]

When the mask field of an rte_flow pattern item is NULL,
the default mask for that item type should be used.

Fixes: 5ef3b79 ("net/bnxt: support flow filter ops")

Signed-off-by: Lance Richardson <lance.richardson@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
  • Loading branch information
Lance Richardson authored and steevenlee committed May 8, 2021
1 parent 28e5e8b commit b1f8911
Showing 1 changed file with 36 additions and 11 deletions.
47 changes: 36 additions & 11 deletions drivers/net/bnxt/bnxt_flow.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
PMD_DRV_LOG(DEBUG, "Parse inner header\n");
break;
case RTE_FLOW_ITEM_TYPE_ETH:
if (!item->spec || !item->mask)
if (!item->spec)
break;

eth_spec = item->spec;
eth_mask = item->mask;

if (item->mask)
eth_mask = item->mask;
else
eth_mask = &rte_flow_item_eth_mask;

/* Source MAC address mask cannot be partially set.
* Should be All 0's or all 1's.
Expand Down Expand Up @@ -281,7 +285,12 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
break;
case RTE_FLOW_ITEM_TYPE_VLAN:
vlan_spec = item->spec;
vlan_mask = item->mask;

if (item->mask)
vlan_mask = item->mask;
else
vlan_mask = &rte_flow_item_vlan_mask;

if (en & en_ethertype) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
Expand Down Expand Up @@ -324,11 +333,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
case RTE_FLOW_ITEM_TYPE_IPV4:
/* If mask is not involved, we could use EM filters. */
ipv4_spec = item->spec;
ipv4_mask = item->mask;

if (!item->spec || !item->mask)
if (!item->spec)
break;

if (item->mask)
ipv4_mask = item->mask;
else
ipv4_mask = &rte_flow_item_ipv4_mask;

/* Only IP DST and SRC fields are maskable. */
if (ipv4_mask->hdr.version_ihl ||
ipv4_mask->hdr.type_of_service ||
Expand Down Expand Up @@ -385,11 +398,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
break;
case RTE_FLOW_ITEM_TYPE_IPV6:
ipv6_spec = item->spec;
ipv6_mask = item->mask;

if (!item->spec || !item->mask)
if (!item->spec)
break;

if (item->mask)
ipv6_mask = item->mask;
else
ipv6_mask = &rte_flow_item_ipv6_mask;

/* Only IP DST and SRC fields are maskable. */
if (ipv6_mask->hdr.vtc_flow ||
ipv6_mask->hdr.payload_len ||
Expand Down Expand Up @@ -437,11 +454,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
break;
case RTE_FLOW_ITEM_TYPE_TCP:
tcp_spec = item->spec;
tcp_mask = item->mask;

if (!item->spec || !item->mask)
if (!item->spec)
break;

if (item->mask)
tcp_mask = item->mask;
else
tcp_mask = &rte_flow_item_tcp_mask;

/* Check TCP mask. Only DST & SRC ports are maskable */
if (tcp_mask->hdr.sent_seq ||
tcp_mask->hdr.recv_ack ||
Expand Down Expand Up @@ -482,11 +503,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
break;
case RTE_FLOW_ITEM_TYPE_UDP:
udp_spec = item->spec;
udp_mask = item->mask;

if (!item->spec || !item->mask)
if (!item->spec)
break;

if (item->mask)
udp_mask = item->mask;
else
udp_mask = &rte_flow_item_udp_mask;

if (udp_mask->hdr.dgram_len ||
udp_mask->hdr.dgram_cksum) {
rte_flow_error_set(error,
Expand Down

0 comments on commit b1f8911

Please sign in to comment.