dad - みる会図書館


検索対象: UNIX MAGAZINE 2004年4月号
20件見つかりました。

1. UNIX MAGAZINE 2004年4月号

連載 / 旧 v6 の実装ー⑦ 図 14 DAD 成否の判断 (nd6-nbr. c) static void nd6—dad—timer (ifa) 1508 1522 1521 1520 #endif / * MIP6 & & MIP6_HOME_AGENT * / 1519 1518 1517 1516 1515 1503 1499 1393 1392 1391 1390 if (duplicate) { struct ifaddr *ifa; TAILQ_REMOVE (&dadq, (struct dadq * ) dp , ia—>ia6—f1ags & = -IN6—IFF—TENTATIVE; else { dad—list) ; #if defined(MIP6) free(dp, M—IP6NDP) ; dp = NULL ; & & defined(MIP6_HOME_AGENT) if (mip6—dad-success(ifa) IFAFREE (ifa) ; = ENOENT) 重複が発生していたら、 nd6-dad-timer() 内で dupli- cate が真に設疋されます。重複していない場合は 1 508 行目に進み、アドレスに付けられていた IN6-IFF-TEN- TATIVE フラグを外します。そして、 DAD 中のアドレ スリストである dadq から該当アドレスを削除し、 mip6- dad-success() を呼び出します。 mip6-dad-success() は、 DAD が成功したことを受けて、移動ノードへのトン ネルリンクの構築と代瑪丘謝架索の処理を実行します。 765 int 766 mip6—dad—success(ifa) struct ifaddr *ifa; 767 768 { mip6-dad-success() は、 DAD が成功したアドレスが 十タされた in6-ifaddr 構造体へのポインタ ( 実際には - ヨ殳 化された ifaddr 橢告体へのポインタ ) を引数にとります。 を返します。 784 mip6—tunne1—contr01 (MIP6—TUNNEL-ADD , mbc , モリを解放し、 mbc-dad を NULL で初期化します。 in6-ifaddr 構造体力坏要になります。 780 ~ 781 行目でメ DAD が終了すれば、これまでアドレスを保持していた 781 mbc->mbc_dad = NULL; 780 FREE(ifa, M_IFADDR) ; 785 mip6—bc—encapcheck, &mbc—>mbc—encap) ; 771 772 773 774 775 776 777 778 for (mbc = LIST—FIRST(&mip6_bc_1ist) ; mbc; mbc = LIST-NEXT(mbc, mbc-entry) ) { if (mbc->mbc—dad ifa) break ; if (!mbc) return (ENOENT) ; 771 ~ 778 行目は、 DAD が終了したアドレスに対応す る対応付けキャッシュの検索です。 DAD の対象となった アドレスの情報は、 mip6-dad-start() で作成した in6_ ifaddr 構造体のかたちで mbc-dad に設疋されています。 こでは、すべての対応付けキャッシュの mbc-dad を確 認し、 DAD が終了した対応付けキャッシュを探します。 対応するキャッシュがなければ、 778 行目で ENOENT UNIX MAGAZ 工 NE 2004.4 788 mip6—bc-proxy-contr01 (&mbc->mbc-phaddr , tmbc—>mbc—addr , RTM—ADD) ; 784 ~ 788 行目で、ホーム・エージェントから移動ノー ドへのトンネルリンクを作成し、移動ノードのアドレスに 対する代瑪丘隣探索を開始します。これらの実装について は次回に解説します。 791 if ( (mbc—>mbc—flags & IP6MU—CLONED) ! = 0 ) return ( 0 ) ; 792 DAD 対象アドレスが移動ノードのリンクローカル・ア ドレスだった場合、以後の対応付け応答の送イ言処理は不要 です。 移動ノードのホームアドレスに対する DAD が完了した ら、 795 行目で移動ノードに対応付け応答を返送し、ホー ム登録処理カ常に終了したことを通知します。 DAD 失敗時の処理 DAD が失敗した場合、近隣探索の nd6-dad-dupIi- cated() 関数が実行されます ( 図 16 ) 。 91

2. UNIX MAGAZINE 2004年4月号

