xref: /openbmc/linux/include/linux/ipv6.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _IPV6_H
3  #define _IPV6_H
4  
5  #include <uapi/linux/ipv6.h>
6  
7  #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
8  #define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
9  /*
10   * This structure contains configuration options per IPv6 link.
11   */
12  struct ipv6_devconf {
13  	__s32		forwarding;
14  	__s32		hop_limit;
15  	__s32		mtu6;
16  	__s32		accept_ra;
17  	__s32		accept_redirects;
18  	__s32		autoconf;
19  	__s32		dad_transmits;
20  	__s32		rtr_solicits;
21  	__s32		rtr_solicit_interval;
22  	__s32		rtr_solicit_max_interval;
23  	__s32		rtr_solicit_delay;
24  	__s32		force_mld_version;
25  	__s32		mldv1_unsolicited_report_interval;
26  	__s32		mldv2_unsolicited_report_interval;
27  	__s32		use_tempaddr;
28  	__s32		temp_valid_lft;
29  	__s32		temp_prefered_lft;
30  	__s32		regen_max_retry;
31  	__s32		max_desync_factor;
32  	__s32		max_addresses;
33  	__s32		accept_ra_defrtr;
34  	__u32		ra_defrtr_metric;
35  	__s32		accept_ra_min_hop_limit;
36  	__s32		accept_ra_min_lft;
37  	__s32		accept_ra_pinfo;
38  	__s32		ignore_routes_with_linkdown;
39  #ifdef CONFIG_IPV6_ROUTER_PREF
40  	__s32		accept_ra_rtr_pref;
41  	__s32		rtr_probe_interval;
42  #ifdef CONFIG_IPV6_ROUTE_INFO
43  	__s32		accept_ra_rt_info_min_plen;
44  	__s32		accept_ra_rt_info_max_plen;
45  #endif
46  #endif
47  	__s32		proxy_ndp;
48  	__s32		accept_source_route;
49  	__s32		accept_ra_from_local;
50  #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
51  	__s32		optimistic_dad;
52  	__s32		use_optimistic;
53  #endif
54  #ifdef CONFIG_IPV6_MROUTE
55  	atomic_t	mc_forwarding;
56  #endif
57  	__s32		disable_ipv6;
58  	__s32		drop_unicast_in_l2_multicast;
59  	__s32		accept_dad;
60  	__s32		force_tllao;
61  	__s32           ndisc_notify;
62  	__s32		suppress_frag_ndisc;
63  	__s32		accept_ra_mtu;
64  	__s32		drop_unsolicited_na;
65  	__s32		accept_untracked_na;
66  	struct ipv6_stable_secret {
67  		bool initialized;
68  		struct in6_addr secret;
69  	} stable_secret;
70  	__s32		use_oif_addrs_only;
71  	__s32		keep_addr_on_down;
72  	__s32		seg6_enabled;
73  #ifdef CONFIG_IPV6_SEG6_HMAC
74  	__s32		seg6_require_hmac;
75  #endif
76  	__u32		enhanced_dad;
77  	__u32		addr_gen_mode;
78  	__s32		disable_policy;
79  	__s32           ndisc_tclass;
80  	__s32		rpl_seg_enabled;
81  	__u32		ioam6_id;
82  	__u32		ioam6_id_wide;
83  	__u8		ioam6_enabled;
84  	__u8		ndisc_evict_nocarrier;
85  
86  	struct ctl_table_header *sysctl_header;
87  };
88  
89  struct ipv6_params {
90  	__s32 disable_ipv6;
91  	__s32 autoconf;
92  };
93  extern struct ipv6_params ipv6_defaults;
94  #include <linux/tcp.h>
95  #include <linux/udp.h>
96  
97  #include <net/inet_sock.h>
98  
ipv6_hdr(const struct sk_buff * skb)99  static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
100  {
101  	return (struct ipv6hdr *)skb_network_header(skb);
102  }
103  
inner_ipv6_hdr(const struct sk_buff * skb)104  static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb)
105  {
106  	return (struct ipv6hdr *)skb_inner_network_header(skb);
107  }
108  
ipipv6_hdr(const struct sk_buff * skb)109  static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
110  {
111  	return (struct ipv6hdr *)skb_transport_header(skb);
112  }
113  
ipv6_transport_len(const struct sk_buff * skb)114  static inline unsigned int ipv6_transport_len(const struct sk_buff *skb)
115  {
116  	return ntohs(ipv6_hdr(skb)->payload_len) + sizeof(struct ipv6hdr) -
117  	       skb_network_header_len(skb);
118  }
119  
120  /*
121     This structure contains results of exthdrs parsing
122     as offsets from skb->nh.
123   */
124  
125  struct inet6_skb_parm {
126  	int			iif;
127  	__be16			ra;
128  	__u16			dst0;
129  	__u16			srcrt;
130  	__u16			dst1;
131  	__u16			lastopt;
132  	__u16			nhoff;
133  	__u16			flags;
134  #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
135  	__u16			dsthao;
136  #endif
137  	__u16			frag_max_size;
138  	__u16			srhoff;
139  
140  #define IP6SKB_XFRM_TRANSFORMED	1
141  #define IP6SKB_FORWARDED	2
142  #define IP6SKB_REROUTED		4
143  #define IP6SKB_ROUTERALERT	8
144  #define IP6SKB_FRAGMENTED      16
145  #define IP6SKB_HOPBYHOP        32
146  #define IP6SKB_L3SLAVE         64
147  #define IP6SKB_JUMBOGRAM      128
148  #define IP6SKB_SEG6	      256
149  #define IP6SKB_FAKEJUMBO      512
150  #define IP6SKB_MULTIPATH      1024
151  };
152  
153  #if defined(CONFIG_NET_L3_MASTER_DEV)
ipv6_l3mdev_skb(__u16 flags)154  static inline bool ipv6_l3mdev_skb(__u16 flags)
155  {
156  	return flags & IP6SKB_L3SLAVE;
157  }
158  #else
ipv6_l3mdev_skb(__u16 flags)159  static inline bool ipv6_l3mdev_skb(__u16 flags)
160  {
161  	return false;
162  }
163  #endif
164  
165  #define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb))
166  #define IP6CBMTU(skb)	((struct ip6_mtuinfo *)((skb)->cb))
167  
inet6_iif(const struct sk_buff * skb)168  static inline int inet6_iif(const struct sk_buff *skb)
169  {
170  	bool l3_slave = ipv6_l3mdev_skb(IP6CB(skb)->flags);
171  
172  	return l3_slave ? skb->skb_iif : IP6CB(skb)->iif;
173  }
174  
inet6_is_jumbogram(const struct sk_buff * skb)175  static inline bool inet6_is_jumbogram(const struct sk_buff *skb)
176  {
177  	return !!(IP6CB(skb)->flags & IP6SKB_JUMBOGRAM);
178  }
179  
180  /* can not be used in TCP layer after tcp_v6_fill_cb */
inet6_sdif(const struct sk_buff * skb)181  static inline int inet6_sdif(const struct sk_buff *skb)
182  {
183  #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV)
184  	if (skb && ipv6_l3mdev_skb(IP6CB(skb)->flags))
185  		return IP6CB(skb)->iif;
186  #endif
187  	return 0;
188  }
189  
190  struct tcp6_request_sock {
191  	struct tcp_request_sock	  tcp6rsk_tcp;
192  };
193  
194  struct ipv6_mc_socklist;
195  struct ipv6_ac_socklist;
196  struct ipv6_fl_socklist;
197  
198  struct inet6_cork {
199  	struct ipv6_txoptions *opt;
200  	u8 hop_limit;
201  	u8 tclass;
202  };
203  
204  /* struct ipv6_pinfo - ipv6 private area */
205  struct ipv6_pinfo {
206  	struct in6_addr 	saddr;
207  	struct in6_pktinfo	sticky_pktinfo;
208  	const struct in6_addr		*daddr_cache;
209  #ifdef CONFIG_IPV6_SUBTREES
210  	const struct in6_addr		*saddr_cache;
211  #endif
212  
213  	__be32			flow_label;
214  	__u32			frag_size;
215  
216  	/*
217  	 * Packed in 16bits.
218  	 * Omit one shift by putting the signed field at MSB.
219  	 */
220  #if defined(__BIG_ENDIAN_BITFIELD)
221  	__s16			hop_limit:9;
222  	__u16			__unused_1:7;
223  #else
224  	__u16			__unused_1:7;
225  	__s16			hop_limit:9;
226  #endif
227  
228  #if defined(__BIG_ENDIAN_BITFIELD)
229  	/* Packed in 16bits. */
230  	__s16			mcast_hops:9;
231  	__u16			__unused_2:6,
232  				mc_loop:1;
233  #else
234  	__u16			mc_loop:1,
235  				__unused_2:6;
236  	__s16			mcast_hops:9;
237  #endif
238  	int			ucast_oif;
239  	int			mcast_oif;
240  
241  	/* pktoption flags */
242  	union {
243  		struct {
244  			__u16	srcrt:1,
245  				osrcrt:1,
246  			        rxinfo:1,
247  			        rxoinfo:1,
248  				rxhlim:1,
249  				rxohlim:1,
250  				hopopts:1,
251  				ohopopts:1,
252  				dstopts:1,
253  				odstopts:1,
254                                  rxflow:1,
255  				rxtclass:1,
256  				rxpmtu:1,
257  				rxorigdstaddr:1,
258  				recvfragsize:1;
259  				/* 1 bits hole */
260  		} bits;
261  		__u16		all;
262  	} rxopt;
263  
264  	/* sockopt flags */
265  	__u16			recverr:1,
266  	                        sndflow:1,
267  				repflow:1,
268  				pmtudisc:3,
269  				padding:1,	/* 1 bit hole */
270  				srcprefs:3,	/* 001: prefer temporary address
271  						 * 010: prefer public address
272  						 * 100: prefer care-of address
273  						 */
274  				dontfrag:1,
275  				autoflowlabel:1,
276  				autoflowlabel_set:1,
277  				mc_all:1,
278  				recverr_rfc4884:1,
279  				rtalert_isolate:1;
280  	__u8			min_hopcount;
281  	__u8			tclass;
282  	__be32			rcv_flowinfo;
283  
284  	__u32			dst_cookie;
285  
286  	struct ipv6_mc_socklist	__rcu *ipv6_mc_list;
287  	struct ipv6_ac_socklist	*ipv6_ac_list;
288  	struct ipv6_fl_socklist __rcu *ipv6_fl_list;
289  
290  	struct ipv6_txoptions __rcu	*opt;
291  	struct sk_buff		*pktoptions;
292  	struct sk_buff		*rxpmtu;
293  	struct inet6_cork	cork;
294  };
295  
296  /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
297  struct raw6_sock {
298  	/* inet_sock has to be the first member of raw6_sock */
299  	struct inet_sock	inet;
300  	__u32			checksum;	/* perform checksum */
301  	__u32			offset;		/* checksum offset  */
302  	struct icmp6_filter	filter;
303  	__u32			ip6mr_table;
304  
305  	struct ipv6_pinfo	inet6;
306  };
307  
308  struct udp6_sock {
309  	struct udp_sock	  udp;
310  
311  	struct ipv6_pinfo inet6;
312  };
313  
314  struct tcp6_sock {
315  	struct tcp_sock	  tcp;
316  
317  	struct ipv6_pinfo inet6;
318  };
319  
320  extern int inet6_sk_rebuild_header(struct sock *sk);
321  
322  struct tcp6_timewait_sock {
323  	struct tcp_timewait_sock   tcp6tw_tcp;
324  };
325  
326  #if IS_ENABLED(CONFIG_IPV6)
327  bool ipv6_mod_enabled(void);
328  
inet6_sk(const struct sock * __sk)329  static inline struct ipv6_pinfo *inet6_sk(const struct sock *__sk)
330  {
331  	return sk_fullsock(__sk) ? inet_sk(__sk)->pinet6 : NULL;
332  }
333  
334  #define raw6_sk(ptr) container_of_const(ptr, struct raw6_sock, inet.sk)
335  
336  #define ipv6_only_sock(sk)	(sk->sk_ipv6only)
337  #define ipv6_sk_rxinfo(sk)	((sk)->sk_family == PF_INET6 && \
338  				 inet6_sk(sk)->rxopt.bits.rxinfo)
339  
inet6_rcv_saddr(const struct sock * sk)340  static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
341  {
342  	if (sk->sk_family == AF_INET6)
343  		return &sk->sk_v6_rcv_saddr;
344  	return NULL;
345  }
346  
inet_v6_ipv6only(const struct sock * sk)347  static inline int inet_v6_ipv6only(const struct sock *sk)
348  {
349  	/* ipv6only field is at same position for timewait and other sockets */
350  	return ipv6_only_sock(sk);
351  }
352  #else
353  #define ipv6_only_sock(sk)	0
354  #define ipv6_sk_rxinfo(sk)	0
355  
ipv6_mod_enabled(void)356  static inline bool ipv6_mod_enabled(void)
357  {
358  	return false;
359  }
360  
inet6_sk(const struct sock * __sk)361  static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
362  {
363  	return NULL;
364  }
365  
raw6_sk(const struct sock * sk)366  static inline struct raw6_sock *raw6_sk(const struct sock *sk)
367  {
368  	return NULL;
369  }
370  
371  #define inet6_rcv_saddr(__sk)	NULL
372  #define inet_v6_ipv6only(__sk)		0
373  #endif /* IS_ENABLED(CONFIG_IPV6) */
374  #endif /* _IPV6_H */
375