lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 47/91] ip_tunnels: Set tunnel option flag when tunnel metadata is present
    Date
    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


    \
     
     \ /
      Last update: 2020-11-23 14:30    [W:5.397 / U:1.232 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site