Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/in6_subr.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/in6_subr.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 122 122 #include <net/if_arp.h> 123 123 #include <net/net.h> 124 #include <net/net_endian.h> 124 125 #include <net/net_var.h> 125 126 #include <net/net_buf.h> … … 128 129 #include <netinet/in.h> 129 130 #include <netinet/in_var.h> 130 131 #include <netinet6/in6.h> 132 #include <netinet6/in6_var.h> 133 #include <netinet/ip6.h> 134 #include <netinet6/ip6_var.h> 131 #include <netinet/ip.h> 132 #include <netinet/ip_var.h> 133 134 #include <netinet6/nd6.h> 135 135 #include <netinet6/ah.h> 136 #include <netinet6/nd6.h> 137 138 #include <net/if6_var.h> 139 140 #ifdef SUPPORT_INET6 136 137 #include <net/if_var.h> 138 139 /* 140 * in6_make_ipv4mapped -- IPv4 射影アドレスを生成する。 141 * 142 * 注意: 143 * src はホストバイトオーダー 144 * 145 */ 146 147 T_IN6_ADDR * 148 in6_make_ipv4mapped (T_IN6_ADDR *dst, T_IN4_ADDR src) 149 { 150 dst->s6_addr32[0] = ULONG_C(0x00000000); 151 dst->s6_addr32[1] = ULONG_C(0x00000000); 152 dst->s6_addr32[2] = IPV6_ADDR_INT32_0000FFFF; 153 dst->s6_addr32[3] = htonl(src); 154 155 return dst; 156 } 157 158 #ifdef _IP6_CFG 159 160 #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 161 162 /* 163 * in6_rtinit -- ルーティング表を初期化する。 164 */ 165 166 void 167 in6_rtinit (void) 168 { 169 int_t ix; 170 171 for (ix = 0; ix < NUM_IN6_STATIC_ROUTE_ENTRY; ix ++) 172 routing6_tbl[ix].flags = IN_RTF_DEFINED; 173 174 for ( ; ix < NUM_IN6_ROUTE_ENTRY; ix ++) 175 routing6_tbl[ix].flags = 0; 176 } 177 178 /* 179 * in6_rtnewentry -- 新しいエントリを獲得する。 180 */ 181 182 T_IN6_RTENTRY * 183 in6_rtnewentry (uint8_t flags, uint32_t tmo) 184 { 185 SYSTIM now; 186 T_IN6_RTENTRY *rt, *frt = NULL; 187 int_t ix; 188 189 /* 空きエントリを探す。*/ 190 for (ix = NUM_IN6_STATIC_ROUTE_ENTRY; ix < NUM_IN6_ROUTE_ENTRY; ix ++) { 191 rt = &routing6_tbl[ix]; 192 if ((routing6_tbl[ix].flags & IN_RTF_DEFINED) == 0) { 193 frt = rt; 194 break; 195 } 196 } 197 198 /* expire の単位は [s]。*/ 199 syscall(get_tim(&now)); 200 now /= SYSTIM_HZ; 201 202 if (frt == NULL) { 203 /* 空きがなければ、有効時間がもっとも短いエントリを空きにする。*/ 204 T_IN6_RTENTRY *srt = NULL; 205 int_t diff, sdiff = INT_MAX; 206 207 syscall(wai_sem(SEM_IN6_ROUTING_TBL)); 208 for (ix = NUM_IN6_STATIC_ROUTE_ENTRY; ix < NUM_IN6_ROUTE_ENTRY; ix ++) { 209 rt = &routing6_tbl[ix]; 210 diff = (int_t)(rt->expire - now); 211 if (diff <= 0) { /* rt->expire <= now */ 212 /* 既に、有効時間が過ぎている。*/ 213 frt = rt; 214 break; 215 } 216 else if (diff < sdiff) { 217 srt = rt; 218 sdiff = diff; 219 } 220 } 221 if (frt == NULL) 222 frt = srt; 223 frt->flags = 0; 224 syscall(sig_sem(SEM_IN6_ROUTING_TBL)); 225 } 226 227 frt->flags = (uint8_t)(flags | IN_RTF_DEFINED); 228 frt->expire = now + tmo / SYSTIM_HZ; 229 return frt; 230 } 231 232 /* 233 * in6_rttimer -- ルーティング表の管理タイマー 234 */ 235 236 void 237 in6_rttimer (void) 238 { 239 SYSTIM now; 240 int_t ix; 241 242 /* expire の単位は [s]。*/ 243 syscall(get_tim(&now)); 244 now /= SYSTIM_HZ; 245 246 syscall(wai_sem(SEM_IN6_ROUTING_TBL)); 247 for (ix = NUM_IN6_STATIC_ROUTE_ENTRY; ix < NUM_IN6_ROUTE_ENTRY; ix ++) 248 if ((routing6_tbl[ix].flags & IN_RTF_DEFINED) && 249 (int_t)(routing6_tbl[ix].expire - now) <= 0) 250 routing6_tbl[ix].flags = 0; 251 syscall(sig_sem(SEM_IN6_ROUTING_TBL)); 252 } 253 254 #endif /* of #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 */ 141 255 142 256 #if NUM_IN6_HOSTCACHE_ENTRY > 0 … … 155 269 156 270 T_IN6_IFADDR * 157 in6_lookup_ifaddr (T_IFNET *ifp, T_IN6_ADDR *addr)271 in6_lookup_ifaddr (T_IFNET *ifp, const T_IN6_ADDR *addr) 158 272 { 159 273 int_t ix; 160 274 161 275 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { 162 if ((ifp->in _ifaddrs[ix].flags & IN6_IFF_DEFINED) &&163 IN6_ARE_ADDR_EQUAL(addr, &ifp->in _ifaddrs[ix].addr))164 return &ifp->in _ifaddrs[ix];276 if ((ifp->in6_ifaddrs[ix].flags & IN6_IFF_DEFINED) && 277 IN6_ARE_ADDR_EQUAL(addr, &ifp->in6_ifaddrs[ix].addr)) 278 return &ifp->in6_ifaddrs[ix]; 165 279 } 166 280 return NULL; … … 172 286 173 287 bool_t 174 in6_lookup_multi (T_IFNET *ifp, T_IN6_ADDR *maddr)288 in6_lookup_multi (T_IFNET *ifp, const T_IN6_ADDR *maddr) 175 289 { 176 290 int_t ix; 177 291 178 292 for (ix = MAX_IN6_MADDR_CNT; ix -- > 0; ) 179 if (IN6_ARE_ADDR_EQUAL(maddr, &ifp->in _maddrs[ix]))293 if (IN6_ARE_ADDR_EQUAL(maddr, &ifp->in6_maddrs[ix])) 180 294 return true; 181 295 return false; … … 188 302 ER 189 303 in6_set_header (T_NET_BUF *nbuf, uint_t len, 190 T_IN6_ADDR *dstaddr,T_IN6_ADDR *srcaddr,304 const T_IN6_ADDR *dstaddr, const T_IN6_ADDR *srcaddr, 191 305 uint8_t next, uint8_t hlim) 192 306 { … … 216 330 memset(&ip6h->dst, 0, sizeof(T_IN6_ADDR)); 217 331 else 218 ip6h->dst = *dstaddr;332 memcpy(&ip6h->dst, dstaddr, sizeof(T_IN6_ADDR)); 219 333 220 334 if (srcaddr == NULL) 221 335 memset(&ip6h->src, 0, sizeof(T_IN6_ADDR)); 222 336 else 223 ip6h->src = *srcaddr;337 memcpy(&ip6h->src, srcaddr, sizeof(T_IN6_ADDR)); 224 338 225 339 return E_OK; … … 232 346 ER 233 347 in6_get_datagram (T_NET_BUF **nbuf, uint_t len, uint_t maxlen, 234 T_IN6_ADDR *dstaddr,T_IN6_ADDR *srcaddr,348 const T_IN6_ADDR *dstaddr, const T_IN6_ADDR *srcaddr, 235 349 uint8_t next, uint8_t hlim, ATR nbatr, TMO tmout) 236 350 { … … 269 383 */ 270 384 271 ER_UINT 385 uint_t 272 386 in6_get_maxnum_ifaddr (void) 273 387 { … … 285 399 286 400 if (index < NUM_IN6_IFADDR_ENTRY && 287 (ifp->in _ifaddrs[index].flags & IN6_IFF_DEFINED))288 return &ifp->in _ifaddrs[index].addr;401 (ifp->in6_ifaddrs[index].flags & IN6_IFF_DEFINED)) 402 return &ifp->in6_ifaddrs[index].addr; 289 403 else 290 404 return NULL; … … 296 410 297 411 char * 298 ipv62str (char *buf, const T_IN6_ADDR *p_ ip6addr)299 { 300 static char addr_sbuf[NUM_IPV6ADDR_STR_BUFF][sizeof("0123:4567:89ab:cdef:0123:4567: 89ab:cdef")];412 ipv62str (char *buf, const T_IN6_ADDR *p_addr) 413 { 414 static char addr_sbuf[NUM_IPV6ADDR_STR_BUFF][sizeof("0123:4567:89ab:cdef:0123:4567:255.255.255.255")]; 301 415 static int_t bix = NUM_IPV6ADDR_STR_BUFF; 302 416 303 417 bool_t omit = false, zero = false; 304 418 char *start; 305 int_t ix ;419 int_t ix, len6; 306 420 307 421 if (buf == NULL) { … … 314 428 315 429 start = buf; 316 if (p_ip6addr == NULL) { 430 if (p_addr == NULL || IN6_IS_ADDR_UNSPECIFIED(p_addr)) { 431 *buf ++ = '0'; 317 432 *buf ++ = ':'; 318 433 *buf ++ = ':'; 434 *buf ++ = '0'; 319 435 } 320 436 else { 321 for (ix = 0; ix < sizeof(T_IN6_ADDR) / 2; ix ++) { 437 if (IN6_IS_ADDR_V4MAPPED(p_addr)) 438 len6 = sizeof(T_IN6_ADDR) / 2 - 2; 439 else 440 len6 = sizeof(T_IN6_ADDR) / 2; 441 for (ix = 0; ix < len6; ix ++) { 322 442 if (omit) { 323 buf += convert_hexdigit(buf, ntohs(p_ ip6addr->s6_addr16[ix]), 16, 0, ' ');443 buf += convert_hexdigit(buf, ntohs(p_addr->s6_addr16[ix]), 16, 0, ' '); 324 444 if (ix < 7) 325 445 *buf ++ = ':'; 326 446 } 327 else if (ix > 0 && ix < 7 && p_ ip6addr->s6_addr16[ix] == 0)447 else if (ix > 0 && ix < 7 && p_addr->s6_addr16[ix] == 0) 328 448 zero = true; 329 449 else { … … 332 452 *buf ++ = ':'; 333 453 } 334 buf += convert_hexdigit(buf, ntohs(p_ ip6addr->s6_addr16[ix]), 16, 0, ' ');454 buf += convert_hexdigit(buf, ntohs(p_addr->s6_addr16[ix]), 16, 0, ' '); 335 455 if (ix < 7) 336 456 *buf ++ = ':'; 337 457 } 338 458 } 459 460 if (len6 == sizeof(T_IN6_ADDR) / 2 - 2) { 461 T_IN4_ADDR ipv4addr; 462 463 ipv4addr = ntohl(p_addr->s6_addr32[3]); 464 buf += convert_hexdigit(buf, (uint_t)((ipv4addr >> 24) & 0xff), 10, 0, ' '); 465 *(buf ++) = '.'; 466 buf += convert_hexdigit(buf, (uint_t)((ipv4addr >> 16) & 0xff), 10, 0, ' '); 467 *(buf ++) = '.'; 468 buf += convert_hexdigit(buf, (uint_t)((ipv4addr >> 8) & 0xff), 10, 0, ' '); 469 *(buf ++) = '.'; 470 buf += convert_hexdigit(buf, (uint_t)((ipv4addr ) & 0xff), 10, 0, ' '); 471 } 339 472 } 340 473 *buf = '\0'; … … 370 503 371 504 /* 372 * in6_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。373 */374 375 bool_t376 in6_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_IN6_ADDR *dstaddr)377 {378 if (IN6_IS_ADDR_UNSPECIFIED(myaddr))379 return in6_lookup_ifaddr(IF_GET_IFNET(), dstaddr) != NULL;380 else381 return IN6_ARE_ADDR_EQUAL(dstaddr, myaddr);382 }383 384 /*385 505 * get_ip6_hdr_size -- 拡張ヘッダも含めた IPv6 ヘッダ長を返す。 386 506 */ 387 507 388 508 uint_t 389 get_ip6_hdr_size (T_IP6_HDR *iph) 390 { 391 uint_t size = IP6_HDR_SIZE, hsize; 392 uint8_t curr = iph->next, next; 393 uint8_t *hdr = ((uint8_t *)iph) + IP6_HDR_SIZE; 509 get_ip6_hdr_size (T_NET_BUF *nbuf) 510 { 511 T_IP6_HDR *iph = GET_IP6_HDR(nbuf); 512 uint_t size = IP6_HDR_SIZE, hsize; 513 uint8_t curr = iph->next, next; 514 uint8_t *hdr = ((uint8_t *)iph) + IP6_HDR_SIZE; 394 515 395 516 while (1) { … … 436 557 */ 437 558 438 T_IN6_ADDR *439 in6_rtalloc (T_IFNET *ifp, T_IN6_ADDR *dst)559 const T_IN6_ADDR * 560 in6_rtalloc (T_IFNET *ifp, const T_IN6_ADDR *dst) 440 561 { 441 562 if (IN6_IS_ADDR_LINKLOCAL(dst) || IN6_IS_ADDR_MULTICAST(dst)) … … 456 577 /* 推奨有効時間内のアドレスを探索する。*/ 457 578 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { 458 ia = &ifp->in _ifaddrs[ix];579 ia = &ifp->in6_ifaddrs[ix]; 459 580 if (IFA6_IS_READY(ia) && 460 581 in6_are_prefix_equal(dst, &ia->addr, ia->prefix_len) && … … 467 588 /* 有効時間内のアドレスを探索する。*/ 468 589 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { 469 ia = &ifp->in _ifaddrs[ix];590 ia = &ifp->in6_ifaddrs[ix]; 470 591 if (IFA6_IS_READY(ia) && 471 592 in6_are_prefix_equal(dst, &ia->addr, ia->prefix_len) && … … 485 606 */ 486 607 487 #if NUM_ ROUTE_ENTRY > 0488 489 syscall(wai_sem(SEM_IN _ROUTING_TBL));490 for (ix = NUM_ ROUTE_ENTRY; ix --; ) {491 if ((routing _tbl[ix].flags & IN_RTF_DEFINED) &&492 in6_are_prefix_equal(dst, &routing _tbl[ix].target,493 routing _tbl[ix].prefix_len)) {608 #if NUM_IN6_ROUTE_ENTRY > 0 609 610 syscall(wai_sem(SEM_IN6_ROUTING_TBL)); 611 for (ix = NUM_IN6_ROUTE_ENTRY; ix --; ) { 612 if ((routing6_tbl[ix].flags & IN_RTF_DEFINED) && 613 in6_are_prefix_equal(dst, &routing6_tbl[ix].target, 614 routing6_tbl[ix].prefix_len)) { 494 615 495 616 /* … … 498 619 * TMO_IN_REDIRECT の単位は [ms]。 499 620 */ 500 if (ix > NUM_ STATIC_ROUTE_ENTRY) {621 if (ix > NUM_IN6_STATIC_ROUTE_ENTRY) { 501 622 SYSTIM now; 502 623 503 624 syscall(get_tim(&now)); 504 routing _tbl[ix].expire = now / SYSTIM_HZ + TMO_IN_REDIRECT / 1000;625 routing6_tbl[ix].expire = now / SYSTIM_HZ + TMO_IN_REDIRECT / 1000; 505 626 } 506 627 507 syscall(sig_sem(SEM_IN _ROUTING_TBL));508 return &routing _tbl[ix].gateway;628 syscall(sig_sem(SEM_IN6_ROUTING_TBL)); 629 return &routing6_tbl[ix].gateway; 509 630 } 510 631 } 511 syscall(sig_sem(SEM_IN _ROUTING_TBL));512 513 #endif /* of #if NUM_ ROUTE_ENTRY > 0 */632 syscall(sig_sem(SEM_IN6_ROUTING_TBL)); 633 634 #endif /* of #if NUM_IN6_ROUTE_ENTRY > 0 */ 514 635 515 636 /* … … 520 641 } 521 642 522 #if NUM_ REDIRECT_ROUTE_ENTRY > 0643 #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 523 644 524 645 /* … … 526 647 */ 527 648 528 T_IN _RTENTRY *529 in6_gateway_lookup ( T_IN6_ADDR *gw)649 T_IN6_RTENTRY * 650 in6_gateway_lookup (const T_IN6_ADDR *gw) 530 651 { 531 652 int_t ix; 532 653 533 for (ix = NUM_ ROUTE_ENTRY; ix --; )534 if ((routing _tbl[ix].flags & IN_RTF_DEFINED) &&535 IN6_ARE_ADDR_EQUAL(&routing _tbl[ix].gateway, gw))536 return &routing _tbl[ix];654 for (ix = NUM_IN6_ROUTE_ENTRY; ix --; ) 655 if ((routing6_tbl[ix].flags & IN_RTF_DEFINED) && 656 IN6_ARE_ADDR_EQUAL(&routing6_tbl[ix].gateway, gw)) 657 return &routing6_tbl[ix]; 537 658 return NULL; 538 659 } … … 545 666 546 667 void 547 in6_rtredirect ( T_IN6_ADDR *gateway,T_IN6_ADDR *target, uint_t prefix_len, uint8_t flags, uint32_t tmo)548 { 549 T_IN _RTENTRY *frt;550 551 frt = in _rtnewentry(flags, tmo);552 frt->gateway = *gateway;553 frt->target = *target;668 in6_rtredirect (const T_IN6_ADDR *gateway, const T_IN6_ADDR *target, uint_t prefix_len, uint8_t flags, uint32_t tmo) 669 { 670 T_IN6_RTENTRY *frt; 671 672 frt = in6_rtnewentry(flags, tmo); 673 memcpy(&frt->gateway, gateway, sizeof(T_IN6_ADDR)); 674 memcpy(&frt->target, target, sizeof(T_IN6_ADDR)); 554 675 frt->prefix_len = prefix_len; 555 676 } 556 677 557 #endif /* of #if NUM_ REDIRECT_ROUTE_ENTRY > 0 */678 #endif /* of #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 */ 558 679 559 680 #if NUM_IN6_HOSTCACHE_ENTRY > 0 … … 564 685 565 686 static T_IN6_HOSTCACHE_ENTRY* 566 in6_hostcache_lookup ( T_IN6_ADDR *dst)687 in6_hostcache_lookup (const T_IN6_ADDR *dst) 567 688 { 568 689 int_t ix; … … 625 746 return; 626 747 } 627 hc->dst = *dst;748 memcpy(&hc->dst, dst, sizeof(T_IN6_ADDR)); 628 749 hc->expire = now + IN6_HOSTCACHE_EXPIRE; 629 750 hc->mtu = mtu; … … 637 758 638 759 uint32_t 639 in6_hostcache_getmtu ( T_IN6_ADDR *dst)760 in6_hostcache_getmtu (const T_IN6_ADDR *dst) 640 761 { 641 762 T_IN6_HOSTCACHE_ENTRY *hc; … … 679 800 in6_timer (void) 680 801 { 681 #if NUM_ REDIRECT_ROUTE_ENTRY > 0682 683 in _rttimer();684 685 #endif /* of #if NUM_ REDIRECT_ROUTE_ENTRY > 0 */802 #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 803 804 in6_rttimer(); 805 806 #endif /* of #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 */ 686 807 687 808 #ifdef IP6_CFG_FRAGMENT … … 707 828 in6_init (void) 708 829 { 709 #if NUM_ REDIRECT_ROUTE_ENTRY > 0710 711 in _rtinit();712 713 #endif /* of #if NUM_ REDIRECT_ROUTE_ENTRY > 0 */830 #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 831 832 in6_rtinit(); 833 834 #endif /* of #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 */ 714 835 715 836 timeout((callout_func)nd6_timer, NULL, ND6_TIMER_TMO); … … 717 838 } 718 839 719 #endif /* of #ifdef SUPPORT_INET6 */ 840 /* 841 * in6_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。 842 */ 843 844 bool_t 845 in6_is_dstaddr_accept (const T_IN6_ADDR *myaddr, const T_IN6_ADDR *dstaddr) 846 { 847 if (IN6_IS_ADDR_UNSPECIFIED(myaddr)) 848 return in6_lookup_ifaddr(IF_GET_IFNET(), dstaddr) != NULL; 849 else 850 return IN6_ARE_ADDR_EQUAL(dstaddr, myaddr); 851 } 852 853 #if defined(DHCP6_CLI_CFG) 854 855 /* 856 * in6_add_ifaddr -- インタフェースに IPv6 アドレスを設定する。 857 * 858 * vltime と pltime の単位は[s] 859 */ 860 861 static ER 862 in6_add_ifaddr (T_IN6_ADDR *addr, uint_t prefix_len, 863 uint32_t vltime, uint32_t pltime) 864 { 865 T_IFNET *ifp = IF_GET_IFNET(); 866 T_IN6_IFADDR *ia = NULL; 867 int_t ix; 868 869 /* 空きのエントリーを探す。*/ 870 ix = 0; 871 while (true) { 872 ia = in6ifa_ifpwithix(ifp, ix ++); 873 874 /* 空きが無ければエラー */ 875 if (ia == NULL) 876 return E_OBJ; 877 878 if ((ia->flags & IN6_IFF_DEFINED) == 0) 879 break; 880 } 881 882 /* 登録する。*/ 883 return in6_update_ifa(ifp, ia, addr, prefix_len, vltime, pltime, 884 IN6_RTR_IX_UNREACH, ND6_PREFIX_IX_INVALID, 0); 885 } 886 887 /* 888 * in6_upd_ifaddr -- インタフェースに設定されている IPv6 アドレスを更新する。 889 * 890 * 登録されていなければ、追加する。 891 * vltime と pltime の単位は[s] 892 */ 893 894 ER 895 in6_upd_ifaddr (T_IN6_ADDR *addr, uint_t prefix_len, 896 uint32_t vltime, uint32_t pltime) 897 { 898 T_IFNET *ifp = IF_GET_IFNET(); 899 T_IN6_IFADDR *ia; 900 int_t ix; 901 902 /* 903 * アドレスが一致するエントリーを探す。 904 * 無ければ登録する。 905 */ 906 if ((ix = in6_addr2ifaix(addr)) == IPV6_IFADDR_IX_INVALID) 907 return in6_add_ifaddr(addr, prefix_len, vltime, pltime); 908 909 /* 910 * インデックス番号から、エントリーに変換する。 911 * エラーにならないはずであるが、確認する。 912 */ 913 if ((ia = in6ifa_ifpwithix (ifp, ix)) == NULL) 914 return E_OBJ; 915 916 /* 更新する。*/ 917 return in6_update_ifa(ifp, ia, addr, prefix_len, vltime, pltime, 918 IN6_RTR_IX_UNREACH, ND6_PREFIX_IX_INVALID, 0); 919 } 920 921 /* 922 * in6_del_ifaddr -- インタフェースに設定されている IPv6 アドレスを削除する。 923 */ 924 925 ER 926 in6_del_ifaddr (T_IN6_ADDR *addr) 927 { 928 T_IFNET *ifp = IF_GET_IFNET(); 929 int_t ix; 930 931 /* アドレスが一致するエントリーを探す。*/ 932 if ((ix = in6_addr2ifaix(addr)) != IPV6_IFADDR_IX_INVALID) { 933 934 /* エントリーを無効にする。*/ 935 ifp->in6_ifaddrs[ix].flags &= ~IN6_IFF_DEFINED; 936 return E_OK; 937 } 938 return E_PAR; 939 } 940 941 #endif /* of #if defined(DHCP6_CLI_CFG) */ 942 943 #endif /* of #ifdef _IP6_CFG */
Note:
See TracChangeset
for help on using the changeset viewer.