|
@@ -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_SRC_MASK] = { .len = sizeof(struct in6_addr) },
|
|
[TCA_FLOWER_KEY_ENC_IPV6_DST] = { .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_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,
|
|
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) {
|
|
if (key->basic.ip_proto == IPPROTO_TCP) {
|
|
fl_set_key_val(tb, &key->tp.src, TCA_FLOWER_KEY_TCP_SRC,
|
|
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));
|
|
sizeof(key->tp.src));
|
|
fl_set_key_val(tb, &key->tp.dst, TCA_FLOWER_KEY_TCP_DST,
|
|
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));
|
|
sizeof(key->tp.dst));
|
|
} else if (key->basic.ip_proto == IPPROTO_UDP) {
|
|
} else if (key->basic.ip_proto == IPPROTO_UDP) {
|
|
fl_set_key_val(tb, &key->tp.src, TCA_FLOWER_KEY_UDP_SRC,
|
|
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));
|
|
sizeof(key->tp.src));
|
|
fl_set_key_val(tb, &key->tp.dst, TCA_FLOWER_KEY_UDP_DST,
|
|
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));
|
|
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 &&
|
|
if (key->basic.ip_proto == IPPROTO_TCP &&
|
|
(fl_dump_key_val(skb, &key->tp.src, TCA_FLOWER_KEY_TCP_SRC,
|
|
(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)) ||
|
|
sizeof(key->tp.src)) ||
|
|
fl_dump_key_val(skb, &key->tp.dst, TCA_FLOWER_KEY_TCP_DST,
|
|
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))))
|
|
sizeof(key->tp.dst))))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
else if (key->basic.ip_proto == IPPROTO_UDP &&
|
|
else if (key->basic.ip_proto == IPPROTO_UDP &&
|
|
(fl_dump_key_val(skb, &key->tp.src, TCA_FLOWER_KEY_UDP_SRC,
|
|
(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)) ||
|
|
sizeof(key->tp.src)) ||
|
|
fl_dump_key_val(skb, &key->tp.dst, TCA_FLOWER_KEY_UDP_DST,
|
|
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))))
|
|
sizeof(key->tp.dst))))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|