Branch data Line data Source code
1 : : #ifndef _IPV6_H
2 : : #define _IPV6_H
3 : :
4 : : #include <uapi/linux/ipv6.h>
5 : :
6 : : #define ipv6_optlen(p) (((p)->hdrlen+1) << 3)
7 : : #define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
8 : : /*
9 : : * This structure contains configuration options per IPv6 link.
10 : : */
11 : : struct ipv6_devconf {
12 : : __s32 forwarding;
13 : : __s32 hop_limit;
14 : : __s32 mtu6;
15 : : __s32 accept_ra;
16 : : __s32 accept_redirects;
17 : : __s32 autoconf;
18 : : __s32 dad_transmits;
19 : : __s32 rtr_solicits;
20 : : __s32 rtr_solicit_interval;
21 : : __s32 rtr_solicit_delay;
22 : : __s32 force_mld_version;
23 : : __s32 mldv1_unsolicited_report_interval;
24 : : __s32 mldv2_unsolicited_report_interval;
25 : : __s32 use_tempaddr;
26 : : __s32 temp_valid_lft;
27 : : __s32 temp_prefered_lft;
28 : : __s32 regen_max_retry;
29 : : __s32 max_desync_factor;
30 : : __s32 max_addresses;
31 : : __s32 accept_ra_defrtr;
32 : : __s32 accept_ra_pinfo;
33 : : #ifdef CONFIG_IPV6_ROUTER_PREF
34 : : __s32 accept_ra_rtr_pref;
35 : : __s32 rtr_probe_interval;
36 : : #ifdef CONFIG_IPV6_ROUTE_INFO
37 : : __s32 accept_ra_rt_info_max_plen;
38 : : #endif
39 : : #endif
40 : : __s32 proxy_ndp;
41 : : __s32 accept_source_route;
42 : : #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
43 : : __s32 optimistic_dad;
44 : : #endif
45 : : #ifdef CONFIG_IPV6_MROUTE
46 : : __s32 mc_forwarding;
47 : : #endif
48 : : __s32 disable_ipv6;
49 : : __s32 accept_dad;
50 : : __s32 force_tllao;
51 : : __s32 ndisc_notify;
52 : : __s32 suppress_frag_ndisc;
53 : : void *sysctl;
54 : : };
55 : :
56 : : struct ipv6_params {
57 : : __s32 disable_ipv6;
58 : : __s32 autoconf;
59 : : };
60 : : extern struct ipv6_params ipv6_defaults;
61 : : #include <linux/icmpv6.h>
62 : : #include <linux/tcp.h>
63 : : #include <linux/udp.h>
64 : :
65 : : #include <net/inet_sock.h>
66 : :
67 : 50 : static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
68 : : {
69 : : return (struct ipv6hdr *)skb_network_header(skb);
70 : : }
71 : :
72 : 0 : static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb)
73 : : {
74 : : return (struct ipv6hdr *)skb_inner_network_header(skb);
75 : : }
76 : :
77 : 0 : static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
78 : : {
79 : : return (struct ipv6hdr *)skb_transport_header(skb);
80 : : }
81 : :
82 : : /*
83 : : This structure contains results of exthdrs parsing
84 : : as offsets from skb->nh.
85 : : */
86 : :
87 : : struct inet6_skb_parm {
88 : : int iif;
89 : : __be16 ra;
90 : : __u16 hop;
91 : : __u16 dst0;
92 : : __u16 srcrt;
93 : : __u16 dst1;
94 : : __u16 lastopt;
95 : : __u16 nhoff;
96 : : __u16 flags;
97 : : #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
98 : : __u16 dsthao;
99 : : #endif
100 : : __u16 frag_max_size;
101 : :
102 : : #define IP6SKB_XFRM_TRANSFORMED 1
103 : : #define IP6SKB_FORWARDED 2
104 : : #define IP6SKB_REROUTED 4
105 : : #define IP6SKB_ROUTERALERT 8
106 : : #define IP6SKB_FRAGMENTED 16
107 : : };
108 : :
109 : : #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
110 : : #define IP6CBMTU(skb) ((struct ip6_mtuinfo *)((skb)->cb))
111 : :
112 : : static inline int inet6_iif(const struct sk_buff *skb)
113 : : {
114 : 0 : return IP6CB(skb)->iif;
115 : : }
116 : :
117 : : struct tcp6_request_sock {
118 : : struct tcp_request_sock tcp6rsk_tcp;
119 : : };
120 : :
121 : : struct ipv6_mc_socklist;
122 : : struct ipv6_ac_socklist;
123 : : struct ipv6_fl_socklist;
124 : :
125 : : /**
126 : : * struct ipv6_pinfo - ipv6 private area
127 : : *
128 : : * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc)
129 : : * this _must_ be the last member, so that inet6_sk_generic
130 : : * is able to calculate its offset from the base struct sock
131 : : * by using the struct proto->slab_obj_size member. -acme
132 : : */
133 : : struct ipv6_pinfo {
134 : : struct in6_addr saddr;
135 : : struct in6_pktinfo sticky_pktinfo;
136 : : const struct in6_addr *daddr_cache;
137 : : #ifdef CONFIG_IPV6_SUBTREES
138 : : const struct in6_addr *saddr_cache;
139 : : #endif
140 : :
141 : : __be32 flow_label;
142 : : __u32 frag_size;
143 : :
144 : : /*
145 : : * Packed in 16bits.
146 : : * Omit one shift by by putting the signed field at MSB.
147 : : */
148 : : #if defined(__BIG_ENDIAN_BITFIELD)
149 : : __s16 hop_limit:9;
150 : : __u16 __unused_1:7;
151 : : #else
152 : : __u16 __unused_1:7;
153 : : __s16 hop_limit:9;
154 : : #endif
155 : :
156 : : #if defined(__BIG_ENDIAN_BITFIELD)
157 : : /* Packed in 16bits. */
158 : : __s16 mcast_hops:9;
159 : : __u16 __unused_2:6,
160 : : mc_loop:1;
161 : : #else
162 : : __u16 mc_loop:1,
163 : : __unused_2:6;
164 : : __s16 mcast_hops:9;
165 : : #endif
166 : : int ucast_oif;
167 : : int mcast_oif;
168 : :
169 : : /* pktoption flags */
170 : : union {
171 : : struct {
172 : : __u16 srcrt:1,
173 : : osrcrt:1,
174 : : rxinfo:1,
175 : : rxoinfo:1,
176 : : rxhlim:1,
177 : : rxohlim:1,
178 : : hopopts:1,
179 : : ohopopts:1,
180 : : dstopts:1,
181 : : odstopts:1,
182 : : rxflow:1,
183 : : rxtclass:1,
184 : : rxpmtu:1,
185 : : rxorigdstaddr:1;
186 : : /* 2 bits hole */
187 : : } bits;
188 : : __u16 all;
189 : : } rxopt;
190 : :
191 : : /* sockopt flags */
192 : : __u16 recverr:1,
193 : : sndflow:1,
194 : : repflow:1,
195 : : pmtudisc:3,
196 : : ipv6only:1,
197 : : srcprefs:3, /* 001: prefer temporary address
198 : : * 010: prefer public address
199 : : * 100: prefer care-of address
200 : : */
201 : : dontfrag:1;
202 : : __u8 min_hopcount;
203 : : __u8 tclass;
204 : : __be32 rcv_flowinfo;
205 : :
206 : : __u32 dst_cookie;
207 : : __u32 rx_dst_cookie;
208 : :
209 : : struct ipv6_mc_socklist __rcu *ipv6_mc_list;
210 : : struct ipv6_ac_socklist *ipv6_ac_list;
211 : : struct ipv6_fl_socklist __rcu *ipv6_fl_list;
212 : :
213 : : struct ipv6_txoptions *opt;
214 : : struct sk_buff *pktoptions;
215 : : struct sk_buff *rxpmtu;
216 : : struct {
217 : : struct ipv6_txoptions *opt;
218 : : u8 hop_limit;
219 : : u8 tclass;
220 : : } cork;
221 : : };
222 : :
223 : : /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
224 : : struct raw6_sock {
225 : : /* inet_sock has to be the first member of raw6_sock */
226 : : struct inet_sock inet;
227 : : __u32 checksum; /* perform checksum */
228 : : __u32 offset; /* checksum offset */
229 : : struct icmp6_filter filter;
230 : : __u32 ip6mr_table;
231 : : /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
232 : : struct ipv6_pinfo inet6;
233 : : };
234 : :
235 : : struct udp6_sock {
236 : : struct udp_sock udp;
237 : : /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
238 : : struct ipv6_pinfo inet6;
239 : : };
240 : :
241 : : struct tcp6_sock {
242 : : struct tcp_sock tcp;
243 : : /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
244 : : struct ipv6_pinfo inet6;
245 : : };
246 : :
247 : : extern int inet6_sk_rebuild_header(struct sock *sk);
248 : :
249 : : struct tcp6_timewait_sock {
250 : : struct tcp_timewait_sock tcp6tw_tcp;
251 : : };
252 : :
253 : : #if IS_ENABLED(CONFIG_IPV6)
254 : : static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
255 : : {
256 : 1 : return inet_sk(__sk)->pinet6;
257 : : }
258 : :
259 : : static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
260 : : {
261 : : struct request_sock *req = reqsk_alloc(ops);
262 : :
263 [ # # ]: 0 : if (req)
264 : 0 : inet_rsk(req)->pktopts = NULL;
265 : :
266 : : return req;
267 : : }
268 : :
269 : : static inline struct raw6_sock *raw6_sk(const struct sock *sk)
270 : : {
271 : : return (struct raw6_sock *)sk;
272 : : }
273 : :
274 : : static inline void inet_sk_copy_descendant(struct sock *sk_to,
275 : : const struct sock *sk_from)
276 : : {
277 : : int ancestor_size = sizeof(struct inet_sock);
278 : :
279 : : if (sk_from->sk_family == PF_INET6)
280 : : ancestor_size += sizeof(struct ipv6_pinfo);
281 : :
282 : : __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
283 : : }
284 : :
285 : : #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only)
286 : : #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
287 : : #define ipv6_sk_rxinfo(sk) ((sk)->sk_family == PF_INET6 && \
288 : : inet6_sk(sk)->rxopt.bits.rxinfo)
289 : :
290 : : static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
291 : : {
292 [ # # ]: 0 : if (sk->sk_family == AF_INET6)
293 : 0 : return &sk->sk_v6_rcv_saddr;
294 : : return NULL;
295 : : }
296 : :
297 : : static inline int inet_v6_ipv6only(const struct sock *sk)
298 : : {
299 : 0 : return likely(sk->sk_state != TCP_TIME_WAIT) ?
300 [ # # ][ # # ]: 0 : ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only;
[ # # ]
301 : : }
302 : : #else
303 : : #define __ipv6_only_sock(sk) 0
304 : : #define ipv6_only_sock(sk) 0
305 : : #define ipv6_sk_rxinfo(sk) 0
306 : :
307 : : static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
308 : : {
309 : : return NULL;
310 : : }
311 : :
312 : : static inline struct inet6_request_sock *
313 : : inet6_rsk(const struct request_sock *rsk)
314 : : {
315 : : return NULL;
316 : : }
317 : :
318 : : static inline struct raw6_sock *raw6_sk(const struct sock *sk)
319 : : {
320 : : return NULL;
321 : : }
322 : :
323 : : #define inet6_rcv_saddr(__sk) NULL
324 : : #define tcp_twsk_ipv6only(__sk) 0
325 : : #define inet_v6_ipv6only(__sk) 0
326 : : #endif /* IS_ENABLED(CONFIG_IPV6) */
327 : :
328 : : #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \
329 : : (((__sk)->sk_portpair == (__ports)) && \
330 : : ((__sk)->sk_family == AF_INET6) && \
331 : : ipv6_addr_equal(&(__sk)->sk_v6_daddr, (__saddr)) && \
332 : : ipv6_addr_equal(&(__sk)->sk_v6_rcv_saddr, (__daddr)) && \
333 : : (!(__sk)->sk_bound_dev_if || \
334 : : ((__sk)->sk_bound_dev_if == (__dif))) && \
335 : : net_eq(sock_net(__sk), (__net)))
336 : :
337 : : #endif /* _IPV6_H */
|