Hook on flow dissector's new interface on ConnTrack from previous patch.

Signed-off-by: Marcelo Ricardo Leitner <mleit...@redhat.com>
---
 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

Reply via email to