#ifndef _NETINET6_MIP6_H_
#define _NETINET6_MIP6_H_
#include <netinet6/nd6.h>
#include <netinet/icmp6.h>
struct ifnet;
#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
#define MIP6_MD_BOOT 0x01
#define MIP6_MD_UNDEFINED 0x02
#define MIP6_MD_HOME 0x03
#define MIP6_MD_FOREIGN 0x04
#define MIP6_ROUTE_NET 0x01
#define MIP6_ROUTE_HOST 0x02
#define MIP6_NODE_MN 0x01
#define MIP6_NODE_HA 0x02
#define MIP6_MAX_LOST_ADVINTS 3
#define MIP6_GENERIC_HOOKS 0x01
#define MIP6_SPECIFIC_HOOKS 0x02
#define MIP6_CONFIG_HOOKS 0x03
#define MIP6_TUNNEL_ADD 0
#define MIP6_TUNNEL_MOVE 1
#define MIP6_TUNNEL_DEL 2
#define IP6OPT_BULEN 8
#define IP6OPT_BALEN 11
#define IP6OPT_BRLEN 0
#define IP6OPT_HALEN 16
#define IP6OPT_UIDLEN 2
#define IP6OPT_HALISTLEN 16
#define IP6OPT_COALEN 16
#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)
#define IP6SUBOPT_UNIQUEID 0x02
#define IP6SUBOPT_HALIST 0x03
#define IP6SUBOPT_ALTCOA 0x04
#define MIP6_BU_AFLAG 0x80
#define MIP6_BU_HFLAG 0x40
#define MIP6_BU_RFLAG 0x20
#define MIP6_DSTOPT_BU 0x80
#define MIP6_DSTOPT_BA 0x40
#define MIP6_DSTOPT_BR 0x20
#define MIP6_DSTOPT_HA 0x10
#define MIP6_DSTOPT_UID 0x08
#define MIP6_DSTOPT_COA 0x04
#define MIP6_DSTOPT_HAL 0x02
#if 0
#define ND_RA_FLAG_HA 0x20
#define ND_OPT_PI_FLAG_RADDR 0x20
#endif
#define MIP6_BU_LIFETIME 600
#define MIP6_BU_LIFETIME_DEFRTR 60
#define MIP6_BU_LIFETIME_DHAAD 16
#define MIP6_MAX_FAST_UPDATES 5
#define MIP6_MAX_UPDATE_RATE 1
#define MIP6_SLOW_UPDATE_RATE 10
#define MIP6_MAX_BINDACK_TIMEOUT 256
#define MIP6_MAX_ADVERT_REXMIT 3
#define MIP6_OUTQ_LIFETIME 20
#define MIP6_OUTQ_INTERVAL 5
#define MIP6_BA_STATUS_ACCEPT 0
#define MIP6_BA_STATUS_UNSPEC 128
#define MIP6_BA_STATUS_PROHIBIT 130
#define MIP6_BA_STATUS_RESOURCE 131
#define MIP6_BA_STATUS_HOMEREGNOSUP 132
#define MIP6_BA_STATUS_SUBNET 133
#define MIP6_BA_STATUS_DHAAD 135
#define MIP6_BA_STATUS_IFLEN 136
#define MIP6_BA_STATUS_NOTHA 137
#define MIP6_LEQ(a,b) ((int16_t)((a)-(b)) <= 0)
#define MIP6_ADDR_ANYCAST_HA 0x7e
#if BYTE_ORDER == BIG_ENDIAN
#define MIP6_ADDR_INT32_ULL 0xfe800000
#define MIP6_ADDR_INT32_USL 0xfec00000
#define MIP6_ADDR_INT32_AHA1 0xfffffffe
#define MIP6_ADDR_INT32_AHA2 0xfdffffff
#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
extern struct in6_addr in6addr_linklocal;
extern struct in6_addr in6addr_sitelocal;
extern struct in6_addr in6addr_aha_64;
extern struct in6_addr in6addr_aha_nn;
enum send_state {NOT_SENT, SENT};
enum esm_type {PERMANENT, TEMPORARY};
struct mip6_static_addr {
LIST_ENTRY(mip6_static_addr) addr_entry;
struct ifnet *ifp;
u_int8_t prefix_len;
struct in6_addr ip6_addr;
};
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;
};
struct mip6_bu_data {
u_int8_t prefix_len;
u_int8_t ack;
};
struct mip6_opt {
u_int8_t type;
u_int8_t len;
} __attribute__ ((packed));
struct mip6_prefix {
struct mip6_prefix *next;
struct ifnet *ifp;
struct in6_addr prefix;
u_int8_t prefix_len;
u_int32_t valid_time;
} __attribute__ ((packed));
struct mip6_opt_bu {
u_int8_t type;
u_int8_t len;
u_int8_t flags;
u_int8_t prefix_len;
u_int16_t seqno;
u_int32_t lifetime;
} __attribute__ ((packed));
struct mip6_opt_ba {
u_int8_t type;
u_int8_t len;
u_int8_t status;
u_int16_t seqno;
u_int32_t lifetime;
u_int32_t refresh;
} __attribute__ ((packed));
struct mip6_opt_br {
u_int8_t type;
u_int8_t len;
} __attribute__ ((packed));
struct mip6_opt_ha {
u_int8_t type;
u_int8_t len;
struct in6_addr home_addr;
} __attribute__ ((packed));
struct mip6_subopt_id {
u_int8_t type;
u_int8_t len;
u_int16_t id;
} __attribute__ ((packed));
struct mip6_subopt_hal {
u_int8_t type;
u_int8_t len;
struct in6_addr halist[1];
} __attribute__ ((packed));
struct mip6_subopt_coa {
u_int8_t type;
u_int8_t len;
struct in6_addr coa;
} __attribute__ ((packed));
struct mip6_subbuf {
u_int16_t len;
char buffer[512];
};
struct mip6_dad {
struct mip6_subopt_hal *hal;
int index;
};
struct mip6_hafn {
time_t time;
int16_t pref;
u_int8_t prefix_len;
struct in6_addr addr;
};
struct mip6_esm {
struct mip6_esm *next;
struct ifnet *ifp;
const struct encaptab *ep;
int state;
enum esm_type type;
struct in6_addr home_addr;
u_int8_t prefix_len;
u_int16_t lifetime;
struct in6_addr ha_hn;
struct in6_addr coa;
struct mip6_hafn *ha_fn;
struct mip6_dad *dad;
};
struct bc_info {
u_int32_t br_interval;
u_int8_t no_of_sent_br;
u_int8_t max_advert;
u_int8_t ra_tunneled;
u_int8_t ra_interval;
};
struct mip6_bc {
struct mip6_bc *next;
struct in6_addr home_addr;
struct in6_addr coa;
u_int32_t lifetime;
u_int8_t hr_flag;
u_int8_t rtr_flag;
u_int8_t prefix_len;
u_int16_t seqno;
struct bc_info info;
time_t lasttime;
const struct encaptab *ep;
};
struct mip6_retrans {
struct mip6_opt_bu *bu_opt;
struct mip6_subbuf *bu_subopt;
u_int8_t ba_timeout;
u_int8_t time_left;
};
struct mip6_bul {
struct mip6_bul *next;
struct in6_addr dst_addr;
struct in6_addr bind_addr;
struct in6_addr coa;
u_int32_t lifetime;
u_int32_t refreshtime;
u_int16_t seqno;
time_t lasttime;
u_int32_t no_of_sent_bu;
struct mip6_retrans *state;
u_int8_t bu_flag;
u_int8_t hr_flag;
u_int8_t update_rate;
};
struct mip6_addr_list {
struct mip6_addr_list *next;
struct in6_addr ip6_addr;
u_int8_t prefix_len;
};
struct mip6_ha_list {
struct mip6_ha_list *next;
struct in6_addr ll_addr;
u_int16_t lifetime;
int16_t pref;
struct mip6_addr_list *addr_list;
};
struct mip6_link_list {
struct mip6_link_list *next;
struct mip6_ha_list *ha_list;
struct ifnet *ifp;
char ifname[IFNAMSIZ+1];
};
struct mip6_na
{
struct mip6_na *next;
struct ifnet *ifp;
struct in6_addr home_addr;
struct in6_addr dst_addr;
struct in6_addr target_addr;
u_int8_t prefix_len;
u_long flags;
int use_link_opt;
int no;
};
struct mip6_indata {
u_int8_t flag;
u_int8_t optflag;
struct in6_addr ip6_src;
struct in6_addr ip6_dst;
struct mip6_opt_bu *bu_opt;
struct mip6_opt_ba *ba_opt;
struct mip6_opt_br *br_opt;
struct mip6_opt_ha *ha_opt;
struct mip6_subopt_id *uid;
struct mip6_subopt_coa *coa;
struct mip6_subopt_hal *hal;
};
struct mip6_output {
struct mip6_output *next;
void *opt;
struct mip6_subbuf *subopt;
struct in6_addr ip6_dst;
struct in6_addr ip6_src;
enum send_state flag;
u_int32_t lifetime;
};
#ifdef KERNEL
#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)
extern struct mip6_indata *mip6_inp;
extern struct mip6_output *mip6_outq;
extern struct mip6_esm *mip6_esmq;
extern struct mip6_bc *mip6_bcq;
extern struct mip6_prefix *mip6_pq;
extern struct mip6_config mip6_config;
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;
extern int mip6_md_state;
extern int mip6_route_state;
extern int mip6_max_lost_advints;
extern int mip6_nd6_delay;
extern int mip6_nd6_umaxtries;
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));
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));
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));
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));
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));
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
#endif