メッセージ - みる会図書館


検索対象: UNIX MAGAZINE 2005年5月号
35件見つかりました。

1. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 ip6—mh—binding—ack { ip6-mh-binding-ack 構〕当本 (ip6mh. h) 図 17 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 図 18 2894 2895 2896 2897 2906 2907 2908 2909 struct #ifdef #define #define #define #define #define struct ip6—mh ip6mhba-hdr ; u_int8_t u_int8_t u_int16_t u_int 16 ー t ip6mhba—status ; ip6mhba—f1ags ; ip6mhba-seqno ; ip6mhba—Iifetime ; / * status code * / / * in units Of 4 seconds * / / * followed by mobility options * / _KERNEL ip6mhba—prot0 ip6mhba-hdr . ip6mh_proto ip6mhba—1en ip6mhba_hdr. ip6mh_1en ip6mhba—type ip6mhba-hdr. ip6mh-type ip6mhba—reservedO ip6mhba—hdr. ip6mh_reserved ip6mhba-cksum ip6mhba—hdr. ip6mh—cksum #endif / * —KERNEL * / メッセージ長の正当生の石忍 ip6 = mtod(), struct ip6—hdr * ) ; / * packet length check. * / if (ip6ma1en く sizeof (struct ip6-mh-binding_ack) ) { (caddr—t) &ip6ma—>ip6mhba—1en ー (caddr—t) ip6) ; icmp6—error (), ICMP6—PARAM_PROB , ICMP6—PARAMPROB_HEADER, return (EINVAL) ; を確認します。受信したメッセージが、対応付け応答メッ セージを表す ip6-mh-binding-ack 構造体よりも小さけ れば、 ICMPv6 工ラーを返します。その際、 IPv6 バケッ トのヘッタ部に問題があることを示す ICMP6-PARAM- PROB-HEADER を指定し、その場所として対応付け 応答メッセージの長さを格納したフィールド (ip6mhba- len) を指定します。 2912 if ( ( (m—>m—flags & M—DECRYPTED) ! = 0 ) 2924 2925 2927 2928 } sizeof (*ip6ma) , ip6ma1en, m—freem(m) ; return (error) ; 2913 2914 2915 } Ⅱ ( (m->m—flags & M—AUTHIPHDR) ba_safe 2 923 ~ 2 , 928 行目は、受信した対応付け応答メッセー ジに含まれているオプションを取り出す処理です。 mip6- get-mobility-options() は、メッセージに含まれている オプションを角斤し、 mip6-pktopts 構造体にオプション 情報をコピーします。 2 , 912 ~ 2 , 915 行目はメッセージの安・翁「生の確認です。 ba-safe は受信した対応付け応答メッセージカ言用できる かどうかを示します。対応付け応答メッセージが IP セキ ュリティで保護されていた場合、 MDECRYPTED もし くは M-AUTHIPHDR フラグが mbuf に設疋されます。 前者はバケットが ESP ヘッダによって暗号化されている ことを、後者は ESP ヘッダもしくは認証ヘッダによって完 全生が保証されていることを示します。これらのフラグが 設疋されたバケットは安全と考えられるので、 ba-safe を 真にして処理を進めます。 if ( (error = mip6_get_mobi1ity—options( 2923 (struct ip6—mh * ) ip6ma , 68 2949 2959 2960 2961 2962 2963 2964 2971 2972 2950 2969 sc = hif—list—find—withhaddr( &ip6—>ip6—dst) ; if ()c = = NULL) { m—freem(m) ; return (EINVAL) ; mbu = mip6—bu—1ist—find—withpaddr ( &sc—>hif-bu—list , &ip6—>ip6—src, &ip6—>ip6—dst) ; if (mbu = = NULL) { return (EINVAL) ; m-freem(m) ; 2 , 949 ~ 2 , 972 行目は、受信した対応付け応答メッセージ に関係する対応付け更新エントリの検索です。対応付け更 UNIX MAGAZINE 2005.5

2. UNIX MAGAZINE 2005年5月号

図 20 3021 3022 3023 3024 3033 3034 図 21 3051 3060 3065 3066 3067 3069 3070 3071 3073 3075 3076 3077 3080 3081 3085 3086 3087 3089 3090 連載 / 旧 v6 の実装ー 0 メッセージの通し番号が間攣っていた場合のタ里 accept—binding—ack : seqno = htons (ip6ma->ip6mhba-seqno) ; ー IP6_MH_BAS_SEQNO_BAD) { if (ip6ma—>ip6mhba—status goto check—mobility—options ; ェラー若受信時の処理 check—mobility—options : if (ip6ma—>ip6mhba—status > = IP6—MH—BAS ERRORBASE) { if if (ip6ma—>ip6mhba—status IP6_MH_BAS_NOT_HA & & mbu->mbu-flags & IP6MU-HOME & & = MIP6_BU_PRI_FSM_STATE_WAITA) { mbu—>mbu—pri—fsm—state goto success; ー IP6_MH_BAS_SEQNO_BAD) { (ip6ma->ip6mhba—status ntohs (ip6ma—>ip6mhba—seqno) + 1 ; mbu—>mbu—seqno return ( 0 ) ; mip6—bu—send—bu (mbu) ; error = mip6—bu—1ist—remove(&sc—>hif—bu—Iist , return ( 0 ) ; return (error) ; m—freem(m) ; if (error) { mbu) ; 受理されているはずです。この時点では、固定ノードから の対応付け応答メッセージの認証データが間違っているか、 そもそも認証データが含まれていなかったことを意味する ので、メッセージを破棄すべきです。 3017 m_freem(m) ; 3019 return (EINVAL) ; 3 , 017 ~ 3 , 019 行目で、不正な対応付け応答メッセージ を破棄します。 図 20 の 3 , 023 ~ 3 , 034 行目は、メッセージの通し番号 が間違っていた場合の処理です。移動ノードが、再起動な どの理由により対応付け情報を更新するとき、すでに先方 のノードに登録されている通し番号よりも小さい番号を使 ってしまうことがあります。現在の通し番号よりも小さい 番号をもっ対応付け更新メッセージは受理されず、応答と して IP6-MH-BAS-SEQNO-BAD が返されます。 の応答メッセージを受信した移動ノードは、通し番号を更 70 新し、正しい対応付け更新メッセージを再送しなければな りません。 if (seqno ! = mbu—>mbu—seqno) { 3036 3048 3049 } 3046 m—freem(m) ; return (EINVAL) ; 対応付け更新メッセージに含めた通し番号 (mbu-seq- (o) と、受信した対応付け応答メッセージに含まれている 通し番号 (seqno) が異なっていれば、このメッセージは破 棄されます。 図 21 の 3 , 060 ~ 3 , 090 行目は、エラー応答を受信した場 合の処理です。ステータスコードとして IP6-MH-BAS- ERRORBASE(128) 以上が設定されている対応付け応 答メッセージはエラーを表します。 まず、 3 , 065 ~ 3 , 070 行目で、ホーム登録メッセージを 送信したホームエージェントが間違っていた場合の処理を UNIX MAGAZINE 2005.5

3. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 図 2 固定ノード用の対応付け更新メッセージの作成と送信 2254 2255 2256 2257 2260 2261 2262 2263 2264 2265 2270 2271 2272 2275 2277 2279 2280 2284 2285 2286 2287 2288 2289 2290 2291 2292 ip6—initpktopts (&opt) ; m = mip6—create—ip6hdr (&mbu—>mbu—haddr , if (m = = NULL) { return (ENOMEM) ; mip6—ip6mu—create (&opt. ip6po—mh, error &mbu->mbu—paddr , mbu->mbu—hif ) ; if (error) { &mbu—>mbu—paddr , &mbu— >mbu_haddr , IPPROTO_NONE , 0 ) ; error m—freem(m) ; goto free—ip6pktopts; xp6—output (), &opt , NULL , NULL 0 , NULL , NULL if (error) { goto free—ip6pktopts ; return ( e てて 0 て ) ; FREE(opt . ip6po—mh, M_IP60PT) ; if (opt ・ ip6po—mh) —ip6pktopts : 図 3 対応付け更新メッセージに要なエントリのオ 3607 hrmbu = mip6_bu—Iist—find—home—registration(&sc—>hif—bu 3606 mbu = mip6—bu—Iist—find—withpaddr (&sc—>hif—bu—list , dst , 付け更新メッセージを作成する関数は、ホーム登録用のメ ッセージの場合と同じ mip6-ip6mu-create() です。 対応付け更新メッセージは、改竄を防ぐために保護しな ければなりません。メッセージを保護する方法は、ホーム 工ージェントにホーム登録する場合と、固定ノードに送信 する場合とで異なります。ホーム登録の場合、メッセージ は IPsec を用いて保護されます。固定ノードに対応付け更 新メッセージを送る場合は、 IPsec カ坏リ用できないため、往 復経路確認の手続きの結果作成された共有鍵を用いて、メ ッセージのハッシュ値を含めなければなりません。ハッシ UNIX MAGAZINE 2005 . 5 dst , sc) 3585 mip6—ip6mu—create(pktopt—m0bi1ity, src, 3584 int に解説する mip6-ip6mu-create() で実装されます。 の種類に応じた対応付け更新メッセージの作成処理は、次 応付け更新メッセージの末尾に追加されます。宛先ノード ュ値は対応付け認証データオプションというかたちで、対 3586 3587 3588 3589 { list, src) ; struct in6 struct hif softc *sc; addr *src, *dst ; struct ip6—mh **pktopt—mobility; mip6-ip6mu-create() は 4 つの引数をもちます。 pkt- opt-mobility は生成された対応付け更新メッセージへの ポインタを格納する変数で、通常は ip6-pktopts 構造体の ip6po-mh メンノヾ一変数へのポインタが渡されます。 src と dst は対応付け更新メッセージの始点アドレスと終点ア ドレスで、それぞれ移動ノードのホームアドレスと、ホー ムエージェントもしくは固定ノードのアドレスになります。 sc は移動ノードのホーム・ネットワークを表す hif-softc 構造体へのポインタです。 3 , 606 ~ 3 , 607 行目 ( 図 3 ) で、対応付け更新メッセージ に必要なエントリを検索します。 mbu はメッセージの送 信先の情報が格納されたエントリへのポインタ、 hrmbu は ホーム登録情報が格納された対応付け更新エントリへのポ 61

4. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 8 , 0 ) ; 図 4 対応付け更新メッセージとオプションのサイズの計算 3648 3649 3670 3669 3662 3661 3660 3680 3679 3678 3677 3676 3675 3674 sizeof (struct ip6—mh—binding—update) ; bu_size if (need-rr) { else bu—size + = MIP6—PADLEN(bu_size, 2 , 0 ) ; sxzeof (struct ip6—mh—opt—nonce—index) ; nonce_SIZe nonce—size + = MIP6—PADLEN(bu_size + nonce—size , 8 , 2 ) ; auth_size IP6MOPT_AUTHDATA_SIZE ; auth—size + = MIP6—PADLEN(bu_size + nonce—size + auth—size, altcoa_size bu—size + = MIP6—PADLEN(bu_size , 8 , 6 ) ; sizeof (struct ip6-mh—opt-a1tcoa) ; altcoa_size auth_size nonce_sxze ip6mu SIZe = bu_SIze 十 nonce_size 十 auth_size 十 altcoa_size; 図 5 各オプション情報へのオフセット値の計算 3687 3688 3689 3690 3691 3692 if (need-rr) { } else { mopt—auth = (struct ip6—mh—opt—auth—data * ) ( (u—int8_t *)mopt_nonce + nonce—size) ; mopt_nonce (struct ip6—mh—opt—nonce—index * ) ( (u—int8—t * ) ip6mu + bu_size) ; mopt—altcoa = (struct ip6—mh—opt—aItcoa * ) ( (u—int8—t * ) ip6mu + bu—size) ; クス・オプションのアラインメント要求は 2 れ十 0 なので、 ラインメント要求から、配置に必要なパディングを計算し 3 , 660 行目で、現在のメッセージサイズとオプションのア ip6—mh—binding—update * , 3682 MALLOC (ip6mu , struct ます。 ンが必要なため、そのぶんをメッセージサイズに加えてい の計算です。ホーム登録では代替気付アドレス・オプショ 3 , 676 ~ 3 , 678 行目はホーム登録用のメッセージサイズ ています。 UNIX MAGAZINE 2005.5 3685 3684 3683 オプションのオフセットを引します。 ホーム登録になります。その場合は、代替気付アドレス・ フセットを引噂します。 need-rr カなら、メッセージは ックス・オプションと対応付け認証データオプションのオ ッセージは固定ノード宛の内容になるため、ナンスインデ セット値の言 t 算です。 need-rr カ填なら、対応付け更新メ の先頭アドレスを担とした、各オプション情報へのオフ 3 , 687 ~ 3 , 692 行目 ( 図 5 ) は、対応付け更新メッセージ ラーで終了します。 るための mbuf を確保します。確保できなかったときは工 3 , 682 ~ 3 : 685 行目で対応付け更新メッセージを構築す return (ENOMEM) ; if (ip6mu = = NULL) ip6mu—size, M—IP60PT, M—NOWAIT) ; 3695 mbu—>mbu_seqno 十十 ; 対応付け更新メッセージの反復攻撃を防ぐため、送信す るメッセージの通し番号は、かならず以前送ったメッセー ジの番号よりも大きくなければなりません。 3 , 695 行目で 通し番号を 1 だけ増やします。 図 6 の 3 , 697 ~ 3 , 703 行目で対応付け更新メッセージを 格納するためのメモリ領域を初期化し、必要な情報を設定 します。対応付け更新メッセージを運ぶモビリテイへッダ は IPv6 の拡張ヘッダの一種ですが、彳売 , 、、ツダおよび上位 63 応付け更新メッセージの有効時間として 0 を誌定しなけれ ジは、対応付け情報の登金覊年除となります。この場合、対 還したことを意味します。よって、対応付け更新メッセー が同じであれば、移動ノードがホーム・ネットワークに帰 ームアドレス (mbu-haddr) と気付アドレス (mbu-coa) 報の登録を解除する際の処理をします。対応付け情報のホ 効時間の誌定です。まず、 3 , 704 ~ 3 , 709 行目で対応付け清 3 , 704 ~ 3 , 731 行目は、対応付け更新メッセージの希望有 長 ip6musize を 8 で割った値から 1 を引いておきます。 の 8 オクテットは引対象に含まれないため、メッセージ は、 8 オクテット単位で長さを指定します。ただし、先頭 PROTO-NONE を設定しています。 ip6mhbu 」 en に で、モビリテイへッダが最後のヘッダであることを示す IP - 層プロトコルをもてない仕様になっています。 3 , 699 行目

5. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 図 1 ホーム電泉の対象となるホームエージェントのアドレスのオ鈺正 2175 if (IN6—IS—ADDR_UNSPECIFIED (&mbu—>mbu_paddr) ) { 2176 2177 2178 2179 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 / * we dO not know where to send a binding update. * / if ( (mbu—>mbu—flags & 工 P6MU_HOME) ! = 0 ) { er て 0 て = mip6-icmp6-dhaad—req—output (mbu—>mbu—hif) ; goto bu—send—bu—end ; * reply. * immediately after receiving DHAAD * a binding update will be sent panic ( 'ta peer address must be known when sending a binding update / * continue , anyway. * / if (error) { 2194 } 異常状態なので panic を呼び、カーネルを停止します。 2197 2198 2199 2202 2203 2204 m if mip6—create-ip6hdr (&mbu—>mbu—haddr , error = ENOBUFS ; = NULL ) { (m IPPROTO_NONE , 0 ) ; &mbu—>mbu—paddr , 2224 2226 2227 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 if NULL ( er て 0 て ) { goto free—ip6pktopts ; goto bu—send—bu—end ; 2 , 197 ~ 2 , 204 行目で、 mip6-create-ip6hdr() を使っ て、対応付け更新メッセージ用の IPv6 バケットをイ尉寺 3 ー る mbuf を確保します。 free —ip6pktopts : if (opt . ip6po-mh) FREE(opt . ip6po—mh, M_ 工 P60PT) ; bu_send_bu_end : return (error) ; 2207 2210 2211 2212 2216 2217 2218 ip6—initpktopts(&opt) ; mip6—ip6mu—create (&opt . ip6po-mh , error &mbu— >mbu_haddr , tmbu—>mbu—paddr , mbu—>mbu—hif ) ; if (error) { goto free—ip6pktopts ; m—freem(m) ; 2 , 197 行目で作成した IPv6 バケットと、 2 , 210 行目で 作成した対応付け更新メッセージを ip6-output() に渡し、 メッセージを送信します ( 2 222 ~ 2 , 240 行目 ) 。 ip6-pkt- opts 構造体の変数である opt には、作成された対応付け 更新メッセージがオ内されたままになっているので、 mip6 ー bu-send-bu() を抜けるときに、確保されていたメモリを 解放しなければなりません ( 2 , 235 ~ 2 , 236 行目 ) 。 2242 int 2243 mip6—bu—send—cbu(mbu) 2 , 207 ~ 2 , 218 行目で対応付け更新メッセージを作成し ます。対応付け更新メッセージは、 ip6-pkt 叩 ts 構造体 の ip6po-mh ポインタが示すメモリ領域に作成され、 ip6- output() の引数の 1 っとして渡されます。 mip6-ip6mu- create() が対応付け更新メッセージを作成する関数です。 mip6-ip6mu-create() については後述します。バケット の作成に失敗したら、 2 , 217 行目で処理を中断します。 2244 2245 { struct mip6—bu *mbu ; 2222 60 error = 1p6—output (m , &opt , NULL , 0 , NULL , NULL 一方、 mip6-bu-send-cbu() は、移動ノードカ涸定ノー ドに対応付け更新メッセージを送信するときに呼ばれます。 mbu は固定ノードに対する対応付け情報が内されたエン トリへのポインタです。 図 2 の 2 , 254 ~ 2 , 272 行目で対応付け更新メッセージを 作成し、 2 , 275 行目の ip6-output() で送信します。対応 UNIX MAGAZINE 2005.5

6. UNIX MAGAZINE 2005年5月号

v—>iov_len = 1 ; (void) —writev (STDERR—FILENO , iov , 2 ) ; 標準ェラー出力だけでなく、 syslog システムに対するメ ッセージの出力も忘れてはいけません。そのために、 open ー log 関数や connectlog 関数を呼び出して syslogd との接 続を確立する作業をおこないます。 if ( ! opened) openlog (LogTag , LogStat ー LOG_NDELAY , 0 ) ; connectlog() ; if (send(LogFi1e, tbuf, cnt, 0 ) > = 0 ) return ; まだ openlog 関数を呼び出していなければ opened 変 数の値は初期値 ( 偽 ) のままなので、その場合には openlog 関数を呼び出します。さらに、 connectlog を呼び出して実 際の接続を確立します。これにより、 syslogd プロセスと のあいだに通信路カられ、ファイルスコープの LogFile 変数にファイル・ディスクリプタが格納されるので、その ファイル・ディスクリプタを使ってメッセージを出力しま す。 send システムコールによる出力が成功すれば、関数は 終了してかまいません。 send システムコールが失敗した場合、以前接続を確立 していた syslogd プロセスが再起動されて、別のプロセス となってしまっている可能性があります。そこで、すでに 確立している接続をいったん破棄し、再度接続を確立して send システムコールを実行します。 終了してかまいません。 この場合にも、 send システムコールが成功したら関数を return ; if (send(LogFi1e, tbuf , cnt , connectlog() ; disconnectlog() ; 0 ) > = の 工ラー処理 80 ロセスにうまくメッセージを送出できなかったときにはシ べます。このオプションが指定されていると、 syslogd プ オプションとして LOG-CONS が指定されているかを調 メッセージを送出できなかったときです。この場合には、 この部分まで制御カザリ達するのは、 syslogd プロセスに ステムのコンソールにメッセージを出力しなければなりま せん。これは、まずシステムのコンソールをオープンし、 オープンできたら再度 writev システムコールを使ってメ ッセージを出力します。 if (LogStat & LOG—CONS & & ()d = —open(—PATH—CONSOLE , , ・ O_WRONLY IO_NONBLOCK , 0 ) ) > = 0 ) { p = strchr (tbuf , , > ' ) + 1 ; 10V ; struct iovec *V struct iovec iov[2] ; V—>iOV V—>iOV_ 十十 V ; V—>iOV V—>iOV (void) base = p; 1en = cnt base _len = 2 ; —writev(fd, iOV (void)—close(fd) ; (p ー tbuf) ; これまでの出力とやや異なるのは、作成したメッセージ 次回は、今回とりあげられなかった関数群を紹介する予 ネ礬なものとなっています。 vsyslog 関数はメッセージの処理をおこなうため、かなり 関数はたんに vsyslog 関数を呼び出しているだけですが、 数と vsyslog 関数のソースコードを紹介しました。 syslog 今回は、 syslog 関連のライプラリ関数として、 syslog 関 ☆ るために、彳帚文字も出力しているわけです。 じカラム " にカーソルが移動してしまいます。これを避け れないため、たんに改行文字を出力すると、次の行の、、同 コンソールへの出力ではドライバによる処理がおこなわ カ形動するようにしています。 出力することで、画面上で正しく次の行の先頭にカーソル されます。また、行末には改行文字だけでなく復帰文字も れにより、メッセージを出力しようとした時刻なども出力 から優先順位だけを除いたものを出力している点です。 定です。 UNIX MAGAZ 工 NE 2005.5 ( たじみ・ひさかず )

7. UNIX MAGAZINE 2005年5月号

図 11 3771 3772 3773 3774 3775 3776 3777 3778 3779 図 12 305 306 307 308 309 連載 / 旧 v6 の実装ー 0 対応付け言 & 正データ窈乍成 mopt-auth—>ip6moad-type = lP6-MHOPT-BAUTH ; mopt-auth—>ip6moad-1en = lP6MOPT—AUTHDATA—SIZE ー 2 ; if (auth—size > IP6MOPT—AUTHDATA_SIZE) { * ( (u—int8-t * ) ip6mu + bu—size + nonce—size + IP6MOPT—AUTHDATA-SIZE) IP6_MHOPT_PADN ; * ( (u—int8-t * ) ip6mu + bu—size + nonce—size + IP6MOPT—AUTHDATA—SIZE + 1 ) auth_size IP6MOPT_AUTHDATA_SIZE ー 2 ; ip6-mh-opt-auth-data 構〕当本 (ip6mh. h) struct ip6—mh—opt—auth—data { u—int8—t ip6moad—type ; u—int8—t ip6moad—1en ; / * followed by authenticator data * / いるホームナンス・インデックス (mbu-home-nonce-in- dex) と気付ナンス・インデックス (mbu-careof-nonce- index) の値を ip6moni-home-nonce と ip6moni-coa- nonce にコピーしますが、登録解除のメッセージの (ig- nore-co-nonce か真の ) 場合、気付ナンスの値はコピーさ れません。 3 , 771 ~ 3 , 779 行目 ( 図 11 ) で対応付け認証データを作 成します。 mopt-auth は ip6-mh-opt-auth-data 構造 体のポインタです。図 12 に ip6-mh-opt-auth-data 構 造体を示します。 対応付け認証データのタイプ番号は、 IP6-MHOPT- BAUTH(5) です。認証データはオプション構造体の直後 に挿入されます。構造的には可変長ですが、 MobiIe IPv6 の仕様では 12 オクテットに固定されています。 3 , 774 ~ 3 , 778 行目はパディングの挿入です。 図 13 の 3 , 786 ~ 3 , 804 行目で認証データを言算します。 認証データの言 t 算と検算は、じつは同じ処理です。固定ノ ードで認証データの検算をしたときと同様に、まず 3 , 786 ~ 3 , 788 行目の mip6-caIcuIate-kbm() でハッシュ値の 引算に必要な鍵を生成します。すでに述べたとおり、移動 ノードがホーム・ネットワークに接続しているときは気付 ナンスを利用しないため、 ignore-co-nonce の値に応じて 鍵の言 fr 算方法カ畯わります。続いて、 3 , 795 ~ 3 , 804 行目の mip6-calculate-authenticator() で認証データを計算し ます。認証データは、対応付け更新メッセージの内容と IP ヘッダの始点・終点アドレスに対して計算され、これらの 情報の改竄を検出できる手段を提供します。 図 14 の 3 , 810 ~ 3 , 824 行目はホーム登録の場合のオプ 66 ション処理です。ホーム登録の場合、代替気付アドレス・ オプションを追加します。手川頁は前述したほかのオプショ ンと同じです。 mopt-altcoa は ip6-mh-opt-altcoa 構 造体のポインタです。図 15 に ip6-mh-opt-altcoa 構造 体を示します。 図 14 では、 3 , 811 ~ 3 , 817 行目でパディングを作成した あと、 3 , 819 ~ 3 , 824 行目でオプション構造体にタイプ番 号 (IP6-MHOPT-ALTCOA(3)) 、オプション長、気付 アドレスを設疋しています。 最後に、モビリテイへッダ全体のチェックサムを mip6- cksum で計算します ( 図 16 の 3 , 828 行目 ) 。作成したメ ッセージへのポインタは、引数で渡された ip6-pktopts 構 造体の ip6po-mh メンバー変数に設疋され、呼出し関数に 返されます ( 3 , 831 行目 ) 。 対応イ寸け応答メッセージの受信 対応付け更新メッセージを送信した移動ノードは、その 返答として対応付け応答メッセージを受信することがあり ます。ホーム登録では対応付け応答の返信が必須なので、 移動ノードはかならず応メッセージを受信します。固定 ノードに送る対応付け更新メッセージで応答メッセージを 要求するかどうかは、移動ノードの判断で決めることがで きます。 KAME では、固定ノードに対しては応メッセ ージを要求しません。ただし、エラーが発生したときは、 要求されていなくても対応付け応答メッセージが返送され ます。 対応付け応答メッセージは、モビリテイへッダの共通処 理部分である mobiIity6-input() を経由し、対応付け応答 メッセージ処理関数である mip6-ip6ma-input() に渡さ れます。 2863 int 2864 mip6-ip6ma—input ()' ip6ma , ip6malen) struct mbuf *m; 2865 UNIX MAGAZINE 2005 . 5

8. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装 インタです。 ー 0 3635 3636 3637 } mip6-icmp6—dhaad—req—output (sc) ; return ( 0 ) ; 3608 if ( (mbu = = NULL) & & 3609 3610 3611 3612 3613 (hrmbu ! = NULL) & & return ( 0 ) ; and send CoTI/HoTI . * / / * create a binding update entry (MIP6_IS_BU_BOUND_STATE (hrmbu) ) ) { 3614 } 3 , 608 ~ 3 , 614 行目は、移動ノードのホーム登録は完了 している (hrmbu が NULL でなく、かっ登録完了た態 (BOUND) になっている ) が、 mbu がない場合の処理で す。この条件に適合するのは、移動ノードが固定ノードと の通信を開始しようとするときです。コメントに書かれて いるとおり、この場合は新たに対応付け更新エントリを作 成し、固定ノードとの往復経路確認手続きを開始すべきで すが、現時点では未実装です。ただし、通常は他ノードと の通信では、送信とともに受信処理も発生します。往復経 3615 if (mbu = = NULL) { 路確認手続きは受信処理の過程で開始されます。 3621 3622 } return ( 0 ) ; 3 , 615 ~ 3 , 622 行目は、ホーム登録が完了していない場 合の処理です。ホーム登録の完了前に、固定ノードへ対応 付け更新メッセージを送ることはできません。対応付け更 新メッセージは必要に応じて再送信されるので、次回の送 信時にホーム登録が完了していることを期待し、 こでは 3623 if ( (mbu->mbu-state & 処理を中断します。 MIP6_BU_STATE_NEEDTUNNEL) ! = 0 ) { return ( 0 ) ; 3624 3625 } 3 , 623 ~ 3 , 625 行目は、対応付け更新処理カ坏要な場合 です。 MIP6-BU-STATE-NEEDTUNNEL は、糸各最 適化をおこなわす、移動ノードとホームエージェント間の IPv6 ⅲ IPv6 トンネルを用いて通信する必要があること を未します。たとえば、固定ノードが MobiIe IPv6 を サポートしていないことが判明している場合などです。 の場合、対応付け更新処理を中止します。 if (IN6_IS_ADDR_UNSPECIFIED ( &mbu—>mbu—paddr) ) { 3626 62 3 , 626 ~ 3 , 637 行目は、対応付け更新メッセージの週言先 (mbu-paddr) が未定義アドレスの場合の処理です。 mbu -paddr が未定義アドレスになるのは、移動ノードがホーム 工ージェントのアドレスを知らないときです。最新のホー ムエージェント・アドレスの一覧を取得するため、 mip6- icmp6-dhaad-req-output() を呼び出して動的ホームエ ージェント・アドレス探索を開始します。 3639 if ( ! (mbu->mbu-flags & IP6MU-HOME) ) { need_rr = 1 ; 3640 3641 } 対応付け更新メッセージの送信先が固定ノードの ( つま り、 IP6MU-HOME フラグが指定されていない ) 場合、 往復経路確認手続きによって生成した鍵でメッセージのハ ッシュ値を計算しなければなりません。 need-rr を 1 にす ることで、ハッシュ値の計算が実行されます。 UNIX MAGAZINE 2005.5 大きさを計算するマクロです。たとえば、ナンスインデッ PADLEN は、オプションの配置に必要なパディングの にはアラインメント要求をもつものもあります。 MIP6- DATA-SIZE マクロから取得します。オプションのなか け認証データオプションのサイズは IP6MOPT-AUTH- ip6-mh-opt-nonce-index 構造体のサイズから、対応付 加されます。ナンスインデックス・オプションのサイズは ックス・オプションと対応イ寸け認証データオプションが追 の言 1 算です。固定ノードに送信する場合は、ナンスインデ 3 , 660 ~ 3 , 674 行目が固定ノード用のメッセージサイズ します。 付け更新メッセージと、必要なオプションのサイズを引算 3 , 648 ~ 3 , 680 行目 ( 図 4 ) では、これから作成する対応 ックスとして登録されているかどうかを確認しておきます。 点で、ホームアドレスのプレフィックスが有効なプレフィ フィックスの肩効時間を参照する必要があります。この時 の後半で、対応付け情報の肩効時間を計算する際に、プレ れる始点アドレスのプレフィックス情報の確認です。処理 3 , 644 ~ 3 , 646 行目は、対応付け更新メッセージに使わ 3646 return (EINVAL) ; 3645 if (mpfx = = NULL) &mip6-prefix—1ist, src) ; 3644 mpfx = mip6—prefix—1ist—find—withhaddr (

9. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 図 6 メモリ令或のネ用ヒと各秘。黼長や有交加の言聢 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 bzero (ip6mu, ip6mu—size) ; IPPROTO_NONE ; ip6mu—>ip6mhbu—proto ip6mu—>ip6mhbu—1en = (ip6mu—size > > 3 ) ip6mu—>ip6mhbu—type = lP6—MH TYPE—BU; ip6mu—>ip6mhbu—fIags = mbu—>mbu—flags ; ip6mu->ip6mhbu-seqno = htons (mbu—>mbu-seqno) ; if ( 工 N6—ARE—ADDR_EQUAL (&mbu—>mbu_haddr , &mbu—>mbu_coa) ) { / * this binding update is for home un—registration. else ip6mu—>ip6mhbu-1ifetime if (need-rr) { Ignore_CO_nonce u_int32_t haddr_lifetime , coa_lifetime , lifetime; haddr—lifetime = mpfx—>mpfx—vltime ; coa—lifetime = mip6—coa—get—1ifetime (&mbu—>mbu—coa) ; if (mip6ct1—bu—max1ifetime > 0 & & if ( (mbu—>mbu—flags & IP6MU—HOME) coa lifetime; haddr_lifetime lifetime = haddr_lifetime く coa_lifetime ? lifetime = mip6ctI—bu—maxIifetime ; lifetime > mip6ctI—bu—maxIifetime) } else { lifetime = mip6ctI—hrbu—maxIifetime ; lifetime > mip6ctI—hrbu—maxIifetime) if (mip6ct1—hrbu—maxIifetime > 0 & & htons( (u—int16—t) (mbu—>mbu—lifetime > > 2 ) ) ; / * units 4 secs * / ip6mu—>ip6mhbu—1ifetime mbu—>mbu_refresh = mbu—>mbu_lifetime ; mbu—>mbu—expire = time_second + mbu—>mbu—lifetime ; lifetime; mbu—>mbu_lifetime 図 7 パティングの作成 3733 if ((pad = bu-size sizeof (struct ip6-mh—binding—update) ) > = 2 ) { 3734 3735 3736 3737 3738 } u—char *p (u—int8—t * ) ip6mu + sizeof(struct ip6_mh_binding_update) ; * (p + 1 ) = pad ー 2 ; *p = IP6—MHOPT_PADN ; ばなりません ( 3 , 706 行目 ) 。また、対応付け更新メッセー ジを送信する相手が固定ノードの場合は往復経路確認手続 きが必要ですが、ホームアドレスと気付アドレスが同一に なるため、気付ナンスは不要になります ( 3 , 708 行目 ) 。 3 , 711 ~ 3 , 731 行目は登録時の処理です。送信する対応 付け更新メッセージの肩勠時間は、気付アドレスの肩勠時 間とホームアドレスの有効時間の短いほうを超えることは できません ( 3 , 713 ~ 3 , 716 行目 ) 。さらに、 KAME では グローバル変数を設定することによって、有効時間の上限 値を制限できるようになっています。メッセージがホーム 登録の場合は mip6ctl-hrbu-maxIifetime を、固定ノー ド宛のメッセージの場合は mip6ctI_bu_maxIifetime を 超える効時間を設定することはできません。肩効時間は 64 4 秒単位でメッセージに本内されるので、 3 , 729 ~ 3 , 730 行 目で有効時間を 4 で割った値をメッセージに設定します。 3 , 733 ~ 3 , 738 行目 ( 図 7 ) は、対応付け更新メッセージ と、それに付属するオプションのあいだに必要なパディン グを作成します。必要なパディングの大きさは、あらかじ め引しておいたパディングを含むメッセージサイズ (bu- size) と、仕オ E のサイズ (sizeof(struct ip6-mh-bind- ing-update)) の差から判断できます。 2 オクテット以上 のパディングが必要な場合は PADN オプションを作成し ます。 1 オクテットのパディングは、数値の 0 を PAD 1 として埋めなければなりませんが、 3 , 697 行目でメモリ全 体が初期化されているので、こでは処理を省略できます。 3 , 740 ~ 3 , 758 行目 ( 図 8 ) は、固定ノードへの対応付け UNIX MAGAZINE 2005 . 5

10. UNIX MAGAZINE 2005年5月号

連載 / 旧 v6 の実装ー 0 図 19 鍵の生成と言正テータの検算 2983 2984 2986 2987 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 } cksum—backup = ip6ma—>ip6mhba—cksum ; ip6ma—>ip6mhba-cksum = 0 ; mip6—ca1cu1ate—kbm (&mbu—>mbu—home_token , ig Ⅱ 0 て e ー CO ー 0 Ⅱ ce ? NULL ・ &mbu—>mbu_careof_token , key_bm) ; if (mip6—ca1cuIate—authenticator (key_bm , authdata, &mbu—>mbu—coa, &ip6—>ip6-dst , (caddr—t) ip6ma, ip6ma1en , (caddr—t)mopt . mopt_auth + 2 (caddr—t) ip6ma , min(MOPT_AUTH_LEN (&mopt) + 2 , MIP6_AUTHENTICATOR—LEN) ) goto accept—binding—ack ; = の min (MOPT_AUTH_LEN (&mopt) + 2 , MIP6_AUTHENTICATOR_LEN) ) if (bcmp (authdata, mopt . mopt_auth + 2 , ip6ma—>ip6mhba—cksum = cksum—backup ; 新エントリはホーム・ネットワークごとに管理されている ので、まず 2 , 949 行目でホームアドレス ( 対応付け応答メッ セージの終点アドレス ) からホーム・ネットワークの情報を オ内している hif-softc 構造体を検索します。続いて、 hif- softc 構造体に保持されている対応付け更新エントリのリ スト (hif-bu 」 ist) から、受信した対応付け応答メッセー ジに関係する対応付け更新エントリを mip6-bu 」 ist-find- withpaddr() を使って検索します。この時点で対応する 工ントリがみつからなければ、受信した対応付け応答メッ セージは無視されます。 2974 if (mopt . valid_options & MOPT_AUTHDATA) { 3002 3003 3004 3005 3006 3007 3008 3009 3010 計算された認証データと、バケットに含まれていた認証デ ータを比較し ( 2 , 995 行目 ) 、同一であればメッセージ受理 処理へ進みます。 3 , 002 ~ 3 , 010 行目はホーム登録に対する応答メッセー goto accept—binding—ack ; & & ba_safe & & (mbu->mbu—flags & IP6MU-HOME) ! = 0 (mip6ctI—use—ipsec goto accept—binding—ack ; ba_safe & & (mbu—>mbu—flags & IP6MU—HOME) ) { ( !mip6ct1—use—ipsec if if 2980 2981 xgnore_co_nonce IN6—ARE-ADDR_EQUAL ( tmbu— >mbu_haddr , &mbu—>mbu—coa) ; 2 , 974 ~ 3 , 000 行目は対応付け認証データオプションの 処理です。移動ノードがホーム・ネットワークに接続し ており、気付アドレスとホームアドレスが同一の場合、認 証データの計算に気付ナンスは利用されません。 2 , 980 ~ 2 , 981 行目で ignore-co-nonce を真に設疋します。 図 19 の 2 , 986 ~ 2 , 987 行目で、認証データの計算に利 用する鍵を生成します。これは、認証データを作成したと きと同様に、 mip6-caIculate-kbm() を利用します。続い て、 2 989 行目の mip6-calculate-authenticator() で認 証データを検算します。なお、認証データを引する際は く、 モビリテイへッダのチェックサム値が 0 に設疋されていな ければならないため、あらかじめ 2 , 983 ~ 2 , 984 行目でチ ェックサムを 0 に設疋しています。受信したバケットから UNIX MAGAZINE 2005 . 5 ジの確認です。 mip6ctI_use-ipsec は、 IP セキュリティ によるメッセージ保護機能を利用するかどうかを決定しま す。仕様ーヒ、ホーム登録メッセージは IP セキュリティで 保護されなければならないので、 mip6ctI-use-ipsec は真 に設定されますが、テストなどの目的で偽に設定すること もできます。 IP セキュリティを利用しない場合は、ホーム 登録メッセージを無条件で受理します ( 3 , 002 ~ 3 , 005 行 目 ) 。 IP セキュリティを利用している場合、 ba-safe が真 である ( 受信バケットが IP セキュリティで保護されてい る ) ときのみ、対応付け応答メッセージを受理します。 3012 if ( (mbu—>mbu—flags & IP6MU—HOME) = の { goto accept—binding—ack ; 3013 3014 } 3 , 012 ~ 3 , 014 行目は固定ノードからの対応付け応答メ ッセージの処理ですが、間違ったコードとなっています。 通常、固定ノードから受信した対応付け応答には認証デー タが含まれているため、正しいメッセージは 2 998 行目で 69