Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/in6_subr.c

    r321 r331  
    22 *  TINET (TCP/IP Protocol Stack)
    33 *
    4  *  Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
     4 *  Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
    55 *                   Tomakomai National College of Technology, JAPAN
    66 *
     
    122122#include <net/if_arp.h>
    123123#include <net/net.h>
     124#include <net/net_endian.h>
    124125#include <net/net_var.h>
    125126#include <net/net_buf.h>
     
    128129#include <netinet/in.h>
    129130#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>
    135135#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
     147T_IN6_ADDR *
     148in6_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
     166void
     167in6_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
     182T_IN6_RTENTRY *
     183in6_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
     236void
     237in6_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 */
    141255
    142256#if NUM_IN6_HOSTCACHE_ENTRY > 0
     
    155269
    156270T_IN6_IFADDR *
    157 in6_lookup_ifaddr (T_IFNET *ifp, T_IN6_ADDR *addr)
     271in6_lookup_ifaddr (T_IFNET *ifp, const T_IN6_ADDR *addr)
    158272{
    159273        int_t ix;
    160274
    161275        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];
    165279                }
    166280        return NULL;
     
    172286
    173287bool_t
    174 in6_lookup_multi (T_IFNET *ifp, T_IN6_ADDR *maddr)
     288in6_lookup_multi (T_IFNET *ifp, const T_IN6_ADDR *maddr)
    175289{
    176290        int_t ix;
    177291
    178292        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]))
    180294                        return true;
    181295        return false;
     
    188302ER
    189303in6_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,
    191305                uint8_t next, uint8_t hlim)
    192306{
     
    216330                memset(&ip6h->dst, 0, sizeof(T_IN6_ADDR));
    217331        else
    218                 ip6h->dst = *dstaddr;
     332                memcpy(&ip6h->dst, dstaddr, sizeof(T_IN6_ADDR));
    219333
    220334        if (srcaddr == NULL)
    221335                memset(&ip6h->src, 0, sizeof(T_IN6_ADDR));
    222336        else
    223                 ip6h->src = *srcaddr;
     337                memcpy(&ip6h->src, srcaddr, sizeof(T_IN6_ADDR));
    224338
    225339        return E_OK;
     
    232346ER
    233347in6_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,
    235349                  uint8_t next, uint8_t hlim, ATR nbatr, TMO tmout)
    236350{
     
    269383 */
    270384
    271 ER_UINT
     385uint_t
    272386in6_get_maxnum_ifaddr (void)
    273387{
     
    285399
    286400        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;
    289403        else
    290404                return NULL;
     
    296410
    297411char *
    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")];
     412ipv62str (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")];
    301415        static int_t    bix = NUM_IPV6ADDR_STR_BUFF;
    302416
    303417        bool_t  omit = false, zero = false;
    304418        char    *start;
    305         int_t   ix;
     419        int_t   ix, len6;
    306420
    307421        if (buf == NULL) {
     
    314428
    315429        start = buf;
    316         if (p_ip6addr == NULL) {
     430        if (p_addr == NULL || IN6_IS_ADDR_UNSPECIFIED(p_addr)) {
     431                *buf ++ = '0';
    317432                *buf ++ = ':';
    318433                *buf ++ = ':';
     434                *buf ++ = '0';
    319435                }
    320436        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 ++) {
    322442                        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, ' ');
    324444                                if (ix < 7)
    325445                                        *buf ++ = ':';
    326446                                }
    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)
    328448                                zero = true;
    329449                        else {
     
    332452                                        *buf ++ = ':';
    333453                                        }
    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, ' ');
    335455                                if (ix < 7)
    336456                                        *buf ++ = ':';
    337457                                }
    338458                        }
     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                        }
    339472                }
    340473        *buf = '\0';
     
    370503
    371504/*
    372  *  in6_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。
    373  */
    374 
    375 bool_t
    376 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         else
    381                 return IN6_ARE_ADDR_EQUAL(dstaddr, myaddr);
    382         }
    383 
    384 /*
    385505 *  get_ip6_hdr_size -- 拡張ヘッダも含めた IPv6 ヘッダ長を返す。
    386506 */
    387507
    388508uint_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;
     509get_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;
    394515
    395516        while (1) {
     
    436557 */
    437558
    438 T_IN6_ADDR *
    439 in6_rtalloc (T_IFNET *ifp, T_IN6_ADDR *dst)
     559const T_IN6_ADDR *
     560in6_rtalloc (T_IFNET *ifp, const T_IN6_ADDR *dst)
    440561{
    441562        if (IN6_IS_ADDR_LINKLOCAL(dst) || IN6_IS_ADDR_MULTICAST(dst))
     
    456577                /* 推奨有効時間内のアドレスを探索する。*/
    457578                for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) {
    458                         ia = &ifp->in_ifaddrs[ix];
     579                        ia = &ifp->in6_ifaddrs[ix];
    459580                        if (IFA6_IS_READY(ia) &&
    460581                            in6_are_prefix_equal(dst, &ia->addr, ia->prefix_len) &&
     
    467588                /* 有効時間内のアドレスを探索する。*/
    468589                for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) {
    469                         ia = &ifp->in_ifaddrs[ix];
     590                        ia = &ifp->in6_ifaddrs[ix];
    470591                        if (IFA6_IS_READY(ia) &&
    471592                            in6_are_prefix_equal(dst, &ia->addr, ia->prefix_len) &&
     
    485606                 */
    486607
    487 #if NUM_ROUTE_ENTRY > 0
    488 
    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)) {
    494615
    495616                                /*
     
    498619                                 *  TMO_IN_REDIRECT の単位は [ms]。
    499620                                 */
    500                                 if (ix > NUM_STATIC_ROUTE_ENTRY) {
     621                                if (ix > NUM_IN6_STATIC_ROUTE_ENTRY) {
    501622                                        SYSTIM  now;
    502623
    503624                                        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;
    505626                                        }
    506627
    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;
    509630                                }
    510631                        }
    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 */
    514635
    515636                /*
     
    520641        }
    521642
    522 #if NUM_REDIRECT_ROUTE_ENTRY > 0
     643#if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0
    523644
    524645/*
     
    526647 */
    527648
    528 T_IN_RTENTRY *
    529 in6_gateway_lookup (T_IN6_ADDR *gw)
     649T_IN6_RTENTRY *
     650in6_gateway_lookup (const T_IN6_ADDR *gw)
    530651{
    531652        int_t   ix;
    532653
    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];
    537658        return NULL;
    538659        }
     
    545666
    546667void
    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;
     668in6_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));
    554675        frt->prefix_len = prefix_len;
    555676        }
    556677
    557 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
     678#endif  /* of #if NUM_IN6_REDIRECT_ROUTE_ENTRY > 0 */
    558679
    559680#if NUM_IN6_HOSTCACHE_ENTRY > 0
     
    564685
    565686static T_IN6_HOSTCACHE_ENTRY*
    566 in6_hostcache_lookup (T_IN6_ADDR *dst)
     687in6_hostcache_lookup (const T_IN6_ADDR *dst)
    567688{
    568689        int_t ix;
     
    625746                return;
    626747                }
    627         hc->dst    = *dst;
     748        memcpy(&hc->dst, dst, sizeof(T_IN6_ADDR));
    628749        hc->expire = now + IN6_HOSTCACHE_EXPIRE;
    629750        hc->mtu    = mtu;
     
    637758
    638759uint32_t
    639 in6_hostcache_getmtu (T_IN6_ADDR *dst)
     760in6_hostcache_getmtu (const T_IN6_ADDR *dst)
    640761{
    641762        T_IN6_HOSTCACHE_ENTRY   *hc;
     
    679800in6_timer (void)
    680801{
    681 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    682 
    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 */
    686807
    687808#ifdef IP6_CFG_FRAGMENT
     
    707828in6_init (void)
    708829{
    709 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    710 
    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 */
    714835
    715836        timeout((callout_func)nd6_timer, NULL, ND6_TIMER_TMO);
     
    717838        }
    718839
    719 #endif /* of #ifdef SUPPORT_INET6 */
     840/*
     841 *  in6_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。
     842 */
     843
     844bool_t
     845in6_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
     861static ER
     862in6_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
     894ER
     895in6_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
     925ER
     926in6_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.