図 15 795 796 797 803 804 805 806 図 16 1529 1530 1531 1532 1558 1559 1560 1561 1562 1563 1564 1565 1536 1547 1548 1551 連載 / 旧 v6 の実装 対応付け応答の選医 return ( 0 ) ; mbc—>mbc—lifetime / 2 / * XXX * / , NULL) ) { mbc—>mbc_status , mbc—>mbc_seqno, mbc—>mbc_lifetime , if (mip6—bc—send—ba(&mbc—>mbc—addr, &mbc—>mbc—phaddr, &mbc—>mbc—pcoa, nd6—dad—dup1icated(ifa) VOid nd6-dad-duplicated() 関数 (nd6-nbr. c) dp = NULL ; free(dp, M—IP6NDP) ; TAILQ_REMOVE(tdadq, (struct dadq *)dp, dad-list) ; nd6-dad-stoptimer (dp) ; ia—>ia6—f1ags ー = IN6—IFF—DUPLICATED; -IN6_IFF_TENTATIVE ; ia->ia6-f1ags & = dp = nd6—dad—find(ifa) ; struct ifaddr *ifa; = ENOENT) if (mip6—dad—dup1icated(ifa) #if defined(MIP6) & & defined(MIP6_HOME_AGENT) IFAFREE(ifa) ; #endif / * MIP6 & & MIP6—HOME_AGENT * / nd6-dad-duplicated() では、 DAD に失敗したアドレ スのフラグを更新し、重複マークを付けたあと ( 1 , 548 行 目 ) 、 DAD 中のアドレスのリストから該当アドレスのエン トリを削除します ( 1 , 558 ~ 1 , 559 行目 ) 。そして、 mip6- dad-duplicated() を呼び、 Mobile IPv6 特有の処理へ進 みます。 808 809 810 811 812 813 int mip6—dad—dup1icated(ifa) struct ifaddr *ifa; return mip6—dad—error(ifa, IP6_MH_BAS_DAD_FA 工 LED) ; mip6-dad-duplicated() は mip6-dad-error() のラッ パー関数です。実際には mip6-dad-error() カ呼び出され ます。 815 816 817 818 819 int mip6—dad—error(ifa, err) struct ifaddr *ifa; int err ; mip6-dad-error() は 2 つの引数をとります。 ifa は DAD に失敗したアドレスが十内された in6-ifaddr 構造 92 体へのポインタ、 err は対応付け応答で返送するステータ return (ENOENT) ; if (!mbc) break; ifa) if (mbc—>mbc—dad mbc = LIST-NEXT(mbc, mbc-entry) ) { mbc; for (mbc = LIST—FIRST(&mip6_bc_1ist) ; スコードです。 831 830 829 828 827 826 825 824 UNIX MAGAZINE 2004.4 応付けキャッシュの削除処理です。対応付けキャッシュが 836 行目以降は、 DAD に失敗したアドレスに対応する対 836 if ( (mbc—>mbc-flags & IP6MU—CLONED) in6-ifaddr 構造体の変数を解放します ( 833 ~ 834 行目 ) 。 DAD 処理が終了したので、アドレスを保持していた 834 mbc—>mbc_dad = NULL; 833 FREE(ifa, M_IFADDR) ; ます。 ば ENOENT を返し、通常の DAD 失敗時の処理に戻り 対応する対応付けキャッシュを確認します。存在しなけれ まず、 824 ~ 831 行目で DAD に失敗したアドレスに

3. UNIX MAGAZINE 2004年4月号

連載 / v6 の実装 キャッシュの削除 error = mip6—bc if (error) { 721 720 719 718 717 716 715 714 713 712 711 710 709 708 図 13 419 418 417 416 415 bi—>mbc_status 411 410 図 12 bi—>mbc_lifetime = bi—>mbc—refresh = 0 ; bi—>mbc—send_ba = 1 ; IP6_MH_BAS_UNSPECIFIED ; 1ist-remove(&mip6—bc-1ist, mbc) ; bzero( (caddr—t) ia, sizeof (*ia) ) ; DAD の対象となるアドレス情報の言綻 return (error) ; return (EINVAL) ; FREE (ia, M-IFADDR) ; &ia->ia—addr. sin6—scope—id) ) { (in6—addr2zoneid(ia—>ia—ifp, &ia—>ia—addr. sin6—addr, la—>ia—addr . sin6—addr = mbc—>mbc—phaddr ; 1a—>ia6—f1ags ー = IN6—IFF—TENTATIVE ; la—>ia—ifp = mbc—>mbc—ifp; la—>ia addr. sin6—Ien = sizeof (ia—>ia—addr) ; la—>ia—addr. sin6—fami1y = AF—INET6 ; la—>ia_ifa. ifa—addr (struct sockaddr *)&ia¯>ia—addr; if in6—embedscope (&ia—>ia—addr. sin6—addr , &ia¯>ia—addr) ; IFAREF(&ia->ia—ifa) ; ・ mip6-dad-success() : DAD 成功時の処理 ・ mip6-dad-error() : DAD 失敗時の処理 DAD の開始 DAD は mip6-dad-start() を呼び出すことで開始され ます。 695 696 697 698 static int mip6—dad—start (mbc) struct mip6—bc *mbc ; を確保します。 図 13 の 708 ~ 720 行目で DAD の対象となるアドレス 情報を in6-ifaddr 構造体に設疋します。注目すべき点は 2 カ所です。まず、 712 行目でアドレスか所属するインター フェイスとして、ホーム・ネットワークに接続しているイ ンターフェイス (mbc-ifp) を指定します。 2 つ目のポイ ントは 713 行目の IN6-IFF-TENTATIVE フラグです。 DAD による重複確認中であることを示すため、アドレス に TENTATIVE フラグを付けています。 mip6-dad-start() は DAD の対象となるアドレスに対 応する対応付けキャッシュへのポインタを引数にとります。 701 if (mbc->mbc—dad ! = NULL) 725 726 } 722 723 mbc—>mbc_dad = ia; nd6—dad—start ( (struct ifaddr *)ia, NULL) ; return ( 0 ) ; 702 return (EEXIST) ; mbc-dad は、このキャッシュに対して DAD がすでに 開始されている場合に定されます。すでに DAD 処理を 開始しているアドレスに対して再度 mip6-dad-start() を 呼び出したときには、エラーを返します。 704 MALLOC(ia, struct in6—ifaddr * , sizeof (*ia) , M-IFADDR, M—NOWAIT) ; if ()a = = NULL) return (ENOBUFS) ; DAD の実装自体は近隣探索の実装である nd6-dad- start() をそのまま使います。 nd6-dad-start() は DAD の対象となるアドレスを in6-ifaddr 構造体のかたちで受 け取るので、 704 ~ 706 行目で in6-ifaddr 構造体のメモリ 705 706 90 in6-ifaddr 構造体の準備ができたら、 DAD の処理中 であることが判断できるように mbc-dad に in6-ifaddr 構造体のポインタを設疋し、 nd6-dad-start() を呼び出し ます。 DAD 成功時の処理 DAD の処理は近隣探索の実装をそのまま使っているの で、 DAD が成功した場合は近隣探索の DAD 成功処理関 数カ野び出されます。 DAD 成否の判断は nd6-dad-timer() で実装されてい ます。該当部分を図 14 に示します。 UNIX MAGAZINE 2004.4

4. UNIX MAGAZINE 2004年4月号

連載 / v6 の実装ー⑦ 図 18 ホームアドレスに対するキャッシュの削除 871 872 873 880 887 gmbc—next = LIST—NEXT(gmbc , mbc—entry) ; e てて or = mip6—bc—1ist_remove( tmip6—bc—1ist , gmbc) ; 888 } 889 return ( 0 ) ; 対象となるキャッシュか有在した場合、まずそのキャッ シュの DAD 処理を mip6-dad-stop() で停止します。続 いて、 mip6-bc 」 ist-remove() でリンクローカル・アドレ スに対するキャッシュを削除します。 863 mip6—bc—send-ba(&gmbc->mbc-addr , 864 865 &gmbc—>mbc—phaddr , &gmbc—>mbc—pcoa , err, gmbc—>mbc—seqno, 0 , 0 , NULL) ; 続いて、ホームアドレスに対する DAD が失敗したこと を通知するために、 910 行目で mip6-bc-send-ba() を呼 び出して対応付け応答を返送し、最後に 912 行目でキャッ シュを削除します。 DAD の中断 工ラー処理中に DAD の実行を中断しなければならない 場合があります。 DAD の中断は mip6-dad-stop() で実 装されます。 ホームアドレスに対する DAD を途中で停止したため、 ホーム登録の返事としてエラーを返さなければなりません。 mip6-bc-send-ba() で、 DAD に失敗したことを示すス テータスコード (IP6-MH-BASDAD-FAILED) を返 します。 工ラーステータスの返送後、該当するホームアドレスに 対するキャッシュも図 18 の 872 ~ 873 行目で削除します。 890 } else { 728 729 730 731 734 735 736 737 738 739 740 i nt mip6-dad—stop(mbc) struct mip6—bc *mbc ; if ()a = = NULL) return (ENOENT) ; nd6—dad—stop( (struct ifaddr *)ia) ; FREE(ia, M_IFADDR) ; mbc->mbc_dad = NULL ; return ( 0 ) ; 896 897 898 906 if (mbc—>mbc—llmbc ! = NULL) { error mip6_bc_1ist—remove (&mip6-bc—1ist , mbc—>mbc—llmbc) ; 907 } 896 ~ 898 行目は、リンクローカル・アドレスではなく、 移動ノードのホームアドレスに対する DAD が失敗した場 合の処理です。この場合は、まず mip6-bc 」 ist-remove( で、関連するリンクローカル・アドレスのキャッシュを削 除します。 910 911 912 920 921 94 mip6—bc—send—ba(&mbc—>mbc—addr, &mbc—>mbc—phaddr , &mbc—>mbc—pcoa, err, mbc->mbc-seqno, 0 , 0 , NULL); mip6_bc_1ist—remove error (&mip6-bc—1ist , mbc) ; return ( 0 ) ; mip6-dad-st 叩 () は、 DAD 中断の対象となるアドレ スに対応するキャッシュへのポインタを引数にとります。 736 行目の nd6-dad-st 叩 () で該当アドレスに対する DAD 処理を停止し、アドレスをイ尉寺していた in6-ifaddr 構造体のメモリの解放と、 mbc-dad の初期化を実行しま す ( 737 ~ 738 行目 ) 。 ☆ 次回は、代理近隣探索とトンネルリンクの作成処理を解 説します。 UN 工 X MAGAZINE 2004.4 ( しま・けいいち IIJ)

5. UNIX MAGAZINE 2004年4月号

連載 / 旧 v6 の実装ー アドレス : ( 2 ) 参照カウント : キャッシュへのポインタ : リンクローカル・アドレス アドレス : 対応付けキャッシュのリスト 図 17 対応イ寸けキャッシュ間の車 リンクローカル・アドレス アドレス : ( 4 ) 参照カウント : キャッシュへのポインタ : リンクローカル・アドレス アドレス : ( 3 ) 参照カウント : キャッシュへのポインタ : リンクローカル・アドレス 参照カウント : キャッシュへのポインタ : ホーム・プレフィックス 1 : インターフェイス識別子 ホーム・プレフィックス 1 : インターフェイス識別子 FE80 : : インターフェイス識別子 ホーム・プレフィックス 1 : インターフェイス識別子 4 互いに関連している場合があるため、処理がややネ礬隹にな っています。図 17 に対応付けキャッシュの例を示します。 図 17 の状態のときに、たとえば ( 1 ) のキャッシュに対す る DAD カ敗したとします。この場合、 ( 1 ) のキャッシ ュを削除するとともに、 ( 1 ) から派生している ( 4 ) のキャッ シュの削除にの場合は参照カウンタの減算 ) も必要です。 また、 ( 4 ) のキャッシュに対する DAD が失敗した場合、 ( 4 ) を削除すると同時に、 ( 1 ) ~ ( 3 ) カ惨照している ( 4 ) へ のポインタも削除しなければなりません。 841 ~ 889 行目は、リンクローカル・アドレスに対する DAD が失敗した ( 図 17 でいえば ( 4 ) の DAD が失敗し た ) 場合の処理です。 841 11mbc = mbc; 842 for (gmbc = LIST—FIRST(&mip6-bc-1ist) ; シュを探します。 845 gmbc-next = LIST-NEXT (gmbc , mbc-entry) ; 846 if ( ( (gmbc—>mbc-flags & IP6MU—LINK) ! = 0 ) 847 848 & & ( (gmbc->mbc—flags & IP6MU—CLONED) = 0 ) llmbc) ) { & & (gmbc->mbc—llmbc 843 844 gmb c ; gmbc = gmbc-next) { 対象となるキャッシュは、 ・リンクローカルアドレス・キャッシュと関連している (IP6MU-LINK カ第ス疋されている。 846 行目 ) それ自体がリンクローカルアドレス・キャッシュではな い (IP6MU-CLONED が設疋されていない。 847 行 目 ) ・ mbc 」 lmbc カ哨リ除対象となるキャッシュを指している ( 848 行目 ) 必要があります。 849 gmbc-next = LIST—NEXT (gmbc , mbc—entry) ; 850 if (MIP6-IS_BC_DAD_WAIT(gmbc) ) { 842 ~ 887 行目のループで、すべての対応付けキャッシ ュをたどりながら、削除対象となるリンクローカルアドレ ス・キャッシュ (llmbc) を参照している対応付けキャッ UNIX MAGAZINE 2004.4 851 852 853 854 mip6—dad-stop(gmbc) ; gmbc—>mbc-llmbc = NULL; error = mip6—bC—1ist_remove ( &mip6—bc—1ist , llmbc) ; 93

6. UNIX MAGAZINE 2004年4月号

連載 / 旧 v6 の実装ー for ()r = nd-prefix. lh-first ; pr; pr = pr—>ndpr—next) { ホーム・ネットワークに属しているか )6 忍 図 10 361 362 363 364 365 366 367 368 369 374 375 376 377 378 図 11 397 399 400 404 405 406 407 408 409 if if (pr->ndpr-ifp ! = destifp) continue ; if (in6—are-prefix-equa1 (&bi->mbc—phaddr , &pr—>ndpr-prefix , pr->ndpr-plen) ) { hifp = pr->ndpr-ifp; / * home ifp. * / (hifp = = NULL) { bi—>mbc_status IP6_MH_BAS_NOT_HOME_SUBNET ; bi—>mbc_send_ba = 1 ; bi—>mbc—lifetime = bi—>mbc_refresh = 0 ; return ( 0 ) ; / * XXX is 0 OK? * / リンクローカルアドレス・キャッシュび )i 忍 if ((bi—>mbc—flags & IP6MU_LINK) & & (mbc—>mbc_llmbc ! = NULL) ) { bi—>mbc—lifetime = bi—>mbc_refresh = 0 ; bi—>mbc_send_ba = 1 ; IP6_MH_BAS_UNSPECIFIED ; bi—>mbc_status if (error) { error = mip6—bc—Iist—remove(&mip6—bc—1ist, mbc—>mbc_llmbc) ; return (error) ; 対応付けキャッシュに設疋されている移動ノードの気付 アドレスを、対応付け更新メッセージで指定された気付ア ドレスに更新します。通常、移動ノードはホーム・ネット ワークからホーム登録の解除を実行するので、気付アドレ スはホームアドレスと等しくなります。 397 ~ 409 行目 ( 図 11 ) は、削除対象となる対応付けキ ャッシュに関連するリンクローカルアドレス・キャッシュ の確認です。もし、 IP6MU-LINK フラグカ第乂疋されてお り、関連するリンクローカル・アドレスに対するキャッシュ を示す mbc 」 lmbc カ蔽疋されていたら、削除対象となる キャッシュに加えて、リンクローカル・アドレスのキャッシ ュも削除しなければなりません。 mip6-bc 」 ist-remove( で、リンクローカル・アドレスに対する対応付けキャッシュ を削除します。なお、リンクローカル・アドレスのキャッ シュは、複数の対応付けキャッシュから参照されている場 合があります。参照しているキャッシュの数は参照カウン タというかたちで記録されているため、 mip6-bc 」 ist-re- move() で実際にキャッシュカ哨リ除されるのは、参照元の キャッシュがすべて削除されたあとになります。 次に、削除対象のキャッシュを mip6-bc 」 ist-remove( で削除します ( 図 12 ) 。リンクローカル・アドレスに対す るキャッシュを削除するときも、ホームアドレスに対する UNIX MAGAZ 工 NE 2004.4 キャッシュを削除するときも、削除の過程でエラーが発生 した場合は IP6-MH-BAS-UNSPECIFIED をステータ スコードとして対応付け応を返送します。 422 423 425 426 } bi—>mbc_lifetime bi—>mbc_send_ba return ( 0 ) ; 1 ; 削除処理が無事終了したら、対応付け応答を返送するた めに mbc-send-ba を 1 に設疋し、呼出し元へ返ります。 重複アドレス検出 移動ノードがホーム・ネットワークから出先ネットワー クへ移動し、最初のホーム登録メッセージを送信してきた とき、ホーム・エージェントはホーム・ネットワーク上で 移動ノードと同じアドレスカ駛われていないかを確認しな ければなりません。すなわち、移動ノードに代わって重複 アドレス検出 (DAD : Duplicate Address Detection をおこなう必要があります。ホーム・エージェントでの DAD 処理は以下の関数で実装されています。 ・ mip6-dad-start() : DAD の開始 ・ mip6-dad-stop() : DAD の停止 89

7. UNIX MAGAZINE 2004年4月号

連載 / 旧 v6 の実装ー 図 7 対応付けキャッシュの更新 277 282 283 284 285 286 288 289 290 291 292 295 296 298 299 300 263 } else { mbc—>mbc mbc—>mbc mbc—>mbc mbc—>mbc _explre time_second 十 mbc—>mbc—lifetime ; mbc—>mbc_lifetime = bi—>mbc—lifetime; —seqno = bi—>mbc—seqno; —flags = bi—>mbc-flags ; —pcoa = bi¯>mbc—pcoa; mip6—bc—encapcheck, &mbc—>mbc—encap) ) { if (mip6—tunne1—contr01 (MIP6-TUNNEL-CHANGE, mbc , mip6—bc—settimer (mbc , mip6—brr—time (mbc) ) ; mip6—bc—settimer (mbc , mbc—>mbc_state = MIP6_BC_FSM_STATE—BOUND ; mbc—>mbc_expire 0x7fffffff; if (mbc—>mbc—expire く time—second) return ( ー 1 ) ; prim—mbc = mbc ; 254 ~ 260 行目で新しい対応付けキャッシュを作成しま 269 if (bi->mbc—flags & IP6MU-LINK) { 重複アドレス検出に利用します。 インタを prim-mbc に設疋します。 prim-mbc はあとで す。作成できたら、 263 行目で作成されたキャッシュのポ なので、解説は省略します。 if (busy) { 302 305 306 } return ( 0 ) ; 270 271 272 } mbc—>mbc_llmbc llmbc ; llmbc—>mbc_refcnt + + ; 302 ~ 306 行目は重複アドレス検出中のホーム登録の受 信処理です。以前受信したホーム登録を処理し、移動ノー ドのアドレスに対する重複アドレス検出をしているところ に、再度ホーム登録を受信すると busy が真になります。 この場合、以降の処理へは進まず、重複アドレス検出の終 了を待ちます。 308 if (prim—mbc) { 269 ~ 272 行目は、ホームアドレスに対応するリンク ローカル・アドレスのキャッシュとの関連付けです。 IP6 MU-LINK が指定されている場合、ホームアドレスに対 するキャッシュに加えて、リンクローカル・アドレスに対 するキャッシュも存在します。直前の処理で、リンクロー カル・アドレスに対する対応イ寸けキャッシュカ胙成もしく は更新されて llmbc に設疋されているので、 270 ~ 271 行 目で llmbc を参照し、参照カウントを増やします。 273 } else if (MIP6-IS—BC—DAD-WAIT(mbc) ) { 313 314 mip6—dad—start (prim—mbc) ; bi—>mbc_send_ba = 0 ; 274 275 276 mbc—>mbc—pcoa = bi—>mbc—pcoa; mbc—>mbc—seqno = bi—>mbc—seqno ; busy + + , 274 ~ 276 行目は、更新対象となった対応付けキャッシ ュの重複アドレス検出が終了していない場合の処理です。 リンクローカル・アドレスの場合と同様、気付アドレスと 通し番号を更新し、重複アドレス検出の終了を待ちます。 図 7 の 282 ~ 299 行目は対応付けキャッシュの更新処理 です。処理内容はリンクローカル・アドレスの場合と同じ UNIX MAGAZINE 2004.4 308 ~ 314 行目で、ホームアドレスの重複アドレス検出 処理を開始します。新しく対応付けキャッシュが作成され た場合、かならずホームアドレスの重複検出をしなければ なりません。 prim-mbc は対応付けキャッシュカ噺規作成 された場合に設疋されるので、 prim-mbc か奴疋されてい れば mip6-dad-start() を呼び出して重複アドレス検出を 開始します。この場合、対応付け応答は検出処理が終った あとでないと返送できないので、対応付け応答メッセージ の返送を才くする mbc-send-ba は 0 に設疋されます。 対応付けキャッシュカ噺規に作成されたのではなく、更 新されただけであれば、重複アドレス検出はすでに実施さ れているので不要です。図 8 の 320 ~ 323 行目で、再対 87

8. UNIX MAGAZINE 2004年4月号

連載 / v6 の実装ー⑦ 図 6 既存のリンクローカル・アドレスに対する対応付けキャッシュの更新 220 225 226 227 228 229 230 232 233 234 235 236 239 240 242 243 244 245 215 else llmbc—>mbc—pcoa = bi—>mbc—pcoa; llmbc—>mbc—flags = bi—>mbc—flags ; llmbc—>mbc-seqno = bi->mbc-seqno; llmbc—>mbc_lifetime = bi—>mbc_lifetime; —>mbc_expire time_second + llmbc—>mbc_lifetime; 11mbc mip6—bc—encapcheck, &llmbc—>mbc—encap)) { if (mip6-tunne1-contr01 (MIP6-TUNNEL-CHANGE, llmbc , mip6-bc—settimer(11mbc, mip6-brr—time(11mbc) ) ; mip6—bc—settimer(IImbc, llmbc->mbc_state = MIP6_BC_FSM_STATE_BOUND ; 0x7fffffff ; llmbc—>mbc—expire if (llmbc->mbc—expire く time-second) llmbc—>mbc—flags ー = IP6MU—CLONED ; mip6—dad—start (llmbc) ; 206 行目で移動ノードのリンクローカル・アドレスに対 する対応付けキャッシュを作成し、 215 行目で重複アドレ スの検出 ( を開始します。 216 } else if (MIP6-IS-BC—DAD_WAIT(11mbc) ) { 217 218 219 llmbc—>mbc—pcoa = bi—>mbc—pcoa; llmbc—>mbc—seqno = bi—>mbc—seqno; busy + + ; 217 ~ 219 行目は、重複アドレス検出中に、同じリンク ローカル・アドレスに対する対応付けの更新要求がきた場 合の処理です。このとき、移動ノードの気付アドレスと、対 応付け更新メッセージの通し番号を更新し、重複アドレス 検出の終了を待ちます。 図 6 の 225 ~ 244 行目は、既存のリンクローカル・アド レスに対する対応付けキャッシュの更新です。 225 ~ 230 行目で、移動ノードの気付アドレス (mbc-pcoa) 、対応付 けキャッシュのフラグ (mbc-flags) 、通し番号 (mbc-seq- (o) 、有効時間 (mbc 」 ifetime) 、有効時間が切れる時刻 (mbc-expire) を更新します。なお、 232 ~ 233 行目で有 効時間が 32 ビット符号付き整数の上限を超えたときの対 応をおこないます。 234 ~ 236 行目は、キャッシュの : 大態の設定とタイマー 関数の設定です。対応付け更新を受信した直後は、 234 行 目で BOUND 状態となります。この状態は、時間カ騷過 して有効時間が短くなると、対応付け再更新要求メッセー 86 ジを送信するために WAITBI や WAITB2 状態に遷移 します。遷移までの時間は mip6-bc-settimer() で指定 されます。対応付け再更新メッセージを送信するタイミン グは、仕様では規定されていません。 KAME では、有効 時間の半分カ釜過したときと 4 分の 3 が経過したときに、 必要であれば送信します。 239 行目は移動ノードに対する = NULL) { 252 if (mbc かれば 274 行目の更新処理に進みます。 リを検索し、存在しなければ 254 行目の作成処理に、みつ 251 行目でホームアドレスに対するキャッシュ・エント (&mip6-bc—1ist , &bi—>mbc—phaddr) ; 251 mbc = mip6-bc-1ist—find-withphaddr ュ情報の作成 / 更新処理に進みます。 続いて、移動ノードのホームアドレスに対するキャッシ め、 IP6MU-CLONED フラグを設定します。 -LINK によって作成されたエントリであることを示すた 最後に 244 行目で、この対応付けキャッシュが IP6MU トンネルリンクの設疋です。 254 255 256 257 259 260 mbc = mip6—bc—create(&bi—> if mbc—phaddr, &bi—>mbc—pcoa, &bi—>mbc—addr, bi—>mbc—flags , bi—>mbc—seqno , bi->mbc—lifetime , hifp) ; = NULL ) { (mbc return ( ー 1 ) ; UN 工 X MAGAZINE 2004.4

9. UNIX MAGAZINE 2004年4月号

連載 / 」 avaServer Pages く div style="padding—left :2ex;font¯style: italic; font—size:large; テンプレート文 く hr> く logic :present く h3 style="text—align: center; " > テンプレート文の登録く / h3 > く %@ taglib uri="/WEB—INF/struts—10gic. tld" prefix="logic" % > く %@ taglib uri="/WEB—INF/struts—htm1. tldl' prefix="html" % > く %@ taglib uri="/WEB-INF/struts-bean. tld" prefix="bean" % > く %@ page contentType="text/htm1 ; charset=EUC-JP" % > ・ tiles/addError. jsp のソース く /tiles : insert> く tiles :put name="body" va1ue="/ti1es/addError. jsp" / > く tiles : insert definition="site . mainLayout" flush="true" > く % taglib uri="/WEB-INF/struts-ti1es. tld" prefix="tiles" % > く %@ page language="j ava" % > く %@ page contentType="text/htm1 ; charset=EUC-JP" % > ・ pages/addError. jsp のソース く p > く /html : form> く tm1 : submit value=l' 登金泉"/> く html:text name="addForm" property="sentence" size="50"/> く html:form method="GET" action="add . dO" focus="sentence"> く p> 文節と文節の間には半角スペースを入れてください。 テンプレート文を入力してください。く br> く /logic :present> く hr> を登録しました。 く /div> く bean:write name="addForm" property="sentence"/> く div style="padding—left :2ex;font¯style: italic;font¯size:large; テンプレート文 く hr> く 10giC :present scope="request"> く htm1 :errors/> く h3 style="text—align: center; " > テンプレート文の登録く / h3 > く %@ taglib uri="/WEB-INF/struts-10gic. tld" prefix="logic" % > く %@ taglib uri="/WEB—INF/struts-htm1. tld" prefix="html" % > く %@ taglib uri="/WEB—INF/struts-bean. tld" prefix="bean" % > く %@ page contentType="text/htmI ; charset=EUC¯JP" % > ・ tiles/add. jsp のソース く /tiles : insert> く tiles :put name="body" value="/tiles/add. jsp" / > く ti1es : insert definition="site. mainLayout" flush="true" > UNIX MAGAZ 工 NE 2004.4 125

10. UNIX MAGAZINE 2004年4月号

連載 / 」 avaServer pages 図 22 言びのページの表示 △ファイルの編集 ( 印表示ジャンプ 0 ブッりマーり⑧ツール 0 ー . 新発ポーム、検索疎・ AOL 「ロカクマゆ ~ 」、、言集道び 第言集遊びー Netscape 第 0 を 宣伝文句製造機 表 1 テンプレート文の泉ページで吏うファイル ウインドウ ヘルプ ( 旦 ) 0 Powered by Struts ファイルの / ヾス pages/add. jsp tiles/add. jsp 処理成功時に呼び出されるファイル 処理成功時の本体タイル pages/addError. jsp 処理失貝寺に呼び出されるファイル tiles/addError. jsp 処理失員寺の本体タイル 表 2 テンプレート文の一覧表示ページに使うファイル 灰色の火第査革が第英を解き明か . ま外なトグック / あられた第室 / 単語を入力して「作る ! 」ボタンをクリッグノてください。 火星探査車 作る ! ファイルのパス pages/list. jsp tiles/list. jsp pages/listEmpty. jsp tiIes/IistEmpty ・ jsp テンプレート文が登録されている ときに呼び出されるファイル テンプレート文が登録されている ときの本体タイル テンプレート文が登録されていな いときに呼び出されるファイル テンプレート文が登録されていな いときの本体タイル く logic :present name="sentencel" : scope="request"> % 〉 ) カそのまま使えます。 などのように、 Struts のタグや JSP の式タグ く /logic :present> く % = request . getAttribute("sentence2 く % = request . getAttribute("sentence1") %> く br> 図 22 は言葉遊びのページの表示です。 Welcome ペー ジとは、次のような点が異なっています。 ・タイトルの文字列が、、言葉遊び " . フッタに Welcome ページへのリンクが表示されている ほかのページのソースコード wordgame のほかのページも、言葉遊びのページと同じ ように作成できます。 1. Struts から呼び出されるファイルに <tiles:insert 〉を 使ったレイアウトの指定を謎杢する。 2. Struts から呼び出されるもとのファイルを書き換え、本 体タイルにする。 図 23 テンプレート文の泉ページに使うファイル ・ pages/add ・ jsp のソース 残りのページについては、末尾に Struts から呼び出さ れるファイルと、本体タイルのソースコードを掲載するの で確認してください。 図 23 は、テンプレート文の登録ページに使うファイル のソースコードです。処理が成功した場合と失敗した場合 のそれぞれに、 Struts から呼び出されるファイルと本体タ イルを用意しています ( 表 1 ) 。 図 24 は、テンプレート文の一覧表示ページに使うファ イルのソースコードです。一覧表示のページでは、登録さ れたテンプレート文がある場合と 1 つもない場合のそれぞ れに、 Struts から呼び出されるファイルと本体タイルを用 意しています俵 2 ) 。 この連載では、 JavaServer Pages の基本的な知識から 始めて、タグライプラリに関する話題を紹介したり、 Struts を使ったアプリケーションの作り方を解説したりしました。 これで、 Web アプリケーションを作るときに便利な機能を ひととおり紹介しました。次回は、これまでに紹介してき た JavaServer Pages の話題の総まとめをして、連載の締 めくくりとする予定です。 ☆ く %@ page contentType="text/htm1 ; charset=EUC-JP" % > く %@ page language="java" % > く %@ taglib uri="/WEB-INF/struts—ti1es . tld" prefix="tiles" % > 124 ( あらい・みちこ ASTEC) UN 工 X MAGAZINE 2004.4