From: Adi Nissim <a...@mellanox.com>

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 <a...@mellanox.com>
Acked-by: Or Gerlitz <ogerl...@mellanox.com>
Reviewed-by: Oz Shlomo <o...@mellanox.com>
Acked-by: Jiri Pirko <j...@mellanox.com>
---
 net/sched/act_tunnel_key.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c
index 4cca8f274662..2d8edee6a7c9 100644
--- a/net/sched/act_tunnel_key.c
+++ b/net/sched/act_tunnel_key.c
@@ -211,8 +211,8 @@ static int tunnel_key_init(struct net *net, struct nlattr 
*nla,
        bool exists = false;
        __be16 dst_port = 0;
        int opts_len = 0;
+       __be16 flags = 0;
        __be64 key_id;
-       __be16 flags;
        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) 
||
-- 
2.17.0.2884.g4ede3d4

Reply via email to