ー 0 連載 / v6 の実装 図 5 IDLE 状態で MOVEMENT イベントがした場合のタ歩里 129 switch (*mbu—pri—fsm—state) { 130 case MIP6_BU_PRI_FSM_STATE_IDLE : switch (event) { 131 case MIP6_BU_PRI_FSM_EVENT_MOVEMENT : 132 if ( (mbu—>mbu-flags & IP6MU-HOME) ! = 0 ) { 133 mbu—>mbu_retrans_count = 0 ; mip6—bu—pri—fsm—home—registration(mbu) ; error if (error) { / * continue and try again. * / 140 141 142 143 149 150 151 152 153 154 *mbu—pri_fsm_state MIP6_BU_PRI_FSM_STATE_WAITA ; else mip6—bu—sec—fsm(mbu, MIP6_BU_SEC_FSM_EVENT_START_RR , data) ; if (error) { retUrn (error) ; *mbu—pri—fsm—state MIP6_BU_PRI_FSM_STATE_RRINIT ; 158 159 160 161 167 168 169 170 171 172 break; 図 6 IDLE 状態で REVERSE-PACKET イベントか発生した場合のタ里 case MIP6_BU_PRI_FSM_EVENT_REVERSE_PACKET : if ( (mbu—>mbu—state & MIP6—BU—STATE—NEEDTUNNEL) * if the peer doesn't support M 工 P6 , * keep IDLE state . break; error = mip6—bu—sec—fsm(mbu, MIP6_BU_SEC_FSM_EVENT_START_RR, data) ; if (error) { return (error) ; 174 178 179 180 181 182 183 184 185 186 187 188 189 194 195 196 197 198 199 *mbu—pri—fsm—state = MlP6—BU—PRI—FSM—STATE RRINIT ; break; 合に発生します。以後、 MIP6-BU-STATE-DISABLE 合、 mip6-bu-sec-fsm() を使って START-RR イベント フラグを設疋し、このノードとのあいだで往復経路確認手 を発生させ、術夏糸各確認手続きを開始します。 続きが開始されないようにします。 201 ~ 213 行目 ( 図 7 ) は、 IDLE;IR 態で ICMPv6 工ラ ーメッセージ (Parameter ProbIem) を受信したときの RRINIT 状態 処理です。このイベントは、移動ノードの通信相手が Mo- 215 ~ 376 行目は RRINIT : 大態の処理です RRINIT bile IPv6 に対応しておらず、ホームアドレス・オプショ 状態は、移動ノードが固定ノードとのあ 0 、だ碆彳主復糸各確 ンもしくはモビリテイへッダに対してエラーを生成した場 100 UNIX MAGAZINE 2005 . 7
ー 0 連載 / 旧 v6 の実装 表 1 た兄の状態一覧 初期状態 MIP6-BU-PRI-FSM-STATE-IDLE 固定ノードに対応付け更新メッセージを週言するための往復糸箚寉認を実行中 MIP6-BU-PRI-FSM-STATE-RRINIT 固定ノードとのあいだの対応付けを更新するために彳夏糸登箚寉認を実行中 MIP6-BU-PRI-FSM-STATE-RRREDO 固定ノードとのあいだの対応付けを削除するために往復糸各確認を実行中 MIP6-BU-PRI-FSM-STATE-RRDEL 対応付け応答メッセージの受イ寺ち MIP6-BU-PRI-FSM-STATE-WAITA 対応付け情報の更新するための対応付け更新メッセージへの対応付け応答メッセー MIP6-BU-PRI-FSM-STATE-WAITAR ン の引言待ち 対応付け情報を削除するための対応付け更新メッセージへの対応付け応答メッセー MIP6-BU-PRI-FSM-STATE-WAITD ン の受信待ち 対応付けカ院了した状態 MIP6-BU-PRI-FSM-STATE-BOUND 表 2 砡忍の状態一覧 初期状 MIP6-BU-SEC-FSM-STATE-START ホームテスト要求と気付テスト要求を週言し、それぞれの応答を待っている状態 MIP6-BU-SEC-FSM-STATE-WAITHC ホームテスト要求メッセージを送信し、ホームテスト・メッセージを待っている状態 MIP6-BU-SEC-FSM-STATE-WAITH 気付テスト要求メッセージを j 当言し、気付テストメッセージを待っている状態 MIP6-BU-SEC-FSM-STATE-WAITC 表 3 状態遷移関数で用いられるイベント一覧 イベント 新しい出先ネットワークに接した MIP6-BU-PRI-FSM-EVENT-MOVEMENT リし ホーム・ネットワークに帰還した MIP6-BU-PRI-FSM-EVENT-RETURNING-HOME 固定ノードから糸各最適化されていないバケットを受イ言した MIP6-BU-PRI-FSM-EVENT-REVERSE-PACKET 往復辛箚寉認手続きカ院了した MIP6-BU-PRI-FSM-EVENT-RR-DONE 囀吏用 ( 彳夏糸箚在認手続きが失敗した ) MIP6-BU-PRI-FSM-EVENT-RR-FAILED 再対応付け要求メッセージを引言した MIP6-BU-PRI-FSM-EVENT-BRR 対応付け応答メッセージを受信した MIP6-BU-PRI-FSM-EVENT-BA 吏用 ( 未定義 ) MIP6-BU-PRI-FSM-EVENT-NO-BINDING 対応付けキャッシュがないホームアドレスを使用した MIP6-BU-PRI-FSM-EVENT-UNVERIFIED-HAO 未知のモビリテイへッダ・タイプ番号を使用した MIP6-BU-PRI-FSM-EVENT-UNKNOWN-MH-TYPE ICMPv6 Parameter Problem を受イ言した MIP6-BU-PRI-FSM-EVENT-ICMP-PARAMPROB 応答が必要なメッセージに対して、指定した時間内に応答を受信 MIP6-BU-PRI-FSM-EVENT-RETRANS-TIMER できなかった (mbu-pri-fsm-state 専用 ) 対応付け更新エントリの肩効時間延長時刻がきた MIP6-BU-PRI-FSM-EVENT-REFRESH-TIMER 囀吏用 ( 回復できないエラーカ咥生した ) MIP6-BU-PRI-FSM-EVENT-FAILURE-TIMER 彳夏糸箚在認手続きの開々幇韵ミ MIP6-BU-SEC-FSM-EVENT-START-RR ホーム・ネットワークでの彳も夏糸箚寉認手続きの開々旨示 MIP6-BU-SEC-FSM-EVENT-START-HOME-RR 往復糸箚寉認手イ売きの中 1 財韵ミ MIP6-BU-SEC-FSM-EVENT-STOP-RR ホームテスト・メッセージを受信した MIP6-BU-SEC-FSM-EVENT-HOT 気付テストメッセージを受イ言した MIP6-BU-SEC-FSM-EVENT-COT 応答が必要なメッセージに対して、指定した時間内に応答を受信 MIP6-BU-SEC-FSM-EVENT-RETRANS-TIMER できなかった (mbu-sec-fsm-state 専用 ) し、 mbu-sec-fsm-state は固定ノードとのあいだで実施 状態遷移関数 される往復経路確認手続きの進行状態を表します。これら のた態は、 MobiIe IPv6 に関係するイベント ( たとえば、 モビリテイへッダの送受信やエラーメッセージの受信、移 対応付け更新エントリの大態は、 mbu-pri-fsm-state と 動の検知など ) に応じて変化します。イベントの通知と状 mbu-sec-fsm-state メンバー変数に保持されています。 態の更新は、 mip6-bu-fsm() 関数を呼び出すことで間接 mbu-pri-fsmstate は対応付け更新清報の登録状態を表 97 UNIX MAGAZINE 2005 . 7
図 20 635 636 643 644 645 646 652 653 654 655 656 657 662 663 664 665 666 667 673 674 675 676 677 678 図 21 680 681 687 688 689 690 696 697 698 699 700 701 706 707 708 709 710 711 717 718 719 720 721 722 723 連載 / v6 の実装ー 0 if ( (mbu->mbu-flags & IP6MU-HOME) ! = 0 ) { case MIP6_BU_PRI_FSM_EVENT_MOVEMENT : WAITA 状態で MOVEMENT イベントか融した場合のタ里 else break; mbu—>mbu_retrans_count = 0 ; error = mip6—bu—pri—fsm—home—registration (mbu) ; if (error) { / * continue and try again. * / *mbu—pri—fsm_state MIP6_BU_PRI_FSM_STATE_WAITA ; mip6-bu—stop-timers (mbu) ; error = mip6—bu—sec—fsm(mbu , MIP6_BU_SEC_FSM_EVENT_START_RR, data) ; if (error) { return (error) ; *mbu—pri—fsm—state = MIP6_BU_PRI_FSM_STATE_RRINIT ; WAITA 状態で RETURNING-HOME イベントが . した場合のタ里 if ( (mbu—>mbu-flags & IP6MU—HOME) ! = 0 ) { case MIP6_BU_PRI_FSM_EVENT_RETURNING_HOME : else break ; mbu—>mbu_retrans_count = 0 ; error = mip6—bu—pri—fsm—home—registration (mbu) ; if (error) { / * continue and try again. * / *mbu—pri—fsm_state MIP6_BU_PRI_FSM_STATE_WAITD ; mip6—bu—stop—timers (mbu) ; error = mip6—bu—sec—fsm(mbu, MIP6_BU_SEC_FSM_EVENT_START_HOME_RR , data) ; if (error) { return (error) ; *mbu—pri—fsm_state MIP6_BU_PRI_FSM_STATE_RRDEL ; 付け更新メッセージを送信し、 WAITD 月越鬟に移ります。 701 ~ 722 行目は固定ノード用の処理です。 mip6-bu- sec-fsm() で START-HOME-RR イベントを発生させ、 108 ホーム・ネットワークでの往復経路確認手続きを開始しま す。ただし、この部分は実際には実行されません。 図 22 の 725 ~ 743 行目は、 WAITA)lk 態のときに RE- UNIX MAGAZINE 2005.7
図 11 307 312 313 314 315 316 317 322 323 324 325 326 327 328 329 330 331 図 12 333 337 338 339 340 345 346 347 348 349 350 図 13 352 357 358 359 360 361 362 367 368 369 370 371 372 373 374 375 376 連載 / 旧 v6 の実装ー 0 mbu—>mbu—expire = mono_time . tv_sec 十 mbu—>mbu—lifetime ; mbu—>mbu_lifetime = 0 ; / * free mbu * / *mbu—pri—fsm—state = MIP6—BU—PR 工—FSM—STATE—IDLE ; (error) ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_STOP_RR , error = mip6—bu—sec—fsm(mbu, mip6-bu—stop-timers (mbu) ; case MIP6_BU_PRI_FSM_EVENT_RETURNING_HOME : RRINIT 状態で RETURNING-HOME イへントを受信した場合のタ歩里 mbu—>mbu—state ー = MIP6—BU—STATE—DISABLE ; *mbu—pri—fsm—state = MIP6—BU—PRI—FSM—STATE_IDLE ; (error) ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_STOP_RR , error mip6—bu—sec—fsm(mbu, mip6—bu—stop—timers (mbu) ; case MIP6_BU_PRI_FSM_EVENT_ICMP_PARAMPROB : RRINIT 状態で ICMPv6 工ラーメッセージを受信した場合のタ里 break; *mbu-pri-fsm-state = MIP6—BU—PRI—FSM-STATE—RR 工 NIT ; return (error) ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_START_RR , error mip6—bu—sec—fsm(mbu, case MIP6_BU_PRI_FSM_EVENT_REVERSE_PACKET : RRINIT 状態で REVERSE-PACKET イベントを受信した場合のタ里 break; break ; break; VERSE-PACKET イベントを受信した場合の処理です。 RRINIT は、すでに往復経路確認手続きを始めた状態で す。この状態でホーム・エージェントからトンネル経由の バケットを受信したとしても、とくに更する必要はあり ません。図 12 のコードでは、再度 START-RR イベント UN 工 X MAGAZ 工 NE 2005 . 7 を発生させていますが、 こは本来は不要です。 352 ~ 376 行目 ( 図 13 ) は、 RRINIT た態で ICMPv6 工ラーメッセージ (Parameter Problem) を受信したと きの処理です。これは、移動ノードが往復経路確認手続き を開始したものの、実祭は相手のノードが MobiIe IPv6 に 103
連載 / 旧 v6 の実装ー 0 図 7 IDLE 状態で ICMPv6 工ラーメッセージを受信した場合の処理 201 205 206 207 208 209 210 211 212 213 case MIP6_BU_PRI_FSM_EVENT_ICMP_PARAMPROB : mip6—bu—stop—timers (mbu) ; *mbu—pri—fsm—state = MlP6—BU—PRI—FSM—STATE_IDLE ; mbu—>mbu—state ー = MIP6—BU—STATE—DISABLE ; break ; break ・ 図 8 RRINIT 状態で RR-DONE イベントを言した場合のタ里 215 case MIP6—BU—PRI—FSM_STATE_RRINIT : 216 217 218 227 228 229 230 231 237 238 243 244 245 246 247 248 249 250 251 252 switch (event) { case MIP6_BU_PRI_FSM_EVENT_RR_DONE : if ( (mbu—>mbu—flags & IP6MU—ACK) ! = 0 ) { *mbu—prl—fsm—state / * XXX Ⅱ 0 code yet . * / else break ; MIP6_BU_PRI_FSM_STATE_WAITA ; mip6—bu—send—cbu (mbu) ; if (error) { return (error) ; mbu—>mbu_retrans mono_time . tv_sec 十 mbu—>mbu_lifetime ; *mbu—pri—fsm—state ー MIP6_BU_PRI_FSM_STATE_BOUND ; 認手続きを実行中であることを示します。 図 8 の 217 ~ 252 行目は、 RRINIT た態で RR - DONE イベントを受信した場合の処理です。 RR-DONE イベン トは、往復経路確認手続きが正常に完了したときに発生し ます。移動ノードは往復経路確認の過程で作成した秘密情 報を使って対応付け更新メッセージを送信します。 KAME では、固定ノードに対応付け更新メッセージを 送信する場合、 A フラグを指定しません。 218 ~ 230 行目 に該当するコードを記述する部分が用意されていますが、 現時点では実行されません。固定ノードへの対応付け更新 メッセージは、 237 行目の mip6-bu-send-cbu() 関数で A フラグなしで送信されます。 ホーム登録用に作成されたエントリと異なり、固定ノー ド用に生成された対応付け更新エントリの有効時間を移動 ノードか積極的に延長することはありません。次の対応付 け更新メッセージを送信する時刻を表す mbu-retrans に UNIX MAGAZINE 2005 . 7 は、肩効時間が切れる時刻を誌定します ( 246 ~ 247 行目 ) 。 固定ノードへの対応付けでは、応答メッセージを待たな い実装になっているので、次の状態は BOUND になりま す ( 249 ~ 250 行目 ) 。 254 ~ 276 行目 ( 図 9 ) は、 RRINIT 状態のときに UN- KNOWN-MH-TYPE イベントを受信した場合の処理で す。このイベントは、通信相手がモビリテイへッダを認識 するものの、送信したヘッダタイプに対応していないとき に発生します。第 1 版となる仕様力開されただけの現時 点では、ノードカ坏明なモビリテイへッダ・タイプを送受信 することはありません。しかし、固定ノード側が経路最適 化を避けるために、移動ノードから送信されたホームテス ト・メッセージや気付テストメッセージに対し意図的に工 ラーを返すことは考えられます。このイベントを受信した 場合は、 mip6-bu-sec-fsm() 関数で STOP-RR イベント を発生させて往復経路確認手続きを中止し、以後ふたたび 101
図 18 573 578 583 584 590 591 592 593 594 595 596 597 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 図 19 618 619 620 621 622 627 628 629 630 631 632 633 連載 / 旧 v6 の実装ー 0 if ( (mbu—>mbu—flags & 工 P6MU—HOME) ! = 0 ) { case MIP6_BU_PRI_FSM_EVENT_RETRANS_TIMER : 、 VAITA 状態で RETRANS-TIMER イベントかした場合のタ里 else break; error = mip6—bu—pri—fsm—home—registration(mbu) ; if (error) { / * continue and try again. * / *mbu—pri_fsm_state MIP6_BU_PRI_FSM_STATE_WAITA ; mip6—bu—send—cbu(mbu) ; error if ( er て 0 て ) { return (error) ; if (mbu—>mbu_retrans_count 十十 > M 工 P6_BU_MAX_BACKOFF) mbu—>mbu retrans_count = MIP6_BU_MAX_BACKOFF ; mbu—>mbu retrans mono_time . tv_sec 十 ( 1 くく mbu—>mbu_retrans_count) ; *mbu—pri—fsm—state MIP6_BU_PRI_FSM_STATE_WAITA ; WAITA 状態で UNKNOS,VN-MH-TYPE イベントが発生した場合のタ里 case MIP6_BU_PR 工 _FSM_EVENT_UNKNOWN_MH_TYPE : if ( (mbu—>mbu-flags & IP6MU—HOME) ! = 0 ) { / * XXX correct ? * / break ; mip6—bu—stop—timers (mbu) ; *mbu—pri—fsm—state = MIP6—BU—PRI—FSM—STATE_IDLE ; mbu—>mbu—state ー = MIP6 BU—STATE—DISABLE ; break; に無視します ( 619 ~ 622 行目 ) 。 UNIX MAGAZINE 2005 . 7 registration() で対応付け更新メッセージを送信します。 -retrans-count を 0 に民し、 mip6-bu-pri-fsm-home- ホーム登録の場合 ( 636 ~ 656 行目 ) 、再送カウンタ mbu 録手続きをやりなおさなければなりなせん。 カ噺しいネットワークに接続したことを未するので、登 MENT イベントが発生した場合の処理です。移動ノード 635 ~ 678 行目 ( 図 20 ) は、 WAITA 月た態で MOVE- 実祭は実行されません。 に対する処理ですが、 WAITA た態になることはないため、 627 ~ 631 行目は固定ノード用の対応付け更新エントリ 次状態は WAITA のままです。 657 ~ 677 行目は固定ノード用の処理です。固定ノード 用の対応付け更新エントリが WAITA 状態に入ることは ないので実際には実行されませんが、処理内容としては、往 復糸各確認の開始となります。 680 ~ 723 行目 ( 図 21 ) は、 WAITA 状態のときに RE ー TURNING-HOME イベントが発生した場合の処理で す。 681 ~ 700 行目はホーム登録用の対応付け更新エントリ の処理です。移動ノードがホーム・ネットワークに帰還し たので、 mip(j-bu-pri-fsm-home-registration() で対応 107
ー 0 図 23 775 781 786 787 793 794 795 796 797 798 803 804 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 図 24 929 933 934 935 936 941 942 943 944 945 946 947 948 連載 / Ⅲ v6 の実装 if ( (mbu->mbu-flags & IP6MU—HOME) ! = 0 ) { case MIP6_BU_PRI_FSM_EVENT_RETRANS_TIMER : WAITAR 状態で RETRANS-TIMER イベントかした場合のタ里 if (mbu—>mbu—retrans_count 十十 if (error) { error mip6—bu—send—cbu(mbu) ; = MIP6_BU_PRI_FSM_STATE_WAITAR ; *mbu—pri—fsm_state / * continue and try again. * / if ( e てて or ) { error mip6—bu—pri—fsm—home—registration (mbu) ; 十 ( 1 くく mbu—>mbu_retrans_count) ; mono_time . tV_sec mbu—>mbu_retrans = MIP6_BU_MAX_BACKOFF ; mbu—>mbu retrans_count > MIP6_BU_MAX_BACKOFF) MIP6_BU_PRI_FSM_STATE_WAITAR ; *mbu—pri_fsm_state break ; WAITAR 状態で REVERSE-PACKET イベントかもた場合のタ里 *mbu—pri—fsm—state = MIP6—BU—PRI—FSM—STATE RRREDO ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_START_RR , error = mip6—bu—sec—fsm(mbu, case MIP6_BU_PRI_FSM_EVENT_REVERSE_PACKET : break; break ; 基本的に WAITA た態で REVERSE-PACKET イベン トが発生した場合と同様の処理になりますが、現在の状態 が WAITAR なので、次の状態は RRREDO になりま す。なお、 KAME の実装では固定ノード用の対応付け更 新エントリが WAITAR 状態になることがないため、この コードが実行されることはありません。 次回は、今回紹介できなかった登録状態の状態遷移の実 ☆ 110 装と、彳主復糸登各確認用の状態遷移の実装を解説します。 ( しま・けいいち IIJ) UNIX MAGAZINE 2005 . 7
ー 0 連載 / Ⅲ v6 の実装 図 9 RRINIT 状態で UNKNOVVN-MH-TYPE イベントを受信した場合のタ里 254 259 260 261 262 263 264 269 270 271 272 273 274 275 276 図 10 278 284 285 286 287 288 289 290 291 292 293 294 295 300 301 302 303 304 305 case MIP6_BU_PRI_FSM_EVENT_UNKNOWN_MH_TYPE : mip6-bu—stop—timers (mbu) ; error = mip6—bu—sec—fsm(mbu, MIP6_BU_SEC_FSM_EVENT_STOP_RR, data) ; if (error) { return (error) ; *mbu—pri—fsm—state = MIP6-BU-PRI-FSM—STATE_IDLE ; mbu—>mbu—state ー = MIP6_BU—STATE_DISABLE ; break ; RRINIT 状態で MOVEMENT イベントを受信した場合のタ里 case MIP6_BU_PRI_FSM_EVENT_MOVEMENT : mip6-bu—stop—timers (mbu) ; error = mip6—bu—sec—fsm(mbu, return (error) ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_START_RR , error = mip6—bu—sec—fsm(mbu, (error data) ; MIP6_BU_SEC_FSM_EVENT_STOP_RR , *mbu—pri—fsm—state = M 工 P6—BU—PRI—FSM—STATE_RRINIT ; break ; 手続きが開始されないように MIP6-BU-STATE-DIS- ABLE フラグを設疋します。状態は IDLE 状態に遷移し 0 278 ~ 305 行目 ( 図 10 ) は、 RRINIT た態で MOVE- MENT イベントを受信した場合の処理です。移動ノード がネットワークを移動すると気付アドレスカ畯化するので、 実行中の往復経路確認をやりなおさなければなりません。 mip6-bu-sec-fsm() で STOP-RR イベントを発生させ て現在進行中の手続きを中断し、新しい気付アドレスを用 いて往復経路確認を開始するために START-RR イベン トを発生させます。 なお、移動にともなって変化するのは気付アドレスだけ なので、実際には往復経路確認全体をやりなおさず、気 付アドレスの確認のみをおこなえばよい場合もあります。 102 KAME では、この場合分けは実装せずに、移動の際は往 復糸各確認のすべての澱売きを再言于します。 次の状態は RRINIT のままです。 307 ~ 331 行目 ( 図 11 ) は RRINIT;l)d 態のときに RE- TURNING-HOME イベントを受信した場合の処理で す。往復糸登各確認手続きカ院了する前にホーム・ネットワ ークに帰還しているので、 mip6-bu-sec-fsm() で STOP -RR イベントを発生させて手続きを中止し、状態を IDLE 状態に戻します ( 314 ~ 325 行目 ) 。 ホーム・ネットワークに帰還したあとは、対応付け更新 工ントリカ坏要になるので、 328 ~ 329 行目で有効時間を 0 に設定します。有効時間が 0 のエントリは、次回のタイ マー処理の過程でエントリのリストから取り除かれます。 333 ~ 350 行目 ( 図 12 ) は RRINIT)Ik 態のときに RE- UNIX MAGAZINE 2005 . 7
ー 0 図 14 378 379 380 381 390 391 392 393 394 400 401 406 407 408 409 410 411 412 413 414 415 連載 / 旧 v6 の実装 if ( (mbu->mbu-flags & IP6MU_ACK) ! = 0 ) { case MIP6_BU_PR 工—FSM_EVENT_RR_DONE : switch (event) { case MIP6_BU_PRI_FSM_STATE_RRREDO : RRREDO 状態で RR-DONE イベントを言した場合のタ里 *mbu—pri—fsm—state / * XXX no code yet . * / else break; MIP6_BU_PRI_FSM_STATE_WAITAR; error = mip6—bu—send—cbu(mbu) ; if (error) { return (error) ; mbu—>mbu_retrans mono_time . tv_sec 十 mbu—>mbu_lifetime ; *mbu—pri—fsm—state = MIP6_BU_PRI_FSM_STATE_BOUND ; 対応していない場合に発生します。 MobiIe IPv6 に対応 していない固定ノードは、移動ノードが送信したホームテ 104 INIT 状態で同じイベントを受信した場合の処理とほば同 RR-DONE イベントを受信した場合の処理です。 RR- 図 14 の 380 ~ 415 行目は、 RRREDO 状態のときに 似ており、重複したコードも多く見られます。 RRREDO 状態の処理は、 RRINIT 状態の処理によく メッセージを送信した場合に発生します。 です。これは、固定ノードが移動ノードへ再対応付け要求 レスカ畯わらないまま往復経路確認手続きを開始する状態 きに遷移する状態であるのに対し、 RRREDO は気付アド だし、 RRINIT は移動ノードの気付アドレスか変化したと ノードが往復経路確認手続きを実行している状態です。た REDO は、 RRINIT た態と同様に、移動ノードと固定 378 ~ 542 行目は RRREDO 状態の処理です。 RR- RRRED O 状態 状態です。 確認手続きを開始しないようにします。次の越は IDLE -DISABLE フラグを設定し、以後同じ通信相手と往復糸登各 続きを中断します。また、 372 行目で MIP6-BU-STATE 行目で STOP-RR イベントを発生させて彳主復経路確認手 ため、 ICMPv6 工ラーを生成します。この場合、 359 ~ 361 スト・メッセージや気付テストメッセージを解釈できない ーの動作になります。違いは A フラグか第定されている対 応付け更新エントリの次状態 ( 393 行目 ) のみですが、すで に解説したとおり、 KAME では固定ノード用の対応付け 更新エントリに A フラグを指定しないため、実際の動作は RRINIT 状態のときとまったく同じになります。 417 case MIP6_BU_PRI_FSM_EVENT_UNKNOWN_MH_TYPE : ( 図 9 と同じ処理 ) 439 break; 417 ~ 439 行目は、 RRREDO た態で UNKNOWN- MH-TYPE イベントを受信したときの処理です。この処 理は RRINIT た態で UNKNOWN-MH-TYPE イベン トを受信したときと同じ動作になるので、コードおよび解 説は省略します。 441 case MIP6_BU_PRI_FSM_EVENT_MOVEMENT : ( 図 10 と同じ処理 ) 468 break; 441 ~ 468 行目は RRREDO 状態で MOVEMENT イベントを受信したときの処理です。この処理は、 RR- INIT 状態で MOVEMENT イベントを受信したときと 同じ動作になります。コードおよび解説は省略します。 470 ~ 497 行目 ( 図 15 ) は、 RRREDO 状態で RE- TURNING-HOME イベントを受信したときの処理で す。 RRREDO 状態は、対応付け情報の登録カ院了し、 さらに往復経路確認手続きを実行している状態なので、ま UNIX MAGAZ 工 NE 2005.7
図 15 470 476 477 478 479 480 481 482 483 484 485 486 487 492 493 494 495 496 497 図 16 499 503 504 505 506 511 512 513 514 515 516 連載 / 旧 v6 の実装ー 0 RRREDO 状態で RETURNING-HOME イベントを受信したときのタ里 case MIP6_BU_PRI_FSM_EVENT_RETURNING_HOME : mip6—bu-stop-timers (mbu) ; error = mip6—bu—sec—fsm(mbu, return (error) ; if (error) { data) ; MIP6_BU_SEC_FSM_EVENT_START_HOME_RR, error mip6—bu—sec—fsm(mbu, (error data) ; MIP6_BU_SEC_FSM_EVENT_STOP_RR, if *mbu—pri—fsm—state = MIP6-BU—PR 工—FSM—STATE—RRREDO ; if ( er て 0 て ) { data) ; MIP6_BU_SEC_FSM_EVENT_START_RR , error mip6—bu—sec—fsm(mbu, c as e M IP6_BU_PRI _FSM_EVENT_REVERSE_PACKET : RRREDO 状態で REVERSE-PACKET イベントを受信したときのタ里 break; *mbu—pri—fsm—state = MIP6—BU—PRI—FSM—STATE_RRDEL ; break ; ず 478 行目の mip6-bu-sec-fsm() で STOP-RR イベ ントを発生させ、現在実行中の彳主復経路確認手続きを中止 します。続いて、現在登録している対応付け情報を解除す るために、 483 行目の mip6-bu-sec-fsm() で START- HOME ー RR イベントを発生させ、ホーム・ネットワーク 帰還時の登金年除処理を開始します。 次の状態は、登金年除のための往復経路確認手続きの完 了を待っ RRDEL 状態になります。 499 ~ 516 行目 ( 図 16 ) は、 RRREDO 状態で RE- VERSE-PACKET イベントを受信したときの処理です。 この処理は RRINIT た態で REVERSE-PACKET イ べントを受信したときの処理と同じ動作になりますが、次 : 大態が RRINIT ではなく RRREDO た態である点が異 なります。 518 case MIP6_BU_PRI_FSM_EVENT_ICMP_PARAMPROB : ( 図 13 と同じ処理 540 break ; UNIX MAGAZINE 2005 . 7 541 } 542 break ; 518 ~ 542 行目は、 RRREDO*R 態で ICMPv6 工ラー メッセージ (Parameter Problem) を受信したときの処 理です。通常、 RRINIT 状態の処理に問題がないにもか かわらず、 RRREDO 状態で ICMPv6 工ラーを受信する ことはないはすですが、念のためにコードだけは準備して あります。この部分は RRINIT 状態で ICMPv6 工ラー メッセージを受信した場合と同じ処理になるので、コード の引用と解説は省略します。 WAITA 状態 544 ~ 744 行目は WAITA た態の処理です。 WAITA 状態は移動ノードが対応イ寸け更新メッセージを送信し、そ の応答として対応付け応答メッセージを待っている状態で す。なお、 KAME の実装では、固定ノードに対して対応 付け応答メッセージを要求しません。この項で解説するコ 105