1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 #ifndef _NETINET6_IP6_VAR_H_
65 #define _NETINET6_IP6_VAR_H_
66
67
68
69
70
71 struct ip6q {
72 u_int32_t ip6q_head;
73 u_int16_t ip6q_len;
74 u_int8_t ip6q_nxt;
75 u_int8_t ip6q_hlim;
76 struct ip6asfrag *ip6q_down;
77 struct ip6asfrag *ip6q_up;
78 u_int32_t ip6q_ident;
79 u_int8_t ip6q_arrive;
80 u_int8_t ip6q_ttl;
81 struct in6_addr ip6q_src, ip6q_dst;
82 struct ip6q *ip6q_next;
83 struct ip6q *ip6q_prev;
84 int ip6q_unfrglen;
85 #ifdef notyet
86 u_char *ip6q_nxtp;
87 #endif
88 int ip6q_nfrag;
89 };
90
91 struct ip6asfrag {
92 u_int32_t ip6af_head;
93 u_int16_t ip6af_len;
94 u_int8_t ip6af_nxt;
95 u_int8_t ip6af_hlim;
96
97 struct ip6asfrag *ip6af_down;
98 struct ip6asfrag *ip6af_up;
99 struct mbuf *ip6af_m;
100 int ip6af_offset;
101 int ip6af_frglen;
102 int ip6af_off;
103 u_int16_t ip6af_mff;
104 };
105
106 #define IP6_REASS_MBUF(ip6af) ((ip6af)->ip6af_m)
107
108 struct ip6_moptions {
109 struct ifnet *im6o_multicast_ifp;
110 u_char im6o_multicast_hlim;
111 u_char im6o_multicast_loop;
112 LIST_HEAD(, in6_multi_mship) im6o_memberships;
113 };
114
115
116
117
118
119
120 struct ip6po_rhinfo {
121 struct ip6_rthdr *ip6po_rhi_rthdr;
122 struct route_in6 ip6po_rhi_route;
123 };
124 #define ip6po_rthdr ip6po_rhinfo.ip6po_rhi_rthdr
125 #define ip6po_route ip6po_rhinfo.ip6po_rhi_route
126
127
128 struct ip6po_nhinfo {
129 struct sockaddr *ip6po_nhi_nexthop;
130 struct route_in6 ip6po_nhi_route;
131 };
132 #define ip6po_nexthop ip6po_nhinfo.ip6po_nhi_nexthop
133 #define ip6po_nextroute ip6po_nhinfo.ip6po_nhi_route
134
135 struct ip6_pktopts {
136
137 int ip6po_hlim;
138
139
140 struct in6_pktinfo *ip6po_pktinfo;
141
142
143 struct ip6po_nhinfo ip6po_nhinfo;
144
145
146 struct ip6_hbh *ip6po_hbh;
147
148
149 struct ip6_dest *ip6po_dest1;
150
151
152 struct ip6po_rhinfo ip6po_rhinfo;
153
154
155 struct ip6_dest *ip6po_dest2;
156
157
158 int ip6po_tclass;
159
160
161 int ip6po_minmtu;
162 #define IP6PO_MINMTU_MCASTONLY -1
163 #define IP6PO_MINMTU_DISABLE 0
164 #define IP6PO_MINMTU_ALL 1
165
166 int ip6po_flags;
167 #define IP6PO_DONTFRAG 0x04
168 };
169
170 struct ip6stat {
171 u_int64_t ip6s_total;
172 u_int64_t ip6s_tooshort;
173 u_int64_t ip6s_toosmall;
174 u_int64_t ip6s_fragments;
175 u_int64_t ip6s_fragdropped;
176 u_int64_t ip6s_fragtimeout;
177 u_int64_t ip6s_fragoverflow;
178 u_int64_t ip6s_forward;
179 u_int64_t ip6s_cantforward;
180 u_int64_t ip6s_redirectsent;
181 u_int64_t ip6s_delivered;
182 u_int64_t ip6s_localout;
183 u_int64_t ip6s_odropped;
184 u_int64_t ip6s_reassembled;
185 u_int64_t ip6s_fragmented;
186 u_int64_t ip6s_ofragments;
187 u_int64_t ip6s_cantfrag;
188 u_int64_t ip6s_badoptions;
189 u_int64_t ip6s_noroute;
190 u_int64_t ip6s_badvers;
191 u_int64_t ip6s_rawout;
192 u_int64_t ip6s_badscope;
193 u_int64_t ip6s_notmember;
194 u_int64_t ip6s_nxthist[256];
195 u_int64_t ip6s_m1;
196 u_int64_t ip6s_m2m[32];
197 u_int64_t ip6s_mext1;
198 u_int64_t ip6s_mext2m;
199 u_int64_t ip6s_exthdrtoolong;
200 u_int64_t ip6s_nogif;
201 u_int64_t ip6s_toomanyhdr;
202
203
204
205
206
207
208
209 u_int64_t ip6s_sources_none;
210
211 u_int64_t ip6s_sources_sameif[16];
212
213 u_int64_t ip6s_sources_otherif[16];
214
215
216
217
218 u_int64_t ip6s_sources_samescope[16];
219
220
221
222
223 u_int64_t ip6s_sources_otherscope[16];
224
225 u_int64_t ip6s_sources_deprecated[16];
226
227 u_int64_t ip6s_forward_cachehit;
228 u_int64_t ip6s_forward_cachemiss;
229 };
230
231 #ifdef _KERNEL
232
233 #define IPV6_UNSPECSRC 0x01
234 #define IPV6_FORWARDING 0x02
235 #define IPV6_MINMTU 0x04
236
237 extern struct ip6stat ip6stat;
238 extern int ip6_defhlim;
239 extern int ip6_defmcasthlim;
240 extern int ip6_forwarding;
241 extern int ip6_mforwarding;
242 extern int ip6_multipath;
243 extern int ip6_sendredirect;
244 extern int ip6_forward_srcrt;
245 extern int ip6_use_deprecated;
246 extern int ip6_rr_prune;
247
248 extern int ip6_mcast_pmtu;
249 extern const int ip6_v6only;
250
251 extern struct socket *ip6_mrouter;
252 extern int ip6_sendredirects;
253 extern int ip6_maxfragpackets;
254 extern int ip6_maxfrags;
255 extern int ip6_sourcecheck;
256 extern int ip6_sourcecheck_interval;
257 extern int ip6_accept_rtadv;
258 extern int ip6_keepfaith;
259 extern int ip6_log_interval;
260 extern time_t ip6_log_time;
261 extern int ip6_hdrnestlimit;
262 extern int ip6_dad_count;
263
264 extern int ip6_auto_flowlabel;
265 extern int ip6_auto_linklocal;
266
267 struct in6pcb;
268 struct inpcb;
269
270 int icmp6_ctloutput(int, struct socket *, int, int, struct mbuf **);
271
272 void ip6_init(void);
273 void ip6intr(void);
274 void ip6_input(struct mbuf *);
275 void ip6_freepcbopts(struct ip6_pktopts *);
276 void ip6_freemoptions(struct ip6_moptions *);
277 int ip6_unknown_opt(u_int8_t *, struct mbuf *, int);
278 u_int8_t *ip6_get_prevhdr(struct mbuf *, int);
279 int ip6_nexthdr(struct mbuf *, int, int, int *);
280 int ip6_lasthdr(struct mbuf *, int, int, int *);
281 int ip6_mforward(struct ip6_hdr *, struct ifnet *, struct mbuf *);
282 int ip6_process_hopopts(struct mbuf *, u_int8_t *, int, u_int32_t *,
283 u_int32_t *);
284 void ip6_savecontrol(struct inpcb *, struct mbuf *, struct mbuf **);
285 int ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
286
287 void ip6_forward(struct mbuf *, int);
288
289 void ip6_mloopback(struct ifnet *, struct mbuf *, struct sockaddr_in6 *);
290 int ip6_output(struct mbuf *, struct ip6_pktopts *, struct route_in6 *, int,
291 struct ip6_moptions *, struct ifnet **, struct inpcb *);
292 int ip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
293 int ip6_raw_ctloutput(int, struct socket *, int, int, struct mbuf **);
294 void ip6_initpktopts(struct ip6_pktopts *);
295 int ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
296 struct ip6_pktopts *, int, int);
297 void ip6_clearpktopts(struct ip6_pktopts *, int);
298 struct ip6_pktopts *ip6_copypktopts(struct ip6_pktopts *, int);
299 int ip6_optlen(struct inpcb *);
300
301 int route6_input(struct mbuf **, int *, int);
302
303 void frag6_init(void);
304 int frag6_input(struct mbuf **, int *, int);
305 void frag6_slowtimo(void);
306 void frag6_drain(void);
307
308 void rip6_init(void);
309 int rip6_input(struct mbuf **mp, int *offp, int proto);
310 void rip6_ctlinput(int, struct sockaddr *, void *);
311 int rip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
312 int rip6_output(struct mbuf *, ...);
313 int rip6_usrreq(struct socket *,
314 int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
315
316 int dest6_input(struct mbuf **, int *, int);
317 int none_input(struct mbuf **, int *, int);
318
319 struct in6_addr *in6_selectsrc(struct sockaddr_in6 *, struct ip6_pktopts *,
320 struct ip6_moptions *, struct route_in6 *, struct in6_addr *,
321 int *);
322 int in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
323 struct ip6_moptions *, struct route_in6 *, struct ifnet **,
324 struct rtentry **);
325
326 u_int32_t ip6_randomid(void);
327 u_int32_t ip6_randomflowlabel(void);
328 #endif
329
330 #endif