1 /* $KAME: mip6.h,v 1.8 2000/03/18 03:05:39 itojun Exp $ */
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
32 #ifndef _NETINET6_MIP6_H_
33 #define _NETINET6_MIP6_H_
35 #include <netinet6/nd6.h>
36 #include <netinet/icmp6.h>
41 * Definition For Mobile Internet Protocol Version 6.
42 * Draft draft-ietf-mobileip-ipv6-09.txt
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
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
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
68 /* Type of node calling mip6_tunnel */
69 #define MIP6_NODE_MN 0x01
70 #define MIP6_NODE_HA 0x02
73 /* Movement Detection default values */
74 #define MIP6_MAX_LOST_ADVINTS 3
77 /* Scope for hook activation */
78 #define MIP6_GENERIC_HOOKS 0x01
79 #define MIP6_SPECIFIC_HOOKS 0x02
80 #define MIP6_CONFIG_HOOKS 0x03
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
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 */
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)
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) */
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 */
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 */
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
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
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)
146 #define MIP6_MAX_UPDATE_RATE 1 /* Rate limiting for sending successive
148 #define MIP6_SLOW_UPDATE_RATE 10 /* Rate limiting for sending successive
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-
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
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 */
172 /* Macro for modulo 2^^16 comparison */
173 #define MIP6_LEQ(a,b) ((int16_t)((a)-(b)) <= 0)
176 /* Macros started with MIP6_ADDR is Mobile IPv6 local */
177 #define MIP6_ADDR_ANYCAST_HA 0x7e
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
192 /* Definition of some useful macros to handle IP6 addresses */
193 extern struct in6_addr in6addr_linklocal
;
194 extern struct in6_addr in6addr_sitelocal
;
195 extern struct in6_addr in6addr_aha_64
; /* 64 bits identifier */
196 extern struct in6_addr in6addr_aha_nn
; /* 121-nn bits identifier */
199 /* Definition of states for flag in queue for outgoing packets. */
200 enum send_state
{NOT_SENT
, SENT
};
203 /* Definition of event-state machine type. */
204 enum esm_type
{PERMANENT
, TEMPORARY
};
207 /* Configuration parameters needed for MIPv6. Controlled by the user */
208 struct 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 */
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
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)
239 LIST_HEAD(fna_list
, mip6_static_addr
) fna_list
;
240 u_int32_t bu_lifetime
;
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
;
252 u_int8_t enable_outq
;
256 /* Generic option format */
257 struct mip6_bu_data
{
258 u_int8_t prefix_len
; /* Prefix length for a Home Address */
259 u_int8_t ack
; /* Acknowledgement flag */
263 /* Generic option format */
265 u_int8_t type
; /* Option type */
266 u_int8_t len
; /* Option length (octets) excl. type and length */
267 } __attribute__ ((packed
));
270 /* List of prefixes extracted from Router Advertisments being sent by
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
));
281 /* Binding Update destination option format */
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
));
292 /* Binding Acknowledgement destination option format */
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
));
303 /* Binding Request destination option format */
305 u_int8_t type
; /* Option type */
306 u_int8_t len
; /* Option length (octets) excl. type and length */
307 } __attribute__ ((packed
));
310 /* Home Address option format */
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
));
318 /* Unique Identifier sub-option format */
319 struct 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
));
326 /* Home Agents list sub-option format */
327 struct 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
));
334 /* Alternate Care-of Address sub-option format */
335 struct 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
));
342 /* Buffer for storing a consequtive sequence of sub-options */
344 u_int16_t len
; /* # of used bytes in buffer */
349 /* The event-state machine must be maintained for each Home Address. */
351 struct mip6_subopt_hal
*hal
; /* Home Agents list */
352 int index
; /* Next entry in list to try */
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 */
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 */
378 /* Binding Cache parameters. Bindings for other IPv6 nodes. */
379 /* Maintained by each node. */
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 */
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
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) */
405 /* Binding Update List parameters. Information for each BU sent by this MN */
406 /* Each MN maintains this list. */
407 struct 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 */
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 */
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
434 /* Each HA maintains this list. */
435 struct mip6_addr_list
{
436 struct mip6_addr_list
*next
; /* Ptr to next entry in the list */
437 struct in6_addr ip6_addr
; /* IPv6 address */
441 struct 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
445 u_int16_t lifetime
; /* Remaining lifetime of this HA
447 int16_t pref
; /* Preference for this HA */
448 struct mip6_addr_list
*addr_list
; /* List of global IP addresses for
452 struct 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 */
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
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
475 (0 = Do not include, 1 = Include) */
476 int no
; /* Remaining no of times to send the NA */
480 /* Definition of global variable used by Mobile IPv6. All variables are
481 stored in node byte order. */
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 */
497 /* Queue of outgoing packets that are waiting to be sent. */
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
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.
516 #define MIP6_FREEINDATA \
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); \
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)
542 /* External Declaration of Global variables. */
543 extern struct mip6_indata
*mip6_inp
; /* Input data rec in one packet */
544 extern struct mip6_output
*mip6_outq
; /* Ptr to output queue */
545 extern struct mip6_esm
*mip6_esmq
; /* Ptr to list of Home Addresses */
546 extern struct mip6_bc
*mip6_bcq
; /* First entry in the BC list */
547 extern struct mip6_prefix
*mip6_pq
; /* First entry in prefix list */
548 extern struct mip6_config mip6_config
; /* Config parameters for MIP6 */
549 extern struct mip6_bul
*mip6_bulq
;
550 extern struct mip6_link_list
*mip6_llq
;
551 extern struct nd_prefix
*mip6_home_prefix
;
552 extern struct nd_prefix
*mip6_primary_prefix
;
554 extern u_int8_t mip6_module
; /* Info about loaded modules (MN/HA) */
555 extern int mip6_md_state
; /* Movement Detection state */
556 extern int mip6_route_state
; /* Home Address route state */
557 extern int mip6_max_lost_advints
; /* No. lost Adv before start of NUD */
558 extern int mip6_nd6_delay
;
559 extern int mip6_nd6_umaxtries
;
562 /* External declaration of function prototypes (mip6_io.c) */
563 extern int mip6_new_packet
564 __P((struct mbuf
*));
565 extern int mip6_store_dstopt_pre
566 __P((struct mbuf
*, u_int8_t
*, u_int8_t
, u_int8_t
));
567 extern int mip6_store_dstopt
568 __P((struct mbuf
*, u_int8_t
*, u_int8_t
));
569 extern int mip6_store_dstsubopt
570 __P((struct mbuf
*, u_int8_t
*, u_int8_t
, int, int));
571 extern int mip6_output
572 __P((struct mbuf
*, struct ip6_pktopts
**));
573 extern int mip6_add_rh
574 __P((struct ip6_pktopts
**, struct mip6_bc
*));
575 extern void mip6_align
576 __P((struct ip6_dest
*, int *));
577 extern void mip6_dest_offset
578 __P((struct ip6_dest
*, int *));
579 extern int mip6_add_ha
580 __P((struct ip6_dest
**, int *, struct in6_addr
*, struct in6_addr
*));
581 extern int mip6_add_bu
582 __P((struct ip6_dest
**, int *, struct mip6_opt_bu
*,
583 struct mip6_subbuf
*));
584 extern int mip6_add_ba
585 __P((struct ip6_dest
**, int *, struct mip6_opt_ba
*,
586 struct mip6_subbuf
*));
587 extern int mip6_add_br
588 __P((struct ip6_dest
**, int *, struct mip6_opt_br
*,
589 struct mip6_subbuf
*));
590 extern int mip6_store_subopt
591 __P((struct mip6_subbuf
**, caddr_t
));
594 /* External declaration of function prototypes (mip6.c) */
595 extern void mip6_init
597 extern void mip6_exit
599 extern int mip6_rec_ctrl_sig
600 __P((struct mbuf
*, int));
601 extern int mip6_icmp6_input
602 __P((struct mbuf
*, int));
603 extern int mip6_rec_bu
604 __P((struct mbuf
*, int));
605 extern void mip6_ha2srcaddr
606 __P((struct mbuf
*));
607 extern 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
));
610 extern void mip6_send_na
611 __P((struct mip6_na
*));
612 extern struct mbuf
*mip6_create_ip6hdr
613 __P((struct in6_addr
*, struct in6_addr
*, u_int8_t
));
614 extern struct ip6_rthdr
*mip6_create_rh
615 __P((struct in6_addr
*, u_int8_t
));
616 extern struct mip6_opt_ba
*mip6_create_ba
617 __P((u_int8_t
, u_int16_t
, u_int32_t
));
618 extern struct ip6_dest
*mip6_create_dh
619 __P((void *, struct mip6_subbuf
*, u_int8_t
));
620 extern int mip6_opt_offset
621 __P((struct mbuf
*, int, int));
622 extern int mip6_addr_on_link
623 __P((struct in6_addr
*, int));
624 extern u_int32_t mip6_min_lifetime
625 __P((struct in6_addr
*, int));
626 extern void mip6_build_in6addr
627 __P((struct in6_addr
*, struct in6_addr
*, const struct in6_addr
*,
629 extern void mip6_build_ha_anycast
630 __P((struct in6_addr
*, const struct in6_addr
*, int));
631 extern int mip6_add_ifaddr
632 __P((struct in6_addr
*addr
, struct ifnet
*ifp
, int plen
, int flags
));
633 extern int mip6_tunnel_output
634 __P((struct mbuf
**, struct mip6_bc
*));
635 extern int mip6_tunnel_input
636 __P((struct mbuf
**, int *, int));
637 extern int mip6_tunnel
638 __P((struct in6_addr
*, struct in6_addr
*, int, int, void *));
639 extern int mip6_proxy
640 __P((struct in6_addr
*, struct in6_addr
*, int));
641 extern struct mip6_bc
*mip6_bc_find
642 __P((struct in6_addr
*));
643 extern 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
));
646 extern 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));
649 extern int mip6_bc_delete
650 __P((struct mip6_bc
*, struct mip6_bc
**));
651 extern struct mip6_na
*mip6_na_create
652 __P((struct in6_addr
*, struct in6_addr
*, struct in6_addr
*,
653 u_int8_t
, u_long
, int));
654 extern struct mip6_na
*mip6_na_delete
655 __P((struct mip6_na
*));
656 extern struct mip6_prefix
*mip6_prefix_find
657 __P((struct in6_addr
*, u_int8_t
));
658 extern struct mip6_prefix
*mip6_prefix_create
659 __P((struct ifnet
*, struct in6_addr
*, u_int8_t
, u_int32_t
));
660 extern struct mip6_prefix
*mip6_prefix_delete
661 __P((struct mip6_prefix
*));
662 extern void mip6_timer_na
664 extern void mip6_timer_bc
666 extern void mip6_timer_prefix
669 #if !defined(__bsdi__) && !(defined(__FreeBSD__) && __FreeBSD__ < 3)
670 extern int mip6_ioctl
__P((struct socket
*, u_long
, caddr_t
, struct ifnet
*,
673 extern int mip6_ioctl
__P((struct socket
*, u_long
, caddr_t
, struct ifnet
*));
677 void mip6_debug
__P((char *, ...));
680 extern void mip6_enable_debug
682 extern int mip6_write_config_data
683 __P((u_long
, caddr_t
));
684 extern int mip6_clear_config_data
685 __P((u_long
, caddr_t
));
686 extern int mip6_enable_func
687 __P((u_long
, caddr_t
));
690 /* External declaration of function prototypes (mip6_md.c) */
691 extern void mip6_md_init
693 extern void mip6_select_defrtr
695 extern void mip6_prelist_update
696 __P((struct nd_prefix
*, struct nd_defrouter
*));
697 extern void mip6_eager_md
699 extern void mip6_expired_defrouter
700 __P((struct nd_defrouter
*dr
));
701 extern void mip6_probe_defrouter
702 __P((struct nd_defrouter
*dr
));
703 extern void mip6_probe_pfxrtrs
705 extern void mip6_store_advint
706 __P((struct nd_opt_advint
*, struct nd_defrouter
*));
707 extern int mip6_delete_ifaddr
708 __P((struct in6_addr
*addr
, struct ifnet
*ifp
));
709 extern struct nd_prefix
*mip6_get_home_prefix
711 extern int mip6_get_md_state
713 extern void mip6_md_exit
717 /* External declaration of function prototypes (mip6_mn.c) */
718 extern void mip6_mn_init
720 extern void mip6_mn_exit
722 extern void mip6_new_defrtr
723 __P((int, struct nd_prefix
*, struct nd_prefix
*,
724 struct nd_defrouter
*));
725 extern int mip6_rec_ba
726 __P((struct mbuf
*, int));
727 extern int mip6_rec_br
728 __P((struct mbuf
*, int));
729 extern int mip6_rec_hal
730 __P((struct in6_addr
*, struct in6_addr
*, struct mip6_subopt_hal
*));
731 extern int mip6_rec_ramn
732 __P((struct mbuf
*, int));
733 extern int mip6_route_optimize
734 __P((struct mbuf
*));
735 extern int mip6_send_bu
736 __P((struct mip6_bul
*, struct mip6_bu_data
*, struct mip6_subbuf
*));
737 extern void mip6_send_bu2fn
738 __P((struct in6_addr
*, struct mip6_hafn
*, struct in6_addr
*,
739 struct ifnet
*, u_int32_t
));
740 extern void mip6_update_cns
741 __P((struct in6_addr
*, struct in6_addr
*, u_int8_t
, u_int32_t
));
742 extern void mip6_queue_bu
743 __P((struct mip6_bul
*, struct in6_addr
*, struct in6_addr
*,
744 u_int8_t
, u_int32_t
));
745 extern struct mip6_opt_bu
*mip6_create_bu
746 __P((u_int8_t
, int, int, u_int16_t
, u_int32_t
));
747 extern void mip6_stop_bu
748 __P((struct in6_addr
*));
749 extern int mip6_ba_error
750 __P((struct in6_addr
*, struct in6_addr
*, struct in6_addr
*,
752 extern u_int32_t mip6_prefix_lifetime
753 __P((struct in6_addr
*));
754 extern struct mip6_retrans
* mip6_create_retrans
755 __P((struct mip6_bul
*));
756 extern void mip6_clear_retrans
757 __P((struct mip6_bul
*));
758 extern struct mip6_bul
*mip6_bul_find
759 __P((struct in6_addr
*, struct in6_addr
*));
760 extern struct mip6_bul
*mip6_bul_create
761 __P((struct in6_addr
*, struct in6_addr
*, struct in6_addr
*,
762 u_int32_t
, u_int8_t
));
763 extern struct mip6_bul
*mip6_bul_delete
764 __P((struct mip6_bul
*));
765 extern struct mip6_esm
*mip6_esm_find
766 __P((struct in6_addr
*));
767 extern 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
));
770 extern struct mip6_esm
*mip6_esm_delete
771 __P((struct mip6_esm
*));
772 extern int mip6_outq_create
773 __P((void *, struct mip6_subbuf
*, struct in6_addr
*,
774 struct in6_addr
*, enum send_state
));
775 extern struct mip6_output
*mip6_outq_delete
776 __P((struct mip6_output
*));
777 extern void mip6_outq_flush
779 extern void mip6_timer_outqueue
781 extern void mip6_timer_bul
783 extern void mip6_timer_esm
785 extern int mip6_write_config_data_mn
786 __P((u_long
, void *));
787 extern int mip6_clear_config_data_mn
788 __P((u_long
, caddr_t
));
789 extern int mip6_enable_func_mn
790 __P((u_long
, caddr_t
));
793 /* External declaration of function prototypes (mip6_ha.c). */
794 extern void mip6_ha_init
796 extern void mip6_ha_exit
798 extern int mip6_rec_raha
799 __P((struct mbuf
*, int));
800 extern int mip6_ra_options
801 __P((struct mip6_ha_list
*, caddr_t
, int));
802 extern struct mip6_subopt_hal
* mip6_hal_dynamic
803 __P((struct in6_addr
*));
804 extern struct in6_addr
*mip6_global_addr
805 __P((struct in6_addr
*));
806 extern void mip6_icmp6_output
807 __P((struct mbuf
*));
808 extern void mip6_prefix_examine
809 __P((struct mip6_ha_list
*, struct ifnet
*, caddr_t
, int));
810 extern struct mip6_link_list
*mip6_ll_find
812 extern struct mip6_link_list
*mip6_ll_create
813 __P((char *, struct ifnet
*));
814 extern struct mip6_link_list
*mip6_ll_delete
815 __P((struct mip6_link_list
*));
816 extern struct mip6_ha_list
*mip6_hal_find
817 __P((struct mip6_ha_list
*, struct in6_addr
*));
818 extern struct mip6_ha_list
*mip6_hal_create
819 __P((struct mip6_ha_list
**, struct in6_addr
*, u_int32_t
, int16_t));
820 extern void mip6_hal_sort
821 __P((struct mip6_ha_list
**));
822 extern struct mip6_ha_list
*mip6_hal_delete
823 __P((struct mip6_ha_list
**, struct mip6_ha_list
*));
824 extern void mip6_timer_ll
826 extern int mip6_write_config_data_ha
827 __P((u_long
, void *));
828 extern int mip6_clear_config_data_ha
829 __P((u_long
, void *));
830 extern int mip6_enable_func_ha
831 __P((u_long
, caddr_t
));
834 /* External declaration of function prototypes (mip6_hooks.c). */
835 extern void mip6_minus_a_case
836 __P((struct nd_prefix
*));
837 extern struct nd_prefix
*mip6_find_auto_home_addr
839 extern void mip6_enable_hooks
841 extern void mip6_disable_hooks
843 extern int mip6_attach
845 extern int mip6_release
849 #if defined(__FreeBSD__) && __FreeBSD__ >= 3
850 extern struct callout_handle mip6_timer_na_handle
;
851 extern struct callout_handle mip6_timer_bc_handle
;
852 extern struct callout_handle mip6_timer_outqueue_handle
;
853 extern struct callout_handle mip6_timer_bul_handle
;
854 extern struct callout_handle mip6_timer_esm_handle
;
855 extern struct callout_handle mip6_timer_prefix_handle
;
856 extern struct callout_handle mip6_timer_ll_handle
;
861 #endif /* not _NETINET6_MIP6_H_ */