xref: /linux-6.15/include/linux/ipv6.h (revision a18dfa99)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _IPV6_H
31da177e4SLinus Torvalds #define _IPV6_H
41da177e4SLinus Torvalds 
5607ca46eSDavid Howells #include <uapi/linux/ipv6.h>
6096361b1SEric Dumazet #include <linux/cache.h>
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
91431fb31SPaul Durrant #define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
101da177e4SLinus Torvalds /*
111da177e4SLinus Torvalds  * This structure contains configuration options per IPv6 link.
121da177e4SLinus Torvalds  */
131da177e4SLinus Torvalds struct ipv6_devconf {
14096361b1SEric Dumazet 	/* RX & TX fastpath fields. */
15096361b1SEric Dumazet 	__cacheline_group_begin(ipv6_devconf_read_txrx);
16096361b1SEric Dumazet 	__s32		disable_ipv6;
171da177e4SLinus Torvalds 	__s32		hop_limit;
181da177e4SLinus Torvalds 	__s32		mtu6;
19096361b1SEric Dumazet 	__s32		forwarding;
20096361b1SEric Dumazet 	__s32		disable_policy;
21096361b1SEric Dumazet 	__s32		proxy_ndp;
22096361b1SEric Dumazet 	__cacheline_group_end(ipv6_devconf_read_txrx);
23096361b1SEric Dumazet 
241da177e4SLinus Torvalds 	__s32		accept_ra;
251da177e4SLinus Torvalds 	__s32		accept_redirects;
261da177e4SLinus Torvalds 	__s32		autoconf;
271da177e4SLinus Torvalds 	__s32		dad_transmits;
281da177e4SLinus Torvalds 	__s32		rtr_solicits;
291da177e4SLinus Torvalds 	__s32		rtr_solicit_interval;
30bd11f074SMaciej Żenczykowski 	__s32		rtr_solicit_max_interval;
311da177e4SLinus Torvalds 	__s32		rtr_solicit_delay;
321da177e4SLinus Torvalds 	__s32		force_mld_version;
33fc4eba58SHannes Frederic Sowa 	__s32		mldv1_unsolicited_report_interval;
34fc4eba58SHannes Frederic Sowa 	__s32		mldv2_unsolicited_report_interval;
351da177e4SLinus Torvalds 	__s32		use_tempaddr;
361da177e4SLinus Torvalds 	__s32		temp_valid_lft;
371da177e4SLinus Torvalds 	__s32		temp_prefered_lft;
38a5fcea2dSAlex Henrie 	__s32		regen_min_advance;
391da177e4SLinus Torvalds 	__s32		regen_max_retry;
401da177e4SLinus Torvalds 	__s32		max_desync_factor;
411da177e4SLinus Torvalds 	__s32		max_addresses;
4265f5c7c1SYOSHIFUJI Hideaki 	__s32		accept_ra_defrtr;
436b2e04bcSPraveen Chaudhary 	__u32		ra_defrtr_metric;
448013d1d7SHangbin Liu 	__s32		accept_ra_min_hop_limit;
455027d54aSPatrick Rohr 	__s32		accept_ra_min_lft;
46c4fd30ebSYOSHIFUJI Hideaki 	__s32		accept_ra_pinfo;
4735103d11SAndy Gospodarek 	__s32		ignore_routes_with_linkdown;
48930d6ff2SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_ROUTER_PREF
49930d6ff2SYOSHIFUJI Hideaki 	__s32		accept_ra_rtr_pref;
5052e16356SYOSHIFUJI Hideaki 	__s32		rtr_probe_interval;
5109c884d4SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_ROUTE_INFO
52bbea124bSJoel Scherpelz 	__s32		accept_ra_rt_info_min_plen;
5309c884d4SYOSHIFUJI Hideaki 	__s32		accept_ra_rt_info_max_plen;
5409c884d4SYOSHIFUJI Hideaki #endif
55930d6ff2SYOSHIFUJI Hideaki #endif
560bcbc926SYOSHIFUJI Hideaki 	__s32		accept_source_route;
57d9333196SBen Greear 	__s32		accept_ra_from_local;
5895c385b4SNeil Horman #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
5995c385b4SNeil Horman 	__s32		optimistic_dad;
607fd2561eSErik Kline 	__s32		use_optimistic;
6195c385b4SNeil Horman #endif
627bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE
63145c7a79SEric Dumazet 	atomic_t	mc_forwarding;
647bc570c8SYOSHIFUJI Hideaki #endif
65abbc3043SJohannes Berg 	__s32		drop_unicast_in_l2_multicast;
661b34be74SYOSHIFUJI Hideaki 	__s32		accept_dad;
67f7734fdfSOctavian Purdila 	__s32		force_tllao;
685cb04436SHannes Frederic Sowa 	__s32           ndisc_notify;
69b800c3b9SHannes Frederic Sowa 	__s32		suppress_frag_ndisc;
70c2943f14SHarout Hedeshian 	__s32		accept_ra_mtu;
717a02bf89SJohannes Berg 	__s32		drop_unsolicited_na;
723e0b8f52SArun Ajith S 	__s32		accept_untracked_na;
733d1bec99SHannes Frederic Sowa 	struct ipv6_stable_secret {
743d1bec99SHannes Frederic Sowa 		bool initialized;
753d1bec99SHannes Frederic Sowa 		struct in6_addr secret;
763d1bec99SHannes Frederic Sowa 	} stable_secret;
773985e8a3SErik Kline 	__s32		use_oif_addrs_only;
78f1705ec1SDavid Ahern 	__s32		keep_addr_on_down;
791ababebaSDavid Lebrun 	__s32		seg6_enabled;
80bf355b8dSDavid Lebrun #ifdef CONFIG_IPV6_SEG6_HMAC
81bf355b8dSDavid Lebrun 	__s32		seg6_require_hmac;
82bf355b8dSDavid Lebrun #endif
83adc176c5SErik Nordmark 	__u32		enhanced_dad;
84d35a00b8SFelix Jia 	__u32		addr_gen_mode;
852210d6b2SMaciej Żenczykowski 	__s32           ndisc_tclass;
868610c7c6SAlexander Aring 	__s32		rpl_seg_enabled;
879ee11f0fSJustin Iurman 	__u32		ioam6_id;
889ee11f0fSJustin Iurman 	__u32		ioam6_id_wide;
899ee11f0fSJustin Iurman 	__u8		ioam6_enabled;
9018ac597aSJames Prestwood 	__u8		ndisc_evict_nocarrier;
91473267a4SPatrick Rohr 	__u8		ra_honor_pio_life;
92990c3049SPatrick Rohr 	__u8		ra_honor_pio_pflag;
93607ea7cdSKonstantin Khlebnikov 
94607ea7cdSKonstantin Khlebnikov 	struct ctl_table_header *sysctl_header;
951da177e4SLinus Torvalds };
9656d417b1SBrian Haley 
9756d417b1SBrian Haley struct ipv6_params {
9856d417b1SBrian Haley 	__s32 disable_ipv6;
9956d417b1SBrian Haley 	__s32 autoconf;
10056d417b1SBrian Haley };
10156d417b1SBrian Haley extern struct ipv6_params ipv6_defaults;
1021da177e4SLinus Torvalds #include <linux/tcp.h>
1031da177e4SLinus Torvalds #include <linux/udp.h>
1041da177e4SLinus Torvalds 
10514c85021SArnaldo Carvalho de Melo #include <net/inet_sock.h>
10614c85021SArnaldo Carvalho de Melo 
ipv6_hdr(const struct sk_buff * skb)1070660e03fSArnaldo Carvalho de Melo static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
1080660e03fSArnaldo Carvalho de Melo {
1090660e03fSArnaldo Carvalho de Melo 	return (struct ipv6hdr *)skb_network_header(skb);
1100660e03fSArnaldo Carvalho de Melo }
1110660e03fSArnaldo Carvalho de Melo 
inner_ipv6_hdr(const struct sk_buff * skb)1126a674e9cSJoseph Gasparakis static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb)
1136a674e9cSJoseph Gasparakis {
1146a674e9cSJoseph Gasparakis 	return (struct ipv6hdr *)skb_inner_network_header(skb);
1156a674e9cSJoseph Gasparakis }
1166a674e9cSJoseph Gasparakis 
ipipv6_hdr(const struct sk_buff * skb)11739b89160SArnaldo Carvalho de Melo static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
11839b89160SArnaldo Carvalho de Melo {
1199c70220bSArnaldo Carvalho de Melo 	return (struct ipv6hdr *)skb_transport_header(skb);
12039b89160SArnaldo Carvalho de Melo }
12139b89160SArnaldo Carvalho de Melo 
ipv6_transport_len(const struct sk_buff * skb)122ba5ea614SLinus Lüssing static inline unsigned int ipv6_transport_len(const struct sk_buff *skb)
123ba5ea614SLinus Lüssing {
124ba5ea614SLinus Lüssing 	return ntohs(ipv6_hdr(skb)->payload_len) + sizeof(struct ipv6hdr) -
125ba5ea614SLinus Lüssing 	       skb_network_header_len(skb);
126ba5ea614SLinus Lüssing }
127ba5ea614SLinus Lüssing 
1281da177e4SLinus Torvalds /*
1291da177e4SLinus Torvalds    This structure contains results of exthdrs parsing
1301da177e4SLinus Torvalds    as offsets from skb->nh.
1311da177e4SLinus Torvalds  */
1321da177e4SLinus Torvalds 
1331da177e4SLinus Torvalds struct inet6_skb_parm {
1341da177e4SLinus Torvalds 	int			iif;
135dd3332bfSYOSHIFUJI Hideaki / 吉藤英明 	__be16			ra;
1361da177e4SLinus Torvalds 	__u16			dst0;
1371da177e4SLinus Torvalds 	__u16			srcrt;
1381da177e4SLinus Torvalds 	__u16			dst1;
139333fad53SYOSHIFUJI Hideaki 	__u16			lastopt;
140e7c38157SDavid S. Miller 	__u16			nhoff;
1413e3850e9SPatrick McHardy 	__u16			flags;
14259fbb3a6SMasahide NAKAMURA #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
1438dd7368dSDavid S. Miller 	__u16			dsthao;
1448dd7368dSDavid S. Miller #endif
1454cdd3408SPatrick McHardy 	__u16			frag_max_size;
146e4129440SAndrew Lunn 	__u16			srhoff;
1473e3850e9SPatrick McHardy 
1483e3850e9SPatrick McHardy #define IP6SKB_XFRM_TRANSFORMED	1
1497bc570c8SYOSHIFUJI Hideaki #define IP6SKB_FORWARDED	2
1509c6eb28aSJan Engelhardt #define IP6SKB_REROUTED		4
151dd3332bfSYOSHIFUJI Hideaki / 吉藤英明 #define IP6SKB_ROUTERALERT	8
152f46078cfSHannes Frederic Sowa #define IP6SKB_FRAGMENTED      16
1538b58a398SFlorian Westphal #define IP6SKB_HOPBYHOP        32
15474b20582SDavid Ahern #define IP6SKB_L3SLAVE         64
155cb891fa6SPaolo Abeni #define IP6SKB_JUMBOGRAM      128
156e4129440SAndrew Lunn #define IP6SKB_SEG6	      256
15780e425b6SCoco Li #define IP6SKB_FAKEJUMBO      512
1588423be89SSriram Yagnaraman #define IP6SKB_MULTIPATH      1024
1591da177e4SLinus Torvalds };
1601da177e4SLinus Torvalds 
16174b20582SDavid Ahern #if defined(CONFIG_NET_L3_MASTER_DEV)
ipv6_l3mdev_skb(__u16 flags)162a04a480dSDavid Ahern static inline bool ipv6_l3mdev_skb(__u16 flags)
16374b20582SDavid Ahern {
16474b20582SDavid Ahern 	return flags & IP6SKB_L3SLAVE;
16574b20582SDavid Ahern }
16674b20582SDavid Ahern #else
ipv6_l3mdev_skb(__u16 flags)167a04a480dSDavid Ahern static inline bool ipv6_l3mdev_skb(__u16 flags)
16874b20582SDavid Ahern {
16974b20582SDavid Ahern 	return false;
17074b20582SDavid Ahern }
17174b20582SDavid Ahern #endif
17274b20582SDavid Ahern 
1731da177e4SLinus Torvalds #define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb))
1744b340ae2SBrian Haley #define IP6CBMTU(skb)	((struct ip6_mtuinfo *)((skb)->cb))
1751da177e4SLinus Torvalds 
inet6_iif(const struct sk_buff * skb)176505cbfc5SArnaldo Carvalho de Melo static inline int inet6_iif(const struct sk_buff *skb)
177505cbfc5SArnaldo Carvalho de Melo {
178a04a480dSDavid Ahern 	bool l3_slave = ipv6_l3mdev_skb(IP6CB(skb)->flags);
17974b20582SDavid Ahern 
18074b20582SDavid Ahern 	return l3_slave ? skb->skb_iif : IP6CB(skb)->iif;
181505cbfc5SArnaldo Carvalho de Melo }
182505cbfc5SArnaldo Carvalho de Melo 
inet6_is_jumbogram(const struct sk_buff * skb)183cb891fa6SPaolo Abeni static inline bool inet6_is_jumbogram(const struct sk_buff *skb)
184cb891fa6SPaolo Abeni {
185cb891fa6SPaolo Abeni 	return !!(IP6CB(skb)->flags & IP6SKB_JUMBOGRAM);
186cb891fa6SPaolo Abeni }
187cb891fa6SPaolo Abeni 
188a04a480dSDavid Ahern /* can not be used in TCP layer after tcp_v6_fill_cb */
inet6_sdif(const struct sk_buff * skb)1891801b570SDavid Ahern static inline int inet6_sdif(const struct sk_buff *skb)
1901801b570SDavid Ahern {
1911801b570SDavid Ahern #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV)
1921801b570SDavid Ahern 	if (skb && ipv6_l3mdev_skb(IP6CB(skb)->flags))
1931801b570SDavid Ahern 		return IP6CB(skb)->iif;
1941801b570SDavid Ahern #endif
1951801b570SDavid Ahern 	return 0;
1961801b570SDavid Ahern }
1971801b570SDavid Ahern 
198ca304b61SArnaldo Carvalho de Melo struct tcp6_request_sock {
199ca304b61SArnaldo Carvalho de Melo 	struct tcp_request_sock	  tcp6rsk_tcp;
200ca304b61SArnaldo Carvalho de Melo };
2012e6599cbSArnaldo Carvalho de Melo 
20220283d84SHerbert Xu struct ipv6_mc_socklist;
20320283d84SHerbert Xu struct ipv6_ac_socklist;
20420283d84SHerbert Xu struct ipv6_fl_socklist;
20520283d84SHerbert Xu 
206366e41d9SVlad Yasevich struct inet6_cork {
207366e41d9SVlad Yasevich 	struct ipv6_txoptions *opt;
208366e41d9SVlad Yasevich 	u8 hop_limit;
209366e41d9SVlad Yasevich 	u8 tclass;
210*a18dfa99SWillem de Bruijn 	u8 dontfrag:1;
211366e41d9SVlad Yasevich };
212366e41d9SVlad Yasevich 
213f5f80e32SEric Dumazet /* struct ipv6_pinfo - ipv6 private area */
2141da177e4SLinus Torvalds struct ipv6_pinfo {
2151da177e4SLinus Torvalds 	struct in6_addr 	saddr;
216b24a2516SYang Hongyang 	struct in6_pktinfo	sticky_pktinfo;
217d3818c92SEric Dumazet 	const struct in6_addr		*daddr_cache;
2188e1ef0a9SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_SUBTREES
219d3818c92SEric Dumazet 	const struct in6_addr		*saddr_cache;
2208e1ef0a9SYOSHIFUJI Hideaki #endif
2211da177e4SLinus Torvalds 
22290bcaf7bSAl Viro 	__be32			flow_label;
2231da177e4SLinus Torvalds 	__u32			frag_size;
2241d5d236dSYOSHIFUJI Hideaki 
225b0adfba7SEric Dumazet 	s16			hop_limit;
2262da23eb0SEric Dumazet 	u8			mcast_hops;
2271d5d236dSYOSHIFUJI Hideaki 
228c4062dfcSErich E. Hoover 	int			ucast_oif;
2291da177e4SLinus Torvalds 	int			mcast_oif;
2301da177e4SLinus Torvalds 
2311da177e4SLinus Torvalds 	/* pktoption flags */
2321da177e4SLinus Torvalds 	union {
2331da177e4SLinus Torvalds 		struct {
2344c752098SYOSHIFUJI Hideaki 			__u16	srcrt:1,
2354c752098SYOSHIFUJI Hideaki 				osrcrt:1,
2361da177e4SLinus Torvalds 			        rxinfo:1,
237333fad53SYOSHIFUJI Hideaki 			        rxoinfo:1,
2381da177e4SLinus Torvalds 				rxhlim:1,
239333fad53SYOSHIFUJI Hideaki 				rxohlim:1,
2401da177e4SLinus Torvalds 				hopopts:1,
241333fad53SYOSHIFUJI Hideaki 				ohopopts:1,
2421da177e4SLinus Torvalds 				dstopts:1,
243333fad53SYOSHIFUJI Hideaki 				odstopts:1,
24441a1f8eaSYOSHIFUJI Hideaki                                 rxflow:1,
245793b1473SBrian Haley 				rxtclass:1,
2466c468622SBalazs Scheidler 				rxpmtu:1,
2470cc0aa61SWillem de Bruijn 				rxorigdstaddr:1,
2480cc0aa61SWillem de Bruijn 				recvfragsize:1;
2490cc0aa61SWillem de Bruijn 				/* 1 bits hole */
2501da177e4SLinus Torvalds 		} bits;
251333fad53SYOSHIFUJI Hideaki 		__u16		all;
2521da177e4SLinus Torvalds 	} rxopt;
2531da177e4SLinus Torvalds 
2541da177e4SLinus Torvalds 	/* sockopt flags */
255fa17a6d8SEric Dumazet 	__u8			srcprefs;	/* 001: prefer temporary address
2567cbca67cSYOSHIFUJI Hideaki 						 * 010: prefer public address
2577cbca67cSYOSHIFUJI Hideaki 						 * 100: prefer care-of address
2587cbca67cSYOSHIFUJI Hideaki 						 */
2596b724bc4SEric Dumazet 	__u8			pmtudisc;
260e802af9cSStephen Hemminger 	__u8			min_hopcount;
26141a1f8eaSYOSHIFUJI Hideaki 	__u8			tclass;
2621397ed35SFlorent Fourcot 	__be32			rcv_flowinfo;
2631da177e4SLinus Torvalds 
2641da177e4SLinus Torvalds 	__u32			dst_cookie;
2651da177e4SLinus Torvalds 
266456b61bcSEric Dumazet 	struct ipv6_mc_socklist	__rcu *ipv6_mc_list;
2671da177e4SLinus Torvalds 	struct ipv6_ac_socklist	*ipv6_ac_list;
26818367681SYOSHIFUJI Hideaki / 吉藤英明 	struct ipv6_fl_socklist __rcu *ipv6_fl_list;
2691da177e4SLinus Torvalds 
27045f6fad8SEric Dumazet 	struct ipv6_txoptions __rcu	*opt;
2711da177e4SLinus Torvalds 	struct sk_buff		*pktoptions;
2724b340ae2SBrian Haley 	struct sk_buff		*rxpmtu;
273366e41d9SVlad Yasevich 	struct inet6_cork	cork;
2741da177e4SLinus Torvalds };
2751da177e4SLinus Torvalds 
276d986f521SEric Dumazet /* We currently use available bits from inet_sk(sk)->inet_flags,
277d986f521SEric Dumazet  * this could change in the future.
278d986f521SEric Dumazet  */
279d986f521SEric Dumazet #define inet6_test_bit(nr, sk)			\
280d986f521SEric Dumazet 	test_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)
281d986f521SEric Dumazet #define inet6_set_bit(nr, sk)			\
282d986f521SEric Dumazet 	set_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)
283d986f521SEric Dumazet #define inet6_clear_bit(nr, sk)			\
284d986f521SEric Dumazet 	clear_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)
285d986f521SEric Dumazet #define inet6_assign_bit(nr, sk, val)		\
286d986f521SEric Dumazet 	assign_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags, val)
287d986f521SEric Dumazet 
2881da177e4SLinus Torvalds /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
2891da177e4SLinus Torvalds struct raw6_sock {
2901da177e4SLinus Torvalds 	/* inet_sock has to be the first member of raw6_sock */
2911da177e4SLinus Torvalds 	struct inet_sock	inet;
2921da177e4SLinus Torvalds 	__u32			checksum;	/* perform checksum */
2931da177e4SLinus Torvalds 	__u32			offset;		/* checksum offset  */
2941da177e4SLinus Torvalds 	struct icmp6_filter	filter;
295d1db275dSPatrick McHardy 	__u32			ip6mr_table;
296f5f80e32SEric Dumazet 
2971da177e4SLinus Torvalds 	struct ipv6_pinfo	inet6;
2981da177e4SLinus Torvalds };
2991da177e4SLinus Torvalds 
3001da177e4SLinus Torvalds struct udp6_sock {
3011da177e4SLinus Torvalds 	struct udp_sock	  udp;
302f5f80e32SEric Dumazet 
3031da177e4SLinus Torvalds 	struct ipv6_pinfo inet6;
3041da177e4SLinus Torvalds };
3051da177e4SLinus Torvalds 
3061da177e4SLinus Torvalds struct tcp6_sock {
3071da177e4SLinus Torvalds 	struct tcp_sock	  tcp;
308f5f80e32SEric Dumazet 
3091da177e4SLinus Torvalds 	struct ipv6_pinfo inet6;
3101da177e4SLinus Torvalds };
3111da177e4SLinus Torvalds 
312b9750ce1SArnaldo Carvalho de Melo extern int inet6_sk_rebuild_header(struct sock *sk);
313b9750ce1SArnaldo Carvalho de Melo 
31448ee3569SDavid S. Miller struct tcp6_timewait_sock {
31548ee3569SDavid S. Miller 	struct tcp_timewait_sock   tcp6tw_tcp;
31648ee3569SDavid S. Miller };
31748ee3569SDavid S. Miller 
318dfd56b8bSEric Dumazet #if IS_ENABLED(CONFIG_IPV6)
319e4348637SDavid Ahern bool ipv6_mod_enabled(void);
320e4348637SDavid Ahern 
inet6_sk(const struct sock * __sk)3211da177e4SLinus Torvalds static inline struct ipv6_pinfo *inet6_sk(const struct sock *__sk)
3221da177e4SLinus Torvalds {
323e7eadb4dSEric Dumazet 	return sk_fullsock(__sk) ? inet_sk(__sk)->pinet6 : NULL;
3241da177e4SLinus Torvalds }
3251da177e4SLinus Torvalds 
32647fcae28SEric Dumazet #define raw6_sk(ptr) container_of_const(ptr, struct raw6_sock, inet.sk)
3271da177e4SLinus Torvalds 
32889e9c728SKuniyuki Iwashima #define ipv6_only_sock(sk)	(sk->sk_ipv6only)
3294b261c75SHannes Frederic Sowa #define ipv6_sk_rxinfo(sk)	((sk)->sk_family == PF_INET6 && \
3304b261c75SHannes Frederic Sowa 				 inet6_sk(sk)->rxopt.bits.rxinfo)
3318feaf0c0SArnaldo Carvalho de Melo 
inet6_rcv_saddr(const struct sock * sk)332efe4208fSEric Dumazet static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
3338feaf0c0SArnaldo Carvalho de Melo {
334efe4208fSEric Dumazet 	if (sk->sk_family == AF_INET6)
335efe4208fSEric Dumazet 		return &sk->sk_v6_rcv_saddr;
336efe4208fSEric Dumazet 	return NULL;
3378feaf0c0SArnaldo Carvalho de Melo }
3388feaf0c0SArnaldo Carvalho de Melo 
inet_v6_ipv6only(const struct sock * sk)339463c84b9SArnaldo Carvalho de Melo static inline int inet_v6_ipv6only(const struct sock *sk)
3408feaf0c0SArnaldo Carvalho de Melo {
3419fe516baSEric Dumazet 	/* ipv6only field is at same position for timewait and other sockets */
3429fe516baSEric Dumazet 	return ipv6_only_sock(sk);
3438feaf0c0SArnaldo Carvalho de Melo }
3441da177e4SLinus Torvalds #else
3451da177e4SLinus Torvalds #define ipv6_only_sock(sk)	0
3464b261c75SHannes Frederic Sowa #define ipv6_sk_rxinfo(sk)	0
3471da177e4SLinus Torvalds 
ipv6_mod_enabled(void)348e4348637SDavid Ahern static inline bool ipv6_mod_enabled(void)
349e4348637SDavid Ahern {
350e4348637SDavid Ahern 	return false;
351e4348637SDavid Ahern }
352e4348637SDavid Ahern 
inet6_sk(const struct sock * __sk)3531da177e4SLinus Torvalds static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
3541da177e4SLinus Torvalds {
3551da177e4SLinus Torvalds 	return NULL;
3561da177e4SLinus Torvalds }
3571da177e4SLinus Torvalds 
raw6_sk(const struct sock * sk)3581da177e4SLinus Torvalds static inline struct raw6_sock *raw6_sk(const struct sock *sk)
3591da177e4SLinus Torvalds {
3601da177e4SLinus Torvalds 	return NULL;
3611da177e4SLinus Torvalds }
3621da177e4SLinus Torvalds 
3630fa1a53eSArnaldo Carvalho de Melo #define inet6_rcv_saddr(__sk)	NULL
364463c84b9SArnaldo Carvalho de Melo #define inet_v6_ipv6only(__sk)		0
365dfd56b8bSEric Dumazet #endif /* IS_ENABLED(CONFIG_IPV6) */
3668feaf0c0SArnaldo Carvalho de Melo #endif /* _IPV6_H */
367