galp - みる会図書館


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

1. UNIX MAGAZINE 2004年8月号

図 15 354 366 367 368 369 370 371 372 373 374 図 16 377 378 379 380 381 382 356 357 358 359 360 361 362 363 364 384 385 386 387 388 389 390 317 318 連載 / 旧 v6 の実装ー 0 泉済みアドレスのリストからの削除 else { if (galp—>hagent-next-gaddr) { galp—>hagent—next—gaddr—>hagent—prev—gaddr galp->hagent-prev-gaddr ; if (galp->hagent—prev-gaddr) { galp—>hagent—prev—gaddr—>hagent—next—gaddr galp¯>hagent—next—gaddr ; galp->hagent—next-gaddr = galp->hagent—prev-gaddr if (galp—>hagent-next-expire) { galp¯>hagent—next—expire—>hagent—prev—expire galp->hagent-prev-expire ; if (galp->hagent—prev—expire) { galp¯>hagent—prev—expire—>hagent—next—expire galp—>hagent—next—expire ; NULL ; galp—>hagent—next—expire = galp¯>hagent—prev—expire = NULL ; フラグ情報と有咬加の更新 if (pi—>nd-opt—pi—flags-reserved & ND—OPT—PI-FLAG—ONLINK) galp—>hagent—flags ・ onlink = 1 ; (pi->nd-opt-pi—flags-reserved & galp—>hagent-flags . autonomous ND_OPT_PI_FLAG_AUTO) ? 1 galp—>hagent-flags. router = (pi->nd-opt-pi-flags-reserved & ND_OPT_PI_FLAG_ROUTER) ? 1 if (pi—>nd-opt-pi-flags—reserved & ND-OPT-PI—FLAG-ONLINK) { if (hal-gaddr-init-prefix—ltimes(galp) ) galp¯>hagent—pltime = nt0hl (pi¯>nd—opt—pi—preferred—time) ; galp->hagent—vltime = nt0h1 (pi—>nd—opt-pi—valid-time) ; goto err; struct nd—opt—prefix—info *pi ; hal-gaddr-add() 関数は 3 つの引数をもちます。 halp はアドレスを追加する hagent-entry 構造体へのポイン 夕、 lastp はグローバルアドレスのリストを一時的に保持 するメモリ領域へのポインタ、 pi はルータ通知で受信した プレフィックス情報へのポインタです。 ます、 321 ~ 322 行目 ( 図 13 ) で、追加しようとしている アドレスがすでにリストに登録済みかどうかを確認します。 hal-gaddr-find() は第 1 引数で指定した hagent-entry 構造体から第 2 引数で指定したアドレスと第 3 引数で指定 したプレフィックス長をもつグローバルアドレスのエント リを検索します。 指定されたアドレスが未登録だった場合、図 14 の 324 ~ 330 行目で新たにメモリを確保し、 332 ~ 352 行目で 各メンバー変数を初期化します。 hagent-gaddr にプレ UNIX MAGAZINE 2004.8 フィックス情報に収められていたグローバルアドレスを、 hagent-prefixlen にプレフィックス長を設疋します。 ha- gent-flags はプレフィックス情報のフラグ情報のコピー です。 hal-gaddr-init-prefix 」 times() は、プレフィッ クスの有効時間 (hagent-vltime) と推奨有効時間 (ha- gent-pltime) から有勠時間が切れる時刻を引算して、 ha- gent-expire と hagent-preferred を設疋します。 指定されたアドレスがすでにリストに登録されていた ら、ますリストからエントリを削除します。 hagent-entry 構造体と同様に、 hagent-gaddr 構造体も 2 つのリストで 管理されています。 1 つは、それぞれのホームエージェン ト情報 (hagent-entry 構造体 ) ごとに保持されたリスト、 もう 1 つはすべてのアドレス情報カ陏勠時間順に並んだリ ストです。図 15 の 356 ~ 364 行目で hagent-entry 構造 体ごとに管理されているリストから、 366 ~ 374 行目で有 効時間順のリストから該当するエントリを取り除きます。 79

2. UNIX MAGAZINE 2004年8月号

図 17 398 399 400 401 402 403 404 405 406 408 409 410 411 412 413 415 416 417 418 420 421 422 423 連載 / v6 の実装ー 0 有交加寺間偵に並んだリストへのエントリの挿入 for (prevp = curp = gaddr—expire—head. hagent—next—expire ; curp—>hagent—prev—expire—>hagent—next—expire = galp ; if (curp->hagent—prev-expire) { curp ; galp—>hagent—next—expire curp¯>hagent—prev—expire ; galp—>hagent-prev—expire if (curp—>hagent-expire > galp->hagent-expire) { curp ; curp = curp¯>hagent—next—expire) { curp—>hagent—prev—expire break ; prevp = curp ; if ( ! curp) { if (prevp) { prevp—>hagent—next—expire galp¯>hagent—prev—expire else { galp ; galp ; prevp ; gaddr—expire—head. hagent—next—expire = galp ; galp¯>hagent—prev—expire = &gaddr—expire—head ; 図 16 の 377 ~ 382 行目でフラグ情報を更新します。受 信したプレフィックス情報がオンリンク・プレフィックス だった場合、 384 ~ 389 行目で肩効時間も更新します。 392 lastp—>hagent—next—gaddr = galp ; 393 galp—>hagent—prev—gaddr = lastp ; 395 lastp = galp; 392 ~ 393 行目で、 lastp に確保されている一時メモリに グローバルアドレスの情報をリスト形式で追加します。 のリストが、最終的なグローバルアドレス群として登録さ れます。 398 ~ 423 行目 ( 図 17 ) で、もう 1 つの ( 有効時間順 の ) リストにエントリを挿入します。手川頁は、 hagent-en- try 構造体を有効時間順に並べたリストに挿入する場合 と同様です。グローバルアドレス全体のリストは gaddr- list-head 変数を先頭として保持されているので、 gaddr- list-head に内されている hagent-gaddr 構造体のポイ ンタ (hagent-next-expire) をたどりながら適切な位置に 工ントリを挿入します。 425 err: return lastp; 426 427 } 最後に、一時リストをオ内したアドレスを呼出し側の関 数に返して終了します。このアドレスは、次に解説する hal 80 -gaddr 」 ast() 関数に渡され、既存のグローノヾルアドレス・ リストと置き換えられます。 499 void 500 hal-gaddr-last (halp, newgal) リストへのポインタです。 add() 関数で作成されたグローバルアドレスを収めた一時 工ージェント情報へのポインタ、 newgal は hal-gaddr- はグローバルアドレス・リストの置換え対象となるホーム hal-gaddr-last() 関数は 2 つの引数をもちます。 halp 503 { 502 struct hagent—gaddr *newgal ; 501 struct hagent—entry *halp ; 506 507 508 511 512 for (galp = &halp—>hagent—galist ; galp¯>hagent—next—gaddr ! = NULL ; galp = galp¯>hagent—next—gaddr) / * nothing to do * / galp->hagent—next—gaddr = newgal ; newgal—>hagent—prev—gaddr = galp ; 506 ~ 508 行目で現在保持されているグローバルアド レス・リストの最後尾工ントリを検索します。その後、 511 行目で一時リストをリストの最後に追加します。 hal- gaddr-add() で一時リストを作成する過程で、一時リスト に格納されているアドレスは、 hagent-entry 構造体に登 録されているリストから取り除かれているので、グローバ 513 } UNIX MAGAZ 工 NE 2004.8

3. UNIX MAGAZINE 2004年8月号

連載 / v6 の実装ー 0 図 12 優先偵 / 有交加蔀頁のリストからのエントリの肖畭 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 図 13 321 322 図 14 324 326 327 329 330 galp->hagent—flags . router 332 333 334 335 336 337 338 339 340 341 342 343 351 352 353 sizeof (struct in6—addr) ) ; bcopy(&(pi->nd-opt-pi-prefix) , &(galp->hagent—gaddr) , bzero(galp, sizeof (struct hagent-gaddr)) ; goto err; = NULL) { if (galp galp = malloc(sizeof (struct hagent—gaddr) ) ; if ( ! galp) { メモリび )i 寉保とメンバー変数のネ騏用ヒ pi—>nd—opt—pi—prefix—len) ; galp = hal-gaddr—find (halp , &pi—>nd-opt-pi—prefix , 〕ロするアドレスがリストにあるか C)E 忍 if if if if (halp->hagent-prev—pref) { halp—>hagent-prev-pref—>hagent-next-pref halp->hagent-next-pref ; (halp—>hagent—next—pref) { halp—>hagent—next—pref—>hagent—prev—pref halp->hagent-prev-pref ; (halp—>hagent—prev-expire) { halp¯>hagent—prev—expire—>hagent—next—expire halp—>hagent—next—expire ; (halp¯>hagent—next—expire) { halp¯>hagent—next—expire—>hagent—prev—expire halp—>hagent—prev—expire ; galp¯>hagent—pref ixlen = pi¯>nd—opt—pi—prefix—len; galp—>hagent—flags . onlink = (pi->nd-opt—pi-flags-reserved & ND_OPT_PI_FLAG_ONLINK) ? 1 (pi—>nd—opt—pi—flags—reserved & galp¯>hagent—flags . autonomous ND_OPT_PI_FLAG_AUTO) ? 1 (pi—>nd—opt—pi—flags—reserved & ND_OPT_PI_FLAG_ROUTER) ? 1 galp¯>hagent—vltime = ntOh1 (pi¯>nd—opt—pi—valid—time) ; galp¯>hagent—pltime = ntOhl (pi¯>nd—opt—pi—preferred—time) ; if (hal-gaddr—init—prefix—ltimes(galp) ) goto err ; のリストを保持している hagent-ifinfo 構造体へのポイン 夕、 ha-addr は検索したいホームエージェントのアドレス へのポインタです。 305 306 307 302 303 304 for (halp = haif—>halist—pref . hagent-next-pref ; halp ; halp = halp->hagent-next-pref ) if (IN6_ARE_ADDR_EQUAL ( & (halp—> hagent—addr) , ha—addr) ) return halp ; break; レスをもつ工ントリを探します。みつかればそのエントリ が、みつからなければ NULL が返されます。 グローバルアドレスの追加 ホームエージェント情報を保持する hagent-entry 構 造体には、ホームエージェントのグローバルアドレスを 示すリストへのポインタが含まれます。あるホームエージ ェント情報にグローノヾルアドレスを追加する場合は hal- gaddr-add() 関数を使います。 313 struct hagent—gaddr * 314 hal-gaddr-add(halp, lastp, pi) 308 } インターフェイスごとに管理されているホー ント・リストをたどりながら、同じリンクローカル・アド ンエ 78 315 316 struct hagent—entry *halp ; struct hagent—gaddr *lastp ; UNIX MAGAZINE 2004.8

4. UNIX MAGAZINE 2004年8月号

図 18 473 474 475 476 477 478 479 480 図 19 526 527 528 531 532 533 534 535 536 537 538 連載 / v6 の実装ー 0 グローバルアドレスのオ for (galp = halp—>hagent—galist . hagent—next—gaddr ; galp ; galp = galp->hagent-next-gaddr) { if ( (galp—>hagent—prefixlen ha—prefixlen) & & IN6_ARE_ADDR_EQUAL ( & (galp->hagent_gaddr) , ha_addr) ) break ; return galp ; グローバルアドレス・リストの角攵 while (halp—>hagent—galist . hagent—next—gaddr) { tmp = halp—>hagent—galist . hagent—next—gaddr ; halp—>hagent—galist . hagent—next—gaddr = tmp—>hagent—next—gaddr ; if (tmp—>hagent—next—expire) { tmp¯>hagent—next—expire—>hagent—prev—expire tmp—>hagent—prev—expire ; if (tmp—>hagent—prev—expire) { tmp—>hagent—prev—expire—>hagent—next—expire tmp¯>hagent—next—expire ; ルアドレスの重複登録カ吮生することはありません。 グローバルアドレスの検索 あるホームエージェントのグローバルアドレス情報を検 索するには hal-gaddr-find() 関数を使います。 465 static struct hagent_gaddr * 466 hal—gaddr—f ind(halp , ha—addr , 467 468 469 ha—prefixlen) struct hagent—entry *halp ; struct in6_addr *ha_addr ; u—int8—t ha—prefixlen ; gaddr-clean() 関数で実装されます。 519 void 520 hal—gaddr—clean (halp) struct hagent—entry *halp ; 521 522 { hal-gaddr-clean() 関数は解放したいグローバルアドレ ス・リストをイ尉寺している hagent-entry 構造体へのポイ ンタを引数にとります。 グローバルアドレスのリストは hagent-entry 構造体の hagent-galist メンバー変数に保持されています。グロー バルアドレスは、インターフェイスごとのリストとノード 全体で管理されている有効時間川頁のリストの 2 つのリスト で管理されています。図 19 の 526 行目のループで、リス トのエントリを 1 つずったどりながら、効時間順のリス トからエントリを削除します。 470 { hal-gaddr-find() 関数は 3 つの引数をもちます。 halp は検索対象となるホームエージェントの情報を保持した hagent-entry 構造体へのポインタ、 ha-addr は検索した いホームエージェントのグローバルアドレス、 ha-prefix- len はグローバルアドレスのプレフィックス長です。 グローバルアドレスは hagent-gaddr 構造体リストのか たちで hagent-entry 構造体の hagent-galist 変数に保持 されています。リストを順番にたどりながら、指定された プレフィックス長をもち、 hal-gaddr-find() の引数で指定 されたグローバルアドレスと同じ値をもつ hagent-gaddr 構造体のポインタを返します ( 図 18 ) 。 グローバルアドレス・リストの解放 グローバルアドレスを保持するリストは、 hagent-en- try 構造体が解放されるときに同時に解放されなければな りません。グローバルアドレス・リストの解放処理は hal- UNIX MAGAZINE 2004.8 540 541 free(tmp) ; 542 } ノード全体のリストからエントリを取り除いたあと、 540 行目で情報をイ尉寺しているメモリを解放します。 ☆ 次回も引き続き、動的ホームエージェント探索処理を解 説します。 81 ( しま・けいいち IIJ)