]> git.saurik.com Git - apple/xnu.git/blame - bsd/netinet6/mip6.h
xnu-124.8.tar.gz
[apple/xnu.git] / bsd / netinet6 / mip6.h
CommitLineData
1c79356b
A
1/* $KAME: mip6.h,v 1.8 2000/03/18 03:05:39 itojun Exp $ */
2
3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#ifndef _NETINET6_MIP6_H_
33#define _NETINET6_MIP6_H_
34
35#include <netinet6/nd6.h>
36#include <netinet/icmp6.h>
37
38struct ifnet;
39
40/*
41 * Definition For Mobile Internet Protocol Version 6.
42 * Draft draft-ietf-mobileip-ipv6-09.txt
43 */
44
45/* Definition of MIPv6 states for the Event-State machine */
46#define MIP6_STATE_UNDEF 0x01
47#define MIP6_STATE_HOME 0x02
48#define MIP6_STATE_DEREG 0x03
49#define MIP6_STATE_NOTREG 0x04
50#define MIP6_STATE_REG 0x05
51#define MIP6_STATE_REREG 0x06
52#define MIP6_STATE_REGNEWCOA 0x07
53
54
55/* Definition of states used by the move detection algorithm used by MIPv6. */
56#define MIP6_MD_BOOT 0x01
57#define MIP6_MD_UNDEFINED 0x02
58#define MIP6_MD_HOME 0x03
59#define MIP6_MD_FOREIGN 0x04
60
61
62/* Definition of Home Address route states used by the move detection
63 algorithm used by MIPv6. */
64#define MIP6_ROUTE_NET 0x01
65#define MIP6_ROUTE_HOST 0x02
66
67
68/* Type of node calling mip6_tunnel */
69#define MIP6_NODE_MN 0x01
70#define MIP6_NODE_HA 0x02
71
72
73/* Movement Detection default values */
74#define MIP6_MAX_LOST_ADVINTS 3
75
76
77/* Scope for hook activation */
78#define MIP6_GENERIC_HOOKS 0x01
79#define MIP6_SPECIFIC_HOOKS 0x02
80#define MIP6_CONFIG_HOOKS 0x03
81
82
83/* Definition of states for tunnels set up by the Home Agent and the MN. */
84#define MIP6_TUNNEL_ADD 0
85#define MIP6_TUNNEL_MOVE 1
86#define MIP6_TUNNEL_DEL 2
87
88
89/* Definition of length for different destination options */
90#define IP6OPT_BULEN 8 /* Length of BU option */
91#define IP6OPT_BALEN 11 /* Length of BA option */
92#define IP6OPT_BRLEN 0 /* Length of BR option */
93#define IP6OPT_HALEN 16 /* Length of HA option */
94#define IP6OPT_UIDLEN 2 /* Length of Unique Identifier sub-option */
95#define IP6OPT_HALISTLEN 16 /* Length of HA List sub-ption */
96#define IP6OPT_COALEN 16 /* Length of Alternate COA sub-option */
97
98
99/* Definition of minimum length of MIPv6 destination options.
100 Length includes option Type and Length. */
101#define IP6OPT_BAMINLEN (IP6OPT_MINLEN + IP6OPT_BALEN)
102#define IP6OPT_BRMINLEN (IP6OPT_MINLEN + IP6OPT_BRLEN)
103#define IP6OPT_BUMINLEN (IP6OPT_MINLEN + IP6OPT_BULEN)
104#define IP6OPT_HAMINLEN (IP6OPT_MINLEN + IP6OPT_HALEN)
105
106
107/* Definition of sub-options used by the Destination Options */
108#define IP6SUBOPT_UNIQUEID 0x02 /* Unique Identifier (BU, BR) */
109#define IP6SUBOPT_HALIST 0x03 /* Home Agents List (BA) */
110#define IP6SUBOPT_ALTCOA 0x04 /* Alternate COA (BU) */
111
112
113/* Definition of MIPv6 Binding Update option flags */
114#define MIP6_BU_AFLAG 0x80 /* BU Acknowledgement flag present */
115#define MIP6_BU_HFLAG 0x40 /* BU Home Registration flag present */
116#define MIP6_BU_RFLAG 0x20 /* BU MN is Router flag present */
117
118
119/* Definition of flags used for indication of options present in a
120 destination header (mip6_indata->optflag) */
121#define MIP6_DSTOPT_BU 0x80 /* BU Option present */
122#define MIP6_DSTOPT_BA 0x40 /* BA Option present */
123#define MIP6_DSTOPT_BR 0x20 /* BR Option present */
124#define MIP6_DSTOPT_HA 0x10 /* HA Option present */
125#define MIP6_DSTOPT_UID 0x08 /* Sub-option Unique Id present */
126#define MIP6_DSTOPT_COA 0x04 /* Sub-option Alternate COA present */
127#define MIP6_DSTOPT_HAL 0x02 /* Sub-option HAs List present */
128
129
130#if 0
131/* Definition of flags for Home Agent */
132#define ND_RA_FLAG_HA 0x20 /* RA indicates that router works as HA */
133#define ND_OPT_PI_FLAG_RADDR 0x20 /* Prefix Information option incl. global
134 IP address */
135#endif
136
137
138/* Definition of timers for signals */
139#define MIP6_BU_LIFETIME 600 /* Lifetime for BU (s) */
140#define MIP6_BU_LIFETIME_DEFRTR 60 /* Lifetime for BU sent to previous def
141 router (s) */
142#define MIP6_BU_LIFETIME_DHAAD 16 /* Lifetime for BU when Dynamic Home
143 Agent Address Discovery (s) */
144#define MIP6_MAX_FAST_UPDATES 5 /* Max number of fast updates (BUs)
145 being sent */
146#define MIP6_MAX_UPDATE_RATE 1 /* Rate limiting for sending successive
147 fast BUs (sec) */
148#define MIP6_SLOW_UPDATE_RATE 10 /* Rate limiting for sending successive
149 slow BUs (sec) */
150#define MIP6_MAX_BINDACK_TIMEOUT 256 /* Max time to wait for a BA */
151#define MIP6_MAX_ADVERT_REXMIT 3 /* Max retransmission of NA when retur-
152 ning to home link */
153#define MIP6_OUTQ_LIFETIME 20 /* Max number of 0.1s units that an entry
154 is stored in the output queue */
155#define MIP6_OUTQ_INTERVAL 5 /* Interval in units of 0.1s that the out
156 queue is searched */
157
158
159/* Definition of Binding Acknowledgement status field */
160#define MIP6_BA_STATUS_ACCEPT 0 /* Binding Update accepted */
161#define MIP6_BA_STATUS_UNSPEC 128 /* Reason unspecified */
162#define MIP6_BA_STATUS_PROHIBIT 130 /* Administratively prohibited */
163#define MIP6_BA_STATUS_RESOURCE 131 /* Insufficient resources */
164#define MIP6_BA_STATUS_HOMEREGNOSUP 132 /* Home registration not supported */
165#define MIP6_BA_STATUS_SUBNET 133 /* Not home subnet */
166#define MIP6_BA_STATUS_DHAAD 135 /* Dynamic home agent address
167 discovery response */
168#define MIP6_BA_STATUS_IFLEN 136 /* Incorrect interface id length */
169#define MIP6_BA_STATUS_NOTHA 137 /* Not home agent for this MN */
170
171
172/* Macro for modulo 2^^16 comparison */
173#define MIP6_LEQ(a,b) ((int16_t)((a)-(b)) <= 0)
174
175
176/* Macros started with MIP6_ADDR is Mobile IPv6 local */
177#define MIP6_ADDR_ANYCAST_HA 0x7e
178
179#if BYTE_ORDER == BIG_ENDIAN
180#define MIP6_ADDR_INT32_ULL 0xfe800000 /* Unicast Link Local */
181#define MIP6_ADDR_INT32_USL 0xfec00000 /* Unicast Site Local */
182#define MIP6_ADDR_INT32_AHA1 0xfffffffe /* Anycast Home Agent bit 97-128 */
183#define MIP6_ADDR_INT32_AHA2 0xfdffffff /* Anycast Home Agent bit 65-96 */
184#elif BYTE_ORDER == LITTLE_ENDIAN
185#define MIP6_ADDR_INT32_ULL 0x000080fe
186#define MIP6_ADDR_INT32_USL 0x0000c0fe
187#define MIP6_ADDR_INT32_AHA1 0xfeffffff
188#define MIP6_ADDR_INT32_AHA2 0xfffffffd
189#endif
190
191
192/* Definition of some useful macros to handle IP6 addresses */
193extern struct in6_addr in6addr_linklocal;
194extern struct in6_addr in6addr_sitelocal;
195extern struct in6_addr in6addr_aha_64; /* 64 bits identifier */
196extern struct in6_addr in6addr_aha_nn; /* 121-nn bits identifier */
197
198
199/* Definition of states for flag in queue for outgoing packets. */
200enum send_state {NOT_SENT, SENT};
201
202
203/* Definition of event-state machine type. */
204enum esm_type {PERMANENT, TEMPORARY};
205
206
207/* Configuration parameters needed for MIPv6. Controlled by the user */
208struct mip6_static_addr {
209 LIST_ENTRY(mip6_static_addr) addr_entry; /* Next IPv6 address list */
210 struct ifnet *ifp; /* Interface */
211 u_int8_t prefix_len; /* Prefix length for address */
212 struct in6_addr ip6_addr; /* Address to be used at foreign network */
213};
214
215
216/*
217 * fna_list List of pre-assigned care-of addresses to be used at
218 * foreign networks that the MN might visit
219 * bu_lifetime Used by the MN when sending a BU to the CN if it wants
220 * to use a smaller value than received in the home
221 * registration acknowledgement
222 * br_update Indicates when the CN sends a BR to the MN. The value
223 * should be given as percentage of the bu_lifetime
224 * ha_pref Preference for the Home Agent
225 * hr_lifetime Default life time for home registration (only sent to the
226 * Home Agent)
227 * fwd_sl_unicast Enable forwarding of site local unicast dest addresses
228 * fwd_sl_multicast Enable forwarding of site local multicast dest addresses
229 * enable_prom_mode Enable link layer promiscus mode (used by move detection)
230 * enable_bu_to_cn Enable BU being sent to the CN (Route optimization on/off)
231 * enable_rev_tunnel Enable tunneling of packets from MN to CN via Home Agent
232 * enable_br Enable sending BR to the MN
233 * autoconfig Only enable MIP6 if the mip6 deamon is running
234 * eager_md Enable eager Movement Detection
235 * enable_outq Enable reading from the MIP6 output queue for piggy
236 * backing (Not configurable, handled internally)
237 */
238struct mip6_config {
239 LIST_HEAD(fna_list, mip6_static_addr) fna_list;
240 u_int32_t bu_lifetime;
241 u_int8_t br_update;
242 int16_t ha_pref;
243 u_int32_t hr_lifetime;
244 u_int8_t fwd_sl_unicast;
245 u_int8_t fwd_sl_multicast;
246 u_int8_t enable_prom_mode;
247 u_int8_t enable_bu_to_cn;
248 u_int8_t enable_rev_tunnel;
249 u_int8_t enable_br;
250 u_int8_t autoconfig;
251 u_int8_t eager_md;
252 u_int8_t enable_outq;
253};
254
255
256/* Generic option format */
257struct mip6_bu_data {
258 u_int8_t prefix_len; /* Prefix length for a Home Address */
259 u_int8_t ack; /* Acknowledgement flag */
260};
261
262
263/* Generic option format */
264struct mip6_opt {
265 u_int8_t type; /* Option type */
266 u_int8_t len; /* Option length (octets) excl. type and length */
267} __attribute__ ((packed));
268
269
270/* List of prefixes extracted from Router Advertisments being sent by
271 the Home Agent. */
272struct mip6_prefix {
273 struct mip6_prefix *next; /* Ptr to next entry in the list */
274 struct ifnet *ifp; /* Outgoing interface */
275 struct in6_addr prefix; /* Announced prefix (on-link) */
276 u_int8_t prefix_len; /* Prefix length for IP address */
277 u_int32_t valid_time; /* Remaining (s) until prefix expires */
278} __attribute__ ((packed));
279
280
281/* Binding Update destination option format */
282struct mip6_opt_bu {
283 u_int8_t type; /* Option type */
284 u_int8_t len; /* Option length excluding Type and length */
285 u_int8_t flags; /* Flags (A, H and R) */
286 u_int8_t prefix_len; /* Prefix length for IP address */
287 u_int16_t seqno; /* Sequence number */
288 u_int32_t lifetime; /* Seconds remaining until the binding expires */
289} __attribute__ ((packed));
290
291
292/* Binding Acknowledgement destination option format */
293struct mip6_opt_ba {
294 u_int8_t type; /* Option type */
295 u_int8_t len; /* Option length (octets) excl. type and length */
296 u_int8_t status; /* Result of the BU */
297 u_int16_t seqno; /* Sequence number */
298 u_int32_t lifetime; /* Granted lifetime (s) for the BU in the BC */
299 u_int32_t refresh; /* Interval for MN to send BU to refresh BC */
300} __attribute__ ((packed));
301
302
303/* Binding Request destination option format */
304struct mip6_opt_br {
305 u_int8_t type; /* Option type */
306 u_int8_t len; /* Option length (octets) excl. type and length */
307} __attribute__ ((packed));
308
309
310/* Home Address option format */
311struct mip6_opt_ha {
312 u_int8_t type; /* Option type */
313 u_int8_t len; /* Option length excl. type and length */
314 struct in6_addr home_addr; /* Home Addr of the MN sending the packet */
315} __attribute__ ((packed));
316
317
318/* Unique Identifier sub-option format */
319struct mip6_subopt_id {
320 u_int8_t type; /* Sub-option type */
321 u_int8_t len; /* Sub-option length (octets) excl. type and length */
322 u_int16_t id; /* Unique identifier */
323} __attribute__ ((packed));
324
325
326/* Home Agents list sub-option format */
327struct mip6_subopt_hal {
328 u_int8_t type; /* Sub-option type */
329 u_int8_t len; /* Sub-option length excl. type and length */
330 struct in6_addr halist[1]; /* List of HA's on the home link */
331} __attribute__ ((packed));
332
333
334/* Alternate Care-of Address sub-option format */
335struct mip6_subopt_coa {
336 u_int8_t type; /* Sub-option type */
337 u_int8_t len; /* Length (octets) excl. type and len fields */
338 struct in6_addr coa; /* Alternate COA */
339} __attribute__ ((packed));
340
341
342/* Buffer for storing a consequtive sequence of sub-options */
343struct mip6_subbuf {
344 u_int16_t len; /* # of used bytes in buffer */
345 char buffer[512];
346};
347
348
349/* The event-state machine must be maintained for each Home Address. */
350struct mip6_dad {
351 struct mip6_subopt_hal *hal; /* Home Agents list */
352 int index; /* Next entry in list to try */
353};
354
355struct mip6_hafn {
356 time_t time; /* Absolute expire time */
357 int16_t pref; /* Preference for this HA */
358 u_int8_t prefix_len; /* Prefix_len for HA Address */
359 struct in6_addr addr; /* FN Home Agent global unicast address */
360};
361
362struct mip6_esm {
363 struct mip6_esm *next; /* Ptr to next entry in the list */
364 struct ifnet *ifp; /* I/f where home address is applied */
365 const struct encaptab *ep; /* Encapsulation attach (MN -> HA) */
366 int state; /* State for the home address */
367 enum esm_type type; /* Type of event-state machine */
368 struct in6_addr home_addr; /* Home address */
369 u_int8_t prefix_len; /* Prefix_len for Home Address */
370 u_int16_t lifetime; /* if type=PERMANENT 0xFFFF, else x */
371 struct in6_addr ha_hn; /* Home agent address (home network) */
372 struct in6_addr coa; /* Current primary care-of address */
373 struct mip6_hafn *ha_fn; /* Home agent address (foreign network) */
374 struct mip6_dad *dad; /* For Dynamic HA Address Discovery */
375};
376
377
378/* Binding Cache parameters. Bindings for other IPv6 nodes. */
379/* Maintained by each node. */
380struct bc_info {
381 u_int32_t br_interval; /* % of mip6_lifetime, max 60s, min 2s */
382 u_int8_t no_of_sent_br; /* Number of sent BR to a Mobile Node */
383 u_int8_t max_advert; /* ? */
384 u_int8_t ra_tunneled; /* RA being tunneled to MN */
385 u_int8_t ra_interval; /* Interval for sending RA */
386};
387
388struct mip6_bc {
389 struct mip6_bc *next; /* Ptr to next entry in the list */
390 struct in6_addr home_addr; /* Home Address of the MN for which this is
391 the BC entry */
392 struct in6_addr coa; /* COA for MN indicated by the HA field */
393 u_int32_t lifetime; /* Remaining lifetime for this BC entry */
394 u_int8_t hr_flag; /* Flag for home registration entry (T/F) */
395 u_int8_t rtr_flag; /* MN is a router (T/F) */
396 u_int8_t prefix_len; /* Prefix length in last received BU */
397 u_int16_t seqno; /* Maximum value of the sequence number */
398 struct bc_info info; /* Usage info for cache replacement policy */
399 time_t lasttime; /* The time at which a BR was last sent */
400 const struct encaptab *ep; /* Encapsulation attach (HA -> MN) */
401};
402
403
404
405/* Binding Update List parameters. Information for each BU sent by this MN */
406/* Each MN maintains this list. */
407struct mip6_retrans {
408 struct mip6_opt_bu *bu_opt; /* BU option in case of retransmission */
409 struct mip6_subbuf *bu_subopt; /* BU sub-option in case of retrans. */
410 u_int8_t ba_timeout; /* Exponential back-off starting at 1 */
411 u_int8_t time_left; /* Time left until next retransmission */
412};
413
414struct mip6_bul {
415 struct mip6_bul *next; /* Ptr to next entry in the list */
416 struct in6_addr dst_addr; /* Destination address for sent BU */
417 struct in6_addr bind_addr; /* Home Address or previous COA */
418 struct in6_addr coa; /* Care-of address sent in the BU */
419 u_int32_t lifetime; /* Remaining binding lifetime */
420 u_int32_t refreshtime; /* Refresh time for the BU */
421 u_int16_t seqno; /* Last value for sent seq number */
422 time_t lasttime; /* Time at which a BU was last sent */
423 u_int32_t no_of_sent_bu; /* Number of sent BU to a MN */
424 struct mip6_retrans *state; /* Status for BU being acknowledged */
425 u_int8_t bu_flag; /* Flag for sending future BU (T/F) */
426 u_int8_t hr_flag; /* Flag for home reg (True / False) */
427 u_int8_t update_rate; /* Seconds between consequtive BUs */
428};
429
430
431/* Home Agent List parameters. Information about each other HA on the link
432 that this node is serving as a HA. One HA list for each link it is
433 serving. */
434/* Each HA maintains this list. */
435struct mip6_addr_list {
436 struct mip6_addr_list *next; /* Ptr to next entry in the list */
437 struct in6_addr ip6_addr; /* IPv6 address */
438 u_int8_t prefix_len;
439};
440
441struct mip6_ha_list {
442 struct mip6_ha_list *next; /* Ptr to next entry in the list */
443 struct in6_addr ll_addr; /* Link-local IP-addr of a node on
444 the home link */
445 u_int16_t lifetime; /* Remaining lifetime of this HA
446 list entry */
447 int16_t pref; /* Preference for this HA */
448 struct mip6_addr_list *addr_list; /* List of global IP addresses for
449 this HA */
450};
451
452struct mip6_link_list {
453 struct mip6_link_list *next; /* Ptr to next entry in the list */
454 struct mip6_ha_list *ha_list; /* List of Home Agents for the link */
455 struct ifnet *ifp; /* Interface */
456 char ifname[IFNAMSIZ+1]; /* Link identifier */
457};
458
459
460/* Neighbor Advertisement information stored for retransmission when the
461 Mobile Node is returning to its Home Network or the Home Agent is
462 requested to act as a proxy for the Mobile Node when it is moving to a
463 Foreign Network. */
464struct mip6_na
465{
466 struct mip6_na *next; /* Ptr to next entry in the list */
467 struct ifnet *ifp; /* Interface for sending the NA */
468 struct in6_addr home_addr; /* Home address of the mobile node */
469 struct in6_addr dst_addr; /* Destination address */
470 struct in6_addr target_addr; /* Target address */
471 u_int8_t prefix_len; /* Prefix length for home address */
472 u_long flags; /* Flags for the NA message */
473 int use_link_opt; /* Include Target link layer address
474 option or not
475 (0 = Do not include, 1 = Include) */
476 int no; /* Remaining no of times to send the NA */
477};
478
479
480/* Definition of global variable used by Mobile IPv6. All variables are
481 stored in node byte order. */
482struct mip6_indata {
483 u_int8_t flag; /* How to handle tunneled packets */
484 u_int8_t optflag; /* Dest options and sub-options flag */
485 struct in6_addr ip6_src; /* Orig src addr from IPv6 header */
486 struct in6_addr ip6_dst; /* Orig dst addr from IPv6 header */
487 struct mip6_opt_bu *bu_opt; /* BU option present */
488 struct mip6_opt_ba *ba_opt; /* BA option present */
489 struct mip6_opt_br *br_opt; /* BR option present */
490 struct mip6_opt_ha *ha_opt; /* HA option present */
491 struct mip6_subopt_id *uid; /* Sub-option Unique ID present */
492 struct mip6_subopt_coa *coa; /* Sub-option alt coa present */
493 struct mip6_subopt_hal *hal; /* Sub-option HAs List present */
494};
495
496
497/* Queue of outgoing packets that are waiting to be sent. */
498struct mip6_output {
499 struct mip6_output *next; /* Ptr to next option in chain */
500 void *opt; /* BU, BA or BR dest option to be sent */
501 struct mip6_subbuf *subopt; /* Sub-option to be sent (if present) */
502 struct in6_addr ip6_dst; /* Destination address for IPv6 packet */
503 struct in6_addr ip6_src; /* Source address for IPv6 packet */
504 enum send_state flag; /* Has packet been sent or not? */
505 u_int32_t lifetime; /* Time remaining for entry in output queue
506 (units of 0.1s) */
507};
508
509#ifdef KERNEL
510
511/*
512 * Macro MIP6_FREEINDATA free memory allocated for the global variable
513 * mip6_inp and its members. Set the variable to point at NULL when
514 * the memory has been freed.
515 */
516#define MIP6_FREEINDATA \
517do { \
518 if (mip6_inp != NULL) { \
519 if (mip6_inp->bu_opt != NULL) \
520 _FREE(mip6_inp->bu_opt, M_TEMP); \
521 if (mip6_inp->ba_opt != NULL) \
522 _FREE(mip6_inp->ba_opt, M_TEMP); \
523 if (mip6_inp->br_opt != NULL) \
524 _FREE(mip6_inp->br_opt, M_TEMP); \
525 if (mip6_inp->ha_opt != NULL) \
526 _FREE(mip6_inp->ha_opt, M_TEMP); \
527 if (mip6_inp->uid != NULL) \
528 _FREE(mip6_inp->uid, M_TEMP); \
529 if (mip6_inp->coa != NULL) \
530 _FREE(mip6_inp->coa, M_TEMP); \
531 if (mip6_inp->hal != NULL) \
532 _FREE(mip6_inp->hal, M_TEMP); \
533 _FREE(mip6_inp, M_TEMP); \
534 mip6_inp = NULL; \
535 } \
536} while (0)
537
538#define MIP6_IS_MN_ACTIVE ((mip6_module & MIP6_MN_MODULE) == MIP6_MN_MODULE)
539#define MIP6_IS_HA_ACTIVE ((mip6_module & MIP6_HA_MODULE) == MIP6_HA_MODULE)
540
541
542/* External Declaration of Global variables. */
543extern struct mip6_indata *mip6_inp; /* Input data rec in one packet */
544extern struct mip6_output *mip6_outq; /* Ptr to output queue */
545extern struct mip6_esm *mip6_esmq; /* Ptr to list of Home Addresses */
546extern struct mip6_bc *mip6_bcq; /* First entry in the BC list */
547extern struct mip6_prefix *mip6_pq; /* First entry in prefix list */
548extern struct mip6_config mip6_config; /* Config parameters for MIP6 */
549extern struct mip6_bul *mip6_bulq;
550extern struct mip6_link_list *mip6_llq;
551extern struct nd_prefix *mip6_home_prefix;
552extern struct nd_prefix *mip6_primary_prefix;
553
554extern u_int8_t mip6_module; /* Info about loaded modules (MN/HA) */
555extern int mip6_md_state; /* Movement Detection state */
556extern int mip6_route_state; /* Home Address route state */
557extern int mip6_max_lost_advints; /* No. lost Adv before start of NUD */
558extern int mip6_nd6_delay;
559extern int mip6_nd6_umaxtries;
560
561
562/* External declaration of function prototypes (mip6_io.c) */
563extern int mip6_new_packet
564 __P((struct mbuf *));
565extern int mip6_store_dstopt_pre
566 __P((struct mbuf *, u_int8_t *, u_int8_t, u_int8_t));
567extern int mip6_store_dstopt
568 __P((struct mbuf *, u_int8_t *, u_int8_t));
569extern int mip6_store_dstsubopt
570 __P((struct mbuf *, u_int8_t *, u_int8_t, int, int));
571extern int mip6_output
572 __P((struct mbuf *, struct ip6_pktopts **));
573extern int mip6_add_rh
574 __P((struct ip6_pktopts **, struct mip6_bc *));
575extern void mip6_align
576 __P((struct ip6_dest *, int *));
577extern void mip6_dest_offset
578 __P((struct ip6_dest *, int *));
579extern int mip6_add_ha
580 __P((struct ip6_dest **, int *, struct in6_addr *, struct in6_addr *));
581extern int mip6_add_bu
582 __P((struct ip6_dest **, int *, struct mip6_opt_bu *,
583 struct mip6_subbuf *));
584extern int mip6_add_ba
585 __P((struct ip6_dest **, int *, struct mip6_opt_ba *,
586 struct mip6_subbuf *));
587extern int mip6_add_br
588 __P((struct ip6_dest **, int *, struct mip6_opt_br *,
589 struct mip6_subbuf *));
590extern int mip6_store_subopt
591 __P((struct mip6_subbuf **, caddr_t));
592
593
594/* External declaration of function prototypes (mip6.c) */
595extern void mip6_init
596 __P((void));
597extern void mip6_exit
598 __P((void));
599extern int mip6_rec_ctrl_sig
600 __P((struct mbuf *, int));
601extern int mip6_icmp6_input
602 __P((struct mbuf *, int));
603extern int mip6_rec_bu
604 __P((struct mbuf *, int));
605extern void mip6_ha2srcaddr
606 __P((struct mbuf *));
607extern int mip6_send_ba
608 __P((struct in6_addr *, struct in6_addr *, struct in6_addr *,
609 struct mip6_subbuf *, u_int8_t, u_int16_t, u_int32_t));
610extern void mip6_send_na
611 __P((struct mip6_na *));
612extern struct mbuf *mip6_create_ip6hdr
613 __P((struct in6_addr *, struct in6_addr *, u_int8_t));
614extern struct ip6_rthdr *mip6_create_rh
615 __P((struct in6_addr *, u_int8_t));
616extern struct mip6_opt_ba *mip6_create_ba
617 __P((u_int8_t, u_int16_t, u_int32_t));
618extern struct ip6_dest *mip6_create_dh
619 __P((void *, struct mip6_subbuf *, u_int8_t));
620extern int mip6_opt_offset
621 __P((struct mbuf *, int, int));
622extern int mip6_addr_on_link
623 __P((struct in6_addr *, int));
624extern u_int32_t mip6_min_lifetime
625 __P((struct in6_addr *, int));
626extern void mip6_build_in6addr
627 __P((struct in6_addr *, struct in6_addr *, const struct in6_addr *,
628 int));
629extern void mip6_build_ha_anycast
630 __P((struct in6_addr *, const struct in6_addr *, int));
631extern int mip6_add_ifaddr
632 __P((struct in6_addr *addr, struct ifnet *ifp, int plen, int flags));
633extern int mip6_tunnel_output
634 __P((struct mbuf **, struct mip6_bc *));
635extern int mip6_tunnel_input
636 __P((struct mbuf **, int *, int));
637extern int mip6_tunnel
638 __P((struct in6_addr *, struct in6_addr *, int, int, void *));
639extern int mip6_proxy
640 __P((struct in6_addr*, struct in6_addr*, int));
641extern struct mip6_bc *mip6_bc_find
642 __P((struct in6_addr *));
643extern struct mip6_bc *mip6_bc_create
644 __P((struct in6_addr *, struct in6_addr *, u_int32_t, u_int8_t,
645 u_int8_t, u_int8_t, u_int16_t));
646extern void mip6_bc_update
647 __P((struct mip6_bc *, struct in6_addr *, u_int32_t, u_int8_t,
648 u_int8_t, u_int8_t, u_int16_t, struct bc_info, time_t));
649extern int mip6_bc_delete
650 __P((struct mip6_bc *, struct mip6_bc **));
651extern struct mip6_na *mip6_na_create
652 __P((struct in6_addr *, struct in6_addr *, struct in6_addr *,
653 u_int8_t, u_long, int));
654extern struct mip6_na *mip6_na_delete
655 __P((struct mip6_na *));
656extern struct mip6_prefix *mip6_prefix_find
657 __P((struct in6_addr *, u_int8_t));
658extern struct mip6_prefix *mip6_prefix_create
659 __P((struct ifnet *, struct in6_addr *, u_int8_t, u_int32_t));
660extern struct mip6_prefix *mip6_prefix_delete
661 __P((struct mip6_prefix *));
662extern void mip6_timer_na
663 __P((void *));
664extern void mip6_timer_bc
665 __P((void *));
666extern void mip6_timer_prefix
667 __P((void *));
668
669#if !defined(__bsdi__) && !(defined(__FreeBSD__) && __FreeBSD__ < 3)
670extern int mip6_ioctl __P((struct socket *, u_long, caddr_t, struct ifnet *,
671 struct proc *));
672#else
673extern int mip6_ioctl __P((struct socket *, u_long, caddr_t, struct ifnet *));
674#endif
675
676#if MIP6_DEBUG
677void mip6_debug __P((char *, ...));
678#endif
679
680extern void mip6_enable_debug
681 __P((int));
682extern int mip6_write_config_data
683 __P((u_long, caddr_t));
684extern int mip6_clear_config_data
685 __P((u_long, caddr_t));
686extern int mip6_enable_func
687 __P((u_long, caddr_t));
688
689
690/* External declaration of function prototypes (mip6_md.c) */
691extern void mip6_md_init
692 __P((void));
693extern void mip6_select_defrtr
694 __P((void));
695extern void mip6_prelist_update
696 __P((struct nd_prefix *, struct nd_defrouter *));
697extern void mip6_eager_md
698 __P((int enable));
699extern void mip6_expired_defrouter
700 __P((struct nd_defrouter *dr));
701extern void mip6_probe_defrouter
702 __P((struct nd_defrouter *dr));
703extern void mip6_probe_pfxrtrs
704 __P((void));
705extern void mip6_store_advint
706 __P((struct nd_opt_advint *, struct nd_defrouter *));
707extern int mip6_delete_ifaddr
708 __P((struct in6_addr *addr, struct ifnet *ifp));
709extern struct nd_prefix *mip6_get_home_prefix
710 __P((void));
711extern int mip6_get_md_state
712 __P((void));
713extern void mip6_md_exit
714 __P((void));
715
716
717/* External declaration of function prototypes (mip6_mn.c) */
718extern void mip6_mn_init
719 __P((void));
720extern void mip6_mn_exit
721 __P((void));
722extern void mip6_new_defrtr
723 __P((int, struct nd_prefix *, struct nd_prefix *,
724 struct nd_defrouter *));
725extern int mip6_rec_ba
726 __P((struct mbuf *, int));
727extern int mip6_rec_br
728 __P((struct mbuf *, int));
729extern int mip6_rec_hal
730 __P((struct in6_addr *, struct in6_addr *, struct mip6_subopt_hal *));
731extern int mip6_rec_ramn
732 __P((struct mbuf *, int));
733extern int mip6_route_optimize
734 __P((struct mbuf *));
735extern int mip6_send_bu
736 __P((struct mip6_bul *, struct mip6_bu_data *, struct mip6_subbuf *));
737extern void mip6_send_bu2fn
738 __P((struct in6_addr *, struct mip6_hafn *, struct in6_addr *,
739 struct ifnet *, u_int32_t));
740extern void mip6_update_cns
741 __P((struct in6_addr *, struct in6_addr *, u_int8_t, u_int32_t));
742extern void mip6_queue_bu
743 __P((struct mip6_bul *, struct in6_addr *, struct in6_addr *,
744 u_int8_t, u_int32_t));
745extern struct mip6_opt_bu *mip6_create_bu
746 __P((u_int8_t, int, int, u_int16_t, u_int32_t));
747extern void mip6_stop_bu
748 __P((struct in6_addr *));
749extern int mip6_ba_error
750 __P((struct in6_addr *, struct in6_addr *, struct in6_addr *,
751 u_int8_t));
752extern u_int32_t mip6_prefix_lifetime
753 __P((struct in6_addr *));
754extern struct mip6_retrans * mip6_create_retrans
755 __P((struct mip6_bul *));
756extern void mip6_clear_retrans
757 __P((struct mip6_bul *));
758extern struct mip6_bul *mip6_bul_find
759 __P((struct in6_addr *, struct in6_addr *));
760extern struct mip6_bul *mip6_bul_create
761 __P((struct in6_addr *, struct in6_addr *, struct in6_addr *,
762 u_int32_t, u_int8_t));
763extern struct mip6_bul *mip6_bul_delete
764 __P((struct mip6_bul *));
765extern struct mip6_esm *mip6_esm_find
766 __P((struct in6_addr *));
767extern struct mip6_esm *mip6_esm_create
768 __P((struct ifnet *, struct in6_addr *, struct in6_addr *,
769 struct in6_addr *, u_int8_t, int, enum esm_type, u_int16_t));
770extern struct mip6_esm *mip6_esm_delete
771 __P((struct mip6_esm *));
772extern int mip6_outq_create
773 __P((void *, struct mip6_subbuf *, struct in6_addr *,
774 struct in6_addr *, enum send_state));
775extern struct mip6_output *mip6_outq_delete
776 __P((struct mip6_output *));
777extern void mip6_outq_flush
778 __P((void));
779extern void mip6_timer_outqueue
780 __P((void *));
781extern void mip6_timer_bul
782 __P((void *));
783extern void mip6_timer_esm
784 __P((void *));
785extern int mip6_write_config_data_mn
786 __P((u_long, void *));
787extern int mip6_clear_config_data_mn
788 __P((u_long, caddr_t));
789extern int mip6_enable_func_mn
790 __P((u_long, caddr_t));
791
792
793/* External declaration of function prototypes (mip6_ha.c). */
794extern void mip6_ha_init
795 __P((void));
796extern void mip6_ha_exit
797 __P((void));
798extern int mip6_rec_raha
799 __P((struct mbuf *, int));
800extern int mip6_ra_options
801 __P((struct mip6_ha_list *, caddr_t, int));
802extern struct mip6_subopt_hal * mip6_hal_dynamic
803 __P((struct in6_addr *));
804extern struct in6_addr *mip6_global_addr
805 __P((struct in6_addr *));
806extern void mip6_icmp6_output
807 __P((struct mbuf *));
808extern void mip6_prefix_examine
809 __P((struct mip6_ha_list *, struct ifnet *, caddr_t, int));
810extern struct mip6_link_list *mip6_ll_find
811 __P((char *));
812extern struct mip6_link_list *mip6_ll_create
813 __P((char *, struct ifnet *));
814extern struct mip6_link_list *mip6_ll_delete
815 __P((struct mip6_link_list *));
816extern struct mip6_ha_list *mip6_hal_find
817 __P((struct mip6_ha_list *, struct in6_addr *));
818extern struct mip6_ha_list *mip6_hal_create
819 __P((struct mip6_ha_list **, struct in6_addr *, u_int32_t, int16_t));
820extern void mip6_hal_sort
821 __P((struct mip6_ha_list **));
822extern struct mip6_ha_list *mip6_hal_delete
823 __P((struct mip6_ha_list **, struct mip6_ha_list *));
824extern void mip6_timer_ll
825 __P((void *));
826extern int mip6_write_config_data_ha
827 __P((u_long, void *));
828extern int mip6_clear_config_data_ha
829 __P((u_long, void *));
830extern int mip6_enable_func_ha
831 __P((u_long, caddr_t));
832
833
834/* External declaration of function prototypes (mip6_hooks.c). */
835extern void mip6_minus_a_case
836 __P((struct nd_prefix *));
837extern struct nd_prefix *mip6_find_auto_home_addr
838 __P((void));
839extern void mip6_enable_hooks
840 __P((int));
841extern void mip6_disable_hooks
842 __P((int));
843extern int mip6_attach
844 __P((int));
845extern int mip6_release
846 __P((void));
847
848
849#if defined(__FreeBSD__) && __FreeBSD__ >= 3
850extern struct callout_handle mip6_timer_na_handle;
851extern struct callout_handle mip6_timer_bc_handle;
852extern struct callout_handle mip6_timer_outqueue_handle;
853extern struct callout_handle mip6_timer_bul_handle;
854extern struct callout_handle mip6_timer_esm_handle;
855extern struct callout_handle mip6_timer_prefix_handle;
856extern struct callout_handle mip6_timer_ll_handle;
857#endif
858
859#endif /* _KERNEL */
860
861#endif /* not _NETINET6_MIP6_H_ */