net/sched: act_tunnel_key: Allow key-less tunnels
authorAdi Nissim <adin@mellanox.com>
Sun, 2 Dec 2018 12:55:20 +0000 (14:55 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Dec 2018 04:53:37 +0000 (20:53 -0800)
Allow setting a tunnel without a tunnel key. This is required for
tunneling protocols, such as GRE, that define the key as an optional
field.

Signed-off-by: Adi Nissim <adin@mellanox.com>
Acked-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/act_tunnel_key.c

index 4cca8f2746621cee82d57b6beea2902cb4660675..fad438c0f7a7d854099fae608e51d95bd22bcedf 100644 (file)
@@ -210,9 +210,9 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla,
        struct tcf_tunnel_key *t;
        bool exists = false;
        __be16 dst_port = 0;
+       __be64 key_id = 0;
        int opts_len = 0;
-       __be64 key_id;
-       __be16 flags;
+       __be16 flags = 0;
        u8 tos, ttl;
        int ret = 0;
        int err;
@@ -246,15 +246,15 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla,
        case TCA_TUNNEL_KEY_ACT_RELEASE:
                break;
        case TCA_TUNNEL_KEY_ACT_SET:
-               if (!tb[TCA_TUNNEL_KEY_ENC_KEY_ID]) {
-                       NL_SET_ERR_MSG(extack, "Missing tunnel key id");
-                       ret = -EINVAL;
-                       goto err_out;
-               }
+               if (tb[TCA_TUNNEL_KEY_ENC_KEY_ID]) {
+                       __be32 key32;
 
-               key_id = key32_to_tunnel_id(nla_get_be32(tb[TCA_TUNNEL_KEY_ENC_KEY_ID]));
+                       key32 = nla_get_be32(tb[TCA_TUNNEL_KEY_ENC_KEY_ID]);
+                       key_id = key32_to_tunnel_id(key32);
+                       flags = TUNNEL_KEY;
+               }
 
-               flags = TUNNEL_KEY | TUNNEL_CSUM;
+               flags |= TUNNEL_CSUM;
                if (tb[TCA_TUNNEL_KEY_NO_CSUM] &&
                    nla_get_u8(tb[TCA_TUNNEL_KEY_NO_CSUM]))
                        flags &= ~TUNNEL_CSUM;
@@ -508,7 +508,8 @@ static int tunnel_key_dump(struct sk_buff *skb, struct tc_action *a,
                struct ip_tunnel_key *key = &info->key;
                __be32 key_id = tunnel_id_to_key32(key->tun_id);
 
-               if (nla_put_be32(skb, TCA_TUNNEL_KEY_ENC_KEY_ID, key_id) ||
+               if (((key->tun_flags & TUNNEL_KEY) &&
+                    nla_put_be32(skb, TCA_TUNNEL_KEY_ENC_KEY_ID, key_id)) ||
                    tunnel_key_dump_addresses(skb,
                                              &params->tcft_enc_metadata->u.tun_info) ||
                    nla_put_be16(skb, TCA_TUNNEL_KEY_ENC_DST_PORT, key->tp_dst) ||