連載 / 旧 v6 の実装ー 0 図 3 mip6-ha 構造体 mha_ addr 256 struct mip6—ha { 257 258 259 260 261 262 263 264 265 267 271 } ; TAILQ_ENTRY (mip6_ha) struct in6_addr u_int8_t u_int16_t u_int16_t time_t time_t 10 g struct ca110ut mha mha mha mha timer_ch ; mha_ntick ; timeout ; mha_expxre ; lifetime; mha—pref ; mha—flags ; entry ; lladdr or g10ba1 addr * / / * RA flags * / home agent preference * / router lifetime * / next timeout time . * / 272 TAILQ—HEAD (mip6_ha_1ist , mip6_ha) ; 図 4 mip6-prefix 構〕冒本と mip6-ha 構〕制本の関係 mip6_prefix_list mip6_ha_Iist mip6—prefix{} mpfx—entry mpfx—ha 」 ist mip6—prefix_ha{} mpfxha_entry mpfxha_mha mip6—prefix—ha{} mpfxha_entry mpfxha_mha m i p6_ha{} mha_entry m ip6_prefix{} mpfx_ha list m pfx—entry mpfxha_mha mpfxha_entry mip6_prefix_ha{} mpfxha_mha m pfxh a_e ntry m ip6_prefix_ha{} mha_entry mip6_ha{} m i p6—p refix{} mpfx_entry mpfx_ha list mip6—prefix—ha{} mpfxha_entry mpfxha_mha mip6_ha{} mha_entry timeout 、 mha-ntick 、 mha-timer-ch は mip6-ha 構造 体のタイマー処理関数で利用されます。 図 4 に、前節で紹介した mip6-prefix 構造体と mip6- ha 構造体の関係を示します。 ジェント ( もしくはルータ ) の情報は mip6 ー ホームエーシェント↑ & の管理 56 ホームエー ha 構造体で管理されます。 mip6-ha 構造体の操作を容易 にするため、いくっかのサービス関数が定義されています。 以後のコードは mip6-halist. c からの才卆です。 ホームエージェント↑の作成 mip6-ha 構造体は mip6-ha-create() で作成されます。 94 struct mip6_ha * UN 工 X MAGAZINE 2005.2
連載 / 旧 v6 の実装ー 0 図 1 mip6-prefix キ冓〕当本 279 struct mip6_prefix { 280 281 282 283 284 285 286 287 288 289 290 291 292 293 295 299 } ; L 工 ST_ENTRY (mip6_prefix) mpfx_entry ; struct in6_addr u_int8_t u_int32_t time_t u_int32_t time_t struct in6_addr mpfx—prefix; mpfx—prefixlen ; mpfx—vltime ; vlexpire; mpfx—pltime ; mpfx-plexpire ; mpfx-haddr ; mpfx— LIST_HEAD(mip6—prefix—ha—Iist , mip6—prefix—ha) mpfx—ha—list ; int int time_t long struct callout mpfx—refcnt ; mpfx—state ; mpfx—timeout ; mpfx—ntick ; mpfx—timer_ch ; 300 LIST_HEAD(mip6_prefix—1ist , mip6—prefix) ; 表 1 mip6-prefix 構〕本の状態 値 MIP6-PREFIX-STATE-PREFERRED MIP6-PREFIX-STATE-EXPIRING 図 2 mip6-prefix-ha 構 ; 本 struct mip6—prefix—ha { 274 状態 プレフィックスカ鮪効である プレフィックスは有効だが、推奨有効時間が切れている 275 276 277 } ; LIST_ENTRY (mip6_prefix—ha) mpfxha_entry ; struct mip6—ha *mpfxha—mha; レフィックス情報を広告しているルータ情報 (mip6-pre- fix-ha 構造体 ) へのポインタをリストとして保持していま す。 rnpfx-refcnt は mip6-prefix 構造体の参照カウント として用いられていましたが、現在は使われていません。 mpfx-state はプレフィックスの状態を示します。現在、 表 1 に示す 2 種類の状態が定義されています。これらの状 態は、移動ノードがホームエージェントとプレフィックス 情報の更新手続きを開始する条件として利用されます。 mpfx-timeout 、 mpfx-ntick 、 mpfx-timer-ch は、い ずれも mip6-prefix 構造体のタイマー処理関数で利用され ます。 続いて、 mip6-prefix-ha 構造体を解説します。図 2 に この構造体の定義を示します。 mip6-prefix-ha 構造体は mip6-ha 構造体のポインタを格納し、 mip6-prefix 構造 体の mpfx-ha 」 ist メンバー変数の要素としてルータ情報 のリストを保持します。 mip6-ha 構造体は次節でとりあ げます。 UNIX MAGAZINE 2005.2 ホームエーシェント↑侵 移動ノードカ第哉しているルータの情報は、 mip6-ha 構 造体に保持されます。名前が示すとおり、この構造体はホ ームエージェントの情報を格納する構造体としても利用さ れます。 KAME/MIP6 では mip6-ha 構造体をルータ とホームエージェント両方の情報を保持するために共用し ます。図 3 に mip6-ha 構造体の定義を示します。 mip6-ha 構造体はルータ情報のリストを示す mip6-ha- list ( 272 行目 ) の要素です。 mha-entry でリストを構成 します。 mha-addr はルータのアドレス、 mha-flags はル ータ通知に含まれるフラグの値のコピーです。ホームエー ジェントの場合、通常のルータ通知のフラグに加え、ホー ムエージェントであることを示すフラグカ羸疋されます。 mha-pref はルータがホームエージェントとして動作し ているときの優先度です。 mha 」 ifetime はルータの有効 時間、 mha-expire は有効時間が切れる時刻です。 mha- 55
連載 / v6 の実装ー 0 図 9 mip6-ha 構造体の再挿ス、タ歩里 321 322 323 324 325 328 329 330 331 332 333 図 10 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 mip6 for (tgtmha = TAILQ—FIRST(mha_1ist) ; tgtmha; tgtmha = TAILQ—NEXT (tgtmha, mha-entry) ) { if (tgtmha = = mha) break; if (tgtmha ! = NULL) TAILQ_REMOVE (mha_list , tgtmha , mha_entry) ; mip6—ha—1ist—insert (mha—list, mha) ; return ; -prefix 構本の参照肖畭 for (mpfx = LIST—FIRST(&mip6_prefix_1ist) ; mpfx; mpfx = LIST—NEXT (mpfx , mpfx_entry) ) { for (mpfxha = LIST-FIRST (&mpfx—>mpfx_ha_list) ; mpfxha ; mpfxha = mpfxha-next) { LIST_NEXT (mpfxha , mpfxha_entry) ; mp f xh a—ne xt if (mpfxha->mpfxha—mha = = mha) mip6—prefix—ha-1ist—remove (&mpfx—>mpfx—ha—list , mpfxha) ; mha , mha—entry) ; TAILQ_REMOVE (mha_list , mip6—ha—settimer (mha, FREE (mha, M_TEMP) ; return ( 0 ) ; 図 9 の 321 ~ 325 行目で、引数で指定された mip6 」 ma 構造体をリストから検索します。指定された mip6-ha 構 造体がみつかれば、 329 行目でリストからいったん取り除 き、 mip6-ha 」 ist-insert() を用いて再挿入します。 mip6-ha 構造体をリストから削除するには mip6-ha- list-remove() を使います。 336 int 337 mip6—ha—Iist—remove(mha—Iist , mha) 338 339 340 { struct mip6—ha—Iist *mha—list; struct mip6—ha *mha ; 参照されているかどうかを調べます。参照されていれば、 354 ~ 356 行目で参照を削除します。ここで使われている mip6-prefix-ha 」 ist-remove() など、プレフィックス構 造を操作する関数は次回以降に解説します。 mip6-prefix 構造体の参照を削除したら、 360 行目で mip6 ー ha 構造体をホームエージェント情報のリストから 取り除き、 361 行目でタイマー呼出しを停止したあとに削 除します。 ホームエーシェント情報の検索 ホームエージェントのリストから特定のアドレスをも つ mip6-ha 構造体を検索するには、 mip6-ha 」 ist-find- withaddr() を使います。 410 struct mip6_ha * 411 mip6—ha—Iist—find—withaddr (mha—list , addr) mip6-ha 」 ist-remove() は 2 つの引数をもち、 mha- list が mip6-ha 構造体のリストへのポインタ、 rnha カ哨リ 除する mip6-ha 構造体へのポインタです。 まず、図 10 の 349 行目の for ループで、プレフィッ クスのリストに含まれている mip6-prefix 構造体をすべ て調べます。 mip6-prefix 構造体は mip6-ha 構造体へ のポインタを保持しているため、 mip6-ha 構造体を削除 する場合は、 mip6-prefix 構造体からの参照も同時に削除 しなければなりません。 351 行目の for ループで、削除 対象となる mip6-ha 構造体が mip6-prefix 構造体から 60 412 413 414 { struct mip6—ha—1ist *mha—list ; struct in6_addr *addr ; mip6-ha 」 ist-find-withaddr() は 2 つの引数をもちま す。 mha 」 ist はホームエージェント情報のリスト、 addr は検索対象となるアドレスです。 UNIX MAGAZ 工 NE 2005 . 2
IPv6 の実装 32 島慶ー 旧 v6 モビリティ ( 1 1 ) KAME では、公式に Mobile IPv6 のサポートを開始 して以来、その多くの部分をカーネルの機能の一部として 実装してきました。カーネルでの実装にはいくつか問題が 指摘されていました。たとえば、デバッグが困難な場合が あることや、カーネルが大きく変更されると各種 BSD に マージする際の障害になるかもしれない、といった点です。 さらに、開発資源の重複の問題もありました。 KAME の母体である WIDE プロジェクトには、ほかにも BSD をベースとした Mobile IPv6 実装を開発している部隊が あったのです。そこで、これらの実装を 1 つにまとめ、ユ ーザー空間での実装として再設計することで、開発資源の 統合と、カーネル空間での実装の問題の解決を図りました。 2004 年 12 月の時点で、すでに旧い MobiIe IPv6 のコー ドは KAME から削除され、新たに書き起こされたコード が追加されています。新しい実装では、 Mobile lPv6 だ けでなく、 NEMO (NEtwork MObi1ity) の実装も提供 しています。 NEMO は移動ネットワークを実現する技術 です。 MobiIe IPv6 は IPv6 ホストに移動通信機能を追 加する仕様ですが、 NEMO は IPv6 ルータに移動通信機 能を追加します。 NEMO を実装したルータが管理するサ プネットワークに割り当てられたアドレスは、ルータが移 動しても変化しません。サプネットに接続したすべてのノ ードは、ルータの移動を意識せずに接続を維持できます。 今後、 KAME プロジェクトでは、新コードをもとにし てさらなる実装窈東と機能の追加を進めていく予定です。 ただし、現時点では新コードよりも旧コードのほうが機能、 品質ともに優れており、仕様の実装を学ぶには後者のほう が適しています。そこで、本連載では旧コードをベースと して解説を続けていくこととします。 54 今回参照するファイル 今回は、移動ノードの実装に関する以下のファイルを参 照します。 ・ kame/sys/netinet6/mip6-halist. c ( 改訂番号 1.13 ) ・ kame/sys/netinet6/mip6-mncore. c ( 改訂番号 1.54 ) ・ kame/sys/netinet6/mip6-icmp6. c ( 改訂番号 1.93 ) ・ kame/sys/netinet6/mip6-var. h ( 改訂番号 1.117 ) ・ kame/sys/netinet/icmp6. h ( 改訂番号 1.94 ) UN 工 X MAGAZINE 2005.2 prefix-ha 構造体のリストです。各プレフィックスは、プ 動ノードのホームアドレスです。 mpfx_ha 」 ist は mip6_ mpfx-haddr は、このプレフィックスから生成された移 ックスの効時間と推奨効時間が切れる時刻を示します。 mpfx-vlexpire と mpfx-plexpire はそれぞれ、プレフィ pltime はプレフィックスの有効時間と推奨有効時間です。 ックス値とプレフィックス長です。 mpfx_vltime 、 mpfx_ mpfx-prefix と mpfx-prefixlen はそれぞれ、プレフィ mpfx-entry でリスト化されます。 義されている mip6-prefix 」 ist に保持され、 280 行目の リを表します。プレフィックス・リストは 300 行目で定 mip6 ー prefix 構造体はプレフィックス・リストのエント らの抜粋です。 図 1 に示します。以下、引用するコードは mip6_var. h か 本的なプレフィックス情報を示す mip6_prefix 構造体を プレフィックス・リストとして管理しています。まず、基 移動ノードは、自分が関係するプレフィックスの情報を プレフィックス情報
図 11 417 418 419 420 421 422 423 424 図 12 783 784 785 786 787 788 789 790 791 792 連載 / v6 の実装ー 0 特定のアドレスをもつ mip6-ha 構造体のオ for (mha = TAILQ-FIRST(mha_1ist) ; mha; mha = TAILQ-NEXT (mha , mha—entry) ) { if (IN6_ARE_ADDR_EQUAL (&mha—>mha—addr , return (mha) ; / * not found. * / ret urn ( NULL ) ; ホームアドレスの取出し for (mpfx = LIST-FIRST(&mip6_prefix—1ist) ; mpfx; mpfx = LIST-NEXT (mpfx , mpfx—entry) ) { addr ) ) if (hif—prefix—list—find—withmpfx(&sc—>hif—prefix—list—home, mpfx) = NULL ) continue ; if (IN6_IS_ADDR_UNSPECIFIED (&mpfx—>mpfx-haddr) ) hoa_scope in6—addrscope (hoa) ; hoa = &mpfx—>mpfx—haddr ; C ont inue ; 図 11 の 417 行目の for ループでリストの要素をすべて 確認し、 addr で指定されたアドレスが mha-addr に設疋 されている mip6-ha 構造体を返します。該当する mip6- ha 構造体がなければ NULL を返します。 移動の検出 移動ノードは、起動するとまず最初に現在位置を確認し ます。 KAME の Mobile IPv6 スタックでは、利用でき る気付アドレスによって現在位置を決定します。移動ノー ドに割り当てられたアドレスがホーム・ネットワークと同 じプレフィックスをもっていれば、そのノードは現在ホー ムにいると考えられます。そうでなければ、出先ネットワ ークに接続されています。現在の気付アドレスを決定する 処理は mip6-select-coa() で実装されています。以下、引 用するコードは mip6-mncore. c からの抜粋です。 767 int 768 mip6—se1ect—coa(sc) struct hif_softc *sc; 769 770 { mip6-select-coa() は、ホーム・ネットワークを表す構 造体である hif-softc 構造体へのポインタを引数にもちま す。 KAME の MobiIe IPv6 実装では、 1 つのホーム・ ネットワーク ( 1 つの hif-softc 構造体 ) に 1 つの気付アド レスが関係づけられます。移動ノードは、あるホーム・ネ ットワーク (hif-softc 構造体に相当 ) で複数のホームアド レスをもつ可能性がありますが、その場合はすべてのホー ムアドレスに同じ気付アドレスが対応付けられます。 UNIX MAGAZINE 2005 . 2 mip6-select-coa() は、アドレスのた態か変化したとき に呼び出されます。たとえば、リンク上のルータからルー タ通知を受信し、新しいアドレスが追加された場合や、プ レフィックスの有効時間が切れてアドレスカ哨リ除された場 合などです。また、アドレスのプレフィックスを通知して いたルータカリ達不能になったことで、アドレスがネット ワークから切り離された状態 (DETACHED 状態 ) にな ったときにも呼び出されます。 DETACHED 状態は移動 検出において重要です。これは通常、移動ノードがネット ワークを移動し、旧いアドレスカ坏リ用できなくなったとき に発生するからです。 783 ~ 792 行目 ( 図 12 ) で、 hif インターフェイスに割 り当てられているホームアドレスを 1 っ取り出します。ホ ームアドレスは mip6-prefix 構造体の mpfx-haddr に格 納されているので、ホーム・ネットワークのプレフィック ス情報が保持されている hif-prefix 」 ist-home をたどり ながら、最初にみつけたホームアドレスとそのスコープ情 報を hoa と hoa-scope にオします。 794 ia_best = NULL ; 795 fo て ()a = in6_ifaddr; ia; 796 797 ia—>ia—next) { la_scope ia_matchlen 795 行目の for ループでは、現在利用可能な気付アドレ スを順番に取り出し、そのなかからホームアドレスにもっ とも適したアドレスを確認していきます。 if (ia—>ia—ifp->if—type 800 IFT_HIF) 801 goto next ; 61
図 21 523 524 525 526 527 528 529 530 539 540 541 542 543 544 545 図 22 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 連載 / 旧 v6 の実装ー 0 対応付け更新リストのホームエージェント・アドレスの言 for (mbu = LIST—FIRST(&sc—>hif_bu_1ist) ; mbu; mbu = LIST-NEXT (mbu , mbu-entry) ) { if ( (mbu->mbu-flags & IP6MU—HOME) & & IN6_ 工 S_ADDR—UNSPECIF 工 ED (&mbu—>mbu_paddr) ) { mip6—dhaad—ha—1ist—insert (hif , mha) static int ホームエージェント・リスト (mpfx-ha 」 ist) の更新 return ( 0 ) ; if (mip6-bu-send—bu (mbu) ) { if ( ! MIP6_IS_BU_BOUND_STATE (mbu) ) { mbu—>mbu—paddr = mha—prefered—>mha—addr ; / * home registration. * / mip6—prefix—ha—Iist—insert (&hpfx—>hpfx—mpfx—>mpfx—ha—list , hpfx = LIST—NEXT(hpfx, hpfx-entry) ) { for (hpfx = LIST—FIRST(&hif—>hif_prefix—Iist—home) ; hpfx; struct hif—prefix *hpfx; struct mip6—ha *mha; struct hif_softc *hif ; mha) ; 行します。このとき、対応付け更新リストのホームエージ return ( 0 ) ; UNIX MAGAZINE 2005 . 2 ホームエージェントへのポインタをもつように、プレフィ 報が、動的ホームエージェント・アドレス探索でみつかった イスに保持されているすべてのホーム・プレフィックス情 ます。図 22 の 554 行目の for ループで、 hif インターフェ ホーム・プレフィックス情報を広告していると仮定してい す。 KAME の実装では、各ホームエージェントが共通の いホームエージェント情報を受信したときに呼び出されま 数は、動的ホームエージェント・アドレス探索によって新し されているホームエージェント情報を更新します。この関 スに保持されているホーム・プレフィックス情報から参照 mip6-dhaad-ha 」 ist-insert() は、 hif インターフェイ 先度の高いものを定します。 ってみつかったホームエージェントのなかで、もっとも優 あるエントリを検索し、動的ホームエージェント探索によ トのなかから、ホームエージェントのアドレスが未定義で 定されています。 523 ~ 542 行目では、対応付け更新リス ェント・アドレスには、仮の値として未定義アドレスカ毅 ックス情報のホー を更新します。 ム、エージェント ☆ ・リスト (mpfx-ha 」 ist) 次回も引き続き移動ノードの処理を解説します。 ( しま・けいいち IIJ) 69
ー 0 図 13 826 827 828 829 830 831 832 833 834 835 836 838 839 図 14 842 843 844 845 846 847 848 849 850 851 ホームアドレスとの上交 連載 / v6 の実装 f0 て (mpfx mpfx if if LIST_FIRST (&mip6_prefix-1ist) ; mpfx ; LIST_NEXT(mpfx, mpfx_entry) ) { (hif-prefix—list—find—withmpfx( &sc->hif-prefix—list—home, mpfx) = = NULL) C011tinue ; (IN6_ARE_ADDR—EQUAL (&mpfx—>mpfx_haddr , &ia—>ia—addr . sin6—addr) ) { ia_best goto out ; if (ia—best = = NULL) goto replace ; アドレススコープの上交 in6—addrscope(&ia—>ia—addr. sin6—addr) ; la_scope if (IN6_ARE_SCOPE_CMP(ia_best-scope, ia_scope) く 0 ) { if (IN6 ARE_SCOPE_CMP(ia_best_scope , hoa_scope) く 0 ) goto replace ; goto next ; } else if (IN6-ARE-SCOPE—CMP(ia_scope, ia—best-scope) く 0 ) { if (IN6_ARE_SCOPE_CMP(ia_scope , hoa_scope) く 0 ) goto replace; goto next ; IFT-HIF は hif インターフェイスを示すタイプ番号で す。 hif インターフェイスに気付アドレスが割り当てられ ることはないので無視します ( 800 ~ 801 行目 ) 。 803 804 814 818 822 823 809 810 811 815 819 if if if if (ia—>ia6—f1ags & (IN6_IFF_ANYCAST ー工N6ー工 FF_DETACHED ー IN6_IFF_DUPLICATED) ) goto next ; (IN6_IS_ADDR_LOOPBACK (&ia—> ia—addr . sin6—addr) ) goto next ; (IN6_IS_ADDR—LINKLOCAL(&ia-> ia—addr . sin6—addr) ) goto next ; (ia—>ia6—fIags & IN6—IFF—TEMPORARY) goto next ; ートしていません ( 822 ~ 823 行目 ) 。 図 13 の 826 ~ 836 行目で、現在確認中のアドレスと hif インターフェイスに割り当てられているホームアドレスを 比較します。ホームアドレスと同じアドレスならば、移動 ノードがホーム・ネットワークに接続したことを未しま す。この場合は、 834 行目で即座にループを終了します。 ホームアドレスと同じ気付アドレスではなかった場合、こ のアドレスをとりあえずの候補アドレスとして次の気付ア ドレスの比較へ進みます ( 838 ~ 839 行目 ) 。 842 ~ 851 行目 ( 図 14 ) でアドレススコープを比較しま す。もし、現在確認中のアドレス (ia) のスコープ清報が、 こまでの比較で残った候補アドレス (ia-best) よりもホ ームアドレスのスコープ清報 (hoa-scope) に近ければ、確 認中のアドレスを新しい候補に設定します。そうでなけれ ば、引き続きこれまでの候補アドレスを保持します。 803 ~ 823 行目で利用できないアドレスを排除します。 まず、ェニーキャスト・アドレス、切り離された (DE- TACHED) アドレス、重複したアドレスを気付アドレス として選択することはできません ( 803 ~ 811 行目 ) 。ルー プバック・アドレスやリンクローカル・アドレスも気付ア ドレスとして選べません ( 814 ~ 819 行目 ) 。また、 IPv6 アドレスのプライバシー拡張 ( RFC3041 ) を気付アドレス に利用することは、仕様上は可能ですが、現時点ではサポ 62 854 855 856 857 if ( ! IFA6_IS_DEPRECATED (ia-best) & & IFA6_IS_DEPRECATED ( (a) ) goto next ; if (IFA6_IS_DEPRECATED (ia—best) & & ! IFA6_IS_DEPRECATED (ia) ) goto replace ; 854 ~ 857 行目は推奨有効時間の比較です。推奨肩効時 間が切れていないアドレスがより適切な候補として選択さ れます。 UNIX MAGAZINE 2005 . 2
図 17 604 605 606 607 608 609 610 612 613 614 615 図 18 630 631 632 633 634 635 636 637 連載 / v6 の実装ー 0 ホームエージェント・ェニーキャスト・アドレスの作成 for (mpfx = LIST—FIRST(&mip6_prefix-1ist) ; mpfx; if (hif—prefix—list—find—withmpfx(&sc—>hif—prefix—list—home, mpfx = LIST—NEXT (mpfx , mpfx—entry) ) { if if mpfx) ) break; (mpfx = NULL ) { return (EINVAL) ; (mip6-icmp6—create-haanyaddr (&haanyaddr , mpfx) ) return (EINVAL) ; IPv6 ヘッダフィールド / 重加勺ホームエージェント探索要求メッセージ・フィールドの言綻 sc—>hif dhaad—id = mip6—dhaad—id + + ; ip6 = mtod(m , struct ip6-hdr * ) ; hdreq = (struct mip6—dhaad—req * ) (ip6 + 1 ) ; bzero( (caddr-t)hdreq, sizeof (struct mip6-dhaad—req) ) ; hdreq->mip6—dhreq—type = MIP6—HA-DISCOVERY-REQUEST ; hdreq—>mip6—dhreq—code hdreq—>mip6—dhreq—id = htons (sc¯>hif dhaad—id) ; ーキャスト・アドレスを引算します。 COVERY-REQUEST ( 144 ) カリ用されます。コード 番号は定義されておらず、 0 で初期化しなければなりませ 618 619 620 627 628 621 icmp61en = sizeof (struct mip6—dhaad—req) ; mip6—create—ip6hdr(&hif—coa, ん。 640 641 if (m &haanyaddr , IPPROTO_ 工 CMPV6 , icmp61en) ; = NULL) { return (ENOBUFS) ; sizeof (struct ip6—hdr) ; off hdreq->mip6—dhreq—cksum = in6-cksum(m, IPPROTO_ICMPV6, off , icmp61en) ; 640 ~ 641 行目は ICMPv6 チェックサムの計算です。 in6-cksum() 関数でメッセージのチェックサム値を計算 し、 mip6-dhreq-cksum にオ内します。 618 ~ 628 行目で動的ホームエージェント探索要求メッ セージを本内するための mbuf を確保します。 mip6-cre- ate-ip6hdr() は、指定された始点アドレス、終点アドレス、 次へッダ値、ペイロード長をもつ IPv6 バケットを作成す る関数です。バケットの作成に失敗したらエラーで終了し ます ( 621 ~ 627 行目 ) 。 630 ~ 637 行目 ( 図 18 ) で、未設疋の IPv6 ヘッダフ ィールドと、動的ホームエージェント探索要求メッセージ のフィールドを設疋します。 hif-dhaad-id には、動的ホ ームエージェント探索要求メッセージと応答メッセージを 対応付けるための識別子がオ内されています ( 630 行目 ) 。 メッセージの識別子が重複しないよう、要求メッセージを 送信するたびに hif-dhaad-id の値を増やします。なお、 動的ホームエージェント探索要求メッセージを表す mip6- dhaad-rep 構造体は 2004 年 9 月号で解説済みなので省 略します。 動的ホームエージェント探索メッセージは ICMPv6 メ ッセージの一種です。タイプ番号として MIP6-HA-DIS- UN 工 X MAGAZINE 2005 . 2 644 654 655 649 error = ip6-output (), NULL , NULL , 0 , NULL , NULL ) ; return (error) ; if (error) { 644 ~ 655 行目で動的ホームエージェント探索要求メッ セージを送信します。送信の過程でエラーが発生した場 合、処理を中断し、エラー値を呼出し側に返します。 図 19 の 658 ~ 666 行目で、動的ホームエージェント探 索要求メッセージの再送に関するパラメータを更新します。 hif-dhaad 」 astsent は、最後に要求メッセージが送イ言され た時刻をイ尉寺します。 hif-dhaad-count は、動的ホームエ ージェント探索応答メッセージを受信するまでに再送した 要求メッセージの数です。この数値をもとに、指数関数的 な再送間隔を計算します。 MIP6DHAAD-RETRIES は、仕様で定義されている最大再送回数です。ただし、再 65