/* $KAME: mip6.h,v 1.8 2000/03/18 03:05:39 itojun Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _NETINET6_MIP6_H_ #define _NETINET6_MIP6_H_ #include #include struct ifnet; /* * Definition For Mobile Internet Protocol Version 6. * Draft draft-ietf-mobileip-ipv6-09.txt */ /* Definition of MIPv6 states for the Event-State machine */ #define MIP6_STATE_UNDEF 0x01 #define MIP6_STATE_HOME 0x02 #define MIP6_STATE_DEREG 0x03 #define MIP6_STATE_NOTREG 0x04 #define MIP6_STATE_REG 0x05 #define MIP6_STATE_REREG 0x06 #define MIP6_STATE_REGNEWCOA 0x07 /* Definition of states used by the move detection algorithm used by MIPv6. */ #define MIP6_MD_BOOT 0x01 #define MIP6_MD_UNDEFINED 0x02 #define MIP6_MD_HOME 0x03 #define MIP6_MD_FOREIGN 0x04 /* Definition of Home Address route states used by the move detection algorithm used by MIPv6. */ #define MIP6_ROUTE_NET 0x01 #define MIP6_ROUTE_HOST 0x02 /* Type of node calling mip6_tunnel */ #define MIP6_NODE_MN 0x01 #define MIP6_NODE_HA 0x02 /* Movement Detection default values */ #define MIP6_MAX_LOST_ADVINTS 3 /* Scope for hook activation */ #define MIP6_GENERIC_HOOKS 0x01 #define MIP6_SPECIFIC_HOOKS 0x02 #define MIP6_CONFIG_HOOKS 0x03 /* Definition of states for tunnels set up by the Home Agent and the MN. */ #define MIP6_TUNNEL_ADD 0 #define MIP6_TUNNEL_MOVE 1 #define MIP6_TUNNEL_DEL 2 /* Definition of length for different destination options */ #define IP6OPT_BULEN 8 /* Length of BU option */ #define IP6OPT_BALEN 11 /* Length of BA option */ #define IP6OPT_BRLEN 0 /* Length of BR option */ #define IP6OPT_HALEN 16 /* Length of HA option */ #define IP6OPT_UIDLEN 2 /* Length of Unique Identifier sub-option */ #define IP6OPT_HALISTLEN 16 /* Length of HA List sub-ption */ #define IP6OPT_COALEN 16 /* Length of Alternate COA sub-option */ /* Definition of minimum length of MIPv6 destination options. Length includes option Type and Length. */ #define IP6OPT_BAMINLEN (IP6OPT_MINLEN + IP6OPT_BALEN) #define IP6OPT_BRMINLEN (IP6OPT_MINLEN + IP6OPT_BRLEN) #define IP6OPT_BUMINLEN (IP6OPT_MINLEN + IP6OPT_BULEN) #define IP6OPT_HAMINLEN (IP6OPT_MINLEN + IP6OPT_HALEN) /* Definition of sub-options used by the Destination Options */ #define IP6SUBOPT_UNIQUEID 0x02 /* Unique Identifier (BU, BR) */ #define IP6SUBOPT_HALIST 0x03 /* Home Agents List (BA) */ #define IP6SUBOPT_ALTCOA 0x04 /* Alternate COA (BU) */ /* Definition of MIPv6 Binding Update option flags */ #define MIP6_BU_AFLAG 0x80 /* BU Acknowledgement flag present */ #define MIP6_BU_HFLAG 0x40 /* BU Home Registration flag present */ #define MIP6_BU_RFLAG 0x20 /* BU MN is Router flag present */ /* Definition of flags used for indication of options present in a destination header (mip6_indata->optflag) */ #define MIP6_DSTOPT_BU 0x80 /* BU Option present */ #define MIP6_DSTOPT_BA 0x40 /* BA Option present */ #define MIP6_DSTOPT_BR 0x20 /* BR Option present */ #define MIP6_DSTOPT_HA 0x10 /* HA Option present */ #define MIP6_DSTOPT_UID 0x08 /* Sub-option Unique Id present */ #define MIP6_DSTOPT_COA 0x04 /* Sub-option Alternate COA present */ #define MIP6_DSTOPT_HAL 0x02 /* Sub-option HAs List present */ #if 0 /* Definition of flags for Home Agent */ #define ND_RA_FLAG_HA 0x20 /* RA indicates that router works as HA */ #define ND_OPT_PI_FLAG_RADDR 0x20 /* Prefix Information option incl. global IP address */ #endif /* Definition of timers for signals */ #define MIP6_BU_LIFETIME 600 /* Lifetime for BU (s) */ #define MIP6_BU_LIFETIME_DEFRTR 60 /* Lifetime for BU sent to previous def router (s) */ #define MIP6_BU_LIFETIME_DHAAD 16 /* Lifetime for BU when Dynamic Home Agent Address Discovery (s) */ #define MIP6_MAX_FAST_UPDATES 5 /* Max number of fast updates (BUs) being sent */ #define MIP6_MAX_UPDATE_RATE 1 /* Rate limiting for sending successive fast BUs (sec) */ #define MIP6_SLOW_UPDATE_RATE 10 /* Rate limiting for sending successive slow BUs (sec) */ #define MIP6_MAX_BINDACK_TIMEOUT 256 /* Max time to wait for a BA */ #define MIP6_MAX_ADVERT_REXMIT 3 /* Max retransmission of NA when retur- ning to home link */ #define MIP6_OUTQ_LIFETIME 20 /* Max number of 0.1s units that an entry is stored in the output queue */ #define MIP6_OUTQ_INTERVAL 5 /* Interval in units of 0.1s that the out queue is searched */ /* Definition of Binding Acknowledgement status field */ #define MIP6_BA_STATUS_ACCEPT 0 /* Binding Update accepted */ #define MIP6_BA_STATUS_UNSPEC 128 /* Reason unspecified */ #define MIP6_BA_STATUS_PROHIBIT 130 /* Administratively prohibited */ #define MIP6_BA_STATUS_RESOURCE 131 /* Insufficient resources */ #define MIP6_BA_STATUS_HOMEREGNOSUP 132 /* Home registration not supported */ #define MIP6_BA_STATUS_SUBNET 133 /* Not home subnet */ #define MIP6_BA_STATUS_DHAAD 135 /* Dynamic home agent address discovery response */ #define MIP6_BA_STATUS_IFLEN 136 /* Incorrect interface id length */ #define MIP6_BA_STATUS_NOTHA 137 /* Not home agent for this MN */ /* Macro for modulo 2^^16 comparison */ #define MIP6_LEQ(a,b) ((int16_t)((a)-(b)) <= 0) /* Macros started with MIP6_ADDR is Mobile IPv6 local */ #define MIP6_ADDR_ANYCAST_HA 0x7e #if BYTE_ORDER == BIG_ENDIAN #define MIP6_ADDR_INT32_ULL 0xfe800000 /* Unicast Link Local */ #define MIP6_ADDR_INT32_USL 0xfec00000 /* Unicast Site Local */ #define MIP6_ADDR_INT32_AHA1 0xfffffffe /* Anycast Home Agent bit 97-128 */ #define MIP6_ADDR_INT32_AHA2 0xfdffffff /* Anycast Home Agent bit 65-96 */ #elif BYTE_ORDER == LITTLE_ENDIAN #define MIP6_ADDR_INT32_ULL 0x000080fe #define MIP6_ADDR_INT32_USL 0x0000c0fe #define MIP6_ADDR_INT32_AHA1 0xfeffffff #define MIP6_ADDR_INT32_AHA2 0xfffffffd #endif /* Definition of some useful macros to handle IP6 addresses */ extern struct in6_addr in6addr_linklocal; extern struct in6_addr in6addr_sitelocal; extern struct in6_addr in6addr_aha_64; /* 64 bits identifier */ extern struct in6_addr in6addr_aha_nn; /* 121-nn bits identifier */ /* Definition of states for flag in queue for outgoing packets. */ enum send_state {NOT_SENT, SENT}; /* Definition of event-state machine type. */ enum esm_type {PERMANENT, TEMPORARY}; /* Configuration parameters needed for MIPv6. Controlled by the user */ struct mip6_static_addr { LIST_ENTRY(mip6_static_addr) addr_entry; /* Next IPv6 address list */ struct ifnet *ifp; /* Interface */ u_int8_t prefix_len; /* Prefix length for address */ struct in6_addr ip6_addr; /* Address to be used at foreign network */ }; /* * fna_list List of pre-assigned care-of addresses to be used at * foreign networks that the MN might visit * bu_lifetime Used by the MN when sending a BU to the CN if it wants * to use a smaller value than received in the home * registration acknowledgement * br_update Indicates when the CN sends a BR to the MN. The value * should be given as percentage of the bu_lifetime * ha_pref Preference for the Home Agent * hr_lifetime Default life time for home registration (only sent to the * Home Agent) * fwd_sl_unicast Enable forwarding of site local unicast dest addresses * fwd_sl_multicast Enable forwarding of site local multicast dest addresses * enable_prom_mode Enable link layer promiscus mode (used by move detection) * enable_bu_to_cn Enable BU being sent to the CN (Route optimization on/off) * enable_rev_tunnel Enable tunneling of packets from MN to CN via Home Agent * enable_br Enable sending BR to the MN * autoconfig Only enable MIP6 if the mip6 deamon is running * eager_md Enable eager Movement Detection * enable_outq Enable reading from the MIP6 output queue for piggy * backing (Not configurable, handled internally) */ struct mip6_config { LIST_HEAD(fna_list, mip6_static_addr) fna_list; u_int32_t bu_lifetime; u_int8_t br_update; int16_t ha_pref; u_int32_t hr_lifetime; u_int8_t fwd_sl_unicast; u_int8_t fwd_sl_multicast; u_int8_t enable_prom_mode; u_int8_t enable_bu_to_cn; u_int8_t enable_rev_tunnel; u_int8_t enable_br; u_int8_t autoconfig; u_int8_t eager_md; u_int8_t enable_outq; }; /* Generic option format */ struct mip6_bu_data { u_int8_t prefix_len; /* Prefix length for a Home Address */ u_int8_t ack; /* Acknowledgement flag */ }; /* Generic option format */ struct mip6_opt { u_int8_t type; /* Option type */ u_int8_t len; /* Option length (octets) excl. type and length */ } __attribute__ ((packed)); /* List of prefixes extracted from Router Advertisments being sent by the Home Agent. */ struct mip6_prefix { struct mip6_prefix *next; /* Ptr to next entry in the list */ struct ifnet *ifp; /* Outgoing interface */ struct in6_addr prefix; /* Announced prefix (on-link) */ u_int8_t prefix_len; /* Prefix length for IP address */ u_int32_t valid_time; /* Remaining (s) until prefix expires */ } __attribute__ ((packed)); /* Binding Update destination option format */ struct mip6_opt_bu { u_int8_t type; /* Option type */ u_int8_t len; /* Option length excluding Type and length */ u_int8_t flags; /* Flags (A, H and R) */ u_int8_t prefix_len; /* Prefix length for IP address */ u_int16_t seqno; /* Sequence number */ u_int32_t lifetime; /* Seconds remaining until the binding expires */ } __attribute__ ((packed)); /* Binding Acknowledgement destination option format */ struct mip6_opt_ba { u_int8_t type; /* Option type */ u_int8_t len; /* Option length (octets) excl. type and length */ u_int8_t status; /* Result of the BU */ u_int16_t seqno; /* Sequence number */ u_int32_t lifetime; /* Granted lifetime (s) for the BU in the BC */ u_int32_t refresh; /* Interval for MN to send BU to refresh BC */ } __attribute__ ((packed)); /* Binding Request destination option format */ struct mip6_opt_br { u_int8_t type; /* Option type */ u_int8_t len; /* Option length (octets) excl. type and length */ } __attribute__ ((packed)); /* Home Address option format */ struct mip6_opt_ha { u_int8_t type; /* Option type */ u_int8_t len; /* Option length excl. type and length */ struct in6_addr home_addr; /* Home Addr of the MN sending the packet */ } __attribute__ ((packed)); /* Unique Identifier sub-option format */ struct mip6_subopt_id { u_int8_t type; /* Sub-option type */ u_int8_t len; /* Sub-option length (octets) excl. type and length */ u_int16_t id; /* Unique identifier */ } __attribute__ ((packed)); /* Home Agents list sub-option format */ struct mip6_subopt_hal { u_int8_t type; /* Sub-option type */ u_int8_t len; /* Sub-option length excl. type and length */ struct in6_addr halist[1]; /* List of HA's on the home link */ } __attribute__ ((packed)); /* Alternate Care-of Address sub-option format */ struct mip6_subopt_coa { u_int8_t type; /* Sub-option type */ u_int8_t len; /* Length (octets) excl. type and len fields */ struct in6_addr coa; /* Alternate COA */ } __attribute__ ((packed)); /* Buffer for storing a consequtive sequence of sub-options */ struct mip6_subbuf { u_int16_t len; /* # of used bytes in buffer */ char buffer[512]; }; /* The event-state machine must be maintained for each Home Address. */ struct mip6_dad { struct mip6_subopt_hal *hal; /* Home Agents list */ int index; /* Next entry in list to try */ }; struct mip6_hafn { time_t time; /* Absolute expire time */ int16_t pref; /* Preference for this HA */ u_int8_t prefix_len; /* Prefix_len for HA Address */ struct in6_addr addr; /* FN Home Agent global unicast address */ }; struct mip6_esm { struct mip6_esm *next; /* Ptr to next entry in the list */ struct ifnet *ifp; /* I/f where home address is applied */ const struct encaptab *ep; /* Encapsulation attach (MN -> HA) */ int state; /* State for the home address */ enum esm_type type; /* Type of event-state machine */ struct in6_addr home_addr; /* Home address */ u_int8_t prefix_len; /* Prefix_len for Home Address */ u_int16_t lifetime; /* if type=PERMANENT 0xFFFF, else x */ struct in6_addr ha_hn; /* Home agent address (home network) */ struct in6_addr coa; /* Current primary care-of address */ struct mip6_hafn *ha_fn; /* Home agent address (foreign network) */ struct mip6_dad *dad; /* For Dynamic HA Address Discovery */ }; /* Binding Cache parameters. Bindings for other IPv6 nodes. */ /* Maintained by each node. */ struct bc_info { u_int32_t br_interval; /* % of mip6_lifetime, max 60s, min 2s */ u_int8_t no_of_sent_br; /* Number of sent BR to a Mobile Node */ u_int8_t max_advert; /* ? */ u_int8_t ra_tunneled; /* RA being tunneled to MN */ u_int8_t ra_interval; /* Interval for sending RA */ }; struct mip6_bc { struct mip6_bc *next; /* Ptr to next entry in the list */ struct in6_addr home_addr; /* Home Address of the MN for which this is the BC entry */ struct in6_addr coa; /* COA for MN indicated by the HA field */ u_int32_t lifetime; /* Remaining lifetime for this BC entry */ u_int8_t hr_flag; /* Flag for home registration entry (T/F) */ u_int8_t rtr_flag; /* MN is a router (T/F) */ u_int8_t prefix_len; /* Prefix length in last received BU */ u_int16_t seqno; /* Maximum value of the sequence number */ struct bc_info info; /* Usage info for cache replacement policy */ time_t lasttime; /* The time at which a BR was last sent */ const struct encaptab *ep; /* Encapsulation attach (HA -> MN) */ }; /* Binding Update List parameters. Information for each BU sent by this MN */ /* Each MN maintains this list. */ struct mip6_retrans { struct mip6_opt_bu *bu_opt; /* BU option in case of retransmission */ struct mip6_subbuf *bu_subopt; /* BU sub-option in case of retrans. */ u_int8_t ba_timeout; /* Exponential back-off starting at 1 */ u_int8_t time_left; /* Time left until next retransmission */ }; struct mip6_bul { struct mip6_bul *next; /* Ptr to next entry in the list */ struct in6_addr dst_addr; /* Destination address for sent BU */ struct in6_addr bind_addr; /* Home Address or previous COA */ struct in6_addr coa; /* Care-of address sent in the BU */ u_int32_t lifetime; /* Remaining binding lifetime */ u_int32_t refreshtime; /* Refresh time for the BU */ u_int16_t seqno; /* Last value for sent seq number */ time_t lasttime; /* Time at which a BU was last sent */ u_int32_t no_of_sent_bu; /* Number of sent BU to a MN */ struct mip6_retrans *state; /* Status for BU being acknowledged */ u_int8_t bu_flag; /* Flag for sending future BU (T/F) */ u_int8_t hr_flag; /* Flag for home reg (True / False) */ u_int8_t update_rate; /* Seconds between consequtive BUs */ }; /* Home Agent List parameters. Information about each other HA on the link that this node is serving as a HA. One HA list for each link it is serving. */ /* Each HA maintains this list. */ struct mip6_addr_list { struct mip6_addr_list *next; /* Ptr to next entry in the list */ struct in6_addr ip6_addr; /* IPv6 address */ u_int8_t prefix_len; }; struct mip6_ha_list { struct mip6_ha_list *next; /* Ptr to next entry in the list */ struct in6_addr ll_addr; /* Link-local IP-addr of a node on the home link */ u_int16_t lifetime; /* Remaining lifetime of this HA list entry */ int16_t pref; /* Preference for this HA */ struct mip6_addr_list *addr_list; /* List of global IP addresses for this HA */ }; struct mip6_link_list { struct mip6_link_list *next; /* Ptr to next entry in the list */ struct mip6_ha_list *ha_list; /* List of Home Agents for the link */ struct ifnet *ifp; /* Interface */ char ifname[IFNAMSIZ+1]; /* Link identifier */ }; /* Neighbor Advertisement information stored for retransmission when the Mobile Node is returning to its Home Network or the Home Agent is requested to act as a proxy for the Mobile Node when it is moving to a Foreign Network. */ struct mip6_na { struct mip6_na *next; /* Ptr to next entry in the list */ struct ifnet *ifp; /* Interface for sending the NA */ struct in6_addr home_addr; /* Home address of the mobile node */ struct in6_addr dst_addr; /* Destination address */ struct in6_addr target_addr; /* Target address */ u_int8_t prefix_len; /* Prefix length for home address */ u_long flags; /* Flags for the NA message */ int use_link_opt; /* Include Target link layer address option or not (0 = Do not include, 1 = Include) */ int no; /* Remaining no of times to send the NA */ }; /* Definition of global variable used by Mobile IPv6. All variables are stored in node byte order. */ struct mip6_indata { u_int8_t flag; /* How to handle tunneled packets */ u_int8_t optflag; /* Dest options and sub-options flag */ struct in6_addr ip6_src; /* Orig src addr from IPv6 header */ struct in6_addr ip6_dst; /* Orig dst addr from IPv6 header */ struct mip6_opt_bu *bu_opt; /* BU option present */ struct mip6_opt_ba *ba_opt; /* BA option present */ struct mip6_opt_br *br_opt; /* BR option present */ struct mip6_opt_ha *ha_opt; /* HA option present */ struct mip6_subopt_id *uid; /* Sub-option Unique ID present */ struct mip6_subopt_coa *coa; /* Sub-option alt coa present */ struct mip6_subopt_hal *hal; /* Sub-option HAs List present */ }; /* Queue of outgoing packets that are waiting to be sent. */ struct mip6_output { struct mip6_output *next; /* Ptr to next option in chain */ void *opt; /* BU, BA or BR dest option to be sent */ struct mip6_subbuf *subopt; /* Sub-option to be sent (if present) */ struct in6_addr ip6_dst; /* Destination address for IPv6 packet */ struct in6_addr ip6_src; /* Source address for IPv6 packet */ enum send_state flag; /* Has packet been sent or not? */ u_int32_t lifetime; /* Time remaining for entry in output queue (units of 0.1s) */ }; #ifdef KERNEL /* * Macro MIP6_FREEINDATA free memory allocated for the global variable * mip6_inp and its members. Set the variable to point at NULL when * the memory has been freed. */ #define MIP6_FREEINDATA \ do { \ if (mip6_inp != NULL) { \ if (mip6_inp->bu_opt != NULL) \ _FREE(mip6_inp->bu_opt, M_TEMP); \ if (mip6_inp->ba_opt != NULL) \ _FREE(mip6_inp->ba_opt, M_TEMP); \ if (mip6_inp->br_opt != NULL) \ _FREE(mip6_inp->br_opt, M_TEMP); \ if (mip6_inp->ha_opt != NULL) \ _FREE(mip6_inp->ha_opt, M_TEMP); \ if (mip6_inp->uid != NULL) \ _FREE(mip6_inp->uid, M_TEMP); \ if (mip6_inp->coa != NULL) \ _FREE(mip6_inp->coa, M_TEMP); \ if (mip6_inp->hal != NULL) \ _FREE(mip6_inp->hal, M_TEMP); \ _FREE(mip6_inp, M_TEMP); \ mip6_inp = NULL; \ } \ } while (0) #define MIP6_IS_MN_ACTIVE ((mip6_module & MIP6_MN_MODULE) == MIP6_MN_MODULE) #define MIP6_IS_HA_ACTIVE ((mip6_module & MIP6_HA_MODULE) == MIP6_HA_MODULE) /* External Declaration of Global variables. */ extern struct mip6_indata *mip6_inp; /* Input data rec in one packet */ extern struct mip6_output *mip6_outq; /* Ptr to output queue */ extern struct mip6_esm *mip6_esmq; /* Ptr to list of Home Addresses */ extern struct mip6_bc *mip6_bcq; /* First entry in the BC list */ extern struct mip6_prefix *mip6_pq; /* First entry in prefix list */ extern struct mip6_config mip6_config; /* Config parameters for MIP6 */ extern struct mip6_bul *mip6_bulq; extern struct mip6_link_list *mip6_llq; extern struct nd_prefix *mip6_home_prefix; extern struct nd_prefix *mip6_primary_prefix; extern u_int8_t mip6_module; /* Info about loaded modules (MN/HA) */ extern int mip6_md_state; /* Movement Detection state */ extern int mip6_route_state; /* Home Address route state */ extern int mip6_max_lost_advints; /* No. lost Adv before start of NUD */ extern int mip6_nd6_delay; extern int mip6_nd6_umaxtries; /* External declaration of function prototypes (mip6_io.c) */ extern int mip6_new_packet __P((struct mbuf *)); extern int mip6_store_dstopt_pre __P((struct mbuf *, u_int8_t *, u_int8_t, u_int8_t)); extern int mip6_store_dstopt __P((struct mbuf *, u_int8_t *, u_int8_t)); extern int mip6_store_dstsubopt __P((struct mbuf *, u_int8_t *, u_int8_t, int, int)); extern int mip6_output __P((struct mbuf *, struct ip6_pktopts **)); extern int mip6_add_rh __P((struct ip6_pktopts **, struct mip6_bc *)); extern void mip6_align __P((struct ip6_dest *, int *)); extern void mip6_dest_offset __P((struct ip6_dest *, int *)); extern int mip6_add_ha __P((struct ip6_dest **, int *, struct in6_addr *, struct in6_addr *)); extern int mip6_add_bu __P((struct ip6_dest **, int *, struct mip6_opt_bu *, struct mip6_subbuf *)); extern int mip6_add_ba __P((struct ip6_dest **, int *, struct mip6_opt_ba *, struct mip6_subbuf *)); extern int mip6_add_br __P((struct ip6_dest **, int *, struct mip6_opt_br *, struct mip6_subbuf *)); extern int mip6_store_subopt __P((struct mip6_subbuf **, caddr_t)); /* External declaration of function prototypes (mip6.c) */ extern void mip6_init __P((void)); extern void mip6_exit __P((void)); extern int mip6_rec_ctrl_sig __P((struct mbuf *, int)); extern int mip6_icmp6_input __P((struct mbuf *, int)); extern int mip6_rec_bu __P((struct mbuf *, int)); extern void mip6_ha2srcaddr __P((struct mbuf *)); extern int mip6_send_ba __P((struct in6_addr *, struct in6_addr *, struct in6_addr *, struct mip6_subbuf *, u_int8_t, u_int16_t, u_int32_t)); extern void mip6_send_na __P((struct mip6_na *)); extern struct mbuf *mip6_create_ip6hdr __P((struct in6_addr *, struct in6_addr *, u_int8_t)); extern struct ip6_rthdr *mip6_create_rh __P((struct in6_addr *, u_int8_t)); extern struct mip6_opt_ba *mip6_create_ba __P((u_int8_t, u_int16_t, u_int32_t)); extern struct ip6_dest *mip6_create_dh __P((void *, struct mip6_subbuf *, u_int8_t)); extern int mip6_opt_offset __P((struct mbuf *, int, int)); extern int mip6_addr_on_link __P((struct in6_addr *, int)); extern u_int32_t mip6_min_lifetime __P((struct in6_addr *, int)); extern void mip6_build_in6addr __P((struct in6_addr *, struct in6_addr *, const struct in6_addr *, int)); extern void mip6_build_ha_anycast __P((struct in6_addr *, const struct in6_addr *, int)); extern int mip6_add_ifaddr __P((struct in6_addr *addr, struct ifnet *ifp, int plen, int flags)); extern int mip6_tunnel_output __P((struct mbuf **, struct mip6_bc *)); extern int mip6_tunnel_input __P((struct mbuf **, int *, int)); extern int mip6_tunnel __P((struct in6_addr *, struct in6_addr *, int, int, void *)); extern int mip6_proxy __P((struct in6_addr*, struct in6_addr*, int)); extern struct mip6_bc *mip6_bc_find __P((struct in6_addr *)); extern struct mip6_bc *mip6_bc_create __P((struct in6_addr *, struct in6_addr *, u_int32_t, u_int8_t, u_int8_t, u_int8_t, u_int16_t)); extern void mip6_bc_update __P((struct mip6_bc *, struct in6_addr *, u_int32_t, u_int8_t, u_int8_t, u_int8_t, u_int16_t, struct bc_info, time_t)); extern int mip6_bc_delete __P((struct mip6_bc *, struct mip6_bc **)); extern struct mip6_na *mip6_na_create __P((struct in6_addr *, struct in6_addr *, struct in6_addr *, u_int8_t, u_long, int)); extern struct mip6_na *mip6_na_delete __P((struct mip6_na *)); extern struct mip6_prefix *mip6_prefix_find __P((struct in6_addr *, u_int8_t)); extern struct mip6_prefix *mip6_prefix_create __P((struct ifnet *, struct in6_addr *, u_int8_t, u_int32_t)); extern struct mip6_prefix *mip6_prefix_delete __P((struct mip6_prefix *)); extern void mip6_timer_na __P((void *)); extern void mip6_timer_bc __P((void *)); extern void mip6_timer_prefix __P((void *)); #if !defined(__bsdi__) && !(defined(__FreeBSD__) && __FreeBSD__ < 3) extern int mip6_ioctl __P((struct socket *, u_long, caddr_t, struct ifnet *, struct proc *)); #else extern int mip6_ioctl __P((struct socket *, u_long, caddr_t, struct ifnet *)); #endif #if MIP6_DEBUG void mip6_debug __P((char *, ...)); #endif extern void mip6_enable_debug __P((int)); extern int mip6_write_config_data __P((u_long, caddr_t)); extern int mip6_clear_config_data __P((u_long, caddr_t)); extern int mip6_enable_func __P((u_long, caddr_t)); /* External declaration of function prototypes (mip6_md.c) */ extern void mip6_md_init __P((void)); extern void mip6_select_defrtr __P((void)); extern void mip6_prelist_update __P((struct nd_prefix *, struct nd_defrouter *)); extern void mip6_eager_md __P((int enable)); extern void mip6_expired_defrouter __P((struct nd_defrouter *dr)); extern void mip6_probe_defrouter __P((struct nd_defrouter *dr)); extern void mip6_probe_pfxrtrs __P((void)); extern void mip6_store_advint __P((struct nd_opt_advint *, struct nd_defrouter *)); extern int mip6_delete_ifaddr __P((struct in6_addr *addr, struct ifnet *ifp)); extern struct nd_prefix *mip6_get_home_prefix __P((void)); extern int mip6_get_md_state __P((void)); extern void mip6_md_exit __P((void)); /* External declaration of function prototypes (mip6_mn.c) */ extern void mip6_mn_init __P((void)); extern void mip6_mn_exit __P((void)); extern void mip6_new_defrtr __P((int, struct nd_prefix *, struct nd_prefix *, struct nd_defrouter *)); extern int mip6_rec_ba __P((struct mbuf *, int)); extern int mip6_rec_br __P((struct mbuf *, int)); extern int mip6_rec_hal __P((struct in6_addr *, struct in6_addr *, struct mip6_subopt_hal *)); extern int mip6_rec_ramn __P((struct mbuf *, int)); extern int mip6_route_optimize __P((struct mbuf *)); extern int mip6_send_bu __P((struct mip6_bul *, struct mip6_bu_data *, struct mip6_subbuf *)); extern void mip6_send_bu2fn __P((struct in6_addr *, struct mip6_hafn *, struct in6_addr *, struct ifnet *, u_int32_t)); extern void mip6_update_cns __P((struct in6_addr *, struct in6_addr *, u_int8_t, u_int32_t)); extern void mip6_queue_bu __P((struct mip6_bul *, struct in6_addr *, struct in6_addr *, u_int8_t, u_int32_t)); extern struct mip6_opt_bu *mip6_create_bu __P((u_int8_t, int, int, u_int16_t, u_int32_t)); extern void mip6_stop_bu __P((struct in6_addr *)); extern int mip6_ba_error __P((struct in6_addr *, struct in6_addr *, struct in6_addr *, u_int8_t)); extern u_int32_t mip6_prefix_lifetime __P((struct in6_addr *)); extern struct mip6_retrans * mip6_create_retrans __P((struct mip6_bul *)); extern void mip6_clear_retrans __P((struct mip6_bul *)); extern struct mip6_bul *mip6_bul_find __P((struct in6_addr *, struct in6_addr *)); extern struct mip6_bul *mip6_bul_create __P((struct in6_addr *, struct in6_addr *, struct in6_addr *, u_int32_t, u_int8_t)); extern struct mip6_bul *mip6_bul_delete __P((struct mip6_bul *)); extern struct mip6_esm *mip6_esm_find __P((struct in6_addr *)); extern struct mip6_esm *mip6_esm_create __P((struct ifnet *, struct in6_addr *, struct in6_addr *, struct in6_addr *, u_int8_t, int, enum esm_type, u_int16_t)); extern struct mip6_esm *mip6_esm_delete __P((struct mip6_esm *)); extern int mip6_outq_create __P((void *, struct mip6_subbuf *, struct in6_addr *, struct in6_addr *, enum send_state)); extern struct mip6_output *mip6_outq_delete __P((struct mip6_output *)); extern void mip6_outq_flush __P((void)); extern void mip6_timer_outqueue __P((void *)); extern void mip6_timer_bul __P((void *)); extern void mip6_timer_esm __P((void *)); extern int mip6_write_config_data_mn __P((u_long, void *)); extern int mip6_clear_config_data_mn __P((u_long, caddr_t)); extern int mip6_enable_func_mn __P((u_long, caddr_t)); /* External declaration of function prototypes (mip6_ha.c). */ extern void mip6_ha_init __P((void)); extern void mip6_ha_exit __P((void)); extern int mip6_rec_raha __P((struct mbuf *, int)); extern int mip6_ra_options __P((struct mip6_ha_list *, caddr_t, int)); extern struct mip6_subopt_hal * mip6_hal_dynamic __P((struct in6_addr *)); extern struct in6_addr *mip6_global_addr __P((struct in6_addr *)); extern void mip6_icmp6_output __P((struct mbuf *)); extern void mip6_prefix_examine __P((struct mip6_ha_list *, struct ifnet *, caddr_t, int)); extern struct mip6_link_list *mip6_ll_find __P((char *)); extern struct mip6_link_list *mip6_ll_create __P((char *, struct ifnet *)); extern struct mip6_link_list *mip6_ll_delete __P((struct mip6_link_list *)); extern struct mip6_ha_list *mip6_hal_find __P((struct mip6_ha_list *, struct in6_addr *)); extern struct mip6_ha_list *mip6_hal_create __P((struct mip6_ha_list **, struct in6_addr *, u_int32_t, int16_t)); extern void mip6_hal_sort __P((struct mip6_ha_list **)); extern struct mip6_ha_list *mip6_hal_delete __P((struct mip6_ha_list **, struct mip6_ha_list *)); extern void mip6_timer_ll __P((void *)); extern int mip6_write_config_data_ha __P((u_long, void *)); extern int mip6_clear_config_data_ha __P((u_long, void *)); extern int mip6_enable_func_ha __P((u_long, caddr_t)); /* External declaration of function prototypes (mip6_hooks.c). */ extern void mip6_minus_a_case __P((struct nd_prefix *)); extern struct nd_prefix *mip6_find_auto_home_addr __P((void)); extern void mip6_enable_hooks __P((int)); extern void mip6_disable_hooks __P((int)); extern int mip6_attach __P((int)); extern int mip6_release __P((void)); #if defined(__FreeBSD__) && __FreeBSD__ >= 3 extern struct callout_handle mip6_timer_na_handle; extern struct callout_handle mip6_timer_bc_handle; extern struct callout_handle mip6_timer_outqueue_handle; extern struct callout_handle mip6_timer_bul_handle; extern struct callout_handle mip6_timer_esm_handle; extern struct callout_handle mip6_timer_prefix_handle; extern struct callout_handle mip6_timer_ll_handle; #endif #endif /* _KERNEL */ #endif /* not _NETINET6_MIP6_H_ */