Hook on flow dissector's new interface on ConnTrack from previous patch.
Signed-off-by: Marcelo Ricardo Leitner <[email protected]>
---
include/uapi/linux/pkt_cls.h | 9 +++++++++
net/sched/cls_flower.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
index
95d0db2a8350dffb1dd20816591f3b179913fb2e..ba1f3bc01b2fdfd810e37a2b3853a1da1f838acf
100644
--- a/include/uapi/linux/pkt_cls.h
+++ b/include/uapi/linux/pkt_cls.h
@@ -490,6 +490,15 @@ enum {
TCA_FLOWER_KEY_PORT_DST_MIN, /* be16 */
TCA_FLOWER_KEY_PORT_DST_MAX, /* be16 */
+ TCA_FLOWER_KEY_CT_ZONE, /* u16 */
+ TCA_FLOWER_KEY_CT_ZONE_MASK, /* u16 */
+ TCA_FLOWER_KEY_CT_STATE, /* u8 */
+ TCA_FLOWER_KEY_CT_STATE_MASK, /* u8 */
+ TCA_FLOWER_KEY_CT_MARK, /* u32 */
+ TCA_FLOWER_KEY_CT_MARK_MASK, /* u32 */
+ TCA_FLOWER_KEY_CT_LABEL, /* 128 bits */
+ TCA_FLOWER_KEY_CT_LABEL_MASK, /* 128 bits */
+
__TCA_FLOWER_MAX,
};
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index
85e9f8e1da10aa7b01b0f51768edfefbe63d6a10..430b7fceeca0998b8c904acd91f8de53571814ff
100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -57,6 +57,7 @@ struct fl_flow_key {
struct flow_dissector_key_enc_opts enc_opts;
struct flow_dissector_key_ports tp_min;
struct flow_dissector_key_ports tp_max;
+ struct flow_dissector_key_ct ct;
} __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs.
*/
struct fl_flow_mask_range {
@@ -1079,6 +1080,22 @@ static int fl_set_key(struct net *net, struct nlattr
**tb,
fl_set_key_ip(tb, true, &key->enc_ip, &mask->enc_ip);
+ fl_set_key_val(tb, &key->ct.mark, TCA_FLOWER_KEY_CT_MARK,
+ &mask->ct.mark, TCA_FLOWER_KEY_CT_MARK_MASK,
+ sizeof(key->ct.mark));
+
+ fl_set_key_val(tb, &key->ct.zone, TCA_FLOWER_KEY_CT_ZONE,
+ &mask->ct.zone, TCA_FLOWER_KEY_CT_ZONE_MASK,
+ sizeof(key->ct.zone));
+
+ fl_set_key_val(tb, &key->ct.state, TCA_FLOWER_KEY_CT_STATE,
+ &mask->ct.state, TCA_FLOWER_KEY_CT_STATE_MASK,
+ sizeof(key->ct.state));
+
+ fl_set_key_val(tb, &key->ct.label, TCA_FLOWER_KEY_CT_LABEL,
+ &mask->ct.label, TCA_FLOWER_KEY_CT_LABEL_MASK,
+ sizeof(key->ct.label));
+
if (tb[TCA_FLOWER_KEY_ENC_OPTS]) {
ret = fl_set_enc_opt(tb, key, mask, extack);
if (ret)
@@ -1183,6 +1200,8 @@ static void fl_init_dissector(struct flow_dissector
*dissector,
FLOW_DISSECTOR_KEY_ENC_IP, enc_ip);
FL_KEY_SET_IF_MASKED(mask, keys, cnt,
FLOW_DISSECTOR_KEY_ENC_OPTS, enc_opts);
+ FL_KEY_SET_IF_MASKED(mask, keys, cnt,
+ FLOW_DISSECTOR_KEY_CT, ct);
skb_flow_dissector_init(dissector, keys, cnt);
}
@@ -1994,6 +2013,20 @@ static int fl_dump_key(struct sk_buff *skb, struct net
*net,
fl_dump_key_enc_opt(skb, &key->enc_opts, &mask->enc_opts))
goto nla_put_failure;
+ if (fl_dump_key_val(skb, &key->ct.zone, TCA_FLOWER_KEY_CT_ZONE,
+ &mask->ct.zone, TCA_FLOWER_KEY_CT_ZONE_MASK,
+ sizeof(key->ct.zone)) ||
+ fl_dump_key_val(skb, &key->ct.mark, TCA_FLOWER_KEY_CT_MARK,
+ &mask->ct.mark, TCA_FLOWER_KEY_CT_MARK_MASK,
+ sizeof(key->ct.mark)) ||
+ fl_dump_key_val(skb, &key->ct.state, TCA_FLOWER_KEY_CT_STATE,
+ &mask->ct.state, TCA_FLOWER_KEY_CT_STATE_MASK,
+ sizeof(key->ct.state)) ||
+ fl_dump_key_val(skb, &key->ct.label, TCA_FLOWER_KEY_CT_LABEL,
+ &mask->ct.label, TCA_FLOWER_KEY_CT_LABEL_MASK,
+ sizeof(key->ct.label)))
+ goto nla_put_failure;
+
if (fl_dump_key_flags(skb, key->control.flags, mask->control.flags))
goto nla_put_failure;
--
2.20.1