Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / netinet6 / ip6_var.h @ 14

History | View | Annotate | Download (16.7 KB)

1 13 up20180614
/*        $NetBSD: ip6_var.h,v 1.64 2015/01/20 21:27:36 roy Exp $        */
2
/*        $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $        */
3
4
/*
5
 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 * 3. Neither the name of the project nor the names of its contributors
17
 *    may be used to endorse or promote products derived from this software
18
 *    without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
 * SUCH DAMAGE.
31
 */
32
33
/*
34
 * Copyright (c) 1982, 1986, 1993
35
 *        The Regents of the University of California.  All rights reserved.
36
 *
37
 * Redistribution and use in source and binary forms, with or without
38
 * modification, are permitted provided that the following conditions
39
 * are met:
40
 * 1. Redistributions of source code must retain the above copyright
41
 *    notice, this list of conditions and the following disclaimer.
42
 * 2. Redistributions in binary form must reproduce the above copyright
43
 *    notice, this list of conditions and the following disclaimer in the
44
 *    documentation and/or other materials provided with the distribution.
45
 * 3. Neither the name of the University nor the names of its contributors
46
 *    may be used to endorse or promote products derived from this software
47
 *    without specific prior written permission.
48
 *
49
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59
 * SUCH DAMAGE.
60
 *
61
 *        @(#)ip_var.h        8.1 (Berkeley) 6/10/93
62
 */
63
64
#ifndef _NETINET6_IP6_VAR_H_
65
#define _NETINET6_IP6_VAR_H_
66
67
#include <sys/socketvar.h>
68
#include <net/route.h>
69
70
/*
71
 * IP6 reassembly queue structure.  Each fragment
72
 * being reassembled is attached to one of these structures.
73
 */
74
struct        ip6q {
75
        u_int32_t        ip6q_head;
76
        u_int16_t        ip6q_len;
77
        u_int8_t        ip6q_nxt;        /* ip6f_nxt in first fragment */
78
        u_int8_t        ip6q_hlim;
79
        struct ip6asfrag *ip6q_down;
80
        struct ip6asfrag *ip6q_up;
81
        u_int32_t        ip6q_ident;
82
        u_int8_t        ip6q_arrive;
83
        u_int8_t        ip6q_ttl;
84
        struct in6_addr        ip6q_src, ip6q_dst;
85
        struct ip6q        *ip6q_next;
86
        struct ip6q        *ip6q_prev;
87
        int                ip6q_unfrglen;        /* len of unfragmentable part */
88
#ifdef notyet
89
        u_char                *ip6q_nxtp;
90
#endif
91
        int                ip6q_nfrag;        /* # of fragments */
92
};
93
94
struct        ip6asfrag {
95
        u_int32_t        ip6af_head;
96
        u_int16_t        ip6af_len;
97
        u_int8_t        ip6af_nxt;
98
        u_int8_t        ip6af_hlim;
99
        /* must not override the above members during reassembling */
100
        struct ip6asfrag *ip6af_down;
101
        struct ip6asfrag *ip6af_up;
102
        struct mbuf        *ip6af_m;
103
        int                ip6af_offset;        /* offset in ip6af_m to next header */
104
        int                ip6af_frglen;        /* fragmentable part length */
105
        int                ip6af_off;        /* fragment offset */
106
        u_int16_t        ip6af_mff;        /* more fragment bit in frag off */
107
};
108
109
#define IP6_REASS_MBUF(ip6af) ((ip6af)->ip6af_m)
110
111
struct        ip6_moptions {
112
        struct        ifnet *im6o_multicast_ifp; /* ifp for outgoing multicasts */
113
        u_char        im6o_multicast_hlim;        /* hoplimit for outgoing multicasts */
114
        u_char        im6o_multicast_loop;        /* 1 >= hear sends if a member */
115
        LIST_HEAD(, in6_multi_mship) im6o_memberships;
116
};
117
118
/*
119
 * Control options for outgoing packets
120
 */
