bareudp: use ipv6_mod_enabled to check if IPv6 enabled
authorHangbin Liu <liuhangbin@gmail.com>
Tue, 15 Mar 2022 06:26:18 +0000 (14:26 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:23:41 +0000 (14:23 +0200)
[ 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

index 54e321a695ce9230dc42f1ec2d2ef2b0f2e50ce6..98c915943f323c96708158a1c91c137ccbd09f25 100644 (file)
@@ -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;