xref: /openbmc/linux/include/linux/ipv6.h (revision 8423be89)
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>
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
81431fb31SPaul Durrant #define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
91da177e4SLinus Torvalds /*
101da177e4SLinus Torvalds  * This structure contains configuration options per IPv6 link.
111da177e4SLinus Torvalds  */
121da177e4SLinus Torvalds struct ipv6_devconf {
131da177e4SLinus Torvalds 	__s32		forwarding;
141da177e4SLinus Torvalds 	__s32		hop_limit;
151da177e4SLinus Torvalds 	__s32		mtu6;
161da177e4SLinus Torvalds 	__s32		accept_ra;
171da177e4SLinus Torvalds 	__s32		accept_redirects;
181da177e4SLinus Torvalds 	__s32		autoconf;
191da177e4SLinus Torvalds 	__s32		dad_transmits;
201da177e4SLinus Torvalds 	__s32		rtr_solicits;
211da177e4SLinus Torvalds 	__s32		rtr_solicit_interval;
22bd11f074SMaciej Żenczykowski 	__s32		rtr_solicit_max_interval;
231da177e4SLinus Torvalds 	__s32		rtr_solicit_delay;
241da177e4SLinus Torvalds 	__s32		force_mld_version;
25fc4eba58SHannes Frederic Sowa 	__s32		mldv1_unsolicited_report_interval;
26fc4eba58SHannes Frederic Sowa 	__s32		mldv2_unsolicited_report_interval;
271da177e4SLinus Torvalds 	__s32		use_tempaddr;
281da177e4SLinus Torvalds 	__s32		temp_valid_lft;
291da177e4SLinus Torvalds 	__s32		temp_prefered_lft;
301da177e4SLinus Torvalds 	__s32		regen_max_retry;
311da177e4SLinus Torvalds 	__s32		max_desync_factor;
321da177e4SLinus Torvalds 	__s32		max_addresses;
3365f5c7c1SYOSHIFUJI Hideaki 	__s32		accept_ra_defrtr;
346b2e04bcSPraveen Chaudhary 	__u32		ra_defrtr_metric;
358013d1d7SHangbin Liu 	__s32		accept_ra_min_hop_limit;
365027d54aSPatrick Rohr 	__s32		accept_ra_min_lft;
37c4fd30ebSYOSHIFUJI Hideaki 	__s32		accept_ra_pinfo;
3835103d11SAndy Gospodarek 	__s32		ignore_routes_with_linkdown;
39930d6ff2SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_ROUTER_PREF
40930d6ff2SYOSHIFUJI Hideaki 	__s32		accept_ra_rtr_pref;
4152e16356SYOSHIFUJI Hideaki 	__s32		rtr_probe_interval;
4209c884d4SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_ROUTE_INFO
43bbea124bSJoel Scherpelz 	__s32		accept_ra_rt_info_min_plen;
4409c884d4SYOSHIFUJI Hideaki 	__s32		accept_ra_rt_info_max_plen;
4509c884d4SYOSHIFUJI Hideaki #endif
46930d6ff2SYOSHIFUJI Hideaki #endif
47fbea49e1SYOSHIFUJI Hideaki 	__s32		proxy_ndp;
480bcbc926SYOSHIFUJI Hideaki 	__s32		accept_source_route;
49d9333196SBen Greear 	__s32		accept_ra_from_local;
5095c385b4SNeil Horman #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
5195c385b4SNeil Horman 	__s32		optimistic_dad;
527fd2561eSErik Kline 	__s32		use_optimistic;
5395c385b4SNeil Horman #endif
547bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE
55145c7a79SEric Dumazet 	atomic_t	mc_forwarding;
567bc570c8SYOSHIFUJI Hideaki #endif
57778d80beSYOSHIFUJI Hideaki 	__s32		disable_ipv6;
58abbc3043SJohannes Berg 	__s32		drop_unicast_in_l2_multicast;
591b34be74SYOSHIFUJI Hideaki 	__s32		accept_dad;
60f7734fdfSOctavian Purdila 	__s32		force_tllao;
615cb04436SHannes Frederic Sowa 	__s32           ndisc_notify;
62b800c3b9SHannes Frederic Sowa 	__s32		suppress_frag_ndisc;
63c2943f14SHarout Hedeshian 	__s32		accept_ra_mtu;
647a02bf89SJohannes Berg 	__s32		drop_unsolicited_na;
653e0b8f52SArun Ajith S 	__s32		accept_untracked_na;
663d1bec99SHannes Frederic Sowa 	struct ipv6_stable_secret {
673d1bec99SHannes Frederic Sowa 		bool initialized;
683d1bec99SHannes Frederic Sowa 		struct in6_addr secret;
693d1bec99SHannes Frederic Sowa 	} stable_secret;
703985e8a3SErik Kline 	__s32		use_oif_addrs_only;
71f1705ec1SDavid Ahern 	__s32		keep_addr_on_down;
721ababebaSDavid Lebrun 	__s32		seg6_enabled;
73bf355b8dSDavid Lebrun #ifdef CONFIG_IPV6_SEG6_HMAC
74bf355b8dSDavid Lebrun 	__s32		seg6_require_hmac;
75bf355b8dSDavid Lebrun #endif
76adc176c5SErik Nordmark 	__u32		enhanced_dad;
77d35a00b8SFelix Jia 	__u32		addr_gen_mode;
78df789fe7SDavid Forster 	__s32		disable_policy;
792210d6b2SMaciej Żenczykowski 	__s32           ndisc_tclass;
808610c7c6SAlexander Aring 	__s32		rpl_seg_enabled;
819ee11f0fSJustin Iurman 	__u32		ioam6_id;
829ee11f0fSJustin Iurman 	__u32		ioam6_id_wide;
839ee11f0fSJustin Iurman 	__u8		ioam6_enabled;
8418ac597aSJames Prestwood 	__u8		ndisc_evict_nocarrier;
85607ea7cdSKonstantin Khlebnikov 
86607ea7cdSKonstantin Khlebnikov 	struct ctl_table_header *sysctl_header;
871da177e4SLinus Torvalds };
8856d417b1SBrian Haley 
8956d417b1SBrian Haley struct ipv6_params {
9056d417b1SBrian Haley 	__s32 disable_ipv6;
9156d417b1SBrian Haley 	__s32 autoconf;
9256d417b1SBrian Haley };
9356d417b1SBrian Haley extern struct ipv6_params ipv6_defaults;
941da177e4SLinus Torvalds #include <linux/tcp.h>
951da177e4SLinus Torvalds #include <linux/udp.h>
961da177e4SLinus Torvalds 
9714c85021SArnaldo Carvalho de Melo #include <net/inet_sock.h>
9814c85021SArnaldo Carvalho de Melo 
ipv6_hdr(const struct sk_buff * skb)990660e03fSArnaldo Carvalho de Melo static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
1000660e03fSArnaldo Carvalho de Melo {
1010660e03fSArnaldo Carvalho de Melo 	return (struct ipv6hdr *)skb_network_header(skb);
1020660e03fSArnaldo Carvalho de Melo }
1030660e03fSArnaldo Carvalho de Melo 
inner_ipv6_hdr(const struct sk_buff * skb)1046a674e9cSJoseph Gasparakis static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb)
1056a674e9cSJoseph Gasparakis {
1066a674e9cSJoseph Gasparakis 	return (struct ipv6hdr *)skb_inner_network_header(skb);
1076a674e9cSJoseph Gasparakis }
1086a674e9cSJoseph Gasparakis 
ipipv6_hdr(const struct sk_buff * skb)10939b89160SArnaldo Carvalho de Melo static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
11039b89160SArnaldo Carvalho de Melo {
1119c70220bSArnaldo Carvalho de Melo 	return (struct ipv6hdr *)skb_transport_header(skb);
11239b89160SArnaldo Carvalho de Melo }
11339b89160SArnaldo Carvalho de Melo 
ipv6_transport_len(const struct sk_buff * skb)114ba5ea614SLinus Lüssing static inline unsigned int ipv6_transport_len(const struct sk_buff *skb)
115ba5ea614SLinus Lüssing {
116ba5ea614SLinus Lüssing 	return ntohs(ipv6_hdr(skb)->payload_len) + sizeof(struct ipv6hdr) -
117ba5ea614SLinus Lüssing 	       skb_network_header_len(skb);
118ba5ea614SLinus Lüssing }
119ba5ea614SLinus Lüssing 
1201da177e4SLinus Torvalds /*
1211da177e4SLinus Torvalds    This structure contains results of exthdrs parsing
1221da177e4SLinus Torvalds    as offsets from skb->nh.
1231da177e4SLinus Torvalds  */
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds struct inet6_skb_parm {
1261da177e4SLinus Torvalds 	int			iif;
127dd3332bfSYOSHIFUJI Hideaki / 吉藤英明 	__be16			ra;
1281da177e4SLinus Torvalds 	__u16			dst0;
1291da177e4SLinus Torvalds 	__u16			srcrt;
1301da177e4SLinus Torvalds 	__u16			dst1;
131333fad53SYOSHIFUJI Hideaki 	__u16			lastopt;
132e7c38157SDavid S. Miller 	__u16			nhoff;
1333e3850e9SPatrick McHardy 	__u16			flags;
13459fbb3a6SMasahide NAKAMURA #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
1358dd7368dSDavid S. Miller 	__u16			dsthao;
1368dd7368dSDavid S. Miller #endif
1374cdd3408SPatrick McHardy 	__u16			frag_max_size;
138e4129440SAndrew Lunn 	__u16			srhoff;
1393e3850e9SPatrick McHardy 
1403e3850e9SPatrick McHardy #define IP6SKB_XFRM_TRANSFORMED	1
1417bc570c8SYOSHIFUJI Hideaki #define IP6SKB_FORWARDED	2
1429c6eb28aSJan Engelhardt #define IP6SKB_REROUTED		4
143dd3332bfSYOSHIFUJI Hideaki / 吉藤英明 #define IP6SKB_ROUTERALERT	8
144f46078cfSHannes Frederic Sowa #define IP6SKB_FRAGMENTED      16
1458b58a398SFlorian Westphal #define IP6SKB_HOPBYHOP        32
14674b20582SDavid Ahern #define IP6SKB_L3SLAVE         64
147cb891fa6SPaolo Abeni #define IP6SKB_JUMBOGRAM      128
148e4129440SAndrew Lunn #define IP6SKB_SEG6	      256
14980e425b6SCoco Li #define IP6SKB_FAKEJUMBO      512
150*8423be89SSriram Yagnaraman #define IP6SKB_MULTIPATH      1024
1511da177e4SLinus Torvalds };
1521da177e4SLinus Torvalds 
15374b20582SDavid Ahern #if defined(CONFIG_NET_L3_MASTER_DEV)
ipv6_l3mdev_skb(__u16 flags)154a04a480dSDavid Ahern static inline bool ipv6_l3mdev_skb(__u16 flags)
15574b20582SDavid Ahern {
15674b20582SDavid Ahern 	return flags & IP6SKB_L3SLAVE;
15774b20582SDavid Ahern }
15874b20582SDavid Ahern #else
ipv6_l3mdev_skb(__u16 flags)159a04a480dSDavid Ahern static inline bool ipv6_l3mdev_skb(__u16 flags)
16074b20582SDavid Ahern {
16174b20582SDavid Ahern 	return false;
16274b20582SDavid Ahern }
16374b20582SDavid Ahern #endif
16474b20582SDavid Ahern 
1651da177e4SLinus Torvalds #define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb))
1664b340ae2SBrian Haley #define IP6CBMTU(skb)	((struct ip6_mtuinfo *)((skb)->cb))
1671da177e4SLinus Torvalds 
inet6_iif(const struct sk_buff * skb)168505cbfc5SArnaldo Carvalho de Melo static inline int inet6_iif(const struct sk_buff *skb)
169505cbfc5SArnaldo Carvalho de Melo {
170a04a480dSDavid Ahern 	bool l3_slave = ipv6_l3mdev_skb(IP6CB(skb)->flags);
17174b20582SDavid Ahern 
17274b20582SDavid Ahern 	return l3_slave ? skb->skb_iif : IP6CB(skb)->iif;
173505cbfc5SArnaldo Carvalho de Melo }
174505cbfc5SArnaldo Carvalho de Melo 
inet6_is_jumbogram(const struct sk_buff * skb)175cb891fa6SPaolo Abeni static inline bool inet6_is_jumbogram(const struct sk_buff *skb)
176cb891fa6SPaolo Abeni {
177cb891fa6SPaolo Abeni 	return !!(IP6CB(skb)->flags & IP6SKB_JUMBOGRAM);
178cb891fa6SPaolo Abeni }
179cb891fa6SPaolo Abeni 
180a04a480dSDavid Ahern /* can not be used in TCP layer after tcp_v6_fill_cb */
inet6_sdif(const struct sk_buff * skb)1811801b570SDavid Ahern static inline int inet6_sdif(const struct sk_buff *skb)
1821801b570SDavid Ahern {
1831801b570SDavid Ahern #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV)
1841801b570SDavid Ahern 	if (skb && ipv6_l3mdev_skb(IP6CB(skb)->flags))
1851801b570SDavid Ahern 		return IP6CB(skb)->iif;
1861801b570SDavid Ahern #endif
1871801b570SDavid Ahern 	return 0;
1881801b570SDavid Ahern }
1891801b570SDavid Ahern 
190ca304b61SArnaldo Carvalho de Melo struct tcp6_request_sock {
191ca304b61SArnaldo Carvalho de Melo 	struct tcp_request_sock	  tcp6rsk_tcp;
192ca304b61SArnaldo Carvalho de Melo };
1932e6599cbSArnaldo Carvalho de Melo 
19420283d84SHerbert Xu struct ipv6_mc_socklist;
19520283d84SHerbert Xu struct ipv6_ac_socklist;
19620283d84SHerbert Xu struct ipv6_fl_socklist;
19720283d84SHerbert Xu 
198366e41d9SVlad Yasevich struct inet6_cork {
199366e41d9SVlad Yasevich 	struct ipv6_txoptions *opt;
200366e41d9SVlad Yasevich 	u8 hop_limit;
201366e41d9SVlad Yasevich 	u8 tclass;
202366e41d9SVlad Yasevich };
203366e41d9SVlad Yasevich 
204f5f80e32SEric Dumazet /* struct ipv6_pinfo - ipv6 private area */
2051da177e4SLinus Torvalds struct ipv6_pinfo {
2061da177e4SLinus Torvalds 	struct in6_addr 	saddr;
207b24a2516SYang Hongyang 	struct in6_pktinfo	sticky_pktinfo;
208d3818c92SEric Dumazet 	const struct in6_addr		*daddr_cache;
2098e1ef0a9SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_SUBTREES
210d3818c92SEric Dumazet 	const struct in6_addr		*saddr_cache;
2118e1ef0a9SYOSHIFUJI Hideaki #endif
2121da177e4SLinus Torvalds 
21390bcaf7bSAl Viro 	__be32			flow_label;
2141da177e4SLinus Torvalds 	__u32			frag_size;
2151d5d236dSYOSHIFUJI Hideaki 
2161d5d236dSYOSHIFUJI Hideaki 	/*
2171d5d236dSYOSHIFUJI Hideaki 	 * Packed in 16bits.
21859632b22SRandy Dunlap 	 * Omit one shift by putting the signed field at MSB.
2191d5d236dSYOSHIFUJI Hideaki 	 */
2201d5d236dSYOSHIFUJI Hideaki #if defined(__BIG_ENDIAN_BITFIELD)
2211d5d236dSYOSHIFUJI Hideaki 	__s16			hop_limit:9;
2221d5d236dSYOSHIFUJI Hideaki 	__u16			__unused_1:7;
2231d5d236dSYOSHIFUJI Hideaki #else
2241d5d236dSYOSHIFUJI Hideaki 	__u16			__unused_1:7;
2251d5d236dSYOSHIFUJI Hideaki 	__s16			hop_limit:9;
2261d5d236dSYOSHIFUJI Hideaki #endif
2271d5d236dSYOSHIFUJI Hideaki 
2281d5d236dSYOSHIFUJI Hideaki #if defined(__BIG_ENDIAN_BITFIELD)
2291d5d236dSYOSHIFUJI Hideaki 	/* Packed in 16bits. */
2301d5d236dSYOSHIFUJI Hideaki 	__s16			mcast_hops:9;
2311d5d236dSYOSHIFUJI Hideaki 	__u16			__unused_2:6,
2321d5d236dSYOSHIFUJI Hideaki 				mc_loop:1;
2331d5d236dSYOSHIFUJI Hideaki #else
2341d5d236dSYOSHIFUJI Hideaki 	__u16			mc_loop:1,
2351d5d236dSYOSHIFUJI Hideaki 				__unused_2:6;
2361d5d236dSYOSHIFUJI Hideaki 	__s16			mcast_hops:9;
2371d5d236dSYOSHIFUJI Hideaki #endif
238c4062dfcSErich E. Hoover 	int			ucast_oif;
2391da177e4SLinus Torvalds 	int			mcast_oif;
2401da177e4SLinus Torvalds 
2411da177e4SLinus Torvalds 	/* pktoption flags */
2421da177e4SLinus Torvalds 	union {
2431da177e4SLinus Torvalds 		struct {
2444c752098SYOSHIFUJI Hideaki 			__u16	srcrt:1,
2454c752098SYOSHIFUJI Hideaki 				osrcrt:1,
2461da177e4SLinus Torvalds 			        rxinfo:1,
247333fad53SYOSHIFUJI Hideaki 			        rxoinfo:1,
2481da177e4SLinus Torvalds 				rxhlim:1,
249333fad53SYOSHIFUJI Hideaki 				rxohlim:1,
2501da177e4SLinus Torvalds 				hopopts:1,
251333fad53SYOSHIFUJI Hideaki 				ohopopts:1,
2521da177e4SLinus Torvalds 				dstopts:1,
253333fad53SYOSHIFUJI Hideaki 				odstopts:1,
25441a1f8eaSYOSHIFUJI Hideaki                                 rxflow:1,
255793b1473SBrian Haley 				rxtclass:1,
2566c468622SBalazs Scheidler 				rxpmtu:1,
2570cc0aa61SWillem de Bruijn 				rxorigdstaddr:1,
2580cc0aa61SWillem de Bruijn 				recvfragsize:1;
2590cc0aa61SWillem de Bruijn 				/* 1 bits hole */
2601da177e4SLinus Torvalds 		} bits;
261333fad53SYOSHIFUJI Hideaki 		__u16		all;
2621da177e4SLinus Torvalds 	} rxopt;
2631da177e4SLinus Torvalds 
2641da177e4SLinus Torvalds 	/* sockopt flags */
265793b1473SBrian Haley 	__u16			recverr:1,
2661da177e4SLinus Torvalds 	                        sndflow:1,
267df3687ffSFlorent Fourcot 				repflow:1,
26893b36cf3SHannes Frederic Sowa 				pmtudisc:3,
2699fe516baSEric Dumazet 				padding:1,	/* 1 bit hole */
270793b1473SBrian Haley 				srcprefs:3,	/* 001: prefer temporary address
2717cbca67cSYOSHIFUJI Hideaki 						 * 010: prefer public address
2727cbca67cSYOSHIFUJI Hideaki 						 * 100: prefer care-of address
2737cbca67cSYOSHIFUJI Hideaki 						 */
274cb1ce2efSTom Herbert 				dontfrag:1,
275513674b5SShaohua Li 				autoflowlabel:1,
27615033f04SAndre Naujoks 				autoflowlabel_set:1,
2779036b2feSFrancesco Ruggeri 				mc_all:1,
27801370434SWillem de Bruijn 				recverr_rfc4884:1,
2799036b2feSFrancesco Ruggeri 				rtalert_isolate:1;
280e802af9cSStephen Hemminger 	__u8			min_hopcount;
28141a1f8eaSYOSHIFUJI Hideaki 	__u8			tclass;
2821397ed35SFlorent Fourcot 	__be32			rcv_flowinfo;
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds 	__u32			dst_cookie;
2851da177e4SLinus Torvalds 
286456b61bcSEric Dumazet 	struct ipv6_mc_socklist	__rcu *ipv6_mc_list;
2871da177e4SLinus Torvalds 	struct ipv6_ac_socklist	*ipv6_ac_list;
28818367681SYOSHIFUJI Hideaki / 吉藤英明 	struct ipv6_fl_socklist __rcu *ipv6_fl_list;
2891da177e4SLinus Torvalds 
29045f6fad8SEric Dumazet 	struct ipv6_txoptions __rcu	*opt;
2911da177e4SLinus Torvalds 	struct sk_buff		*pktoptions;
2924b340ae2SBrian Haley 	struct sk_buff		*rxpmtu;
293366e41d9SVlad Yasevich 	struct inet6_cork	cork;
2941da177e4SLinus Torvalds };
2951da177e4SLinus Torvalds 
2961da177e4SLinus Torvalds /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
2971da177e4SLinus Torvalds struct raw6_sock {
2981da177e4SLinus Torvalds 	/* inet_sock has to be the first member of raw6_sock */
2991da177e4SLinus Torvalds 	struct inet_sock	inet;
3001da177e4SLinus Torvalds 	__u32			checksum;	/* perform checksum */
3011da177e4SLinus Torvalds 	__u32			offset;		/* checksum offset  */
3021da177e4SLinus Torvalds 	struct icmp6_filter	filter;
303d1db275dSPatrick McHardy 	__u32			ip6mr_table;
304f5f80e32SEric Dumazet 
3051da177e4SLinus Torvalds 	struct ipv6_pinfo	inet6;
3061da177e4SLinus Torvalds };
3071da177e4SLinus Torvalds 
3081da177e4SLinus Torvalds struct udp6_sock {
3091da177e4SLinus Torvalds 	struct udp_sock	  udp;
310f5f80e32SEric Dumazet 
3111da177e4SLinus Torvalds 	struct ipv6_pinfo inet6;
3121da177e4SLinus Torvalds };
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds struct tcp6_sock {
3151da177e4SLinus Torvalds 	struct tcp_sock	  tcp;
316f5f80e32SEric Dumazet 
3171da177e4SLinus Torvalds 	struct ipv6_pinfo inet6;
3181da177e4SLinus Torvalds };
3191da177e4SLinus Torvalds 
320b9750ce1SArnaldo Carvalho de Melo extern int inet6_sk_rebuild_header(struct sock *sk);
321b9750ce1SArnaldo Carvalho de Melo 
32248ee3569SDavid S. Miller struct tcp6_timewait_sock {
32348ee3569SDavid S. Miller 	struct tcp_timewait_sock   tcp6tw_tcp;
32448ee3569SDavid S. Miller };
32548ee3569SDavid S. Miller 
326dfd56b8bSEric Dumazet #if IS_ENABLED(CONFIG_IPV6)
327e4348637SDavid Ahern bool ipv6_mod_enabled(void);
328e4348637SDavid Ahern 
inet6_sk(const struct sock * __sk)3291da177e4SLinus Torvalds static inline struct ipv6_pinfo *inet6_sk(const struct sock *__sk)
3301da177e4SLinus Torvalds {
331e7eadb4dSEric Dumazet 	return sk_fullsock(__sk) ? inet_sk(__sk)->pinet6 : NULL;
3321da177e4SLinus Torvalds }
3331da177e4SLinus Torvalds 
33447fcae28SEric Dumazet #define raw6_sk(ptr) container_of_const(ptr, struct raw6_sock, inet.sk)
3351da177e4SLinus Torvalds 
33689e9c728SKuniyuki Iwashima #define ipv6_only_sock(sk)	(sk->sk_ipv6only)
3374b261c75SHannes Frederic Sowa #define ipv6_sk_rxinfo(sk)	((sk)->sk_family == PF_INET6 && \
3384b261c75SHannes Frederic Sowa 				 inet6_sk(sk)->rxopt.bits.rxinfo)
3398feaf0c0SArnaldo Carvalho de Melo 
inet6_rcv_saddr(const struct sock * sk)340efe4208fSEric Dumazet static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
3418feaf0c0SArnaldo Carvalho de Melo {
342efe4208fSEric Dumazet 	if (sk->sk_family == AF_INET6)
343efe4208fSEric Dumazet 		return &sk->sk_v6_rcv_saddr;
344efe4208fSEric Dumazet 	return NULL;
3458feaf0c0SArnaldo Carvalho de Melo }
3468feaf0c0SArnaldo Carvalho de Melo 
inet_v6_ipv6only(const struct sock * sk)347463c84b9SArnaldo Carvalho de Melo static inline int inet_v6_ipv6only(const struct sock *sk)
3488feaf0c0SArnaldo Carvalho de Melo {
3499fe516baSEric Dumazet 	/* ipv6only field is at same position for timewait and other sockets */
3509fe516baSEric Dumazet 	return ipv6_only_sock(sk);
3518feaf0c0SArnaldo Carvalho de Melo }
3521da177e4SLinus Torvalds #else
3531da177e4SLinus Torvalds #define ipv6_only_sock(sk)	0
3544b261c75SHannes Frederic Sowa #define ipv6_sk_rxinfo(sk)	0
3551da177e4SLinus Torvalds 
ipv6_mod_enabled(void)356e4348637SDavid Ahern static inline bool ipv6_mod_enabled(void)
357e4348637SDavid Ahern {
358e4348637SDavid Ahern 	return false;
359e4348637SDavid Ahern }
360e4348637SDavid Ahern 
inet6_sk(const struct sock * __sk)3611da177e4SLinus Torvalds static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
3621da177e4SLinus Torvalds {
3631da177e4SLinus Torvalds 	return NULL;
3641da177e4SLinus Torvalds }
3651da177e4SLinus Torvalds 
raw6_sk(const struct sock * sk)3661da177e4SLinus Torvalds static inline struct raw6_sock *raw6_sk(const struct sock *sk)
3671da177e4SLinus Torvalds {
3681da177e4SLinus Torvalds 	return NULL;
3691da177e4SLinus Torvalds }
3701da177e4SLinus Torvalds 
3710fa1a53eSArnaldo Carvalho de Melo #define inet6_rcv_saddr(__sk)	NULL
372463c84b9SArnaldo Carvalho de Melo #define inet_v6_ipv6only(__sk)		0
373dfd56b8bSEric Dumazet #endif /* IS_ENABLED(CONFIG_IPV6) */
3748feaf0c0SArnaldo Carvalho de Melo #endif /* _IPV6_H */
375