Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/nd6_nbr.c
- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/nd6_nbr.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r270 r321 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * 7 * ä¸è¨èä½æ¨©è 8 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 9 * ã«ãã£ã¦å 10 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 11 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 12 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 13 å¸ï¼ä»¥ä¸ï¼ 14 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 15 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 16 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 17 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 18 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 19 * ç¨ã§ããå½¢ã§åé 20 å¸ããå ´åã«ã¯ï¼åé 21 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 22 * è 23 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 24 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 25 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 26 * ç¨ã§ããªãå½¢ã§åé 27 å¸ããå ´åã«ã¯ï¼æ¬¡ã®æ¡ä»¶ãæºãããã¨ï¼ 28 * (a) åé 29 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 30 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 31 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 32 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 33 * 害ãããï¼ä¸è¨èä½æ¨©è 34 ããã³TOPPERSããã¸ã§ã¯ããå 35 責ãããã¨ï¼ 7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 8 * によって公表されている GNU General Public License の Version 2 に記 9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 11 * 利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次の条件を満たすこと. 21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 36 25 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 126 114 127 115 /* 128 * å±æé¢æ°116 * 局所関数 129 117 */ 130 118 … … 136 124 137 125 /* 138 * nd6_dad_duplicated -- éè¤ã¢ãã¬ã¹ãæ¤åºããæã®å¦ç126 * nd6_dad_duplicated -- 重複アドレスを検出した時の処理 139 127 */ 140 128 … … 149 137 ifa->flags |= IN6_IFF_DUPLICATED; 150 138 151 /* ã¿ã¤ãã¼ãåæ¢ããã*/139 /* タイマーを停止する。*/ 152 140 untimeout((callout_func)nd6_dad_timer, ifa); 153 141 154 142 /* 155 * ãã IPv6 ã¢ãã¬ã¹ããã¦ãã¼ã¯ã«å²ãå½ã¦ãã156 * ï¼ã¤ã¼ãµãããç¨ã® EUI-64ï¼ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹ããã¼ã¹ã¨ãã157 * ã¤ã³ã¿ãã§ã¼ã¹ ID ã§çæãããã®ã§ããã°ã158 * ãã®ã¤ã³ã¿ãã§ã¼ã¹ã§ã® IPv6 ã®åä½ã¯ç¡å¹ã«ãã¹ãã§ãã159 * ï¼RFC2462bis-03 ã»ã¯ã·ã§ã³ 5.4.5ï¼ã143 * もし IPv6 アドレスが、ユニークに割り当てらた 144 * (イーサネット用の EUI-64)ハードウェアアドレスをベースとした 145 * インタフェース ID で生成されたのであれば、 146 * このインタフェースでの IPv6 の動作は無効にすべきである 147 * (RFC2462bis-03 セクション 5.4.5)。 160 148 */ 161 149 if (IN6_IS_ADDR_LINKLOCAL(&ifa->addr)) … … 165 153 166 154 /* 167 * nd6_dad_ns_output -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) è¦è«ãåºåããã155 * nd6_dad_ns_output -- 重複アドレス検出 (DAD) 要請を出力する。 168 156 */ 169 157 … … 178 166 179 167 /* 180 * nd6_dad_ns_input -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) è¦è«å 181 ¥å 168 * nd6_dad_ns_input -- 重複アドレス検出 (DAD) 要請入力 182 169 */ 183 170 … … 188 175 189 176 /* 190 * ã¾ã ãéè¤ã¢ãã¬ã¹æ¤åºè¦è«ãåºåãã¦ããªãå ´å177 * まだ、重複アドレス検出要請を出力していない場合 191 178 */ 192 179 if (ifa->ns_ocount == 0) … … 197 184 198 185 /* 199 * nd6_dad_na_input -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) éç¥å 200 ¥å 186 * nd6_dad_na_input -- 重複アドレス検出 (DAD) 通知入力 201 187 */ 202 188 … … 210 196 211 197 /* 212 * nd6_dad_timer -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) ã¿ã¤ãã¼198 * nd6_dad_timer -- 重複アドレス検出 (DAD) タイマー 213 199 */ 214 200 … … 231 217 nd6_dad_ns_output(ifp, ifa); 232 218 233 /* ã¿ã¤ã ã¢ã¦ããè¿é£æ¢ç´¢ã®éä¿¡ééã«è¨å®ããã*/219 /* タイムアウトを近隣探索の送信間隔に設定する。*/ 234 220 timeout((callout_func)nd6_dad_timer, ifa, ND6_RETRANS_TIME * NET_TIMER_HZ / SYSTIM_HZ); 235 221 } … … 243 229 244 230 /* 245 * nd6_ns_input -- è¿é£è¦è«ã®å 246 ¥åå¦çã 231 * nd6_ns_input -- 近隣要請の入力処理。 247 232 */ 248 233 … … 266 251 267 252 /* 268 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã269 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤270 * ã»ãããé·ãçã253 * ヘッダのチェック、以下の場合は破棄する。 254 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 255 * ・ヘッダ長が短い 271 256 */ 272 257 if (ip6h->hlim != IPV6_MAXHLIM || input->len - off < NEIGHBOR_SOLICIT_HDR_SIZE) … … 277 262 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) { 278 263 /* 279 * å§ç¹ã¢ãã¬ã¹ãç¡æå®ãªããéè¤ã¢ãã¬ã¹æ¤åº 280 * ãã¦å 281 ã¢ãã¬ã¹ã¯ãè¦è«ãã«ããã£ã¹ãã§ãªããã°ãªããªãã 264 * 始点アドレスが無指定なら、重複アドレス検出 265 * あて先アドレスは、要請マルチキャストでなければならない。 282 266 */ 283 267 if (!IN6_IS_ADDR_NS_MULTICAST(&ip6h->dst)) … … 285 269 } 286 270 287 /* ç®çã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼*/271 /* 目的アドレスがマルチキャストならエラー */ 288 272 if (IN6_IS_ADDR_MULTICAST(&nsh->target)) 289 273 goto err_ret; 290 274 291 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/275 /* 近隣探索オプションのオフセットを記録する。*/ 292 276 if (nd6_options(nd_opt_off, input->buf + (off + NEIGHBOR_SOLICIT_HDR_SIZE), 293 277 input->len - (off + NEIGHBOR_SOLICIT_HDR_SIZE)) != E_OK) 294 278 goto err_ret; 295 279 296 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ (å§ç¹ãªã³ã¯ã¢ãã¬ã¹) */280 /* 近隣探索オプション (始点リンクアドレス) */ 297 281 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)]) { 298 282 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + NEIGHBOR_SOLICIT_HDR_SIZE) + 299 283 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)] - 8); 300 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 301 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 284 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 302 285 lladdr = (uint8_t *)(opth + 1); 303 286 lladdr_len = (opth->len << 3); … … 307 290 goto err_ret; 308 291 309 /* å®å 310 ã¢ãã¬ã¹ããã«ããã£ã¹ããªãè¿é£éç¥ã«ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãä»ããã*/ 292 /* 宛先アドレスがマルチキャストなら近隣通知にデータリンク層のアドレスを付ける。*/ 311 293 if (IN6_IS_ADDR_MULTICAST(&ip6h->dst)) 312 294 tlladdr = true; … … 315 297 316 298 /* 317 * ç®çã¢ãã¬ã¹ããèªåã®ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã« 318 * å²ãå½ã¦ããã¦ããã¢ãã¬ã¹ã調ã¹ãã 319 * ãªãã代çãµã¼ãã¹ã¯å®è£ 320 ãã¦ããªãã 299 * 目的アドレスが、自分のネットワークインタフェースに 300 * 割り当てられているアドレスか調べる。 301 * なお、代理サービスは実装していない。 321 302 */ 322 303 ifa = in6_lookup_ifaddr(ifp, &nsh->target); … … 325 306 goto free_ret; 326 307 327 /* æ¢ç´¢çµæã¢ãã¬ã¹ãéè¤ãã¦ããã°å¿çããªãã§çµäºããã*/308 /* 探索結果アドレスが重複していれば応答しないで終了する。*/ 328 309 if (ifa->flags & IN6_IFF_DUPLICATED) 329 310 goto err_ret; 330 311 331 312 /* 332 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼313 * ネットワークインタフェースのアドレス長が一致しなければエラー 333 314 */ 334 315 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) … … 336 317 337 318 /* 338 * å§ç¹ã¢ãã¬ã¹ãèªåã®ã¢ãã¬ã¹ã¨ä¸è´ããã°éè¤ãã¦ããã319 * 始点アドレスが自分のアドレスと一致すれば重複している。 339 320 */ 340 321 if (IN6_ARE_ADDR_EQUAL(&ifa->addr, &ip6h->src)) 341 322 goto free_ret; 342 323 343 /* éè¤æ¤åºä¸ã«ãè¿é£è¦è«ãåä¿¡ããã¨ãã®å¦ç*/324 /* 重複検出中に、近隣要請を受信したときの処理 */ 344 325 if (ifa->flags & IN6_IFF_TENTATIVE) { 345 326 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) … … 354 335 355 336 /* 356 * å§ç¹ã¢ãã¬ã¹ãç¡æå®ãªããéä¿¡ç¸æã¯éè¤ã¢ãã¬ã¹æ¤åºä¸ã§ã 357 * ç´æ¥éä¿¡ãããã¨ã¯ã§ããªãã®ã§ãå 358 ¨ãã¼ããã«ããã£ã¹ã 359 * ã¢ãã¬ã¹ã«éä¿¡ããã 337 * 始点アドレスが無指定なら、送信相手は重複アドレス検出中で、 338 * 直接送信することはできないので、全ノードマルチキャスト 339 * アドレスに送信する。 360 340 */ 361 341 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) { … … 364 344 } 365 345 366 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/346 /* 近隣キャッシュに登録する。*/ 367 347 nd6_cache_lladdr(ifp, &ip6h->src, (T_IF_ADDR *)lladdr, ND_NEIGHBOR_SOLICIT, 0); 368 348 … … 379 359 380 360 /* 381 * nd6_ns_output -- è¿é£è¦è«ãåºåããã361 * nd6_ns_output -- 近隣要請を出力する。 382 362 */ 383 363 … … 398 378 return; 399 379 400 /* è¿é£è¦è«ãã¤ãã¼ãé·ãè¨ç®ããã*/380 /* 近隣要請ペイロード長を計算する。*/ 401 381 if (!dad && IF_SOFTC_TO_IFADDR(ifp->ic)) 402 382 len = (NEIGHBOR_SOLICIT_HDR_SIZE + ND_OPT_HDR_SIZE + sizeof(T_IF_ADDR) + 7) >> 3 << 3; … … 405 385 406 386 /* 407 * è¦è«ãã«ããã£ã¹ãã»ã¢ãã¬ã¹å®ã®è¿é£æ¢ç´¢ã§ã¯ã408 * ä»ã®ãªã³ã¯ããã®å½é ããããã¼ã¿ã°ã©ã ã409 * æé¤ãããããããããªãããã« IPV6_MAXHLIM (255) ãè¨å®ããã387 * 要請マルチキャスト・アドレス宛の近隣探索では、 388 * 他のリンクからの偽造されたデータグラムを 389 * 排除するため、ホップリミットに IPV6_MAXHLIM (255) を設定する。 410 390 */ 411 391 if (IN6_IS_ADDR_UNSPECIFIED(daddr) || IN6_IS_ADDR_MULTICAST(daddr)) 412 392 ipflags = IPV6_OUT_SET_HOP_LIMIT(IPV6_OUT_FLG_HOP_LIMIT, IPV6_MAXHLIM); 413 393 414 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/394 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 415 395 if (in6_get_datagram(&output, len, 0, daddr, NULL, 416 396 IPPROTO_ICMPV6, IPV6_MAXHLIM, … … 422 402 if (IN6_IS_ADDR_UNSPECIFIED(daddr)) { 423 403 424 /* å®å 425 ã¢ãã¬ã¹ãç¡æå®ã®å ´åã¯ãè¦è«ãã«ããã£ã¹ãã¢ãã¬ã¹ãè¨å®ããã*/ 404 /* 宛先アドレスが無指定の場合は、要請マルチキャストアドレスを設定する。*/ 426 405 ip6h->dst.s6_addr32[0] = IPV6_ADDR_INT32_MLL; 427 406 ip6h->dst.s6_addr32[2] = IPV6_ADDR_INT32_ONE; … … 430 409 } 431 410 432 /* éä¿¡å 433 ã¢ãã¬ã¹ã®è¨å® */ 411 /* 送信元アドレスの設定 */ 434 412 if (!dad) { 435 413 436 /* éè¤ã¢ãã¬ã¹æ¤åºã§ã¯ãªãæã®éä¿¡å 437 ã¢ãã¬ã¹æ±ºå®å¦çã*/ 414 /* 重複アドレス検出ではない時の送信元アドレス決定処理。*/ 438 415 T_IN6_ADDR *saddr; 439 416 440 417 if (ln && ln->hold) { 441 418 /* 442 * éä¿¡ããã³ãã£ã³ã°ããã¦ãããã¼ã¿ã°ã©ã ã® 443 * éä¿¡å 444 ã¢ãã¬ã¹ãå©ç¨ããã 419 * 送信がペンディングされているデータグラムの 420 * 送信元アドレスを利用する。 445 421 */ 446 422 if (ln->hold->len > IF_IP6_HDR_SIZE) … … 456 432 else { 457 433 /* 458 * å®å 459 ã¢ãã¬ã¹ã«ãµããããéä¿¡å 460 ã¢ãã¬ã¹ãã 461 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããæ¢ç´¢ãã¦å©ç¨ããã 434 * 宛先アドレスにふさわしい送信元アドレスを、 435 * ネットワークインタフェースから探索して利用する。 462 436 */ 463 437 T_IN6_IFADDR *ifa; … … 472 446 else { 473 447 474 /* éè¤ã¢ãã¬ã¹æ¤åºæã®éä¿¡å 475 ã¢ãã¬ã¹ã¯ç¡æå®ã*/ 448 /* 重複アドレス検出時の送信元アドレスは無指定。*/ 476 449 memset(&ip6h->src, 0, sizeof(T_IN6_ADDR)); 477 450 } 478 451 479 /* è¿é£è¦è«ããããè¨å®ããã*/452 /* 近隣要請ヘッダを設定する。*/ 480 453 nsh = GET_NEIGHBOR_SOLICIT_HDR(output, IF_IP6_NEIGHBOR_SOLICIT_HDR_OFFSET); 481 454 nsh->hdr.type = ND_NEIGHBOR_SOLICIT; … … 486 459 if (!dad && (mac = IF_SOFTC_TO_IFADDR(ifp->ic)) != NULL) { 487 460 488 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã¨ãã¦ãæ¢ç´¢ç®æ¨ã® MAC ã¢ãã¬ã¹ãè¨å®ããã*/461 /* 近隣探索オプションとして、探索目標の MAC アドレスを設定する。*/ 489 462 T_ND_OPT_HDR *opth; 490 463 uint_t optlen; … … 498 471 } 499 472 500 /* ãã§ãã¯ãµã ãè¨ç®ããã*/473 /* チェックサムを計算する。*/ 501 474 nsh->hdr.sum = 0; 502 475 nsh->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)nsh - output->buf, len); 503 476 504 /* éä¿¡ããã*/477 /* 送信する。*/ 505 478 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 506 479 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 512 485 513 486 /* 514 * nd6_na_input -- è¿é£éç¥ã®å 515 ¥åå¦çã 487 * nd6_na_input -- 近隣通知の入力処理。 516 488 */ 517 489 … … 536 508 537 509 /* 538 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã539 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤540 * ã»ãããé·ãçã510 * ヘッダのチェック、以下の場合は破棄する。 511 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 512 * ・ヘッダ長が短い 541 513 */ 542 514 if (ip6h->hlim != IPV6_MAXHLIM || input->len - off < NEIGHBOR_ADVERT_HDR_SIZE) … … 545 517 nah = (T_NEIGHBOR_ADVERT_HDR *)(input->buf + off); 546 518 547 /* ç®çã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼*/519 /* 目的アドレスがマルチキャストならエラー */ 548 520 if (IN6_IS_ADDR_MULTICAST(&nah->target)) 549 521 goto err_ret; 550 522 551 /* è¿é£è¦è«ã¸ã®å¿çã§ãå®å 552 ã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼ */ 523 /* 近隣要請への応答で、宛先アドレスがマルチキャストならエラー */ 553 524 if ((nah->nd_na_flags_reserved & ND_NA_FLG_SOLICITED) && 554 525 IN6_IS_ADDR_MULTICAST(&ip6h->dst)) 555 526 goto err_ret; 556 527 557 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/528 /* 近隣探索オプションのオフセットを記録する。*/ 558 529 if (nd6_options(nd_opt_off, input->buf + (off + NEIGHBOR_ADVERT_HDR_SIZE), 559 530 input->len - (off + NEIGHBOR_ADVERT_HDR_SIZE)) != E_OK) 560 531 goto err_ret; 561 532 562 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ (ç®çãªã³ã¯ã¢ãã¬ã¹) */533 /* 近隣探索オプション (目的リンクアドレス) */ 563 534 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_TARGET_LINKADDR)]) { 564 535 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + NEIGHBOR_ADVERT_HDR_SIZE) + 565 536 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_TARGET_LINKADDR)] - 8); 566 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 567 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 537 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 568 538 lladdr = (uint8_t *)(opth + 1); 569 539 lladdr_len = (opth->len << 3); … … 573 543 574 544 /* 575 * ç®çã¢ãã¬ã¹ãèªåã®ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã«å²ãå½ã¦ããã¦ããã¢ãã¬ã¹ã®576 * ããããã«ä¸è´ããã¨ãã¯ãéè¤ãã¦ãããã¨ãæå³ãã¦ããã545 * 目的アドレスが自分のネットワークインタフェースに割り当てられているアドレスの 546 * いずれかに一致したときは、重複していることを意味している。 577 547 */ 578 548 if (ifa) { … … 585 555 586 556 /* 587 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼557 * ネットワークインタフェースのアドレス長が一致しなければエラー 588 558 */ 589 559 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) 590 560 goto err_ret; 591 561 592 /* è¿é£ãã£ãã·ã¥ãæ¢ç´¢ããã*/562 /* 近隣キャッシュを探索する。*/ 593 563 syscall(wai_sem(SEM_ND6_CACHE)); 594 564 if ((ln = nd6_lookup(&nah->target, false)) == NULL) 595 565 goto free_ret; 596 566 597 /* è¿é£ãã£ãã·ã¥ã®ç¶æ 598 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹æªè§£æ±ºã®å ´å */ 567 /* 近隣キャッシュの状態が、データリンク層のアドレス未解決の場合 */ 599 568 if (ln->state == ND6_LLINFO_INCOMPLETE) { 600 /* éç¥ããããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ã®é·ãã 0 ã®å ´å*/569 /* 通知されたデータリンク層のアドレスの長さが 0 の場合 */ 601 570 if (lladdr == NULL) 602 571 goto free_ret; … … 633 602 634 603 /* 635 * ç¶æ 636 é·ç§»è¡¨ 604 * 状態遷移表 637 605 * 638 606 * nd_na_flags_reserved 639 * OVERRIDE SOLICTED lladdr llchange å¦ç (L: lladdr ãç»é²ãã)607 * OVERRIDE SOLICTED lladdr llchange 処理 (L: lladdr を登録する) 640 608 * 641 609 * F F N - (2c) … … 653 621 */ 654 622 if ((nah->nd_na_flags_reserved & ND_NA_FLG_OVERRIDE) == 0 && (lladdr != NULL && llchange)) { /* (1) */ 655 /* ç¶æ 656 ã REACHABLE ãªã STALE ã«é·ç§»ããã*/ 623 /* 状態が REACHABLE なら STALE に遷移する。*/ 657 624 if (ln->state == ND6_LLINFO_REACHABLE) { 658 625 syscall(get_tim(&now)); … … 666 633 lladdr == NULL) { /* (2c) */ 667 634 668 /* ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã¦ããã°æ´æ°ããã*/635 /* データリンク層のアドレスが通知されていれば更新する。*/ 669 636 if (lladdr != NULL) 670 637 ln->ifaddr = *(T_IF_ADDR *)lladdr; 671 638 672 /* è¿é£è¦è«ã¸ã®å¿çãªã REACHABLE ã«é·ç§»ããã*/639 /* 近隣要請への応答なら REACHABLE に遷移する。*/ 673 640 if (nah->nd_na_flags_reserved & ND_NA_FLG_SOLICITED) { 674 641 ln->state = ND6_LLINFO_REACHABLE; … … 680 647 } 681 648 /* 682 * ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã683 * ç°ãªãã¢ãã¬ã¹ãªãæ´æ°ããã649 * データリンク層のアドレスが通知され、 650 * 異なるアドレスなら更新する。 684 651 */ 685 652 else if (lladdr != NULL && llchange) { … … 690 657 } 691 658 692 /* ã«ã¼ã¿éç¥ãã©ã°ã®å¦ç*/659 /* ルータ通知フラグの処理 */ 693 660 if ((ln->flags & ND6_LLIF_ROUTER ) != 0 && 694 661 (nah->nd_na_flags_reserved & ND_NA_FLG_ROUTER) == 0) { 695 662 /* 696 * éä¿¡ç¸æãã«ã¼ã¿éç¥ãã©ã°ãç¡å¹ã«ããå ´åã697 * ãã£ãã©ã«ãã»ã«ã¼ã¿ãªã¹ããã対象ã®ã«ã¼ã¿ãåé¤ãã698 * è¿é£æ¢ç´¢ãã£ãã·ã¥ãæ´æ°ããã663 * 送信相手がルータ通知フラグを無効にした場合。 664 * ディフォルト・ルータリストから対象のルータを削除し、 665 * 近隣探索キャッシュを更新する。 699 666 */ 700 667 T_DEF_ROUTER *dr = NULL; … … 714 681 ln->asked = 0; 715 682 716 /* ã¢ãã¬ã¹è§£æ±ºå¾ 717 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã*/ 683 /* アドレス解決待ちのデータグラムがあれば送信する。*/ 718 684 nd6_output_hold(ifp, ln); 719 685 … … 729 695 730 696 /* 731 * nd6_na_output -- è¿é£éç¥ãåºåããã697 * nd6_na_output -- 近隣通知を出力する。 732 698 */ 733 699 … … 747 713 748 714 /* 749 * è¿é£éç¥ãã¤ãã¼ãé·ãè¨ç®ããã750 * tlladdr ãçãªããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ã追å ããã715 * 近隣通知ペイロード長を計算する。 716 * tlladdr が真ならネットワークインタフェースのアドレスを追加する。 751 717 */ 752 718 if (tlladdr && IF_SOFTC_TO_IFADDR(ifp->ic)) … … 756 722 757 723 /* 758 * ä»ã®ãªã³ã¯ããã®å½é ããããã¼ã¿ã°ã©ã ã759 * æé¤ãããããããããªãããã« IPV6_MAXHLIM (255) ãè¨å®ããã724 * 他のリンクからの偽造されたデータグラムを 725 * 排除するため、ホップリミットに IPV6_MAXHLIM (255) を設定する。 760 726 */ 761 727 ipflags = IPV6_OUT_SET_HOP_LIMIT(IPV6_OUT_FLG_HOP_LIMIT, IPV6_MAXHLIM); 762 728 763 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/729 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 764 730 if (in6_get_datagram(&output, len, 0, daddr, NULL, 765 731 IPPROTO_ICMPV6, IPV6_MAXHLIM, … … 771 737 if (IN6_IS_ADDR_UNSPECIFIED(daddr)) { 772 738 /* 773 * å®å 774 ã¢ãã¬ã¹ãç¡æå®ã®å ´åã¯ã 775 * ãªã³ã¯ãã¼ã«ã«å 776 ¨ãã¼ãã»ãã«ããã£ã¹ãã¢ãã¬ã¹ãè¨å®ããã 739 * 宛先アドレスが無指定の場合は、 740 * リンクローカル全ノード・マルチキャストアドレスを設定する。 777 741 */ 778 742 ip6h->dst.s6_addr32[0] = IPV6_ADDR_INT32_MLL; … … 786 750 787 751 /* 788 * å®å 789 ã¢ãã¬ã¹ã«ãµããããéä¿¡å 790 ã¢ãã¬ã¹ãã 791 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããæ¢ç´¢ãã¦å©ç¨ããã 752 * 宛先アドレスにふさわしい送信元アドレスを、 753 * ネットワークインタフェースから探索して利用する。 792 754 */ 793 755 if ((ifa = in6_ifawithifp(ifp, &ip6h->dst)) == NULL) { … … 797 759 ip6h->src = ifa->addr; 798 760 799 /* è¿é£éç¥ããããè¨å®ããã*/761 /* 近隣通知ヘッダを設定する。*/ 800 762 nah = GET_NEIGHBOR_ADVERT_HDR(output, IF_IP6_NEIGHBOR_ADVERT_HDR_OFFSET); 801 763 nah->hdr.type = ND_NEIGHBOR_ADVERT; … … 803 765 nah->target = *taddr; 804 766 805 /* tlladdr ãçãªããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ã追å ããã*/767 /* tlladdr が真ならネットワークインタフェースのアドレスを追加する。*/ 806 768 if (tlladdr && (mac = IF_SOFTC_TO_IFADDR(ifp->ic)) != NULL) { 807 769 … … 821 783 nah->nd_na_flags_reserved = flags; 822 784 823 /* ãã§ãã¯ãµã ãè¨ç®ããã*/785 /* チェックサムを計算する。*/ 824 786 nah->hdr.sum = 0; 825 787 nah->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)nah - output->buf, len); 826 788 827 /* éä¿¡ããã*/789 /* 送信する。*/ 828 790 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 829 791 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 835 797 836 798 /* 837 * nd6_dad_start -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) ãéå§ããã799 * nd6_dad_start -- 重複アドレス検出 (DAD) を開始する。 838 800 * 839 * 第3å¼æ°ã®tick ã¯ãã¤ã³ã¿ãã§ã¼ã¹ãèµ·åããã¦ãããéè¤æ¤åºã 840 * éä¿¡ããã¾ã§ã®æå°é 841 延å¤ã§ããã 801 * 第3引数のtick は、インタフェースが起動されてから、重複検出を 802 * 送信するまでの最小遅延値である。 842 803 */ 843 804 … … 845 806 nd6_dad_start (T_IFNET *ifp, T_IN6_IFADDR *ifa, int_t *tick) 846 807 { 847 /* ãã©ã°ããã§ãã¯ããã*/808 /* フラグをチェックする。*/ 848 809 if (!(ifa->flags & IN6_IFF_TENTATIVE)) 849 810 return; … … 862 823 return; 863 824 864 /* éè¤ã¢ãã¬ã¹æ¤åºã«ã¦ã³ã¿ããªã»ããããã*/825 /* 重複アドレス検出カウンタをリセットする。*/ 865 826 ifa->ns_icount = ifa->na_icount = ifa->ns_ocount = 0; 866 827 867 828 /* 868 * éè¤ã¢ãã¬ã¹æ¤åºè¦è«ãéä¿¡ããããã ããã¤ã³ã¿ãã§ã¼ã¹ã 869 * åæåããç´å¾ã«ãæåã«éä¿¡ããå ´åã¯ãã©ã³ãã ãªé 870 延ãè¡ãã 829 * 重複アドレス検出要請を送信する。ただし、インタフェースを 830 * 初期化した直後に、最初に送信する場合は、ランダムな遅延を行う。 871 831 */ 872 832 if (tick == NULL) { 873 833 nd6_dad_ns_output(ifp, ifa); 874 834 875 /* ã¿ã¤ã ã¢ã¦ããè¿é£æ¢ç´¢ã®éä¿¡ééã«è¨å®ããã*/835 /* タイムアウトを近隣探索の送信間隔に設定する。*/ 876 836 timeout((callout_func)nd6_dad_timer, ifa, ND6_RETRANS_TIME * NET_TIMER_HZ / SYSTIM_HZ); 877 837 } … … 879 839 int_t ntick; 880 840 881 if (*tick == 0) /* æåã®éä¿¡*/841 if (*tick == 0) /* 最初の送信 */ 882 842 ntick = net_rand() % (ND6_FIRST_DAD_DELAY_TIME * NET_TIMER_HZ / SYSTIM_HZ); 883 843 else
Note:
See TracChangeset
for help on using the changeset viewer.