121
122
/* Routing header related info */
123
struct        ip6po_rhinfo {
124
        struct        ip6_rthdr *ip6po_rhi_rthdr; /* Routing header */
125
        struct        route ip6po_rhi_route; /* Route to the 1st hop */
126
};
127
#define ip6po_rthdr        ip6po_rhinfo.ip6po_rhi_rthdr
128
#define ip6po_route        ip6po_rhinfo.ip6po_rhi_route
129
130
/* Nexthop related info */
131
struct        ip6po_nhinfo {
132
        struct        sockaddr *ip6po_nhi_nexthop;
133
        struct        route ip6po_nhi_route; /* Route to the nexthop */
134
};
135
#define ip6po_nexthop        ip6po_nhinfo.ip6po_nhi_nexthop
136
#define ip6po_nextroute        ip6po_nhinfo.ip6po_nhi_route
137
138
struct        ip6_pktopts {
139
        int        ip6po_hlim;                /* Hoplimit for outgoing packets */
140
        struct        in6_pktinfo *ip6po_pktinfo; /* Outgoing IF/address information */
141
        struct        ip6po_nhinfo ip6po_nhinfo; /* Next-hop address information */
142
        struct        ip6_hbh *ip6po_hbh; /* Hop-by-Hop options header */
143
        struct        ip6_dest *ip6po_dest1; /* Destination options header(1st part) */
144
        struct        ip6po_rhinfo ip6po_rhinfo; /* Routing header related info. */
145
        struct        ip6_dest *ip6po_dest2; /* Destination options header(2nd part) */
146
        int        ip6po_tclass;        /* traffic class */
147
        int        ip6po_minmtu;  /* fragment vs PMTU discovery policy */
148
#define IP6PO_MINMTU_MCASTONLY        -1 /* default; send at min MTU for multicast*/
149
#define IP6PO_MINMTU_DISABLE         0 /* always perform pmtu disc */
150
#define IP6PO_MINMTU_ALL         1 /* always send at min MTU */
151
        int        ip6po_prefer_tempaddr;        /* whether temporary addresses are
152
                                         * preferred as source address */
153
#define IP6PO_TEMPADDR_SYSTEM        -1 /* follow the system default */
154
#define IP6PO_TEMPADDR_NOTPREFER 0 /* not prefer temporary address */
155
#define IP6PO_TEMPADDR_PREFER         1 /* prefer temporary address */
156
        int ip6po_flags;
157
#if 0        /* parameters in this block is obsolete. do not reuse the values. */
158
#define IP6PO_REACHCONF        0x01        /* upper-layer reachability confirmation. */
159
#define IP6PO_MINMTU        0x02        /* use minimum MTU (IPV6_USE_MIN_MTU) */
160
#endif
161
#define IP6PO_DONTFRAG        0x04        /* disable fragmentation (IPV6_DONTFRAG) */
162
};
163
164
/*
165
 * IPv6 statistics.
166
 * Each counter is an unsigned 64-bit value.
167
 */
168
#define        IP6_STAT_TOTAL                0        /* total packets received */
169
#define        IP6_STAT_TOOSHORT        1        /* packet too short */
170
#define        IP6_STAT_TOOSMALL        2        /* not enough data */
171
#define        IP6_STAT_FRAGMENTS        3        /* fragments received */
172
#define        IP6_STAT_FRAGDROPPED        4        /* frags dropped (dups, out of space) */
173
#define        IP6_STAT_FRAGTIMEOUT        5        /* fragments timed out */
174
#define        IP6_STAT_FRAGOVERFLOW        6        /* fragments that exceed limit */
175
#define IP6_STAT_FORWARD        7        /* packets forwarded */
176
#define        IP6_STAT_CANTFORWARD        8        /* packets rcvd for uncreachable dst */
177
#define        IP6_STAT_REDIRECTSENT        9        /* packets forwarded on same net */
178
#define        IP6_STAT_DELIVERED        10        /* datagrams delivered to upper level */
179
#define        IP6_STAT_LOCALOUT        11        /* total IP packets generated here */
180
#define        IP6_STAT_ODROPPED        12        /* lost packets due to nobufs, etc. */
181
#define        IP6_STAT_REASSEMBLED        13        /* total packets reassembled ok */
182
#define        IP6_STAT_FRAGMENTED        14        /* datagrams successfully fragmented */
183
#define        IP6_STAT_OFRAGMENTS        15        /* output fragments created */
184
#define        IP6_STAT_CANTFRAG        16        /* don't fragment flag was set, etc. */
185
#define        IP6_STAT_BADOPTIONS        17        /* error in option processing */
186
#define        IP6_STAT_NOROUTE        18        /* packets discarded due to no route */
187
#define        IP6_STAT_BADVERS        19        /* ip6 version != 6 */
188
#define        IP6_STAT_RAWOUT                20        /* total raw ip packets generated */
189
#define        IP6_STAT_BADSCOPE        21        /* scope error */
190
#define        IP6_STAT_NOTMEMBER        22        /* don't join this multicast group */
191
#define        IP6_STAT_NXTHIST        23        /* next header histogram */
192
                /* space for 256 counters */
