|
27 | 27 | #define BNXT_FID_INVALID 0xffff
|
28 | 28 | #define VLAN_TCI(vid, prio) ((vid) | ((prio) << VLAN_PRIO_SHIFT))
|
29 | 29 |
|
| 30 | +#define is_vlan_pcp_wildcarded(vlan_tci_mask) \ |
| 31 | + ((ntohs(vlan_tci_mask) & VLAN_PRIO_MASK) == 0x0000) |
| 32 | +#define is_vlan_pcp_exactmatch(vlan_tci_mask) \ |
| 33 | + ((ntohs(vlan_tci_mask) & VLAN_PRIO_MASK) == VLAN_PRIO_MASK) |
| 34 | +#define is_vlan_pcp_zero(vlan_tci) \ |
| 35 | + ((ntohs(vlan_tci) & VLAN_PRIO_MASK) == 0x0000) |
| 36 | +#define is_vid_exactmatch(vlan_tci_mask) \ |
| 37 | + ((ntohs(vlan_tci_mask) & VLAN_VID_MASK) == VLAN_VID_MASK) |
| 38 | + |
30 | 39 | /* Return the dst fid of the func for flow forwarding
|
31 | 40 | * For PFs: src_fid is the fid of the PF
|
32 | 41 | * For VF-reps: src_fid the fid of the VF
|
@@ -389,6 +398,21 @@ static bool is_exactmatch(void *mask, int len)
|
389 | 398 | return true;
|
390 | 399 | }
|
391 | 400 |
|
| 401 | +static bool is_vlan_tci_allowed(__be16 vlan_tci_mask, |
| 402 | + __be16 vlan_tci) |
| 403 | +{ |
| 404 | + /* VLAN priority must be either exactly zero or fully wildcarded and |
| 405 | + * VLAN id must be exact match. |
| 406 | + */ |
| 407 | + if (is_vid_exactmatch(vlan_tci_mask) && |
| 408 | + ((is_vlan_pcp_exactmatch(vlan_tci_mask) && |
| 409 | + is_vlan_pcp_zero(vlan_tci)) || |
| 410 | + is_vlan_pcp_wildcarded(vlan_tci_mask))) |
| 411 | + return true; |
| 412 | + |
| 413 | + return false; |
| 414 | +} |
| 415 | + |
392 | 416 | static bool bits_set(void *key, int len)
|
393 | 417 | {
|
394 | 418 | const u8 *p = key;
|
@@ -803,9 +827,9 @@ static bool bnxt_tc_can_offload(struct bnxt *bp, struct bnxt_tc_flow *flow)
|
803 | 827 | /* Currently VLAN fields cannot be partial wildcard */
|
804 | 828 | if (bits_set(&flow->l2_key.inner_vlan_tci,
|
805 | 829 | sizeof(flow->l2_key.inner_vlan_tci)) &&
|
806 |
| - !is_exactmatch(&flow->l2_mask.inner_vlan_tci, |
807 |
| - sizeof(flow->l2_mask.inner_vlan_tci))) { |
808 |
| - netdev_info(bp->dev, "Wildcard match unsupported for VLAN TCI\n"); |
| 830 | + !is_vlan_tci_allowed(flow->l2_mask.inner_vlan_tci, |
| 831 | + flow->l2_key.inner_vlan_tci)) { |
| 832 | + netdev_info(bp->dev, "Unsupported VLAN TCI\n"); |
809 | 833 | return false;
|
810 | 834 | }
|
811 | 835 | if (bits_set(&flow->l2_key.inner_vlan_tpid,
|
|
0 commit comments