Message ID | 20240412120258.233970-1-ast@fiberby.net (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2] octeontx2-pf: fix FLOW_DIS_IS_FRAGMENT implementation | expand |
>Upon reviewing the flower control flags handling in this driver, I notice >that the key wasn't being used, only the mask. > >Ie. `tc flower ... ip_flags nofrag` was hardware offloaded as `... ip_flags >frag`. > >Only compile tested, no access to HW. > >Fixes: c672e3727989 ("octeontx2-pf: Add support to filter packet based on >IP fragment") >Signed-off-by: Asbjørn Sloth Tønnesen <ast@fiberby.net> >Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Tested-by: Suman Ghosh <sumang@marvell.com> >--- > >Changelog: > >v2: >- Added Reviewed-by from Jacob Keller. > >v1: https://urldefense.proofpoint.com/v2/url?u=https- >3A__lore.kernel.org_all_20240410134303.21560-2D1-2Dast- >40fiberby.net_&d=DwIDaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r=7si3Xn9Ly- >Se1a655kvEPIYU0nQ9HPeN280sEUv5ROU&m=UfMrVnDU5JBsaVCp2qFOqZRGkDyBtoQy8QCVjrd >zoiPy4SUhpvrOES3g3YlAhMCa&s=W3SsIVaRWmLwF0VFSRrHLIcA3reHOL1qGNZd-aGrftk&e= > > drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > >diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c >b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c >index 87bdb93cb066..f4655a8c0705 100644 >--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c >+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c >@@ -688,22 +688,25 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, >struct otx2_tc_flow *node, > } > > if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CONTROL)) { > struct flow_match_control match; >+ u32 val; > > flow_rule_match_control(rule, &match); > if (match.mask->flags & FLOW_DIS_FIRST_FRAG) { > NL_SET_ERR_MSG_MOD(extack, "HW doesn't support frag >first/later"); > return -EOPNOTSUPP; > } > > if (match.mask->flags & FLOW_DIS_IS_FRAGMENT) { >+ val = match.key->flags & FLOW_DIS_IS_FRAGMENT; > if (ntohs(flow_spec->etype) == ETH_P_IP) { >- flow_spec->ip_flag = IPV4_FLAG_MORE; >+ flow_spec->ip_flag = val ? IPV4_FLAG_MORE : 0; > flow_mask->ip_flag = IPV4_FLAG_MORE; > req->features |= BIT_ULL(NPC_IPFRAG_IPV4); > } else if (ntohs(flow_spec->etype) == ETH_P_IPV6) { >- flow_spec->next_header = IPPROTO_FRAGMENT; >+ flow_spec->next_header = val ? >+ IPPROTO_FRAGMENT : 0; > flow_mask->next_header = 0xff; > req->features |= BIT_ULL(NPC_IPFRAG_IPV6); > } else { > NL_SET_ERR_MSG_MOD(extack, "flow-type should be either >IPv4 and IPv6"); >-- >2.43.0
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c index 87bdb93cb066..f4655a8c0705 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c @@ -688,22 +688,25 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node, } if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CONTROL)) { struct flow_match_control match; + u32 val; flow_rule_match_control(rule, &match); if (match.mask->flags & FLOW_DIS_FIRST_FRAG) { NL_SET_ERR_MSG_MOD(extack, "HW doesn't support frag first/later"); return -EOPNOTSUPP; } if (match.mask->flags & FLOW_DIS_IS_FRAGMENT) { + val = match.key->flags & FLOW_DIS_IS_FRAGMENT; if (ntohs(flow_spec->etype) == ETH_P_IP) { - flow_spec->ip_flag = IPV4_FLAG_MORE; + flow_spec->ip_flag = val ? IPV4_FLAG_MORE : 0; flow_mask->ip_flag = IPV4_FLAG_MORE; req->features |= BIT_ULL(NPC_IPFRAG_IPV4); } else if (ntohs(flow_spec->etype) == ETH_P_IPV6) { - flow_spec->next_header = IPPROTO_FRAGMENT; + flow_spec->next_header = val ? + IPPROTO_FRAGMENT : 0; flow_mask->next_header = 0xff; req->features |= BIT_ULL(NPC_IPFRAG_IPV6); } else { NL_SET_ERR_MSG_MOD(extack, "flow-type should be either IPv4 and IPv6");