193
#define        IP6_STAT_M1                279        /* one mbuf */
194
#define        IP6_STAT_M2M                280        /* two or more mbuf */
195
                /* space for 32 counters */
196
#define        IP6_STAT_MEXT1                312        /* one ext mbuf */
197
#define        IP6_STAT_MEXT2M                313        /* two or more ext mbuf */
198
#define        IP6_STAT_EXTHDRTOOLONG        314        /* ext hdr are not contiguous */
199
#define        IP6_STAT_NOGIF                315        /* no match gif found */
200
#define        IP6_STAT_TOOMANYHDR        316        /* discarded due to too many headers */
201
        /*
202
         * statistics for improvement of the source address selection
203
         * algorithm:
204
         * XXX: hardcoded 16 = # of ip6 multicast scope types + 1
205
         */
206
#define        IP6_STAT_SOURCES_NONE        317        /* number of times that address
207
                                           selection fails */
208
#define        IP6_STAT_SOURCES_SAMEIF        318        /* number of times that an address
209
                                           on the outgoing I/F is chosen */
210
                /* space for 16 counters */
211
#define        IP6_STAT_SOURCES_OTHERIF 334        /* number of times that an address on
212
                                           a non-outgoing I/F is chosen */
213
                /* space for 16 counters */
214
#define        IP6_STAT_SOURCES_SAMESCOPE 350        /* number of times that an address that
215
                                           has the same scope from the dest.
216
                                           is chosen */
217
                /* space for 16 counters */
218
#define        IP6_STAT_SOURCES_OTHERSCOPE 366        /* number of times that an address that
219
                                           has a different scope from the dest.
220
                                           is chosen */
221
                /* space for 16 counters */
222
#define        IP6_STAT_SOURCES_DEPRECATED 382        /* number of times that a deprecated
223
                                           address is chosen */
224
                /* space for 16 counters */
225
#define        IP6_STAT_FORWARD_CACHEHIT 398
226
#define        IP6_STAT_FORWARD_CACHEMISS 399
227
#define        IP6_STAT_FASTFORWARD        400        /* packets fast forwarded */
228
#define        IP6_STAT_FASTFORWARDFLOWS 401        /* number of fast forward flows */
229
230
#define        IP6_NSTATS                402
231
232
#define IP6FLOW_HASHBITS         6 /* should not be a multiple of 8 */
233
234
/*
235
 * Structure for an IPv6 flow (ip6_fastforward).
236
 */
237
struct ip6flow {
238
        LIST_ENTRY(ip6flow) ip6f_list;  /* next in active list */
239
        LIST_ENTRY(ip6flow) ip6f_hash;  /* next ip6flow in bucket */
240
        struct in6_addr ip6f_dst;       /* destination address */
241
        struct in6_addr ip6f_src;       /* source address */
242
        struct route ip6f_ro;       /* associated route entry */
243
        u_int32_t ip6f_flow;                /* flow (tos) */
244
        u_quad_t ip6f_uses;               /* number of uses in this period */
245
        u_quad_t ip6f_last_uses;          /* number of uses in last period */
246
        u_quad_t ip6f_dropped;            /* ENOBUFS returned by if_output */
247
        u_quad_t ip6f_forwarded;          /* packets forwarded */
248
        u_int ip6f_timer;               /* lifetime timer */
249
};
250
251
#ifdef _KERNEL
252
/*
253
 * Auxiliary attributes of incoming IPv6 packets, which is initialized when we
254
 * come into ip6_input().
255
 * XXX do not make it a kitchen sink!
256
 */
