* [PATCH net-next 0/3] net/sched: cls_flower: Add support for matching on dissection flags
@ 2016-12-06 12:32 Or Gerlitz
2016-12-06 12:32 ` [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers Or Gerlitz
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Or Gerlitz @ 2016-12-06 12:32 UTC (permalink / raw)
To: David S. Miller; +Cc: netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Or Gerlitz
This series add the UAPI to provide set of flags for matching, where the
flags provided from user-space are mapped to flow-dissector flags.
The 1st flag allows to match on whether the packet is an
IP fragment and corresponds to the FLOW_DIS_IS_FRAGMENT flag.
Or
Or Gerlitz (3):
net/flow_dissector: Enable matching on flags for TC filter consumers
net/sched: cls_flower: Add support for matching on flags
net/mlx5e: Offload TC matching on packets being IP fragments
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 12 ++++
include/net/flow_dissector.h | 2 +-
include/uapi/linux/pkt_cls.h | 7 +++
net/sched/cls_flower.c | 83 +++++++++++++++++++++++++
4 files changed, 103 insertions(+), 1 deletion(-)
--
2.3.7
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers 2016-12-06 12:32 [PATCH net-next 0/3] net/sched: cls_flower: Add support for matching on dissection flags Or Gerlitz @ 2016-12-06 12:32 ` Or Gerlitz 2016-12-06 12:43 ` Jiri Pirko 2016-12-06 12:32 ` [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 3/3] net/mlx5e: Offload TC matching on packets being IP fragments Or Gerlitz 2 siblings, 1 reply; 8+ messages in thread From: Or Gerlitz @ 2016-12-06 12:32 UTC (permalink / raw) To: David S. Miller Cc: netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Or Gerlitz, Tom Herbert This is a pre-step to allow TC classifiers that makes use of the flow-dissector (e.g Flower) to match on flow-dissector flags which are located in the control struct. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> --- include/net/flow_dissector.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index c4f3166..a679e6c 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h @@ -154,8 +154,8 @@ struct flow_dissector { }; struct flow_keys { +#define FLOW_KEYS_HASH_START_FIELD control struct flow_dissector_key_control control; -#define FLOW_KEYS_HASH_START_FIELD basic struct flow_dissector_key_basic basic; struct flow_dissector_key_tags tags; struct flow_dissector_key_vlan vlan; -- 2.3.7 Cc: Tom Herbert <tom@herbertland.com> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers 2016-12-06 12:32 ` [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers Or Gerlitz @ 2016-12-06 12:43 ` Jiri Pirko 2016-12-06 20:51 ` Or Gerlitz 0 siblings, 1 reply; 8+ messages in thread From: Jiri Pirko @ 2016-12-06 12:43 UTC (permalink / raw) To: Or Gerlitz Cc: David S. Miller, netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Tom Herbert Tue, Dec 06, 2016 at 01:32:57PM CET, ogerlitz@mellanox.com wrote: >This is a pre-step to allow TC classifiers that makes use of the >flow-dissector (e.g Flower) to match on flow-dissector flags which >are located in the control struct. > >Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> >--- > include/net/flow_dissector.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > >diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h >index c4f3166..a679e6c 100644 >--- a/include/net/flow_dissector.h >+++ b/include/net/flow_dissector.h >@@ -154,8 +154,8 @@ struct flow_dissector { > }; > > struct flow_keys { >+#define FLOW_KEYS_HASH_START_FIELD control > struct flow_dissector_key_control control; >-#define FLOW_KEYS_HASH_START_FIELD basic How is this hashing related to cls_flower dissections? What am I missing? ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers 2016-12-06 12:43 ` Jiri Pirko @ 2016-12-06 20:51 ` Or Gerlitz 0 siblings, 0 replies; 8+ messages in thread From: Or Gerlitz @ 2016-12-06 20:51 UTC (permalink / raw) To: Jiri Pirko Cc: Or Gerlitz, David S. Miller, Linux Netdev List, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Tom Herbert On Tue, Dec 6, 2016 at 2:43 PM, Jiri Pirko <jiri@resnulli.us> wrote: > Tue, Dec 06, 2016 at 01:32:57PM CET, ogerlitz@mellanox.com wrote: >> struct flow_keys { >>+#define FLOW_KEYS_HASH_START_FIELD control >> struct flow_dissector_key_control control; >>-#define FLOW_KEYS_HASH_START_FIELD basic > How is this hashing related to cls_flower dissections? What am I > missing? Oops, this is my bad. I convinced myself that flower dissections will not work for any field which is not accounted for hash start field, I was wrong, dropping this patch. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags 2016-12-06 12:32 [PATCH net-next 0/3] net/sched: cls_flower: Add support for matching on dissection flags Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers Or Gerlitz @ 2016-12-06 12:32 ` Or Gerlitz 2016-12-06 12:40 ` Jiri Pirko 2016-12-06 12:32 ` [PATCH net-next 3/3] net/mlx5e: Offload TC matching on packets being IP fragments Or Gerlitz 2 siblings, 1 reply; 8+ messages in thread From: Or Gerlitz @ 2016-12-06 12:32 UTC (permalink / raw) To: David S. Miller; +Cc: netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Or Gerlitz Add UAPI to provide set of flags for matching, where the flags provided from user-space are mapped to flow-dissector flags. The 1st flag allows to match on whether the packet is an IP fragment and corresponds to the FLOW_DIS_IS_FRAGMENT flag. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reviewed-by: Paul Blakey <paulb@mellanox.com> --- include/uapi/linux/pkt_cls.h | 7 ++++ net/sched/cls_flower.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h index 86786d4..f114277 100644 --- a/include/uapi/linux/pkt_cls.h +++ b/include/uapi/linux/pkt_cls.h @@ -457,11 +457,18 @@ enum { TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ + + TCA_FLOWER_KEY_FLAGS, /* be32 */ + TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ __TCA_FLOWER_MAX, }; #define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = BIT(0), +}; + /* Match-all classifier */ enum { diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index c5cea78..d9f4124 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -383,6 +383,8 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = { [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK] = { .type = NLA_U16 }, [TCA_FLOWER_KEY_ENC_UDP_DST_PORT] = { .type = NLA_U16 }, [TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK] = { .type = NLA_U16 }, + [TCA_FLOWER_KEY_FLAGS] = { .type = NLA_U32 }, + [TCA_FLOWER_KEY_FLAGS_MASK] = { .type = NLA_U32 }, }; static void fl_set_key_val(struct nlattr **tb, @@ -417,6 +419,40 @@ static void fl_set_key_vlan(struct nlattr **tb, } } +static void set_flags(u32 flower_key, u32 flower_mask, + u32 *dissector_key, u32 *dissector_mask, + u32 flower_flag_bit, u32 dissector_flag_bit) +{ + if (flower_mask & flower_flag_bit) { + *dissector_mask |= dissector_flag_bit; + if (flower_key & flower_flag_bit) + *dissector_key |= dissector_flag_bit; + } +} + +static void fl_set_key_flags(struct nlattr **tb, + u32 *flags_key, + u32 *flags_mask) +{ + u32 key, mask; + + if (!tb[TCA_FLOWER_KEY_FLAGS]) + return; + + key = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS])); + + if (!tb[TCA_FLOWER_KEY_FLAGS_MASK]) + mask = ~0; + else + mask = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS_MASK])); + + *flags_key = 0; + *flags_mask = 0; + + set_flags(key, mask, flags_key, flags_mask, + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); +} + static int fl_set_key(struct net *net, struct nlattr **tb, struct fl_flow_key *key, struct fl_flow_key *mask) { @@ -543,6 +579,8 @@ static int fl_set_key(struct net *net, struct nlattr **tb, &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, sizeof(key->enc_tp.dst)); + fl_set_key_flags(tb, &key->control.flags, &mask->control.flags); + return 0; } @@ -877,6 +915,48 @@ static int fl_dump_key_vlan(struct sk_buff *skb, return 0; } +static void get_flags(u32 dissector_key, u32 dissector_mask, + u32 *flower_key, u32 *flower_mask, + u32 flower_flag_bit, u32 dissector_flag_bit) +{ + if (dissector_mask & dissector_flag_bit) { + *flower_mask |= flower_flag_bit; + if (dissector_key & dissector_flag_bit) + *flower_key |= flower_flag_bit; + } +} + +static int fl_dump_key_flags(struct sk_buff *skb, + u32 flags_key, + u32 flags_mask) +{ + u32 key, mask; + __be32 _key, _mask; + int err; + + if (!memchr_inv(&flags_mask, 0, sizeof(flags_mask))) + return 0; + + key = 0; + mask = 0; + + get_flags(flags_key, flags_mask, &key, &mask, + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); + + _key = cpu_to_be32(key); + _mask = cpu_to_be32(mask); + + err = nla_put(skb, TCA_FLOWER_KEY_FLAGS, 4, &_key); + if (err) + return err; + + err = nla_put(skb, TCA_FLOWER_KEY_FLAGS_MASK, 4, &_mask); + if (err) + return err; + + return 0; +} + static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, struct sk_buff *skb, struct tcmsg *t) { @@ -1012,6 +1092,9 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, sizeof(key->enc_tp.dst))) goto nla_put_failure; + if (fl_dump_key_flags(skb, key->control.flags, mask->control.flags)) + goto nla_put_failure; + nla_put_u32(skb, TCA_FLOWER_FLAGS, f->flags); if (tcf_exts_dump(skb, &f->exts)) -- 2.3.7 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags 2016-12-06 12:32 ` [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags Or Gerlitz @ 2016-12-06 12:40 ` Jiri Pirko 2016-12-06 14:02 ` Or Gerlitz 0 siblings, 1 reply; 8+ messages in thread From: Jiri Pirko @ 2016-12-06 12:40 UTC (permalink / raw) To: Or Gerlitz; +Cc: David S. Miller, netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion Tue, Dec 06, 2016 at 01:32:58PM CET, ogerlitz@mellanox.com wrote: >Add UAPI to provide set of flags for matching, where the flags >provided from user-space are mapped to flow-dissector flags. > >The 1st flag allows to match on whether the packet is an >IP fragment and corresponds to the FLOW_DIS_IS_FRAGMENT flag. > >Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> >Reviewed-by: Paul Blakey <paulb@mellanox.com> >--- > include/uapi/linux/pkt_cls.h | 7 ++++ > net/sched/cls_flower.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 90 insertions(+) > >diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h >index 86786d4..f114277 100644 >--- a/include/uapi/linux/pkt_cls.h >+++ b/include/uapi/linux/pkt_cls.h >@@ -457,11 +457,18 @@ enum { > TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ > TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ > TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ >+ >+ TCA_FLOWER_KEY_FLAGS, /* be32 */ >+ TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ > __TCA_FLOWER_MAX, > }; > > #define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) > >+enum { >+ TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = BIT(0), >+}; >+ > /* Match-all classifier */ > > enum { >diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c >index c5cea78..d9f4124 100644 >--- a/net/sched/cls_flower.c >+++ b/net/sched/cls_flower.c >@@ -383,6 +383,8 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = { > [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK] = { .type = NLA_U16 }, > [TCA_FLOWER_KEY_ENC_UDP_DST_PORT] = { .type = NLA_U16 }, > [TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK] = { .type = NLA_U16 }, >+ [TCA_FLOWER_KEY_FLAGS] = { .type = NLA_U32 }, >+ [TCA_FLOWER_KEY_FLAGS_MASK] = { .type = NLA_U32 }, > }; > > static void fl_set_key_val(struct nlattr **tb, >@@ -417,6 +419,40 @@ static void fl_set_key_vlan(struct nlattr **tb, > } > } > >+static void set_flags(u32 flower_key, u32 flower_mask, Use some prefix for helpers like this, or at least __ >+ u32 *dissector_key, u32 *dissector_mask, >+ u32 flower_flag_bit, u32 dissector_flag_bit) >+{ >+ if (flower_mask & flower_flag_bit) { >+ *dissector_mask |= dissector_flag_bit; >+ if (flower_key & flower_flag_bit) >+ *dissector_key |= dissector_flag_bit; >+ } >+} >+ >+static void fl_set_key_flags(struct nlattr **tb, >+ u32 *flags_key, >+ u32 *flags_mask) >+{ >+ u32 key, mask; >+ >+ if (!tb[TCA_FLOWER_KEY_FLAGS]) >+ return; >+ >+ key = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS])); >+ >+ if (!tb[TCA_FLOWER_KEY_FLAGS_MASK]) >+ mask = ~0; >+ else >+ mask = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS_MASK])); >+ >+ *flags_key = 0; >+ *flags_mask = 0; >+ >+ set_flags(key, mask, flags_key, flags_mask, >+ TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); >+} >+ > static int fl_set_key(struct net *net, struct nlattr **tb, > struct fl_flow_key *key, struct fl_flow_key *mask) > { >@@ -543,6 +579,8 @@ static int fl_set_key(struct net *net, struct nlattr **tb, > &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, > sizeof(key->enc_tp.dst)); > >+ fl_set_key_flags(tb, &key->control.flags, &mask->control.flags); >+ > return 0; > } > >@@ -877,6 +915,48 @@ static int fl_dump_key_vlan(struct sk_buff *skb, > return 0; > } > >+static void get_flags(u32 dissector_key, u32 dissector_mask, Same here. >+ u32 *flower_key, u32 *flower_mask, >+ u32 flower_flag_bit, u32 dissector_flag_bit) >+{ >+ if (dissector_mask & dissector_flag_bit) { >+ *flower_mask |= flower_flag_bit; >+ if (dissector_key & dissector_flag_bit) >+ *flower_key |= flower_flag_bit; >+ } >+} >+ >+static int fl_dump_key_flags(struct sk_buff *skb, >+ u32 flags_key, >+ u32 flags_mask) over-wrapped :) >+{ >+ u32 key, mask; >+ __be32 _key, _mask; >+ int err; >+ >+ if (!memchr_inv(&flags_mask, 0, sizeof(flags_mask))) >+ return 0; >+ >+ key = 0; ^ remove the extra space >+ mask = 0; >+ >+ get_flags(flags_key, flags_mask, &key, &mask, >+ TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); >+ >+ _key = cpu_to_be32(key); ^ remove the extra space >+ _mask = cpu_to_be32(mask); >+ >+ err = nla_put(skb, TCA_FLOWER_KEY_FLAGS, 4, &_key); >+ if (err) >+ return err; >+ >+ err = nla_put(skb, TCA_FLOWER_KEY_FLAGS_MASK, 4, &_mask); Just return nla_put... >+ if (err) >+ return err; >+ >+ return 0; >+} >+ > static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, > struct sk_buff *skb, struct tcmsg *t) > { >@@ -1012,6 +1092,9 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, > sizeof(key->enc_tp.dst))) > goto nla_put_failure; > >+ if (fl_dump_key_flags(skb, key->control.flags, mask->control.flags)) >+ goto nla_put_failure; >+ > nla_put_u32(skb, TCA_FLOWER_FLAGS, f->flags); > > if (tcf_exts_dump(skb, &f->exts)) >-- >2.3.7 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags 2016-12-06 12:40 ` Jiri Pirko @ 2016-12-06 14:02 ` Or Gerlitz 0 siblings, 0 replies; 8+ messages in thread From: Or Gerlitz @ 2016-12-06 14:02 UTC (permalink / raw) To: Jiri Pirko; +Cc: David S. Miller, netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion On 12/6/2016 2:40 PM, Jiri Pirko wrote: > Tue, Dec 06, 2016 at 01:32:58PM CET, ogerlitz@mellanox.com wrote: >> Add UAPI to provide set of flags for matching, where the flags >> provided from user-space are mapped to flow-dissector flags. >> >> The 1st flag allows to match on whether the packet is an >> IP fragment and corresponds to the FLOW_DIS_IS_FRAGMENT flag. >> >> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> >> Reviewed-by: Paul Blakey <paulb@mellanox.com> >> --- >> include/uapi/linux/pkt_cls.h | 7 ++++ >> net/sched/cls_flower.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 90 insertions(+) >> >> diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h >> index 86786d4..f114277 100644 >> --- a/include/uapi/linux/pkt_cls.h >> +++ b/include/uapi/linux/pkt_cls.h >> @@ -457,11 +457,18 @@ enum { >> TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ >> TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ >> TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ >> + >> + TCA_FLOWER_KEY_FLAGS, /* be32 */ >> + TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ >> __TCA_FLOWER_MAX, >> }; >> >> #define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) >> >> +enum { >> + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = BIT(0), >> +}; >> + >> /* Match-all classifier */ >> >> enum { >> diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c >> index c5cea78..d9f4124 100644 >> --- a/net/sched/cls_flower.c >> +++ b/net/sched/cls_flower.c >> @@ -383,6 +383,8 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = { >> [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK] = { .type = NLA_U16 }, >> [TCA_FLOWER_KEY_ENC_UDP_DST_PORT] = { .type = NLA_U16 }, >> [TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK] = { .type = NLA_U16 }, >> + [TCA_FLOWER_KEY_FLAGS] = { .type = NLA_U32 }, >> + [TCA_FLOWER_KEY_FLAGS_MASK] = { .type = NLA_U32 }, >> }; >> >> static void fl_set_key_val(struct nlattr **tb, >> @@ -417,6 +419,40 @@ static void fl_set_key_vlan(struct nlattr **tb, >> } >> } >> >> +static void set_flags(u32 flower_key, u32 flower_mask, > Use some prefix for helpers like this, or at least __ okay, will use fl_set_key_flags here > > >> + u32 *dissector_key, u32 *dissector_mask, >> + u32 flower_flag_bit, u32 dissector_flag_bit) >> +{ >> + if (flower_mask & flower_flag_bit) { >> + *dissector_mask |= dissector_flag_bit; >> + if (flower_key & flower_flag_bit) >> + *dissector_key |= dissector_flag_bit; >> + } >> +} >> + >> +static void fl_set_key_flags(struct nlattr **tb, >> + u32 *flags_key, >> + u32 *flags_mask) >> +{ >> + u32 key, mask; >> + >> + if (!tb[TCA_FLOWER_KEY_FLAGS]) >> + return; >> + >> + key = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS])); >> + >> + if (!tb[TCA_FLOWER_KEY_FLAGS_MASK]) >> + mask = ~0; >> + else >> + mask = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS_MASK])); >> + >> + *flags_key = 0; >> + *flags_mask = 0; >> + >> + set_flags(key, mask, flags_key, flags_mask, >> + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); >> +} >> + >> static int fl_set_key(struct net *net, struct nlattr **tb, >> struct fl_flow_key *key, struct fl_flow_key *mask) >> { >> @@ -543,6 +579,8 @@ static int fl_set_key(struct net *net, struct nlattr **tb, >> &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, >> sizeof(key->enc_tp.dst)); >> >> + fl_set_key_flags(tb, &key->control.flags, &mask->control.flags); >> + >> return 0; >> } >> >> @@ -877,6 +915,48 @@ static int fl_dump_key_vlan(struct sk_buff *skb, >> return 0; >> } >> >> +static void get_flags(u32 dissector_key, u32 dissector_mask, > Same here. and fl_get_key_flags here > >> + u32 *flower_key, u32 *flower_mask, >> + u32 flower_flag_bit, u32 dissector_flag_bit) >> +{ >> + if (dissector_mask & dissector_flag_bit) { >> + *flower_mask |= flower_flag_bit; >> + if (dissector_key & dissector_flag_bit) >> + *flower_key |= flower_flag_bit; >> + } >> +} >> + >> +static int fl_dump_key_flags(struct sk_buff *skb, >> + u32 flags_key, >> + u32 flags_mask) > over-wrapped :) okay, > >> +{ >> + u32 key, mask; >> + __be32 _key, _mask; >> + int err; >> + >> + if (!memchr_inv(&flags_mask, 0, sizeof(flags_mask))) >> + return 0; >> + >> + key = 0; > ^ remove the extra space okay > >> + mask = 0; >> + >> + get_flags(flags_key, flags_mask, &key, &mask, >> + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOW_DIS_IS_FRAGMENT); >> + >> + _key = cpu_to_be32(key); > ^ remove the extra space NP > >> + _mask = cpu_to_be32(mask); >> + >> + err = nla_put(skb, TCA_FLOWER_KEY_FLAGS, 4, &_key); >> + if (err) >> + return err; >> + >> + err = nla_put(skb, TCA_FLOWER_KEY_FLAGS_MASK, 4, &_mask); > Just return nla_put... sure ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 3/3] net/mlx5e: Offload TC matching on packets being IP fragments 2016-12-06 12:32 [PATCH net-next 0/3] net/sched: cls_flower: Add support for matching on dissection flags Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags Or Gerlitz @ 2016-12-06 12:32 ` Or Gerlitz 2 siblings, 0 replies; 8+ messages in thread From: Or Gerlitz @ 2016-12-06 12:32 UTC (permalink / raw) To: David S. Miller; +Cc: netdev, Jiri Pirko, Roi Dayan, Hadar Har-Zion, Or Gerlitz Enable offloading of matching on packets being fragments. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reviewed-by: Paul Blakey <paulb@mellanox.com> --- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index f07ef8c..f8829b5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -31,6 +31,7 @@ */ #include <net/flow_dissector.h> +#include <net/sch_generic.h> #include <net/pkt_cls.h> #include <net/tc_act/tc_gact.h> #include <net/tc_act/tc_skbedit.h> @@ -363,7 +364,18 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, skb_flow_dissector_target(f->dissector, FLOW_DISSECTOR_KEY_CONTROL, f->key); + + struct flow_dissector_key_control *mask = + skb_flow_dissector_target(f->dissector, + FLOW_DISSECTOR_KEY_CONTROL, + f->mask); addr_type = key->addr_type; + + if (mask->flags & FLOW_DIS_IS_FRAGMENT) { + MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1); + MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, + key->flags & FLOW_DIS_IS_FRAGMENT); + } } if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_BASIC)) { -- 2.3.7 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-12-06 20:51 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-12-06 12:32 [PATCH net-next 0/3] net/sched: cls_flower: Add support for matching on dissection flags Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 1/3] net/flow_dissector: Enable matching on flags for TC filter consumers Or Gerlitz 2016-12-06 12:43 ` Jiri Pirko 2016-12-06 20:51 ` Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 2/3] net/sched: cls_flower: Add support for matching on flags Or Gerlitz 2016-12-06 12:40 ` Jiri Pirko 2016-12-06 14:02 ` Or Gerlitz 2016-12-06 12:32 ` [PATCH net-next 3/3] net/mlx5e: Offload TC matching on packets being IP fragments Or Gerlitz
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).