* [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support @ 2022-06-24 13:41 Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik ` (3 more replies) 0 siblings, 4 replies; 9+ messages in thread From: Marcin Szycik @ 2022-06-24 13:41 UTC (permalink / raw) To: netdev Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, jiri, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, gustavoars, davem Add support for dissecting PPPoE and PPP-specific fields in flow dissector: PPPoE session id and PPP protocol type. Add support for those fields in tc-flower and support offloading PPPoE. Finally, add support for hardware offload of PPPoE packets in switchdev mode in ice driver. Example filter: tc filter add dev $PF1 ingress protocol ppp_ses prio 1 flower pppoe_sid \ 1234 ppp_proto ip skip_sw action mirred egress redirect dev $VF1_PR Changes in iproute2 are required to use the new fields. ICE COMMS DDP package is required to create a filter in ice. Note: currently matching on vlan + PPPoE fields is not supported. Patch [0] will add this feature. [0] https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20220420210048.5809-1-martyna.szapar-mudlaw@intel.com Marcin Szycik (1): ice: Add support for PPPoE hardware offload Wojciech Drewek (3): flow_dissector: Add PPPoE dissectors net/sched: flower: Add PPPoE filter flow_offload: Introduce flow_match_pppoe drivers/net/ethernet/intel/ice/ice.h | 1 + .../net/ethernet/intel/ice/ice_flex_pipe.c | 5 +- .../ethernet/intel/ice/ice_protocol_type.h | 11 ++ drivers/net/ethernet/intel/ice/ice_switch.c | 165 ++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_tc_lib.c | 94 ++++++++-- drivers/net/ethernet/intel/ice/ice_tc_lib.h | 8 + include/net/flow_dissector.h | 11 ++ include/net/flow_offload.h | 6 + include/uapi/linux/pkt_cls.h | 3 + net/core/flow_dissector.c | 51 +++++- net/core/flow_offload.c | 7 + net/sched/cls_flower.c | 46 +++++ 12 files changed, 391 insertions(+), 17 deletions(-) -- 2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors 2022-06-24 13:41 [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support Marcin Szycik @ 2022-06-24 13:41 ` Marcin Szycik 2022-06-24 15:01 ` Alexander Lobakin 2022-06-26 7:20 ` Baowen Zheng 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 2/4] net/sched: flower: Add PPPoE filter Marcin Szycik ` (2 subsequent siblings) 3 siblings, 2 replies; 9+ messages in thread From: Marcin Szycik @ 2022-06-24 13:41 UTC (permalink / raw) To: netdev Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, jiri, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, gustavoars, davem From: Wojciech Drewek <wojciech.drewek@intel.com> Allow to dissect PPPoE specific fields which are: - session ID (16 bits) - ppp protocol (16 bits) The goal is to make the following TC command possible: # tc filter add dev ens6f0 ingress prio 1 protocol ppp_ses \ flower \ pppoe_sid 12 \ ppp_proto ip \ action drop Note that only PPPoE Session is supported. Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> --- include/net/flow_dissector.h | 11 ++++++++ net/core/flow_dissector.c | 51 +++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index a4c6057c7097..8ff40c7c3f1c 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h @@ -261,6 +261,16 @@ struct flow_dissector_key_num_of_vlans { u8 num_of_vlans; }; +/** + * struct flow_dissector_key_pppoe: + * @session_id: pppoe session id + * @ppp_proto: ppp protocol + */ +struct flow_dissector_key_pppoe { + u16 session_id; + __be16 ppp_proto; +}; + enum flow_dissector_key_id { FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */ FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */ @@ -291,6 +301,7 @@ enum flow_dissector_key_id { FLOW_DISSECTOR_KEY_CT, /* struct flow_dissector_key_ct */ FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */ FLOW_DISSECTOR_KEY_NUM_OF_VLANS, /* struct flow_dissector_key_num_of_vlans */ + FLOW_DISSECTOR_KEY_PPPOE, /* struct flow_dissector_key_pppoe */ FLOW_DISSECTOR_KEY_MAX, }; diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 6aee04f75e3e..41933905f90b 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -895,6 +895,35 @@ bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx, return result == BPF_OK; } +static bool is_ppp_proto_supported(__be16 proto) +{ + switch (proto) { + case htons(PPP_AT): + case htons(PPP_IPX): + case htons(PPP_VJC_COMP): + case htons(PPP_VJC_UNCOMP): + case htons(PPP_MP): + case htons(PPP_COMPFRAG): + case htons(PPP_COMP): + case htons(PPP_MPLS_UC): + case htons(PPP_MPLS_MC): + case htons(PPP_IPCP): + case htons(PPP_ATCP): + case htons(PPP_IPXCP): + case htons(PPP_IPV6CP): + case htons(PPP_CCPFRAG): + case htons(PPP_MPLSCP): + case htons(PPP_LCP): + case htons(PPP_PAP): + case htons(PPP_LQR): + case htons(PPP_CHAP): + case htons(PPP_CBCP): + return true; + default: + return false; + } +} + /** * __skb_flow_dissect - extract the flow_keys struct and return it * @net: associated network namespace, derived from @skb if NULL @@ -1221,19 +1250,29 @@ bool __skb_flow_dissect(const struct net *net, } nhoff += PPPOE_SES_HLEN; - switch (hdr->proto) { - case htons(PPP_IP): + if (hdr->proto == htons(PPP_IP)) { proto = htons(ETH_P_IP); fdret = FLOW_DISSECT_RET_PROTO_AGAIN; - break; - case htons(PPP_IPV6): + } else if (hdr->proto == htons(PPP_IPV6)) { proto = htons(ETH_P_IPV6); fdret = FLOW_DISSECT_RET_PROTO_AGAIN; - break; - default: + } else if (is_ppp_proto_supported(hdr->proto)) { + fdret = FLOW_DISSECT_RET_OUT_GOOD; + } else { fdret = FLOW_DISSECT_RET_OUT_BAD; break; } + + if (dissector_uses_key(flow_dissector, + FLOW_DISSECTOR_KEY_PPPOE)) { + struct flow_dissector_key_pppoe *key_pppoe; + + key_pppoe = skb_flow_dissector_target(flow_dissector, + FLOW_DISSECTOR_KEY_PPPOE, + target_container); + key_pppoe->session_id = ntohs(hdr->hdr.sid); + key_pppoe->ppp_proto = hdr->proto; + } break; } case htons(ETH_P_TIPC): { -- 2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik @ 2022-06-24 15:01 ` Alexander Lobakin 2022-06-27 11:33 ` Drewek, Wojciech 2022-06-26 7:20 ` Baowen Zheng 1 sibling, 1 reply; 9+ messages in thread From: Alexander Lobakin @ 2022-06-24 15:01 UTC (permalink / raw) To: Marcin Szycik Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, jiri, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, netdev, gustavoars, davem From: Marcin Szycik <marcin.szycik@linux.intel.com> Date: Fri, 24 Jun 2022 15:41:31 +0200 > From: Wojciech Drewek <wojciech.drewek@intel.com> > > Allow to dissect PPPoE specific fields which are: > - session ID (16 bits) > - ppp protocol (16 bits) > > The goal is to make the following TC command possible: > > # tc filter add dev ens6f0 ingress prio 1 protocol ppp_ses \ > flower \ > pppoe_sid 12 \ > ppp_proto ip \ > action drop > > Note that only PPPoE Session is supported. > > Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> > --- > include/net/flow_dissector.h | 11 ++++++++ > net/core/flow_dissector.c | 51 +++++++++++++++++++++++++++++++----- > 2 files changed, 56 insertions(+), 6 deletions(-) > > diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h > index a4c6057c7097..8ff40c7c3f1c 100644 > --- a/include/net/flow_dissector.h > +++ b/include/net/flow_dissector.h > @@ -261,6 +261,16 @@ struct flow_dissector_key_num_of_vlans { > u8 num_of_vlans; > }; > > +/** > + * struct flow_dissector_key_pppoe: > + * @session_id: pppoe session id > + * @ppp_proto: ppp protocol > + */ > +struct flow_dissector_key_pppoe { > + u16 session_id; > + __be16 ppp_proto; > +}; > + > enum flow_dissector_key_id { > FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */ > FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */ > @@ -291,6 +301,7 @@ enum flow_dissector_key_id { > FLOW_DISSECTOR_KEY_CT, /* struct flow_dissector_key_ct */ > FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */ > FLOW_DISSECTOR_KEY_NUM_OF_VLANS, /* struct flow_dissector_key_num_of_vlans */ > + FLOW_DISSECTOR_KEY_PPPOE, /* struct flow_dissector_key_pppoe */ > > FLOW_DISSECTOR_KEY_MAX, > }; > diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c > index 6aee04f75e3e..41933905f90b 100644 > --- a/net/core/flow_dissector.c > +++ b/net/core/flow_dissector.c > @@ -895,6 +895,35 @@ bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx, > return result == BPF_OK; > } > > +static bool is_ppp_proto_supported(__be16 proto) > +{ > + switch (proto) { > + case htons(PPP_AT): > + case htons(PPP_IPX): > + case htons(PPP_VJC_COMP): > + case htons(PPP_VJC_UNCOMP): > + case htons(PPP_MP): > + case htons(PPP_COMPFRAG): > + case htons(PPP_COMP): > + case htons(PPP_MPLS_UC): > + case htons(PPP_MPLS_MC): > + case htons(PPP_IPCP): > + case htons(PPP_ATCP): > + case htons(PPP_IPXCP): > + case htons(PPP_IPV6CP): > + case htons(PPP_CCPFRAG): > + case htons(PPP_MPLSCP): > + case htons(PPP_LCP): > + case htons(PPP_PAP): > + case htons(PPP_LQR): > + case htons(PPP_CHAP): > + case htons(PPP_CBCP): > + return true; > + default: > + return false; > + } > +} > + > /** > * __skb_flow_dissect - extract the flow_keys struct and return it > * @net: associated network namespace, derived from @skb if NULL > @@ -1221,19 +1250,29 @@ bool __skb_flow_dissect(const struct net *net, > } > > nhoff += PPPOE_SES_HLEN; > - switch (hdr->proto) { > - case htons(PPP_IP): > + if (hdr->proto == htons(PPP_IP)) { > proto = htons(ETH_P_IP); > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > - break; > - case htons(PPP_IPV6): > + } else if (hdr->proto == htons(PPP_IPV6)) { > proto = htons(ETH_P_IPV6); > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > - break; > - default: Oh, sorry for missing this previously. This switch -> if-else conversion looks redundant. You can add `if (is_ppp_proto_supported()) GOOD; else BAD` to the `default` label without modifying the rest of code (to skip the actual dissecting block you can add a condition there that @fdret must not equal BAD). > + } else if (is_ppp_proto_supported(hdr->proto)) { > + fdret = FLOW_DISSECT_RET_OUT_GOOD; > + } else { > fdret = FLOW_DISSECT_RET_OUT_BAD; > break; > } > + > + if (dissector_uses_key(flow_dissector, > + FLOW_DISSECTOR_KEY_PPPOE)) { > + struct flow_dissector_key_pppoe *key_pppoe; > + > + key_pppoe = skb_flow_dissector_target(flow_dissector, > + FLOW_DISSECTOR_KEY_PPPOE, > + target_container); > + key_pppoe->session_id = ntohs(hdr->hdr.sid); > + key_pppoe->ppp_proto = hdr->proto; > + } > break; > } > case htons(ETH_P_TIPC): { > -- > 2.35.1 Thanks, Olek _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors 2022-06-24 15:01 ` Alexander Lobakin @ 2022-06-27 11:33 ` Drewek, Wojciech 0 siblings, 0 replies; 9+ messages in thread From: Drewek, Wojciech @ 2022-06-27 11:33 UTC (permalink / raw) To: Lobakin, Alexandr, Marcin Szycik Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, elic, Brandeburg, Jesse, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, jiri, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, netdev, gustavoars, davem > -----Original Message----- > From: Lobakin, Alexandr <alexandr.lobakin@intel.com> > Sent: piątek, 24 czerwca 2022 17:01 > To: Marcin Szycik <marcin.szycik@linux.intel.com> > Cc: Lobakin, Alexandr <alexandr.lobakin@intel.com>; netdev@vger.kernel.org; Nguyen, Anthony L <anthony.l.nguyen@intel.com>; > davem@davemloft.net; xiyou.wangcong@gmail.com; Brandeburg, Jesse <jesse.brandeburg@intel.com>; gustavoars@kernel.org; > baowen.zheng@corigine.com; boris.sukholitko@broadcom.com; elic@nvidia.com; edumazet@google.com; kuba@kernel.org; > jhs@mojatatu.com; jiri@resnulli.us; kurt@linutronix.de; pablo@netfilter.org; pabeni@redhat.com; paulb@nvidia.com; > simon.horman@corigine.com; komachi.yoshiki@gmail.com; zhangkaiheb@126.com; intel-wired-lan@lists.osuosl.org; > michal.swiatkowski@linux.intel.com; Drewek, Wojciech <wojciech.drewek@intel.com> > Subject: Re: [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors > > From: Marcin Szycik <marcin.szycik@linux.intel.com> > Date: Fri, 24 Jun 2022 15:41:31 +0200 > > > From: Wojciech Drewek <wojciech.drewek@intel.com> > > > > Allow to dissect PPPoE specific fields which are: > > - session ID (16 bits) > > - ppp protocol (16 bits) > > > > The goal is to make the following TC command possible: > > > > # tc filter add dev ens6f0 ingress prio 1 protocol ppp_ses \ > > flower \ > > pppoe_sid 12 \ > > ppp_proto ip \ > > action drop > > > > Note that only PPPoE Session is supported. > > > > Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> > > --- > > include/net/flow_dissector.h | 11 ++++++++ > > net/core/flow_dissector.c | 51 +++++++++++++++++++++++++++++++----- > > 2 files changed, 56 insertions(+), 6 deletions(-) > > > > diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h > > index a4c6057c7097..8ff40c7c3f1c 100644 > > --- a/include/net/flow_dissector.h > > +++ b/include/net/flow_dissector.h > > @@ -261,6 +261,16 @@ struct flow_dissector_key_num_of_vlans { > > u8 num_of_vlans; > > }; > > > > +/** > > + * struct flow_dissector_key_pppoe: > > + * @session_id: pppoe session id > > + * @ppp_proto: ppp protocol > > + */ > > +struct flow_dissector_key_pppoe { > > + u16 session_id; > > + __be16 ppp_proto; > > +}; > > + > > enum flow_dissector_key_id { > > FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */ > > FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */ > > @@ -291,6 +301,7 @@ enum flow_dissector_key_id { > > FLOW_DISSECTOR_KEY_CT, /* struct flow_dissector_key_ct */ > > FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */ > > FLOW_DISSECTOR_KEY_NUM_OF_VLANS, /* struct flow_dissector_key_num_of_vlans */ > > + FLOW_DISSECTOR_KEY_PPPOE, /* struct flow_dissector_key_pppoe */ > > > > FLOW_DISSECTOR_KEY_MAX, > > }; > > diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c > > index 6aee04f75e3e..41933905f90b 100644 > > --- a/net/core/flow_dissector.c > > +++ b/net/core/flow_dissector.c > > @@ -895,6 +895,35 @@ bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx, > > return result == BPF_OK; > > } > > > > +static bool is_ppp_proto_supported(__be16 proto) > > +{ > > + switch (proto) { > > + case htons(PPP_AT): > > + case htons(PPP_IPX): > > + case htons(PPP_VJC_COMP): > > + case htons(PPP_VJC_UNCOMP): > > + case htons(PPP_MP): > > + case htons(PPP_COMPFRAG): > > + case htons(PPP_COMP): > > + case htons(PPP_MPLS_UC): > > + case htons(PPP_MPLS_MC): > > + case htons(PPP_IPCP): > > + case htons(PPP_ATCP): > > + case htons(PPP_IPXCP): > > + case htons(PPP_IPV6CP): > > + case htons(PPP_CCPFRAG): > > + case htons(PPP_MPLSCP): > > + case htons(PPP_LCP): > > + case htons(PPP_PAP): > > + case htons(PPP_LQR): > > + case htons(PPP_CHAP): > > + case htons(PPP_CBCP): > > + return true; > > + default: > > + return false; > > + } > > +} > > + > > /** > > * __skb_flow_dissect - extract the flow_keys struct and return it > > * @net: associated network namespace, derived from @skb if NULL > > @@ -1221,19 +1250,29 @@ bool __skb_flow_dissect(const struct net *net, > > } > > > > nhoff += PPPOE_SES_HLEN; > > - switch (hdr->proto) { > > - case htons(PPP_IP): > > + if (hdr->proto == htons(PPP_IP)) { > > proto = htons(ETH_P_IP); > > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > > - break; > > - case htons(PPP_IPV6): > > + } else if (hdr->proto == htons(PPP_IPV6)) { > > proto = htons(ETH_P_IPV6); > > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > > - break; > > - default: > > Oh, sorry for missing this previously. This switch -> if-else > conversion looks redundant. > You can add `if (is_ppp_proto_supported()) GOOD; else BAD` to the > `default` label without modifying the rest of code (to skip the > actual dissecting block you can add a condition there that @fdret > must not equal BAD). I could leave switch case statement but IMHO converting to if else statement is cleaner then adding new if after switch case in order to skip dissecting block. > > > + } else if (is_ppp_proto_supported(hdr->proto)) { > > + fdret = FLOW_DISSECT_RET_OUT_GOOD; > > + } else { > > fdret = FLOW_DISSECT_RET_OUT_BAD; > > break; > > } > > + > > + if (dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_PPPOE)) { > > + struct flow_dissector_key_pppoe *key_pppoe; > > + > > + key_pppoe = skb_flow_dissector_target(flow_dissector, > > + FLOW_DISSECTOR_KEY_PPPOE, > > + target_container); > > + key_pppoe->session_id = ntohs(hdr->hdr.sid); > > + key_pppoe->ppp_proto = hdr->proto; > > + } > > break; > > } > > case htons(ETH_P_TIPC): { > > -- > > 2.35.1 > > Thanks, > Olek _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik 2022-06-24 15:01 ` Alexander Lobakin @ 2022-06-26 7:20 ` Baowen Zheng 2022-06-27 11:36 ` Drewek, Wojciech 1 sibling, 1 reply; 9+ messages in thread From: Baowen Zheng @ 2022-06-26 7:20 UTC (permalink / raw) To: Marcin Szycik, netdev Cc: zhangkaiheb, jiri, jhs, Simon Horman, kurt, paulb, gustavoars, jesse.brandeburg, edumazet, boris.sukholitko, komachi.yoshiki, kuba, xiyou.wangcong, elic, pabeni, davem, pablo, intel-wired-lan On Friday, June 24, 2022 9:42 PM, Marcin Szycik wrote: >Allow to dissect PPPoE specific fields which are: >- session ID (16 bits) >- ppp protocol (16 bits) > >The goal is to make the following TC command possible: > > # tc filter add dev ens6f0 ingress prio 1 protocol ppp_ses \ > flower \ > pppoe_sid 12 \ > ppp_proto ip \ > action drop > >Note that only PPPoE Session is supported. > >Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> >--- > include/net/flow_dissector.h | 11 ++++++++ > net/core/flow_dissector.c | 51 +++++++++++++++++++++++++++++++----- > 2 files changed, 56 insertions(+), 6 deletions(-) > >diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index >a4c6057c7097..8ff40c7c3f1c 100644 >--- a/include/net/flow_dissector.h >+++ b/include/net/flow_dissector.h >@@ -261,6 +261,16 @@ struct flow_dissector_key_num_of_vlans { > u8 num_of_vlans; > }; > [..] >+static bool is_ppp_proto_supported(__be16 proto) { >+ switch (proto) { >+ case htons(PPP_AT): >+ case htons(PPP_IPX): >+ case htons(PPP_VJC_COMP): >+ case htons(PPP_VJC_UNCOMP): >+ case htons(PPP_MP): >+ case htons(PPP_COMPFRAG): >+ case htons(PPP_COMP): >+ case htons(PPP_MPLS_UC): >+ case htons(PPP_MPLS_MC): >+ case htons(PPP_IPCP): >+ case htons(PPP_ATCP): >+ case htons(PPP_IPXCP): >+ case htons(PPP_IPV6CP): >+ case htons(PPP_CCPFRAG): >+ case htons(PPP_MPLSCP): >+ case htons(PPP_LCP): >+ case htons(PPP_PAP): >+ case htons(PPP_LQR): >+ case htons(PPP_CHAP): >+ case htons(PPP_CBCP): >+ return true; >+ default: >+ return false; >+ } >+} >+ Just a suggestion, for the above code segment, will it be more clean to change as the format: switch (ntohs(proto)) { case PPP_AT: case PPP_IPX: case PPP_VJC_COMP: then you will not need to call function of htons repeatedly. > /** > * __skb_flow_dissect - extract the flow_keys struct and return it > * @net: associated network namespace, derived from @skb if NULL @@ - >1221,19 +1250,29 @@ bool __skb_flow_dissect(const struct net *net, > } > > nhoff += PPPOE_SES_HLEN; >- switch (hdr->proto) { >- case htons(PPP_IP): >+ if (hdr->proto == htons(PPP_IP)) { > proto = htons(ETH_P_IP); > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; >- break; >- case htons(PPP_IPV6): >+ } else if (hdr->proto == htons(PPP_IPV6)) { > proto = htons(ETH_P_IPV6); > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; >- break; >- default: >+ } else if (is_ppp_proto_supported(hdr->proto)) { >+ fdret = FLOW_DISSECT_RET_OUT_GOOD; >+ } else { > fdret = FLOW_DISSECT_RET_OUT_BAD; > break; > } >+ >+ if (dissector_uses_key(flow_dissector, >+ FLOW_DISSECTOR_KEY_PPPOE)) { >+ struct flow_dissector_key_pppoe *key_pppoe; >+ >+ key_pppoe = >skb_flow_dissector_target(flow_dissector, >+ >FLOW_DISSECTOR_KEY_PPPOE, >+ target_container); >+ key_pppoe->session_id = ntohs(hdr->hdr.sid); >+ key_pppoe->ppp_proto = hdr->proto; >+ } > break; > } > case htons(ETH_P_TIPC): { >-- >2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors 2022-06-26 7:20 ` Baowen Zheng @ 2022-06-27 11:36 ` Drewek, Wojciech 0 siblings, 0 replies; 9+ messages in thread From: Drewek, Wojciech @ 2022-06-27 11:36 UTC (permalink / raw) To: Baowen Zheng, Marcin Szycik, netdev Cc: zhangkaiheb, jiri, jhs, Simon Horman, kurt, paulb, gustavoars, Brandeburg, Jesse, edumazet, boris.sukholitko, komachi.yoshiki, kuba, xiyou.wangcong, elic, pabeni, davem, pablo, intel-wired-lan Thanks for the review! > -----Original Message----- > From: Baowen Zheng <baowen.zheng@corigine.com> > Sent: niedziela, 26 czerwca 2022 09:20 > To: Marcin Szycik <marcin.szycik@linux.intel.com>; netdev@vger.kernel.org > Cc: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; davem@davemloft.net; xiyou.wangcong@gmail.com; Brandeburg, Jesse > <jesse.brandeburg@intel.com>; gustavoars@kernel.org; boris.sukholitko@broadcom.com; elic@nvidia.com; edumazet@google.com; > kuba@kernel.org; jhs@mojatatu.com; jiri@resnulli.us; kurt@linutronix.de; pablo@netfilter.org; pabeni@redhat.com; > paulb@nvidia.com; Simon Horman <simon.horman@corigine.com>; komachi.yoshiki@gmail.com; zhangkaiheb@126.com; intel-wired- > lan@lists.osuosl.org; michal.swiatkowski@linux.intel.com; Drewek, Wojciech <wojciech.drewek@intel.com> > Subject: RE: [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors > > On Friday, June 24, 2022 9:42 PM, Marcin Szycik wrote: > > >Allow to dissect PPPoE specific fields which are: > >- session ID (16 bits) > >- ppp protocol (16 bits) > > > >The goal is to make the following TC command possible: > > > > # tc filter add dev ens6f0 ingress prio 1 protocol ppp_ses \ > > flower \ > > pppoe_sid 12 \ > > ppp_proto ip \ > > action drop > > > >Note that only PPPoE Session is supported. > > > >Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> > >--- > > include/net/flow_dissector.h | 11 ++++++++ > > net/core/flow_dissector.c | 51 +++++++++++++++++++++++++++++++----- > > 2 files changed, 56 insertions(+), 6 deletions(-) > > > >diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index > >a4c6057c7097..8ff40c7c3f1c 100644 > >--- a/include/net/flow_dissector.h > >+++ b/include/net/flow_dissector.h > >@@ -261,6 +261,16 @@ struct flow_dissector_key_num_of_vlans { > > u8 num_of_vlans; > > }; > > > [..] > >+static bool is_ppp_proto_supported(__be16 proto) { > >+ switch (proto) { > >+ case htons(PPP_AT): > >+ case htons(PPP_IPX): > >+ case htons(PPP_VJC_COMP): > >+ case htons(PPP_VJC_UNCOMP): > >+ case htons(PPP_MP): > >+ case htons(PPP_COMPFRAG): > >+ case htons(PPP_COMP): > >+ case htons(PPP_MPLS_UC): > >+ case htons(PPP_MPLS_MC): > >+ case htons(PPP_IPCP): > >+ case htons(PPP_ATCP): > >+ case htons(PPP_IPXCP): > >+ case htons(PPP_IPV6CP): > >+ case htons(PPP_CCPFRAG): > >+ case htons(PPP_MPLSCP): > >+ case htons(PPP_LCP): > >+ case htons(PPP_PAP): > >+ case htons(PPP_LQR): > >+ case htons(PPP_CHAP): > >+ case htons(PPP_CBCP): > >+ return true; > >+ default: > >+ return false; > >+ } > >+} > >+ > Just a suggestion, for the above code segment, will it be more clean to change as the format: > switch (ntohs(proto)) { > case PPP_AT: > case PPP_IPX: > case PPP_VJC_COMP: > then you will not need to call function of htons repeatedly. Sure, will be included in second version. > > /** > > * __skb_flow_dissect - extract the flow_keys struct and return it > > * @net: associated network namespace, derived from @skb if NULL @@ - > >1221,19 +1250,29 @@ bool __skb_flow_dissect(const struct net *net, > > } > > > > nhoff += PPPOE_SES_HLEN; > >- switch (hdr->proto) { > >- case htons(PPP_IP): > >+ if (hdr->proto == htons(PPP_IP)) { > > proto = htons(ETH_P_IP); > > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > >- break; > >- case htons(PPP_IPV6): > >+ } else if (hdr->proto == htons(PPP_IPV6)) { > > proto = htons(ETH_P_IPV6); > > fdret = FLOW_DISSECT_RET_PROTO_AGAIN; > >- break; > >- default: > >+ } else if (is_ppp_proto_supported(hdr->proto)) { > >+ fdret = FLOW_DISSECT_RET_OUT_GOOD; > >+ } else { > > fdret = FLOW_DISSECT_RET_OUT_BAD; > > break; > > } > >+ > >+ if (dissector_uses_key(flow_dissector, > >+ FLOW_DISSECTOR_KEY_PPPOE)) { > >+ struct flow_dissector_key_pppoe *key_pppoe; > >+ > >+ key_pppoe = > >skb_flow_dissector_target(flow_dissector, > >+ > >FLOW_DISSECTOR_KEY_PPPOE, > >+ target_container); > >+ key_pppoe->session_id = ntohs(hdr->hdr.sid); > >+ key_pppoe->ppp_proto = hdr->proto; > >+ } > > break; > > } > > case htons(ETH_P_TIPC): { > >-- > >2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Intel-wired-lan] [RFC PATCH net-next 2/4] net/sched: flower: Add PPPoE filter 2022-06-24 13:41 [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik @ 2022-06-24 13:41 ` Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 3/4] flow_offload: Introduce flow_match_pppoe Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 4/4] ice: Add support for PPPoE hardware offload Marcin Szycik 3 siblings, 0 replies; 9+ messages in thread From: Marcin Szycik @ 2022-06-24 13:41 UTC (permalink / raw) To: netdev Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, jiri, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, gustavoars, davem From: Wojciech Drewek <wojciech.drewek@intel.com> Add support for PPPoE specific fields for tc-flower. Those fields can be provided only when protocol was set to ETH_P_PPP_SES. Defines, dump, load and set are being done here. Overwrite basic.n_proto only in case of PPP_IP and PPP_IPV6, otherwise leave it as ETH_P_PPP_SES. Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> --- include/uapi/linux/pkt_cls.h | 3 +++ net/sched/cls_flower.c | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h index 9a2ee1e39fad..a67dcd8294c9 100644 --- a/include/uapi/linux/pkt_cls.h +++ b/include/uapi/linux/pkt_cls.h @@ -589,6 +589,9 @@ enum { TCA_FLOWER_KEY_NUM_OF_VLANS, /* u8 */ + TCA_FLOWER_KEY_PPPOE_SID, /* u16 */ + TCA_FLOWER_KEY_PPP_PROTO, /* be16 */ + __TCA_FLOWER_MAX, }; diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index dcca70144dff..f6a0bb87f869 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -16,6 +16,7 @@ #include <linux/in6.h> #include <linux/ip.h> #include <linux/mpls.h> +#include <linux/ppp_defs.h> #include <net/sch_generic.h> #include <net/pkt_cls.h> @@ -73,6 +74,7 @@ struct fl_flow_key { struct flow_dissector_key_ct ct; struct flow_dissector_key_hash hash; struct flow_dissector_key_num_of_vlans num_of_vlans; + struct flow_dissector_key_pppoe pppoe; } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */ struct fl_flow_mask_range { @@ -714,6 +716,8 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = { [TCA_FLOWER_KEY_HASH] = { .type = NLA_U32 }, [TCA_FLOWER_KEY_HASH_MASK] = { .type = NLA_U32 }, [TCA_FLOWER_KEY_NUM_OF_VLANS] = { .type = NLA_U8 }, + [TCA_FLOWER_KEY_PPPOE_SID] = { .type = NLA_U16 }, + [TCA_FLOWER_KEY_PPP_PROTO] = { .type = NLA_U16 }, }; @@ -1041,6 +1045,32 @@ static void fl_set_key_vlan(struct nlattr **tb, } } +static void fl_set_key_pppoe(struct nlattr **tb, + struct flow_dissector_key_pppoe *key_val, + struct flow_dissector_key_pppoe *key_mask, + struct fl_flow_key *key, + struct fl_flow_key *mask) +{ + if (tb[TCA_FLOWER_KEY_PPPOE_SID]) { + key_val->session_id = + nla_get_u16(tb[TCA_FLOWER_KEY_PPPOE_SID]); + key_mask->session_id = 0xffff; + } + if (tb[TCA_FLOWER_KEY_PPP_PROTO]) { + key_val->ppp_proto = + nla_get_be16(tb[TCA_FLOWER_KEY_PPP_PROTO]); + key_mask->ppp_proto = cpu_to_be16(~0); + + if (key_val->ppp_proto == htons(PPP_IP)) { + key->basic.n_proto = htons(ETH_P_IP); + mask->basic.n_proto = cpu_to_be16(~0); + } else if (key_val->ppp_proto == htons(PPP_IPV6)) { + key->basic.n_proto = htons(ETH_P_IPV6); + mask->basic.n_proto = cpu_to_be16(~0); + } + } +} + static void fl_set_key_flag(u32 flower_key, u32 flower_mask, u32 *dissector_key, u32 *dissector_mask, u32 flower_flag_bit, u32 dissector_flag_bit) @@ -1651,6 +1681,9 @@ static int fl_set_key(struct net *net, struct nlattr **tb, } } + if (key->basic.n_proto == htons(ETH_P_PPP_SES)) + fl_set_key_pppoe(tb, &key->pppoe, &mask->pppoe, key, mask); + if (key->basic.n_proto == htons(ETH_P_IP) || key->basic.n_proto == htons(ETH_P_IPV6)) { fl_set_key_val(tb, &key->basic.ip_proto, TCA_FLOWER_KEY_IP_PROTO, @@ -1923,6 +1956,8 @@ static void fl_init_dissector(struct flow_dissector *dissector, FLOW_DISSECTOR_KEY_HASH, hash); FL_KEY_SET_IF_MASKED(mask, keys, cnt, FLOW_DISSECTOR_KEY_NUM_OF_VLANS, num_of_vlans); + FL_KEY_SET_IF_MASKED(mask, keys, cnt, + FLOW_DISSECTOR_KEY_PPPOE, pppoe); skb_flow_dissector_init(dissector, keys, cnt); } @@ -3051,6 +3086,17 @@ static int fl_dump_key(struct sk_buff *skb, struct net *net, fl_dump_key_ip(skb, false, &key->ip, &mask->ip))) goto nla_put_failure; + if (mask->pppoe.session_id) { + if (nla_put_u16(skb, TCA_FLOWER_KEY_PPPOE_SID, + key->pppoe.session_id)) + goto nla_put_failure; + } + if (mask->basic.n_proto && mask->pppoe.ppp_proto) { + if (nla_put_be16(skb, TCA_FLOWER_KEY_PPP_PROTO, + key->pppoe.ppp_proto)) + goto nla_put_failure; + } + if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS && (fl_dump_key_val(skb, &key->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC, &mask->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC_MASK, -- 2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Intel-wired-lan] [RFC PATCH net-next 3/4] flow_offload: Introduce flow_match_pppoe 2022-06-24 13:41 [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 2/4] net/sched: flower: Add PPPoE filter Marcin Szycik @ 2022-06-24 13:41 ` Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 4/4] ice: Add support for PPPoE hardware offload Marcin Szycik 3 siblings, 0 replies; 9+ messages in thread From: Marcin Szycik @ 2022-06-24 13:41 UTC (permalink / raw) To: netdev Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, jiri, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, gustavoars, davem From: Wojciech Drewek <wojciech.drewek@intel.com> Allow to offload PPPoE filters by adding flow_rule_match_pppoe. Drivers can extract PPPoE specific fields from now on. Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> --- include/net/flow_offload.h | 6 ++++++ net/core/flow_offload.c | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h index 6484095a8c01..50283a30b97b 100644 --- a/include/net/flow_offload.h +++ b/include/net/flow_offload.h @@ -72,6 +72,10 @@ struct flow_match_ct { struct flow_dissector_key_ct *key, *mask; }; +struct flow_match_pppoe { + struct flow_dissector_key_pppoe *key, *mask; +}; + struct flow_rule; void flow_rule_match_meta(const struct flow_rule *rule, @@ -116,6 +120,8 @@ void flow_rule_match_enc_opts(const struct flow_rule *rule, struct flow_match_enc_opts *out); void flow_rule_match_ct(const struct flow_rule *rule, struct flow_match_ct *out); +void flow_rule_match_pppoe(const struct flow_rule *rule, + struct flow_match_pppoe *out); enum flow_action_id { FLOW_ACTION_ACCEPT = 0, diff --git a/net/core/flow_offload.c b/net/core/flow_offload.c index 929f6379a279..d13d293e3de2 100644 --- a/net/core/flow_offload.c +++ b/net/core/flow_offload.c @@ -223,6 +223,13 @@ void flow_rule_match_ct(const struct flow_rule *rule, } EXPORT_SYMBOL(flow_rule_match_ct); +void flow_rule_match_pppoe(const struct flow_rule *rule, + struct flow_match_pppoe *out) +{ + FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PPPOE, out); +} +EXPORT_SYMBOL(flow_rule_match_pppoe); + struct flow_block_cb *flow_block_cb_alloc(flow_setup_cb_t *cb, void *cb_ident, void *cb_priv, void (*release)(void *cb_priv)) -- 2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Intel-wired-lan] [RFC PATCH net-next 4/4] ice: Add support for PPPoE hardware offload 2022-06-24 13:41 [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support Marcin Szycik ` (2 preceding siblings ...) 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 3/4] flow_offload: Introduce flow_match_pppoe Marcin Szycik @ 2022-06-24 13:41 ` Marcin Szycik 3 siblings, 0 replies; 9+ messages in thread From: Marcin Szycik @ 2022-06-24 13:41 UTC (permalink / raw) To: netdev Cc: simon.horman, kurt, paulb, edumazet, boris.sukholitko, jiri, elic, intel-wired-lan, kuba, zhangkaiheb, pablo, baowen.zheng, komachi.yoshiki, jhs, xiyou.wangcong, pabeni, gustavoars, davem Add support for creating PPPoE filters in switchdev mode. Add support for parsing PPPoE and PPP-specific tc options: pppoe_sid and ppp_proto. Example filter: tc filter add dev $PF1 ingress protocol ppp_ses prio 1 flower pppoe_sid \ 1234 ppp_proto ip skip_sw action mirred egress redirect dev $VF1_PR Changes in iproute2 are required to use the new fields. ICE COMMS DDP package is required to create a filter as it contains PPPoE profiles. Added a warning message when loaded DDP package does not contain required profiles. Note: currently matching on vlan + PPPoE fields is not supported. Patch [0] will add this feature. [0] https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20220420210048.5809-1-martyna.szapar-mudlaw@intel.com Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com> --- drivers/net/ethernet/intel/ice/ice.h | 1 + .../net/ethernet/intel/ice/ice_flex_pipe.c | 5 +- .../ethernet/intel/ice/ice_protocol_type.h | 11 ++ drivers/net/ethernet/intel/ice/ice_switch.c | 165 ++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_tc_lib.c | 94 ++++++++-- drivers/net/ethernet/intel/ice/ice_tc_lib.h | 8 + 6 files changed, 273 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index 60453b3b8d23..0e48a930f004 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -52,6 +52,7 @@ #include <net/udp_tunnel.h> #include <net/vxlan.h> #include <net/gtp.h> +#include <linux/ppp_defs.h> #include "ice_devids.h" #include "ice_type.h" #include "ice_txrx.h" diff --git a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c index c73cdab44f70..14fdd73a83be 100644 --- a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c +++ b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c @@ -1964,8 +1964,11 @@ ice_get_sw_fv_list(struct ice_hw *hw, struct ice_prot_lkup_ext *lkups, } } } while (fv); - if (list_empty(fv_list)) + if (list_empty(fv_list)) { + dev_warn(ice_hw_to_dev(hw), "Required profiles not found in currently loaded DDP package"); return -EIO; + } + return 0; err: diff --git a/drivers/net/ethernet/intel/ice/ice_protocol_type.h b/drivers/net/ethernet/intel/ice/ice_protocol_type.h index 3f64300b0e14..4b7471a25551 100644 --- a/drivers/net/ethernet/intel/ice/ice_protocol_type.h +++ b/drivers/net/ethernet/intel/ice/ice_protocol_type.h @@ -43,6 +43,7 @@ enum ice_protocol_type { ICE_NVGRE, ICE_GTP, ICE_GTP_NO_PAY, + ICE_PPPOE, ICE_VXLAN_GPE, ICE_SCTP_IL, ICE_PROTOCOL_LAST @@ -107,6 +108,7 @@ enum ice_prot_id { #define ICE_TCP_IL_HW 49 #define ICE_UDP_ILOS_HW 53 #define ICE_GRE_OF_HW 64 +#define ICE_PPPOE_HW 103 #define ICE_UDP_OF_HW 52 /* UDP Tunnels */ #define ICE_META_DATA_ID_HW 255 /* this is used for tunnel type */ @@ -200,6 +202,14 @@ struct ice_udp_gtp_hdr { u8 rsvrd; }; +struct ice_pppoe_hdr { + u8 rsrvd_ver_type; + u8 rsrvd_code; + __be16 session_id; + __be16 length; + __be16 ppp_prot_id; /* control and data only */ +}; + struct ice_nvgre_hdr { __be16 flags; __be16 protocol; @@ -217,6 +227,7 @@ union ice_prot_hdr { struct ice_udp_tnl_hdr tnl_hdr; struct ice_nvgre_hdr nvgre_hdr; struct ice_udp_gtp_hdr gtp_hdr; + struct ice_pppoe_hdr pppoe_hdr; }; /* This is mapping table entry that maps every word within a given protocol diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 8d8f3eec79ee..99af56264f8a 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -41,6 +41,7 @@ enum { ICE_PKT_INNER_TCP = BIT(7), ICE_PKT_INNER_UDP = BIT(8), ICE_PKT_GTP_NOPAY = BIT(9), + ICE_PKT_PPPOE = BIT(10), }; struct ice_dummy_pkt_offsets { @@ -1233,6 +1234,154 @@ ICE_DECLARE_PKT_TEMPLATE(ipv6_gtp) = { 0x00, 0x00, }; +ICE_DECLARE_PKT_OFFSETS(pppoe_ipv4_tcp) = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_PPPOE, 14 }, + { ICE_IPV4_OFOS, 22 }, + { ICE_TCP_IL, 42 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +ICE_DECLARE_PKT_TEMPLATE(pppoe_ipv4_tcp) = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x88, 0x64, /* ICE_ETYPE_OL 12 */ + + 0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 14 */ + 0x00, 0x16, + + 0x00, 0x21, /* PPP Link Layer 20 */ + + 0x45, 0x00, 0x00, 0x28, /* ICE_IPV4_OFOS 22 */ + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 42 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, /* 2 bytes for 4 bytes alignment */ +}; + +ICE_DECLARE_PKT_OFFSETS(pppoe_ipv4_udp) = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_PPPOE, 14 }, + { ICE_IPV4_OFOS, 22 }, + { ICE_UDP_ILOS, 42 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +ICE_DECLARE_PKT_TEMPLATE(pppoe_ipv4_udp) = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x88, 0x64, /* ICE_ETYPE_OL 12 */ + + 0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 14 */ + 0x00, 0x16, + + 0x00, 0x21, /* PPP Link Layer 20 */ + + 0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_OFOS 22 */ + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 42 */ + 0x00, 0x08, 0x00, 0x00, + + 0x00, 0x00, /* 2 bytes for 4 bytes alignment */ +}; + +ICE_DECLARE_PKT_OFFSETS(pppoe_ipv6_tcp) = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_PPPOE, 14 }, + { ICE_IPV6_OFOS, 22 }, + { ICE_TCP_IL, 62 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +ICE_DECLARE_PKT_TEMPLATE(pppoe_ipv6_tcp) = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x88, 0x64, /* ICE_ETYPE_OL 12 */ + + 0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 14 */ + 0x00, 0x2a, + + 0x00, 0x57, /* PPP Link Layer 20 */ + + 0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 22 */ + 0x00, 0x14, 0x06, 0x00, /* Next header is TCP */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 62 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, /* 2 bytes for 4 bytes alignment */ +}; + +ICE_DECLARE_PKT_OFFSETS(pppoe_ipv6_udp) = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_PPPOE, 14 }, + { ICE_IPV6_OFOS, 22 }, + { ICE_UDP_ILOS, 62 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +ICE_DECLARE_PKT_TEMPLATE(pppoe_ipv6_udp) = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x88, 0x64, /* ICE_ETYPE_OL 12 */ + + 0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 14 */ + 0x00, 0x2a, + + 0x00, 0x57, /* PPP Link Layer 20 */ + + 0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 22 */ + 0x00, 0x08, 0x11, 0x00, /* Next header UDP*/ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 62 */ + 0x00, 0x08, 0x00, 0x00, + + 0x00, 0x00, /* 2 bytes for 4 bytes alignment */ +}; + static const struct ice_dummy_pkt_profile ice_dummy_pkt_profiles[] = { ICE_PKT_PROFILE(ipv6_gtp, ICE_PKT_TUN_GTPU | ICE_PKT_OUTER_IPV6 | ICE_PKT_GTP_NOPAY), @@ -1259,6 +1408,11 @@ static const struct ice_dummy_pkt_profile ice_dummy_pkt_profiles[] = { ICE_PKT_PROFILE(ipv4_gtpu_ipv4_tcp, ICE_PKT_TUN_GTPU), ICE_PKT_PROFILE(ipv6_gtp, ICE_PKT_TUN_GTPC | ICE_PKT_OUTER_IPV6), ICE_PKT_PROFILE(ipv4_gtpu_ipv4, ICE_PKT_TUN_GTPC), + ICE_PKT_PROFILE(pppoe_ipv6_udp, ICE_PKT_PPPOE | ICE_PKT_OUTER_IPV6 | + ICE_PKT_INNER_UDP), + ICE_PKT_PROFILE(pppoe_ipv6_tcp, ICE_PKT_PPPOE | ICE_PKT_OUTER_IPV6), + ICE_PKT_PROFILE(pppoe_ipv4_udp, ICE_PKT_PPPOE | ICE_PKT_INNER_UDP), + ICE_PKT_PROFILE(pppoe_ipv4_tcp, ICE_PKT_PPPOE), ICE_PKT_PROFILE(gre_ipv6_tcp, ICE_PKT_TUN_NVGRE | ICE_PKT_INNER_IPV6 | ICE_PKT_INNER_TCP), ICE_PKT_PROFILE(gre_tcp, ICE_PKT_TUN_NVGRE | ICE_PKT_INNER_TCP), @@ -4609,6 +4763,7 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = { { ICE_NVGRE, { 0, 2, 4, 6 } }, { ICE_GTP, { 8, 10, 12, 14, 16, 18, 20, 22 } }, { ICE_GTP_NO_PAY, { 8, 10, 12, 14 } }, + { ICE_PPPOE, { 0, 2, 4, 6 } }, }; static struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = { @@ -4629,6 +4784,7 @@ static struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = { { ICE_NVGRE, ICE_GRE_OF_HW }, { ICE_GTP, ICE_UDP_OF_HW }, { ICE_GTP_NO_PAY, ICE_UDP_ILOS_HW }, + { ICE_PPPOE, ICE_PPPOE_HW }, }; /** @@ -5615,6 +5771,12 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt, match |= ICE_PKT_INNER_IPV6; else if (lkups[i].type == ICE_GTP_NO_PAY) match |= ICE_PKT_GTP_NOPAY; + else if (lkups[i].type == ICE_PPPOE) { + match |= ICE_PKT_PPPOE; + if (lkups[i].h_u.pppoe_hdr.ppp_prot_id == + htons(PPP_IPV6)) + match |= ICE_PKT_OUTER_IPV6; + } } while (ret->match && (match & ret->match) != ret->match) @@ -5707,6 +5869,9 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt, case ICE_GTP: len = sizeof(struct ice_udp_gtp_hdr); break; + case ICE_PPPOE: + len = sizeof(struct ice_pppoe_hdr); + break; default: return -EINVAL; } diff --git a/drivers/net/ethernet/intel/ice/ice_tc_lib.c b/drivers/net/ethernet/intel/ice/ice_tc_lib.c index b803f2ab3cc7..3e97d0736d67 100644 --- a/drivers/net/ethernet/intel/ice/ice_tc_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_tc_lib.c @@ -50,6 +50,11 @@ ice_tc_count_lkups(u32 flags, struct ice_tc_flower_lyr_2_4_hdrs *headers, if (flags & ICE_TC_FLWR_FIELD_VLAN) lkups_cnt++; + /* are PPPoE options specified? */ + if (flags & (ICE_TC_FLWR_FIELD_PPPOE_SESSID | + ICE_TC_FLWR_FIELD_PPP_PROTO)) + lkups_cnt++; + /* are IPv[4|6] fields specified? */ if (flags & (ICE_TC_FLWR_FIELD_DEST_IPV4 | ICE_TC_FLWR_FIELD_SRC_IPV4 | ICE_TC_FLWR_FIELD_DEST_IPV6 | ICE_TC_FLWR_FIELD_SRC_IPV6)) @@ -317,6 +322,28 @@ ice_tc_fill_rules(struct ice_hw *hw, u32 flags, i++; } + if (flags & (ICE_TC_FLWR_FIELD_PPPOE_SESSID | + ICE_TC_FLWR_FIELD_PPP_PROTO)) { + struct ice_pppoe_hdr *vals, *masks; + + vals = &list[i].h_u.pppoe_hdr; + masks = &list[i].m_u.pppoe_hdr; + + list[i].type = ICE_PPPOE; + + if (flags & ICE_TC_FLWR_FIELD_PPPOE_SESSID) { + vals->session_id = headers->pppoe_hdr.session_id; + masks->session_id = cpu_to_be16(0xFFFF); + } + + if (flags & ICE_TC_FLWR_FIELD_PPP_PROTO) { + vals->ppp_prot_id = headers->pppoe_hdr.ppp_proto; + masks->ppp_prot_id = cpu_to_be16(0xFFFF); + } + + i++; + } + /* copy L3 (IPv[4|6]: src, dest) address */ if (flags & (ICE_TC_FLWR_FIELD_DEST_IPV4 | ICE_TC_FLWR_FIELD_SRC_IPV4)) { @@ -660,6 +687,32 @@ ice_add_tc_flower_adv_fltr(struct ice_vsi *vsi, return ret; } +/** + * ice_tc_set_pppoe - Parse PPPoE fields from TC flower filter + * @match: Pointer to flow match structure + * @fltr: Pointer to filter structure + * @headers: Pointer to outer header fields + * @returns Whether ppp_proto field was used + */ +static bool +ice_tc_set_pppoe(struct flow_match_pppoe *match, + struct ice_tc_flower_fltr *fltr, + struct ice_tc_flower_lyr_2_4_hdrs *headers) +{ + if (match->mask->session_id) { + fltr->flags |= ICE_TC_FLWR_FIELD_PPPOE_SESSID; + headers->pppoe_hdr.session_id = cpu_to_be16(match->key->session_id); + } + + if (match->mask->ppp_proto) { + fltr->flags |= ICE_TC_FLWR_FIELD_PPP_PROTO; + headers->pppoe_hdr.ppp_proto = match->key->ppp_proto; + return true; + } + + return false; +} + /** * ice_tc_set_ipv4 - Parse IPv4 addresses from TC flower filter * @match: Pointer to flow match structure @@ -937,6 +990,7 @@ ice_parse_cls_flower(struct net_device *filter_dev, struct ice_vsi *vsi, u16 n_proto_mask = 0, n_proto_key = 0, addr_type = 0; struct flow_dissector *dissector; struct net_device *tunnel_dev; + bool ppp_proto_present = false; dissector = rule->match.dissector; @@ -954,7 +1008,8 @@ ice_parse_cls_flower(struct net_device *filter_dev, struct ice_vsi *vsi, BIT(FLOW_DISSECTOR_KEY_ENC_PORTS) | BIT(FLOW_DISSECTOR_KEY_ENC_OPTS) | BIT(FLOW_DISSECTOR_KEY_ENC_IP) | - BIT(FLOW_DISSECTOR_KEY_PORTS))) { + BIT(FLOW_DISSECTOR_KEY_PORTS) | + BIT(FLOW_DISSECTOR_KEY_PPPOE))) { NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported key used"); return -EOPNOTSUPP; } @@ -986,21 +1041,40 @@ ice_parse_cls_flower(struct net_device *filter_dev, struct ice_vsi *vsi, fltr->tunnel_type = TNL_LAST; } + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PPPOE)) { + struct flow_match_pppoe match; + + flow_rule_match_pppoe(rule, &match); + ppp_proto_present = ice_tc_set_pppoe(&match, fltr, headers); + } + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_BASIC)) { struct flow_match_basic match; flow_rule_match_basic(rule, &match); - n_proto_key = ntohs(match.key->n_proto); - n_proto_mask = ntohs(match.mask->n_proto); - - if (n_proto_key == ETH_P_ALL || n_proto_key == 0 || - fltr->tunnel_type == TNL_GTPU || - fltr->tunnel_type == TNL_GTPC) { - n_proto_key = 0; - n_proto_mask = 0; + if (ppp_proto_present) { + /* When ppp_proto field is specified, it also overwrites + * ethertype field with its value. E.g. if tc command is + * ... protocol ppp_ses ... ppp_proto ip ... + * it will result in ppp_proto=ip and n_proto_key=ip. + * n_proto_key needs to be set to the proper value, + * i.e. ppp_ses. + */ + n_proto_key = ETH_P_PPP_SES; + n_proto_mask = 0xFFFF; } else { - fltr->flags |= ICE_TC_FLWR_FIELD_ETH_TYPE_ID; + n_proto_key = ntohs(match.key->n_proto); + n_proto_mask = ntohs(match.mask->n_proto); + + if (n_proto_key == ETH_P_ALL || n_proto_key == 0 || + fltr->tunnel_type == TNL_GTPU || + fltr->tunnel_type == TNL_GTPC) { + n_proto_key = 0; + n_proto_mask = 0; + } else { + fltr->flags |= ICE_TC_FLWR_FIELD_ETH_TYPE_ID; + } } headers->l2_key.n_proto = cpu_to_be16(n_proto_key); diff --git a/drivers/net/ethernet/intel/ice/ice_tc_lib.h b/drivers/net/ethernet/intel/ice/ice_tc_lib.h index e25e958f4396..efbd9c0a54ec 100644 --- a/drivers/net/ethernet/intel/ice/ice_tc_lib.h +++ b/drivers/net/ethernet/intel/ice/ice_tc_lib.h @@ -23,6 +23,8 @@ #define ICE_TC_FLWR_FIELD_ENC_DST_MAC BIT(16) #define ICE_TC_FLWR_FIELD_ETH_TYPE_ID BIT(17) #define ICE_TC_FLWR_FIELD_ENC_OPTS BIT(18) +#define ICE_TC_FLWR_FIELD_PPPOE_SESSID BIT(19) +#define ICE_TC_FLWR_FIELD_PPP_PROTO BIT(20) #define ICE_TC_FLOWER_MASK_32 0xFFFFFFFF @@ -42,6 +44,11 @@ struct ice_tc_vlan_hdr { u16 vlan_prio; /* Only last 3 bits valid (valid values: 0..7) */ }; +struct ice_tc_pppoe_hdr { + __be16 session_id; + __be16 ppp_proto; +}; + struct ice_tc_l2_hdr { u8 dst_mac[ETH_ALEN]; u8 src_mac[ETH_ALEN]; @@ -81,6 +88,7 @@ struct ice_tc_flower_lyr_2_4_hdrs { struct ice_tc_l2_hdr l2_key; struct ice_tc_l2_hdr l2_mask; struct ice_tc_vlan_hdr vlan_hdr; + struct ice_tc_pppoe_hdr pppoe_hdr; /* L3 (IPv4[6]) layer fields with their mask */ struct ice_tc_l3_hdr l3_key; struct ice_tc_l3_hdr l3_mask; -- 2.35.1 _______________________________________________ Intel-wired-lan mailing list Intel-wired-lan@osuosl.org https://lists.osuosl.org/mailman/listinfo/intel-wired-lan ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-06-27 13:59 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-06-24 13:41 [Intel-wired-lan] [RFC PATCH net-next 0/4] ice: PPPoE offload support Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 1/4] flow_dissector: Add PPPoE dissectors Marcin Szycik 2022-06-24 15:01 ` Alexander Lobakin 2022-06-27 11:33 ` Drewek, Wojciech 2022-06-26 7:20 ` Baowen Zheng 2022-06-27 11:36 ` Drewek, Wojciech 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 2/4] net/sched: flower: Add PPPoE filter Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 3/4] flow_offload: Introduce flow_match_pppoe Marcin Szycik 2022-06-24 13:41 ` [Intel-wired-lan] [RFC PATCH net-next 4/4] ice: Add support for PPPoE hardware offload Marcin Szycik
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).