| From 79f14ca55e751b1ce118913045f598c1535bcd89 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Nov 2020 16:16:40 -0800 |
| Subject: ip_tunnels: Set tunnel option flag when tunnel metadata is present |
| |
| From: Yi-Hung Wei <yihung.wei@gmail.com> |
| |
| [ Upstream commit 9c2e14b48119b39446031d29d994044ae958d8fc ] |
| |
| Currently, we may set the tunnel option flag when the size of metadata |
| is zero. For example, we set TUNNEL_GENEVE_OPT in the receive function |
| no matter the geneve option is present or not. As this may result in |
| issues on the tunnel flags consumers, this patch fixes the issue. |
| |
| Related discussion: |
| * https://lore.kernel.org/netdev/1604448694-19351-1-git-send-email-yihung.wei@gmail.com/T/#u |
| |
| Fixes: 256c87c17c53 ("net: check tunnel option type in tunnel flags") |
| Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com> |
| Link: https://lore.kernel.org/r/1605053800-74072-1-git-send-email-yihung.wei@gmail.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/geneve.c | 3 +-- |
| include/net/ip_tunnels.h | 7 ++++--- |
| 2 files changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c |
| index d0b5844c8a315..2e2afc824a6a8 100644 |
| --- a/drivers/net/geneve.c |
| +++ b/drivers/net/geneve.c |
| @@ -223,8 +223,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs, |
| if (ip_tunnel_collect_metadata() || gs->collect_md) { |
| __be16 flags; |
| |
| - flags = TUNNEL_KEY | TUNNEL_GENEVE_OPT | |
| - (gnvh->oam ? TUNNEL_OAM : 0) | |
| + flags = TUNNEL_KEY | (gnvh->oam ? TUNNEL_OAM : 0) | |
| (gnvh->critical ? TUNNEL_CRIT_OPT : 0); |
| |
| tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags, |
| diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h |
| index e11423530d642..f8873c4eb003a 100644 |
| --- a/include/net/ip_tunnels.h |
| +++ b/include/net/ip_tunnels.h |
| @@ -489,9 +489,11 @@ static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info, |
| const void *from, int len, |
| __be16 flags) |
| { |
| - memcpy(ip_tunnel_info_opts(info), from, len); |
| info->options_len = len; |
| - info->key.tun_flags |= flags; |
| + if (len > 0) { |
| + memcpy(ip_tunnel_info_opts(info), from, len); |
| + info->key.tun_flags |= flags; |
| + } |
| } |
| |
| static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate) |
| @@ -537,7 +539,6 @@ static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info, |
| __be16 flags) |
| { |
| info->options_len = 0; |
| - info->key.tun_flags |= flags; |
| } |
| |
| #endif /* CONFIG_INET */ |
| -- |
| 2.27.0 |
| |