257
struct ip6aux {
258
        /* ip6.ip6_dst */
259
        struct in6_addr        ip6a_src;
260
        uint32_t        ip6a_scope_id;
261
        int                ip6a_flags;
262
};
263
264
/* flags passed to ip6_output as last parameter */
265
#define        IPV6_UNSPECSRC                0x01        /* allow :: as the source address */
266
#define        IPV6_FORWARDING                0x02        /* most of IPv6 header exists */
267
#define        IPV6_MINMTU                0x04        /* use minimum MTU (IPV6_USE_MIN_MTU) */
268
269
extern u_int32_t ip6_id;                /* fragment identifier */
270
extern int        ip6_defhlim;                /* default hop limit */
271
extern int        ip6_defmcasthlim;        /* default multicast hop limit */
272
extern int        ip6_forwarding;                /* act as router? */
273
extern int        ip6_sendredirect;        /* send ICMPv6 redirect? */
274
extern int        ip6_forward_srcrt;        /* forward src-routed? */
275
extern int        ip6_use_deprecated;        /* allow deprecated addr as source */
276
extern int        ip6_rr_prune;                /* router renumbering prefix
277
                                         * walk list every 5 sec.    */
278
extern int        ip6_mcast_pmtu;                /* enable pMTU discovery for multicast? */
279
extern int        ip6_v6only;
280
extern int        ip6_neighborgcthresh;        /* Threshold # of NDP entries for GC */
281
extern int        ip6_maxifprefixes; /* Max acceptable prefixes via RA per IF */
282
extern int        ip6_maxifdefrouters;        /* Max acceptable def routers via RA */
283
extern int        ip6_maxdynroutes; /* Max # of routes created via redirect */
284
285
286
extern struct socket *ip6_mrouter;         /* multicast routing daemon */
287
extern int        ip6_sendredirects;        /* send IP redirects when forwarding? */
288
extern int        ip6_maxfragpackets; /* Maximum packets in reassembly queue */
289
extern int        ip6_maxfrags;        /* Maximum fragments in reassembly queue */
290
extern int        ip6_sourcecheck;        /* Verify source interface */
291
extern int        ip6_sourcecheck_interval; /* Interval between log messages */
292
extern int        ip6_accept_rtadv;        /* Acts as a host not a router */
293
extern int        ip6_rtadv_maxroutes;        /* maximum number of routes via rtadv */
294
extern int        ip6_keepfaith;                /* Firewall Aided Internet Translator */
295
extern int        ip6_log_interval;
296
extern time_t        ip6_log_time;
297
extern int        ip6_hdrnestlimit; /* upper limit of # of extension headers */
298
extern int        ip6_dad_count;                /* DupAddrDetectionTransmits */
299
300
extern int ip6_auto_flowlabel;
301
extern int ip6_auto_linklocal;
302
303
extern int   ip6_anonportmin;                /* minimum ephemeral port */
304
extern int   ip6_anonportmax;                /* maximum ephemeral port */
305
extern int   ip6_lowportmin;                /* minimum reserved port */
306
extern int   ip6_lowportmax;                /* maximum reserved port */
307
308
extern int        ip6_use_tempaddr; /* whether to use temporary addresses. */
309
extern int        ip6_prefer_tempaddr; /* whether to prefer temporary addresses
310
                                        in the source address selection */
311
extern int        ip6_use_defzone; /* whether to use the default scope zone
312
                                    when unspecified */
