net/sched: cls_flower: Support masking for matching on tcp/udp ports
authorOr Gerlitz <ogerlitz@mellanox.com>
Thu, 15 Sep 2016 12:28:22 +0000 (15:28 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Sep 2016 00:27:23 +0000 (20:27 -0400)
Add the definitions for src/dst udp/tcp port masks and use
them when setting && dumping the relevant keys.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Paul Blakey <paulb@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/pkt_cls.h
net/sched/cls_flower.c

index f9c287c..60ea2a0 100644 (file)
@@ -442,6 +442,10 @@ enum {
        TCA_FLOWER_KEY_ENC_IPV6_DST,    /* struct in6_addr */
        TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */
 
+       TCA_FLOWER_KEY_TCP_SRC_MASK,    /* be16 */
+       TCA_FLOWER_KEY_TCP_DST_MASK,    /* be16 */
+       TCA_FLOWER_KEY_UDP_SRC_MASK,    /* be16 */
+       TCA_FLOWER_KEY_UDP_DST_MASK,    /* be16 */
        __TCA_FLOWER_MAX,
 };
 
index b084b2a..027523c 100644 (file)
@@ -335,6 +335,10 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = {
        [TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK] = { .len = sizeof(struct in6_addr) },
        [TCA_FLOWER_KEY_ENC_IPV6_DST]   = { .len = sizeof(struct in6_addr) },
        [TCA_FLOWER_KEY_ENC_IPV6_DST_MASK] = { .len = sizeof(struct in6_addr) },
+       [TCA_FLOWER_KEY_TCP_SRC_MASK]   = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_TCP_DST_MASK]   = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_UDP_SRC_MASK]   = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_UDP_DST_MASK]   = { .type = NLA_U16 },
 };
 
 static void fl_set_key_val(struct nlattr **tb,
@@ -432,17 +436,17 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
 
        if (key->basic.ip_proto == IPPROTO_TCP) {
                fl_set_key_val(tb, &key->tp.src, TCA_FLOWER_KEY_TCP_SRC,
-                              &mask->tp.src, TCA_FLOWER_UNSPEC,
+                              &mask->tp.src, TCA_FLOWER_KEY_TCP_SRC_MASK,
                               sizeof(key->tp.src));
                fl_set_key_val(tb, &key->tp.dst, TCA_FLOWER_KEY_TCP_DST,
-                              &mask->tp.dst, TCA_FLOWER_UNSPEC,
+                              &mask->tp.dst, TCA_FLOWER_KEY_TCP_DST_MASK,
                               sizeof(key->tp.dst));
        } else if (key->basic.ip_proto == IPPROTO_UDP) {
                fl_set_key_val(tb, &key->tp.src, TCA_FLOWER_KEY_UDP_SRC,
-                              &mask->tp.src, TCA_FLOWER_UNSPEC,
+                              &mask->tp.src, TCA_FLOWER_KEY_UDP_SRC_MASK,
                               sizeof(key->tp.src));
                fl_set_key_val(tb, &key->tp.dst, TCA_FLOWER_KEY_UDP_DST,
-                              &mask->tp.dst, TCA_FLOWER_UNSPEC,
+                              &mask->tp.dst, TCA_FLOWER_KEY_UDP_DST_MASK,
                               sizeof(key->tp.dst));
        }
 
@@ -877,18 +881,18 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
 
        if (key->basic.ip_proto == IPPROTO_TCP &&
            (fl_dump_key_val(skb, &key->tp.src, TCA_FLOWER_KEY_TCP_SRC,
-                            &mask->tp.src, TCA_FLOWER_UNSPEC,
+                            &mask->tp.src, TCA_FLOWER_KEY_TCP_SRC_MASK,
                             sizeof(key->tp.src)) ||
             fl_dump_key_val(skb, &key->tp.dst, TCA_FLOWER_KEY_TCP_DST,
-                            &mask->tp.dst, TCA_FLOWER_UNSPEC,
+                            &mask->tp.dst, TCA_FLOWER_KEY_TCP_DST_MASK,
                             sizeof(key->tp.dst))))
                goto nla_put_failure;
        else if (key->basic.ip_proto == IPPROTO_UDP &&
                 (fl_dump_key_val(skb, &key->tp.src, TCA_FLOWER_KEY_UDP_SRC,
-                                 &mask->tp.src, TCA_FLOWER_UNSPEC,
+                                 &mask->tp.src, TCA_FLOWER_KEY_UDP_SRC_MASK,
                                  sizeof(key->tp.src)) ||
                  fl_dump_key_val(skb, &key->tp.dst, TCA_FLOWER_KEY_UDP_DST,
-                                 &mask->tp.dst, TCA_FLOWER_UNSPEC,
+                                 &mask->tp.dst, TCA_FLOWER_KEY_UDP_DST_MASK,
                                  sizeof(key->tp.dst))))
                goto nla_put_failure;