mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
bareudp: use ipv6_mod_enabled to check if IPv6 enabled
[ Upstream commite077ed58c2
] 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:571912c69f
("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>
This commit is contained in:
parent
b184a8fa7d
commit
3f79811107
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user