00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
#ifndef _NETINET6_ND6_H_
00038
#define _NETINET6_ND6_H_
00039
00040
00041
#ifndef RTF_ANNOUNCE
00042
#define RTF_ANNOUNCE RTF_PROTO2
00043
#endif
00044
00045
#include <sys/queue.h>
00046
#include <sys/callout.h>
00047
00048
struct llinfo_nd6 {
00049
struct llinfo_nd6 *ln_next;
00050
struct llinfo_nd6 *ln_prev;
00051
struct rtentry *ln_rt;
00052
struct mbuf *ln_hold;
00053
long ln_asked;
00054 u_long ln_expire;
00055
short ln_state;
00056
short ln_router;
00057
int ln_byhint;
00058 };
00059
00060
#define ND6_LLINFO_NOSTATE -2
00061
00062
00063
00064
00065
00066
00067
00068
00069
#define ND6_LLINFO_INCOMPLETE 0
00070
#define ND6_LLINFO_REACHABLE 1
00071
#define ND6_LLINFO_STALE 2
00072
#define ND6_LLINFO_DELAY 3
00073
#define ND6_LLINFO_PROBE 4
00074
00075
#define ND6_IS_LLINFO_PROBREACH(n) ((n)->ln_state > ND6_LLINFO_INCOMPLETE)
00076
00077
struct nd_ifinfo {
00078 u_int32_t linkmtu;
00079 u_int32_t maxmtu;
00080 u_int32_t basereachable;
00081 u_int32_t reachable;
00082 u_int32_t retrans;
00083 u_int32_t flags;
00084
int recalctm;
00085 u_int8_t chlim;
00086 u_int8_t receivedra;
00087
00088 u_int8_t randomseed0[8];
00089 u_int8_t randomseed1[8];
00090 u_int8_t randomid[8];
00091 };
00092
00093
#define ND6_IFF_PERFORMNUD 0x1
00094
00095
struct in6_nbrinfo {
00096
char ifname[IFNAMSIZ];
00097
struct in6_addr addr;
00098
long asked;
00099
int isrouter;
00100
int state;
00101
int expire;
00102 };
00103
00104
#define DRLSTSIZ 10
00105
#define PRLSTSIZ 10
00106
struct in6_drlist {
00107
char ifname[IFNAMSIZ];
00108
struct {
00109
struct in6_addr rtaddr;
00110 u_char flags;
00111 u_short rtlifetime;
00112 u_long expire;
00113 u_short if_index;
00114 } defrouter[DRLSTSIZ];
00115 };
00116
00117
struct in6_defrouter {
00118
struct sockaddr_in6 rtaddr;
00119 u_char flags;
00120 u_short rtlifetime;
00121 u_long expire;
00122 u_short if_index;
00123 };
00124
00125
struct in6_prlist {
00126
char ifname[IFNAMSIZ];
00127
struct {
00128
struct in6_addr prefix;
00129
struct prf_ra raflags;
00130 u_char prefixlen;
00131 u_char origin;
00132 u_int32_t vltime;
00133 u_int32_t pltime;
00134 time_t expire;
00135 u_short if_index;
00136 u_short advrtrs;
00137
struct in6_addr advrtr[DRLSTSIZ];
00138 } prefix[PRLSTSIZ];
00139 };
00140
00141
struct in6_prefix {
00142
struct sockaddr_in6 prefix;
00143
struct prf_ra raflags;
00144 u_char prefixlen;
00145 u_char origin;
00146 u_long vltime;
00147 u_long pltime;
00148 u_long expire;
00149 u_int32_t flags;
00150
int refcnt;
00151 u_short if_index;
00152 u_short advrtrs;
00153
00154 };
00155
00156
#ifdef _KERNEL
00157
struct in6_ondireq {
00158
char ifname[IFNAMSIZ];
00159
struct {
00160 u_int32_t linkmtu;
00161 u_int32_t maxmtu;
00162 u_int32_t basereachable;
00163 u_int32_t reachable;
00164 u_int32_t retrans;
00165 u_int32_t flags;
00166
int recalctm;
00167 u_int8_t chlim;
00168 u_int8_t receivedra;
00169 } ndi;
00170 };
00171
#endif
00172
00173
struct in6_ndireq {
00174
char ifname[IFNAMSIZ];
00175
struct nd_ifinfo ndi;
00176 };
00177
00178
struct in6_ndifreq {
00179
char ifname[IFNAMSIZ];
00180 u_long ifindex;
00181 };
00182
00183
00184
#define NDPRF_ONLINK 0x1
00185
#define NDPRF_DETACHED 0x2
00186
00187
00188
#define MAX_RTR_SOLICITATION_DELAY 1
00189
#define RTR_SOLICITATION_INTERVAL 4
00190
#define MAX_RTR_SOLICITATIONS 3
00191
00192
#define ND6_INFINITE_LIFETIME 0xffffffff
00193
00194
#ifdef _KERNEL
00195
00196
#define MAX_REACHABLE_TIME 3600000
00197
#define REACHABLE_TIME 30000
00198
#define RETRANS_TIMER 1000
00199
#define MIN_RANDOM_FACTOR 512
00200
#define MAX_RANDOM_FACTOR 1536
00201
#define DEF_TEMP_VALID_LIFETIME 604800
00202
#define DEF_TEMP_PREFERRED_LIFETIME 86400
00203
#define TEMPADDR_REGEN_ADVANCE 5
00204
#define MAX_TEMP_DESYNC_FACTOR 600
00205
#define ND_COMPUTE_RTIME(x) \
00206
(((MIN_RANDOM_FACTOR * (x >> 10)) + (random() & \
00207
((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) /1000)
00208
00209 TAILQ_HEAD(nd_drhead, nd_defrouter);
00210
struct nd_defrouter {
00211 TAILQ_ENTRY(nd_defrouter) dr_entry;
00212 struct in6_addr rtaddr;
00213 u_char flags;
00214 u_short rtlifetime;
00215 u_long expire;
00216 u_long advint;
00217 u_long advint_expire;
00218
int advints_lost;
00219 struct ifnet *ifp;
00220 };
00221
00222 struct nd_prefix {
00223
struct ifnet *ndpr_ifp;
00224 LIST_ENTRY(nd_prefix) ndpr_entry;
00225 struct sockaddr_in6 ndpr_prefix;
00226 struct in6_addr ndpr_mask;
00227 struct in6_addr ndpr_addr;
00228 u_int32_t ndpr_vltime;
00229 u_int32_t ndpr_pltime;
00230 time_t ndpr_expire;
00231 time_t ndpr_preferred;
00232 struct prf_ra ndpr_flags;
00233 u_int32_t ndpr_stateflags;
00234
00235 LIST_HEAD(pr_rtrhead, nd_pfxrouter) ndpr_advrtrs;
00236 u_char ndpr_plen;
00237
int ndpr_refcnt;
00238 };
00239
00240 #define ndpr_next ndpr_entry.le_next
00241
00242 #define ndpr_raf ndpr_flags
00243 #define ndpr_raf_onlink ndpr_flags.onlink
00244 #define ndpr_raf_auto ndpr_flags.autonomous
00245
00246
00247
00248
00249
00250 #define NDPR_KEEP_EXPIRED (1800 * 2)
00251
00252
00253
00254
00255
00256 struct inet6_ndpr_msghdr {
00257 u_short inpm_msglen;
00258 u_char inpm_version;
00259 u_char inpm_type;
00260
struct in6_addr inpm_prefix;
00261 u_long prm_vltim;
00262 u_long prm_pltime;
00263 u_long prm_expire;
00264 u_long prm_preferred;
00265
struct in6_prflags prm_flags;
00266 u_short prm_index;
00267 u_char prm_plen;
00268 };
00269
00270
#define prm_raf_onlink prm_flags.prf_ra.onlink
00271
#define prm_raf_auto prm_flags.prf_ra.autonomous
00272
00273
#define prm_statef_onlink prm_flags.prf_state.onlink
00274
00275
#define prm_rrf_decrvalid prm_flags.prf_rr.decrvalid
00276
#define prm_rrf_decrprefd prm_flags.prf_rr.decrprefd
00277
00278
#define ifpr2ndpr(ifpr) ((struct nd_prefix *)(ifpr))
00279
#define ndpr2ifpr(ndpr) ((struct ifprefix *)(ndpr))
00280
00281
struct nd_pfxrouter {
00282 LIST_ENTRY(nd_pfxrouter) pfr_entry;
00283 #define pfr_next pfr_entry.le_next
00284 struct nd_defrouter *router;
00285 };
00286
00287 LIST_HEAD(nd_prhead, nd_prefix);
00288
00289
00290 extern
int nd6_prune;
00291 extern
int nd6_delay;
00292 extern
int nd6_umaxtries;
00293 extern
int nd6_mmaxtries;
00294 extern
int nd6_useloopback;
00295 extern
int nd6_maxnudhint;
00296 extern
int nd6_gctimer;
00297 extern struct llinfo_nd6 llinfo_nd6;
00298 extern struct nd_ifinfo *nd_ifinfo;
00299 extern struct nd_drhead nd_defrouter;
00300 extern struct nd_prhead nd_prefix;
00301 extern
int nd6_debug;
00302
00303 #define nd6log(x) do {
if (nd6_debug) log x; }
while (0)
00304
00305
extern struct callout nd6_timer_ch;
00306
00307
00308
extern int nd6_defifindex;
00309
extern int ip6_desync_factor;
00310
extern u_int32_t ip6_temp_preferred_lifetime;
00311
extern u_int32_t ip6_temp_valid_lifetime;
00312
extern int ip6_temp_regen_advance;
00313
00314
union nd_opts {
00315
struct nd_opt_hdr *nd_opt_array[9];
00316
struct {
00317
struct nd_opt_hdr *zero;
00318
struct nd_opt_hdr *src_lladdr;
00319
struct nd_opt_hdr *tgt_lladdr;
00320
struct nd_opt_prefix_info *pi_beg;
00321
struct nd_opt_rd_hdr *rh;
00322
struct nd_opt_mtu *mtu;
00323
struct nd_opt_hdr *six;
00324
struct nd_opt_advint *adv;
00325
struct nd_opt_hai *hai;
00326
struct nd_opt_hdr *search;
00327
struct nd_opt_hdr *last;
00328
int done;
00329
struct nd_opt_prefix_info *pi_end;
00330 } nd_opt_each;
00331 };
00332
#define nd_opts_src_lladdr nd_opt_each.src_lladdr
00333
#define nd_opts_tgt_lladdr nd_opt_each.tgt_lladdr
00334
#define nd_opts_pi nd_opt_each.pi_beg
00335
#define nd_opts_pi_end nd_opt_each.pi_end
00336
#define nd_opts_rh nd_opt_each.rh
00337
#define nd_opts_mtu nd_opt_each.mtu
00338
#define nd_opts_adv nd_opt_each.adv
00339
#define nd_opts_hai nd_opt_each.hai
00340
#define nd_opts_search nd_opt_each.search
00341
#define nd_opts_last nd_opt_each.last
00342
#define nd_opts_done nd_opt_each.done
00343
00344
00345
00346
void nd6_init __P((
void));
00347
void nd6_ifattach __P((
struct ifnet *));
00348
int nd6_is_addr_neighbor __P((
struct sockaddr_in6 *,
struct ifnet *));
00349
void nd6_option_init __P((
void *,
int,
union nd_opts *));
00350
struct nd_opt_hdr *nd6_option __P((
union nd_opts *));
00351
int nd6_options __P((
union nd_opts *));
00352
struct rtentry *nd6_lookup __P((
struct in6_addr *,
int,
struct ifnet *));
00353
void nd6_setmtu __P((
struct ifnet *));
00354
void nd6_timer __P((
void *));
00355
void nd6_purge __P((
struct ifnet *));
00356
struct llinfo_nd6 *nd6_free __P((
struct rtentry *));
00357
void nd6_nud_hint __P((
struct rtentry *,
struct in6_addr *,
int));
00358
int nd6_resolve __P((
struct ifnet *,
struct rtentry *,
00359
struct mbuf *,
struct sockaddr *, u_char *));
00360
void nd6_rtrequest __P((
int,
struct rtentry *,
struct rt_addrinfo *));
00361
int nd6_ioctl __P((u_long, caddr_t,
struct ifnet *));
00362
struct rtentry *nd6_cache_lladdr __P((
struct ifnet *,
struct in6_addr *,
00363
char *,
int,
int,
int));
00364
int nd6_output __P((
struct ifnet *,
struct ifnet *,
struct mbuf *,
00365
struct sockaddr_in6 *,
struct rtentry *));
00366
int nd6_storelladdr __P((
struct ifnet *,
struct rtentry *,
struct mbuf *,
00367
struct sockaddr *, u_char *));
00368
int nd6_need_cache __P((
struct ifnet *));
00369
00370
00371
void nd6_na_input __P((
struct mbuf *,
int,
int));
00372
void nd6_na_output __P((
struct ifnet *,
const struct in6_addr *,
00373
const struct in6_addr *, u_long,
int,
struct sockaddr *));
00374
void nd6_ns_input __P((
struct mbuf *,
int,
int));
00375
void nd6_ns_output __P((
struct ifnet *,
const struct in6_addr *,
00376
const struct in6_addr *,
struct llinfo_nd6 *,
int));
00377 caddr_t nd6_ifptomac __P((
struct ifnet *));
00378
void nd6_dad_start __P((
struct ifaddr *,
int *));
00379
void nd6_dad_stop __P((
struct ifaddr *));
00380
void nd6_dad_duplicated __P((
struct ifaddr *));
00381
00382
00383
void nd6_rs_input __P((
struct mbuf *,
int,
int));
00384
void nd6_ra_input __P((
struct mbuf *,
int,
int));
00385
void prelist_del __P((
struct nd_prefix *));
00386
void defrouter_addreq __P((
struct nd_defrouter *));
00387
void defrouter_delreq __P((
struct nd_defrouter *,
int));
00388
void defrouter_select __P((
void));
00389
void defrtrlist_del __P((
struct nd_defrouter *));
00390
void prelist_remove __P((
struct nd_prefix *));
00391
int prelist_update __P((
struct nd_prefix *,
struct nd_defrouter *,
00392
struct mbuf *));
00393
int nd6_prelist_add __P((
struct nd_prefix *,
struct nd_defrouter *,
00394
struct nd_prefix **));
00395
int nd6_prefix_onlink __P((
struct nd_prefix *));
00396
int nd6_prefix_offlink __P((
struct nd_prefix *));
00397
void pfxlist_onlink_check __P((
void));
00398
struct nd_defrouter *defrouter_lookup __P((
struct in6_addr *,
00399
struct ifnet *));
00400
struct nd_prefix *nd6_prefix_lookup __P((
struct nd_prefix *));
00401
int in6_init_prefix_ltimes __P((
struct nd_prefix *ndpr));
00402
void rt6_flush __P((
struct in6_addr *,
struct ifnet *));
00403
int nd6_setdefaultiface __P((
int));
00404
int in6_tmpifadd __P((
const struct in6_ifaddr *,
int));
00405
00406
#endif
00407
00408
#endif