313
314
#ifdef GATEWAY
315
extern int      ip6_maxflows;           /* maximum amount of flows for ip6ff */
316
extern int        ip6_hashsize;                /* size of hash table */
317
#endif
318
319
struct in6pcb;
320
extern const struct pr_usrreqs rip6_usrreqs;
321
322
int        icmp6_ctloutput(int, struct socket *, struct sockopt *);
323
324
struct mbuf;
325
void        ip6_init(void);
326
void        ip6_input(struct mbuf *);
327
const struct ip6aux *ip6_getdstifaddr(struct mbuf *);
328
void        ip6_freepcbopts(struct ip6_pktopts *);
329
void        ip6_freemoptions(struct ip6_moptions *);
330
int        ip6_unknown_opt(u_int8_t *, struct mbuf *, int);
331
u_int8_t *ip6_get_prevhdr(struct mbuf *, int);
332
int        ip6_nexthdr(struct mbuf *, int, int, int *);
333
int        ip6_lasthdr(struct mbuf *, int, int, int *);
334
335
struct m_tag *ip6_addaux(struct mbuf *);
336
struct m_tag *ip6_findaux(struct mbuf *);
337
void        ip6_delaux(struct mbuf *);
338
struct ip6_hdr;
339
int        ip6_mforward(struct ip6_hdr *, struct ifnet *, struct mbuf *);
340
int        ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *);
341
void        ip6_savecontrol(struct in6pcb *, struct mbuf **, struct ip6_hdr *,
342
                struct mbuf *);
343
void        ip6_notify_pmtu(struct in6pcb *, const struct sockaddr_in6 *,
344
                u_int32_t *);
345
int        ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
346
347
void        ip6_forward(struct mbuf *, int);
348
349
void        ip6_mloopback(struct ifnet *, struct mbuf *,
350
                      const struct sockaddr_in6 *);
351
int        ip6_output(struct mbuf *, struct ip6_pktopts *,
352
                        struct route *, int,
353
                        struct ip6_moptions *, struct socket *,
354
                        struct ifnet **);
355
int        ip6_ctloutput(int, struct socket *, struct sockopt *);
356
int        ip6_raw_ctloutput(int, struct socket *, struct sockopt *);
357
void        ip6_initpktopts(struct ip6_pktopts *);
358
int        ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
359
                            struct ip6_pktopts *, kauth_cred_t, int);
360
void        ip6_clearpktopts(struct ip6_pktopts *, int);
361
struct ip6_pktopts *ip6_copypktopts(struct ip6_pktopts *, int);
362
int        ip6_optlen(struct in6pcb *);
363
364
void        ip6_statinc(u_int);
365
366
int        route6_input(struct mbuf **, int *, int);
367
368
void        frag6_init(void);
369
int        frag6_input(struct mbuf **, int *, int);
370
int        ip6_reass_packet(struct mbuf **, int);
371
void        frag6_slowtimo(void);
372
void        frag6_fasttimo(void);
373
void        frag6_drain(void);
374
void        frag6_drainstub(void);
375
376
int        ip6flow_init(int);
377
void        ip6flow_poolinit(void);
378
struct  ip6flow *ip6flow_reap(int);
379
void    ip6flow_create(const struct route *, struct mbuf *);
380
void    ip6flow_slowtimo(void);
381
int        ip6flow_invalidate_all(int);
382
383
void        rip6_init(void);
384
int        rip6_input(struct mbuf **, int *, int);
385
void        *rip6_ctlinput(int, const struct sockaddr *, void *);
386
int        rip6_ctloutput(int, struct socket *, struct sockopt *);
387
int        rip6_output(struct mbuf *, struct socket *, struct sockaddr_in6 *,
388
                         struct mbuf *);
389
int        rip6_attach(struct socket *, int);
390
int        rip6_usrreq(struct socket *,
391
            int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
392
393
int        dest6_input(struct mbuf **, int *, int);
394
int        none_input(struct mbuf **, int *, int);
395
396
struct route;
397
398
struct         in6_addr *in6_selectsrc(struct sockaddr_in6 *,
399
        struct ip6_pktopts *, struct ip6_moptions *, struct route *,
400
        struct in6_addr *, struct ifnet **, int *);
401
int in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
402
        struct ip6_moptions *, struct route *, struct ifnet **,
403
        struct rtentry **, int);
404
int        ip6_get_membership(const struct sockopt *, struct ifnet **, void *,
405
        size_t);
406
407
u_int32_t ip6_randomid(void);
408
u_int32_t ip6_randomflowlabel(void);
409
#endif /* _KERNEL */
410
411
#endif /* !_NETINET6_IP6_VAR_H_ */