00001
00002
00003
00004
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
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 #ifndef _NETINET6_IN6_VAR_H_
00065 #define _NETINET6_IN6_VAR_H_
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 struct in6_addrlifetime {
00083 time_t ia6t_expire;
00084 time_t ia6t_preferred;
00085 u_int32_t ia6t_vltime;
00086 u_int32_t ia6t_pltime;
00087 };
00088
00089 struct nd_ifinfo;
00090 struct scope6_id;
00091 struct in6_ifextra {
00092 struct in6_ifstat *in6_ifstat;
00093 struct icmp6_ifstat *icmp6_ifstat;
00094 struct nd_ifinfo *nd_ifinfo;
00095 struct scope6_id *scope6_id;
00096 };
00097
00098 #ifndef __SYMBIAN32__
00099
00100
00101
00102 struct in6_ifaddr {
00103 struct ifaddr ia_ifa;
00104 #define ia_ifp ia_ifa.ifa_ifp
00105 #define ia_flags ia_ifa.ifa_flags
00106 struct sockaddr_in6 ia_addr;
00107 struct sockaddr_in6 ia_net;
00108 struct sockaddr_in6 ia_dstaddr;
00109 struct sockaddr_in6 ia_prefixmask;
00110 u_int32_t ia_plen;
00111 struct in6_ifaddr *ia_next;
00112 int ia6_flags;
00113
00114 struct in6_addrlifetime ia6_lifetime;
00115 struct ifprefix *ia6_ifpr;
00116
00117
00118 struct nd_prefix *ia6_ndpr;
00119 };
00120
00121 #endif
00122
00123 struct in6_addrpolicy {
00124 struct sockaddr_in6 addr;
00125 struct sockaddr_in6 addrmask;
00126 int preced;
00127 int label;
00128 u_quad_t use;
00129 };
00130
00131
00132
00133
00134 struct in6_ifstat {
00135 u_quad_t ifs6_in_receive;
00136 u_quad_t ifs6_in_hdrerr;
00137 u_quad_t ifs6_in_toobig;
00138 u_quad_t ifs6_in_noroute;
00139 u_quad_t ifs6_in_addrerr;
00140 u_quad_t ifs6_in_protounknown;
00141
00142 u_quad_t ifs6_in_truncated;
00143 u_quad_t ifs6_in_discard;
00144
00145 u_quad_t ifs6_in_deliver;
00146
00147 u_quad_t ifs6_out_forward;
00148
00149 u_quad_t ifs6_out_request;
00150
00151 u_quad_t ifs6_out_discard;
00152 u_quad_t ifs6_out_fragok;
00153 u_quad_t ifs6_out_fragfail;
00154 u_quad_t ifs6_out_fragcreat;
00155
00156 u_quad_t ifs6_reass_reqd;
00157
00158 u_quad_t ifs6_reass_ok;
00159
00160
00161 u_quad_t ifs6_reass_fail;
00162
00163
00164 u_quad_t ifs6_in_mcast;
00165 u_quad_t ifs6_out_mcast;
00166 };
00167
00168
00169
00170
00171
00172 struct icmp6_ifstat {
00173
00174
00175
00176
00177 u_quad_t ifs6_in_msg;
00178
00179 u_quad_t ifs6_in_error;
00180
00181 u_quad_t ifs6_in_dstunreach;
00182
00183 u_quad_t ifs6_in_adminprohib;
00184
00185 u_quad_t ifs6_in_timeexceed;
00186
00187 u_quad_t ifs6_in_paramprob;
00188
00189 u_quad_t ifs6_in_pkttoobig;
00190
00191 u_quad_t ifs6_in_echo;
00192
00193 u_quad_t ifs6_in_echoreply;
00194
00195 u_quad_t ifs6_in_routersolicit;
00196
00197 u_quad_t ifs6_in_routeradvert;
00198
00199 u_quad_t ifs6_in_neighborsolicit;
00200
00201 u_quad_t ifs6_in_neighboradvert;
00202
00203 u_quad_t ifs6_in_redirect;
00204
00205 u_quad_t ifs6_in_mldquery;
00206
00207 u_quad_t ifs6_in_mldreport;
00208
00209 u_quad_t ifs6_in_mlddone;
00210
00211
00212
00213
00214
00215 u_quad_t ifs6_out_msg;
00216
00217 u_quad_t ifs6_out_error;
00218
00219 u_quad_t ifs6_out_dstunreach;
00220
00221 u_quad_t ifs6_out_adminprohib;
00222
00223 u_quad_t ifs6_out_timeexceed;
00224
00225 u_quad_t ifs6_out_paramprob;
00226
00227 u_quad_t ifs6_out_pkttoobig;
00228
00229 u_quad_t ifs6_out_echo;
00230
00231 u_quad_t ifs6_out_echoreply;
00232
00233 u_quad_t ifs6_out_routersolicit;
00234
00235 u_quad_t ifs6_out_routeradvert;
00236
00237 u_quad_t ifs6_out_neighborsolicit;
00238
00239 u_quad_t ifs6_out_neighboradvert;
00240
00241 u_quad_t ifs6_out_redirect;
00242
00243 u_quad_t ifs6_out_mldquery;
00244
00245 u_quad_t ifs6_out_mldreport;
00246
00247 u_quad_t ifs6_out_mlddone;
00248 };
00249
00250 struct in6_ifreq {
00251 char ifr_name[IFNAMSIZ];
00252 union {
00253 struct sockaddr_in6 ifru_addr;
00254 struct sockaddr_in6 ifru_dstaddr;
00255 int ifru_flags;
00256 int ifru_flags6;
00257 int ifru_metric;
00258 caddr_t ifru_data;
00259 struct in6_addrlifetime ifru_lifetime;
00260 struct in6_ifstat ifru_stat;
00261 struct icmp6_ifstat ifru_icmp6stat;
00262 u_int32_t ifru_scope_id[16];
00263 } ifr_ifru;
00264 };
00265
00266 struct in6_aliasreq {
00267 char ifra_name[IFNAMSIZ];
00268 struct sockaddr_in6 ifra_addr;
00269 struct sockaddr_in6 ifra_dstaddr;
00270 struct sockaddr_in6 ifra_prefixmask;
00271 int ifra_flags;
00272 struct in6_addrlifetime ifra_lifetime;
00273 };
00274
00275
00276 #define IN6_PREFIX_ND 1
00277 #define IN6_PREFIX_RR 2
00278
00279
00280
00281
00282
00283 struct in6_prflags {
00284 struct prf_ra {
00285 u_char onlink : 1;
00286 u_char autonomous : 1;
00287 u_char reserved : 6;
00288 } prf_ra;
00289 u_char prf_reserved1;
00290 u_short prf_reserved2;
00291
00292 struct prf_rr {
00293 u_char decrvalid : 1;
00294 u_char decrprefd : 1;
00295 u_char reserved : 6;
00296 } prf_rr;
00297 u_char prf_reserved3;
00298 u_short prf_reserved4;
00299 };
00300
00301 struct in6_prefixreq {
00302 char ipr_name[IFNAMSIZ];
00303 u_char ipr_origin;
00304 u_char ipr_plen;
00305 u_int32_t ipr_vltime;
00306 u_int32_t ipr_pltime;
00307 struct in6_prflags ipr_flags;
00308 struct sockaddr_in6 ipr_prefix;
00309 };
00310
00311 #define PR_ORIG_RA 0
00312 #define PR_ORIG_RR 1
00313 #define PR_ORIG_STATIC 2
00314 #define PR_ORIG_KERNEL 3
00315
00316 #define ipr_raf_onlink ipr_flags.prf_ra.onlink
00317 #define ipr_raf_auto ipr_flags.prf_ra.autonomous
00318
00319 #define ipr_statef_onlink ipr_flags.prf_state.onlink
00320
00321 #define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid
00322 #define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd
00323
00324 struct in6_rrenumreq {
00325 char irr_name[IFNAMSIZ];
00326 u_char irr_origin;
00327 u_char irr_m_len;
00328 u_char irr_m_minlen;
00329 u_char irr_m_maxlen;
00330 u_char irr_u_uselen;
00331 u_char irr_u_keeplen;
00332 struct irr_raflagmask {
00333 u_char onlink : 1;
00334 u_char autonomous : 1;
00335 u_char reserved : 6;
00336 } irr_raflagmask;
00337 u_int32_t irr_vltime;
00338 u_int32_t irr_pltime;
00339 struct in6_prflags irr_flags;
00340 struct sockaddr_in6 irr_matchprefix;
00341 struct sockaddr_in6 irr_useprefix;
00342 };
00343
00344 #define irr_raf_mask_onlink irr_raflagmask.onlink
00345 #define irr_raf_mask_auto irr_raflagmask.autonomous
00346 #define irr_raf_mask_reserved irr_raflagmask.reserved
00347
00348 #define irr_raf_onlink irr_flags.prf_ra.onlink
00349 #define irr_raf_auto irr_flags.prf_ra.autonomous
00350
00351 #define irr_statef_onlink irr_flags.prf_state.onlink
00352
00353 #define irr_rrf irr_flags.prf_rr
00354 #define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid
00355 #define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd
00356
00357
00358
00359
00360
00361 #define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr))
00362 #define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr))
00363 #define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr))
00364 #define IA6_SIN6(ia) (&((ia)->ia_addr))
00365 #define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr))
00366 #define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
00367 #define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
00368
00369 #define IFPR_IN6(x) (&((struct sockaddr_in6 *)((x)->ifpr_prefix))->sin6_addr)
00370
00371 #ifdef _KERNEL
00372 #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \
00373 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
00374 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
00375 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
00376 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
00377 #endif
00378
00379 #define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq)
00380 #define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq)
00381
00382 #ifdef _KERNEL
00383
00384
00385
00386
00387 #define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq)
00388 #define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq)
00389 #endif
00390
00391 #define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq)
00392 #define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq)
00393
00394 #define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq)
00395 #define SIOCAIFADDR_IN6 _IOW('i', 26, struct in6_aliasreq)
00396
00397 #define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq)
00398 #define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq)
00399 #define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq)
00400
00401 #define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
00402
00403 #define SIOCGDRLST_IN6 _IOWR('i', 74, struct in6_drlist)
00404 #ifdef _KERNEL
00405
00406 #define SIOCGPRLST_IN6 _IOWR('i', 75, struct in6_oprlist)
00407 #endif
00408 #ifdef _KERNEL
00409 #define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq)
00410 #endif
00411 #define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq)
00412 #define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq)
00413 #define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo)
00414 #define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq)
00415 #define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq)
00416
00417 #define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq)
00418 #define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq)
00419 #define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq)
00420 #define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq)
00421
00422 #define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq)
00423 #define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq)
00424
00425 #define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq)
00426
00427 #define SIOCSSCOPE6 _IOW('i', 88, struct in6_ifreq)
00428 #define SIOCGSCOPE6 _IOWR('i', 89, struct in6_ifreq)
00429 #define SIOCGSCOPE6DEF _IOWR('i', 90, struct in6_ifreq)
00430
00431 #define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq)
00432 #define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq)
00433 #define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq)
00434 #define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq)
00435 #define SIOCCIFPREFIX_IN6 _IOW('i', 104, \
00436 struct in6_rrenumreq)
00437 #define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \
00438 struct in6_rrenumreq)
00439
00440 #define SIOCGETSGCNT_IN6 _IOWR('u', 106, \
00441 struct sioc_sg_req6)
00442 #define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \
00443 struct sioc_mif_req6)
00444
00445 #define SIOCAADDRCTL_POLICY _IOW('u', 108, struct in6_addrpolicy)
00446 #define SIOCDADDRCTL_POLICY _IOW('u', 109, struct in6_addrpolicy)
00447
00448 #define IN6_IFF_ANYCAST 0x01
00449 #define IN6_IFF_TENTATIVE 0x02
00450 #define IN6_IFF_DUPLICATED 0x04
00451 #define IN6_IFF_DETACHED 0x08
00452 #define IN6_IFF_DEPRECATED 0x10
00453 #define IN6_IFF_NODAD 0x20
00454
00455
00456 #define IN6_IFF_AUTOCONF 0x40
00457 #define IN6_IFF_TEMPORARY 0x80
00458 #define IN6_IFF_NOPFX 0x8000
00459
00460
00461
00462
00463 #define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED)
00464
00465 #ifdef _KERNEL
00466 #define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
00467 #define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
00468 #endif
00469
00470 #ifdef _KERNEL
00471 extern struct in6_ifaddr *in6_ifaddr;
00472
00473 extern struct icmp6stat icmp6stat;
00474 #define in6_ifstat_inc(ifp, tag) \
00475 do { \
00476 if (ifp) \
00477 ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \
00478 } while ( 0)
00479
00480 extern struct in6_addr zeroin6_addr;
00481 extern u_char inet6ctlerrmap[];
00482 extern unsigned long in6_maxmtu;
00483 #ifdef MALLOC_DECLARE
00484 MALLOC_DECLARE(M_IPMADDR);
00485 #endif
00486
00487
00488
00489
00490
00491
00492 #define IFP_TO_IA6(ifp, ia) \
00493 \
00494 \
00495 do { \
00496 struct ifaddr *ifa; \
00497 for (ifa = (ifp)->if_addrlist.tqh_first; ifa; ifa = ifa->ifa_list.tqe_next) { \
00498 if (!ifa->ifa_addr) \
00499 continue; \
00500 if (ifa->ifa_addr->sa_family == AF_INET6) \
00501 break; \
00502 } \
00503 (ia) = (struct in6_ifaddr *)ifa; \
00504 } while ( 0)
00505
00506 #endif
00507
00508
00509
00510
00511
00512 struct in6_multi_mship {
00513 struct in6_multi *i6mm_maddr;
00514 LIST_ENTRY(in6_multi_mship) i6mm_chain;
00515 };
00516
00517 struct in6_multi {
00518 LIST_ENTRY(in6_multi) in6m_entry;
00519 struct in6_addr in6m_addr;
00520 struct ifnet *in6m_ifp;
00521 struct ifmultiaddr *in6m_ifma;
00522 u_int in6m_refcount;
00523 u_int in6m_state;
00524 u_int in6m_timer;
00525 };
00526
00527 #ifdef _KERNEL
00528 extern LIST_HEAD(in6_multihead, in6_multi) in6_multihead;
00529
00530
00531
00532
00533
00534 struct in6_multistep {
00535 struct in6_ifaddr *i_ia;
00536 struct in6_multi *i_in6m;
00537 };
00538
00539
00540
00541
00542
00543
00544
00545 #define IN6_LOOKUP_MULTI(addr, ifp, in6m) \
00546 \
00547 \
00548 \
00549 do { \
00550 struct ifmultiaddr *ifma; \
00551 IF_ADDR_LOCK(ifp); \
00552 TAILQ_FOREACH(ifma, &(ifp)->if_multiaddrs, ifma_link) { \
00553 if (ifma->ifma_addr->sa_family == AF_INET6 \
00554 && IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 *)ifma->ifma_addr)->sin6_addr, \
00555 &(addr))) \
00556 break; \
00557 } \
00558 (in6m) = (struct in6_multi *)(ifma ? ifma->ifma_protospec : 0); \
00559 IF_ADDR_UNLOCK(ifp); \
00560 } while(0)
00561
00562
00563
00564
00565
00566
00567
00568
00569 #define IN6_NEXT_MULTI(step, in6m) \
00570 \
00571 \
00572 do { \
00573 if (((in6m) = (step).i_in6m) != NULL) \
00574 (step).i_in6m = (step).i_in6m->in6m_entry.le_next; \
00575 } while(0)
00576
00577 #define IN6_FIRST_MULTI(step, in6m) \
00578 \
00579 \
00580 do { \
00581 (step).i_in6m = in6_multihead.lh_first; \
00582 IN6_NEXT_MULTI((step), (in6m)); \
00583 } while(0)
00584
00585 struct in6_multi *in6_addmulti __P((struct in6_addr *, struct ifnet *,
00586 int *));
00587 void in6_delmulti __P((struct in6_multi *));
00588 struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, int *);
00589 int in6_leavegroup(struct in6_multi_mship *);
00590 int in6_mask2len __P((struct in6_addr *, u_char *));
00591 int in6_control __P((struct socket *, u_long, caddr_t, struct ifnet *,
00592 struct thread *));
00593 int in6_update_ifa __P((struct ifnet *, struct in6_aliasreq *,
00594 struct in6_ifaddr *));
00595 void in6_purgeaddr __P((struct ifaddr *));
00596 int in6if_do_dad __P((struct ifnet *));
00597 void in6_purgeif __P((struct ifnet *));
00598 void in6_savemkludge __P((struct in6_ifaddr *));
00599 void *in6_domifattach __P((struct ifnet *));
00600 void in6_domifdetach __P((struct ifnet *, void *));
00601 void in6_setmaxmtu __P((void));
00602 void in6_restoremkludge __P((struct in6_ifaddr *, struct ifnet *));
00603 void in6_purgemkludge __P((struct ifnet *));
00604 struct in6_ifaddr *in6ifa_ifpforlinklocal __P((struct ifnet *, int));
00605 struct in6_ifaddr *in6ifa_ifpwithaddr __P((struct ifnet *, struct in6_addr *));
00606 char *ip6_sprintf __P((const struct in6_addr *));
00607 int in6_addr2zoneid __P((struct ifnet *, struct in6_addr *, u_int32_t *));
00608 int in6_matchlen __P((struct in6_addr *, struct in6_addr *));
00609 int in6_are_prefix_equal __P((struct in6_addr *, struct in6_addr *, int));
00610 void in6_prefixlen2mask __P((struct in6_addr *, int));
00611 int in6_prefix_ioctl __P((struct socket *, u_long, caddr_t,
00612 struct ifnet *));
00613 int in6_prefix_add_ifid __P((int, struct in6_ifaddr *));
00614 void in6_prefix_remove_ifid __P((int, struct in6_ifaddr *));
00615 void in6_purgeprefix __P((struct ifnet *));
00616 void in6_ifremloop(struct ifaddr *);
00617 void in6_ifaddloop(struct ifaddr *);
00618
00619 int in6_is_addr_deprecated __P((struct sockaddr_in6 *));
00620 struct inpcb;
00621 int in6_embedscope __P((struct in6_addr *, const struct sockaddr_in6 *,
00622 struct inpcb *, struct ifnet **));
00623 int in6_recoverscope __P((struct sockaddr_in6 *, const struct in6_addr *,
00624 struct ifnet *));
00625 void in6_clearscope __P((struct in6_addr *));
00626 int in6_src_ioctl __P((u_long, caddr_t));
00627 #endif
00628
00629 #endif