From nobody Tue Apr 7 01:01:25 2026 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CEE483E3C4B for ; Tue, 17 Mar 2026 14:03:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773756231; cv=none; b=qqVW1ajXY4/0qLNcbK1WOcsiEHN1QWXXLZsnYP0P3TEGsKk2lKyr5vqaUwkzzUCpgNBWsFenWZS6sv0ZsggcqEIRYh0xzntWrZF3gyk+t8qm9RGd+bMpsOyiTdTqSj7EAz7Bje8uGf3sIhi/ml99qcPCvBfjT0kMwjI/Yksz8UA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773756231; c=relaxed/simple; bh=5xfC5J26jWpgy51Ar7US32CgEPmNriY5ioSI5/u2CVY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hPw15lEzPG60RCvFsno0GZSsfD8ZweyjeEAJR9BwGaRb4nEsFL7asWiId/fCdPcuccpcGssyR2MvH4XXlWsNh3f8hFd3qo3jsgY1U0rN/Zie9phM93zL2sH14u2icLY9BV6tYTOICc0JopnRYYjp2CqT1Mt4uEEnlktMsdtPQG4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=suse.de; spf=pass smtp.mailfrom=suse.de; arc=none smtp.client-ip=195.135.223.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.de Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 685885BE15; Tue, 17 Mar 2026 14:03:48 +0000 (UTC) Authentication-Results: smtp-out2.suse.de; none Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id B443B4273C; Tue, 17 Mar 2026 14:03:47 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id gCfzKENfuWmpYwAAD6G6ig (envelope-from ); Tue, 17 Mar 2026 14:03:47 +0000 From: Fernando Fernandez Mancera To: netdev@vger.kernel.org Cc: Fernando Fernandez Mancera , =?UTF-8?q?Ricardo=20B=2E=20Marli=C3=A8re?= , "David S. Miller" , David Ahern , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Willem de Bruijn , linux-kernel@vger.kernel.org Subject: [PATCH 06/10 net-next v3] ipv4: drop ipv6_stub usage and use direct function calls Date: Tue, 17 Mar 2026 15:01:02 +0100 Message-ID: <20260317140141.5723-7-fmancera@suse.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260317140141.5723-1-fmancera@suse.de> References: <20260317140141.5723-1-fmancera@suse.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Spamd-Result: default: False [-4.00 / 50.00]; REPLY(-4.00)[]; TAGGED_RCPT(0.00)[]; ASN(0.00)[asn:32098, ipnet:2800::/6, country:US] X-Rspamd-Queue-Id: 685885BE15 X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Action: no action X-Spam-Flag: NO X-Spam-Score: -4.00 X-Spam-Level: As IPv6 is built-in only, the ipv6_stub infrastructure is no longer necessary. The IPv4 stack interacts with IPv6 mainly to support IPv4 routes with IPv6 next-hops (RFC 8950). Convert all these cross-family calls from ipv6_stub to direct function calls. The fallback functions introduced previously will prevent linkage errors when CONFIG_IPV6 is disabled. Signed-off-by: Fernando Fernandez Mancera Tested-by: Ricardo B. Marli=C3=A8re --- net/ipv4/fib_semantics.c | 11 +++++------ net/ipv4/icmp.c | 2 +- net/ipv4/nexthop.c | 21 ++++++++++----------- net/ipv4/route.c | 2 +- net/ipv4/udp.c | 7 ++----- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 01cb587866d8..b576dd74d678 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -586,8 +586,7 @@ static int fib_detect_death(struct fib_info *fi, int or= der, if (likely(nhc->nhc_gw_family =3D=3D AF_INET)) n =3D neigh_lookup(&arp_tbl, &nhc->nhc_gw.ipv4, nhc->nhc_dev); else if (nhc->nhc_gw_family =3D=3D AF_INET6) - n =3D neigh_lookup(ipv6_stub->nd_tbl, &nhc->nhc_gw.ipv6, - nhc->nhc_dev); + n =3D neigh_lookup(ipv6_get_nd_tbl(), &nhc->nhc_gw.ipv6, nhc->nhc_dev); else n =3D NULL; =20 @@ -1083,7 +1082,7 @@ static int fib_check_nh_v6_gw(struct net *net, struct= fib_nh *nh, struct fib6_nh fib6_nh =3D {}; int err; =20 - err =3D ipv6_stub->fib6_nh_init(net, &fib6_nh, &cfg, GFP_KERNEL, extack); + err =3D fib6_nh_init(net, &fib6_nh, &cfg, GFP_KERNEL, extack); if (!err) { nh->fib_nh_dev =3D fib6_nh.fib_nh_dev; netdev_hold(nh->fib_nh_dev, &nh->fib_nh_dev_tracker, @@ -1091,7 +1090,7 @@ static int fib_check_nh_v6_gw(struct net *net, struct= fib_nh *nh, nh->fib_nh_oif =3D nh->fib_nh_dev->ifindex; nh->fib_nh_scope =3D RT_SCOPE_LINK; =20 - ipv6_stub->fib6_nh_release(&fib6_nh); + fib6_nh_release(&fib6_nh); } =20 return err; @@ -2148,8 +2147,8 @@ static bool fib_good_nh(const struct fib_nh *nh) n =3D __ipv4_neigh_lookup_noref(nh->fib_nh_dev, (__force u32)nh->fib_nh_gw4); else if (nh->fib_nh_gw_family =3D=3D AF_INET6) - n =3D __ipv6_neigh_lookup_noref_stub(nh->fib_nh_dev, - &nh->fib_nh_gw6); + n =3D __ipv6_neigh_lookup_noref(nh->fib_nh_dev, + &nh->fib_nh_gw6); else n =3D NULL; if (n) diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index ac6d2ffc1963..f76c9ac183ae 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -1342,7 +1342,7 @@ bool icmp_build_probe(struct sk_buff *skb, struct icm= phdr *icmphdr) case ICMP_AFI_IP6: if (iio->ident.addr.ctype3_hdr.addrlen !=3D sizeof(struct in6_addr)) goto send_mal_query; - dev =3D ipv6_stub->ipv6_dev_find(net, &iio->ident.addr.ip_addr.ipv6_add= r, dev); + dev =3D ipv6_dev_find(net, &iio->ident.addr.ip_addr.ipv6_addr, dev); dev_hold(dev); break; #endif diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c index c942f1282236..cfb235f51ab6 100644 --- a/net/ipv4/nexthop.c +++ b/net/ipv4/nexthop.c @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -510,7 +510,7 @@ static void nexthop_free_single(struct nexthop *nh) fib_nh_release(nh->net, &nhi->fib_nh); break; case AF_INET6: - ipv6_stub->fib6_nh_release(&nhi->fib6_nh); + fib6_nh_release(&nhi->fib6_nh); break; } kfree(nhi); @@ -1367,7 +1367,7 @@ static bool ipv6_good_nh(const struct fib6_nh *nh) =20 rcu_read_lock(); =20 - n =3D __ipv6_neigh_lookup_noref_stub(nh->fib_nh_dev, &nh->fib_nh_gw6); + n =3D __ipv6_neigh_lookup_noref(nh->fib_nh_dev, &nh->fib_nh_gw6); if (n) state =3D READ_ONCE(n->nud_state); =20 @@ -2151,8 +2151,8 @@ static void __remove_nexthop_fib(struct net *net, str= uct nexthop *nh) fib6_info_hold(f6i); =20 spin_unlock_bh(&nh->lock); - ipv6_stub->ip6_del_rt(net, f6i, - !READ_ONCE(net->ipv4.sysctl_nexthop_compat_mode)); + ip6_del_rt(net, f6i, + !READ_ONCE(net->ipv4.sysctl_nexthop_compat_mode)); =20 spin_lock_bh(&nh->lock); } @@ -2209,7 +2209,7 @@ static void nh_rt_cache_flush(struct net *net, struct= nexthop *nh, rt_cache_flush(net); =20 list_for_each_entry(f6i, &nh->f6i_list, nh_list) - ipv6_stub->fib6_update_sernum(net, f6i); + fib6_update_sernum(net, f6i); =20 /* if an IPv6 group was replaced, we have to release all old * dsts to make sure all refcounts are released @@ -2223,7 +2223,7 @@ static void nh_rt_cache_flush(struct net *net, struct= nexthop *nh, struct nh_info *nhi =3D rtnl_dereference(nhge->nh->nh_info); =20 if (nhi->family =3D=3D AF_INET6) - ipv6_stub->fib6_nh_release_dsts(&nhi->fib6_nh); + fib6_nh_release_dsts(&nhi->fib6_nh); } } =20 @@ -2504,7 +2504,7 @@ static void __nexthop_replace_notify(struct net *net,= struct nexthop *nh, } =20 list_for_each_entry(f6i, &nh->f6i_list, nh_list) - ipv6_stub->fib6_rt_update(net, f6i, info); + fib6_rt_update(net, f6i, info); } =20 /* send RTM_NEWROUTE with REPLACE flag set for all FIB entries @@ -2877,13 +2877,12 @@ static int nh_create_ipv6(struct net *net, struct = nexthop *nh, fib6_cfg.fc_flags |=3D RTF_GATEWAY; =20 /* sets nh_dev if successful */ - err =3D ipv6_stub->fib6_nh_init(net, fib6_nh, &fib6_cfg, GFP_KERNEL, - extack); + err =3D fib6_nh_init(net, fib6_nh, &fib6_cfg, GFP_KERNEL, extack); if (err) { /* IPv6 is not enabled, don't call fib6_nh_release */ if (err =3D=3D -EAFNOSUPPORT) goto out; - ipv6_stub->fib6_nh_release(fib6_nh); + fib6_nh_release(fib6_nh); } else { nh->nh_flags =3D fib6_nh->fib_nh_flags; } diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 463236e0dc2d..802c68a1b446 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -447,7 +447,7 @@ static void ipv4_confirm_neigh(const struct dst_entry *= dst, const void *daddr) if (rt->rt_gw_family =3D=3D AF_INET) { pkey =3D (const __be32 *)&rt->rt_gw4; } else if (rt->rt_gw_family =3D=3D AF_INET6) { - return __ipv6_confirm_neigh_stub(dev, &rt->rt_gw6); + return __ipv6_confirm_neigh(dev, &rt->rt_gw6); } else if (!daddr || (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST | RTCF_LOCAL))) { diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 7e3f9fd9de19..85490358098d 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -118,9 +118,6 @@ #include #include #include -#if IS_ENABLED(CONFIG_IPV6) -#include -#endif #include =20 struct udp_table udp_table __read_mostly; @@ -2877,7 +2874,7 @@ static void set_xfrm_gro_udp_encap_rcv(__u16 encap_ty= pe, unsigned short family, =20 if (udp_test_bit(GRO_ENABLED, sk) && encap_type =3D=3D UDP_ENCAP_ESPINUDP= ) { if (IS_ENABLED(CONFIG_IPV6) && family =3D=3D AF_INET6) - new_gro_receive =3D ipv6_stub->xfrm6_gro_udp_encap_rcv; + new_gro_receive =3D xfrm6_gro_udp_encap_rcv; else new_gro_receive =3D xfrm4_gro_udp_encap_rcv; =20 @@ -2949,7 +2946,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, in= t optname, #if IS_ENABLED(CONFIG_IPV6) if (sk->sk_family =3D=3D AF_INET6) WRITE_ONCE(up->encap_rcv, - ipv6_stub->xfrm6_udp_encap_rcv); + xfrm6_udp_encap_rcv); else #endif WRITE_ONCE(up->encap_rcv, --=20 2.53.0