lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0613/1017] bareudp: use ipv6_mod_enabled to check if IPv6 enabled
    Date
    From: Hangbin Liu <liuhangbin@gmail.com>

    [ Upstream commit e077ed58c243afc197bc2a2ba0e1ff61135e4ec2 ]

    bareudp_create_sock() use AF_INET6 by default if IPv6 CONFIG enabled.
    But if user start kernel with ipv6.disable=1, the bareudp sock will
    created failed, which cause the interface open failed even with ethertype
    ip. e.g.

    # ip link add bareudp1 type bareudp dstport 2 ethertype ip
    # ip link set bareudp1 up
    RTNETLINK answers: Address family not supported by protocol

    Fix it by using ipv6_mod_enabled() to check if IPv6 enabled. There is
    no need to check IS_ENABLED(CONFIG_IPV6) as ipv6_mod_enabled() will
    return false when CONFIG_IPV6 no enabled in include/linux/ipv6.h.

    Reported-by: Jianlin Shi <jishi@redhat.com>
    Fixes: 571912c69f0e ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
    Link: https://lore.kernel.org/r/20220315062618.156230-1-liuhangbin@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/bareudp.c | 19 ++++++++++---------
    1 file changed, 10 insertions(+), 9 deletions(-)

    diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c
    index edffc3489a12..a7d79100b685 100644
    --- a/drivers/net/bareudp.c
    +++ b/drivers/net/bareudp.c
    @@ -141,14 +141,14 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
    skb_reset_network_header(skb);
    skb_reset_mac_header(skb);

    - if (!IS_ENABLED(CONFIG_IPV6) || family == AF_INET)
    + if (!ipv6_mod_enabled() || family == AF_INET)
    err = IP_ECN_decapsulate(oiph, skb);
    else
    err = IP6_ECN_decapsulate(oiph, skb);

    if (unlikely(err)) {
    if (log_ecn_error) {
    - if (!IS_ENABLED(CONFIG_IPV6) || family == AF_INET)
    + if (!ipv6_mod_enabled() || family == AF_INET)
    net_info_ratelimited("non-ECT from %pI4 "
    "with TOS=%#x\n",
    &((struct iphdr *)oiph)->saddr,
    @@ -214,11 +214,12 @@ static struct socket *bareudp_create_sock(struct net *net, __be16 port)
    int err;

    memset(&udp_conf, 0, sizeof(udp_conf));
    -#if IS_ENABLED(CONFIG_IPV6)
    - udp_conf.family = AF_INET6;
    -#else
    - udp_conf.family = AF_INET;
    -#endif
    +
    + if (ipv6_mod_enabled())
    + udp_conf.family = AF_INET6;
    + else
    + udp_conf.family = AF_INET;
    +
    udp_conf.local_udp_port = port;
    /* Open UDP socket */
    err = udp_sock_create(net, &udp_conf, &sock);
    @@ -441,7 +442,7 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
    }

    rcu_read_lock();
    - if (IS_ENABLED(CONFIG_IPV6) && info->mode & IP_TUNNEL_INFO_IPV6)
    + if (ipv6_mod_enabled() && info->mode & IP_TUNNEL_INFO_IPV6)
    err = bareudp6_xmit_skb(skb, dev, bareudp, info);
    else
    err = bareudp_xmit_skb(skb, dev, bareudp, info);
    @@ -471,7 +472,7 @@ static int bareudp_fill_metadata_dst(struct net_device *dev,

    use_cache = ip_tunnel_dst_cache_usable(skb, info);

    - if (!IS_ENABLED(CONFIG_IPV6) || ip_tunnel_info_af(info) == AF_INET) {
    + if (!ipv6_mod_enabled() || ip_tunnel_info_af(info) == AF_INET) {
    struct rtable *rt;
    __be32 saddr;

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-05 15:27    [W:4.026 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site