Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/nd6_rtr.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_rtr.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$ … … 123 111 124 112 /* 125 * å¤é¨é¢æ°ã®å®ç¾©113 * 外部関数の定義 126 114 */ 127 115 … … 133 121 134 122 /* 135 * å 136 ¨åå¤æ° 137 */ 138 139 SYSTIM nd6_base_reachable_time = ND6_DEF_REACHABLE_TIME; /* ã«ã¼ã¿ããéç¥ãããå¤ */ 140 SYSTIM nd6_reachable_time = ND6_DEF_REACHABLE_TIME; /* ã«ã¼ã¿ããéç¥ãããå¤ã®è£æ£å¤ */ 141 SYSTIM nd6_recalc_reachtm_interval = ND6_RECALC_REACHTM_INTERVAL; /* å°éå¯è½ç¶æ 142 ã®æå¹æéåè¨ç®éé */ 143 SYSTIM nd6_retrans_time = ND6_DEF_RETRANS_TIME; /* è¿é£æ¢ç´¢ã®éä¿¡éé */ 144 uint8_t ip6_defhlim = IPV6_DEFHLIM; /* ããããªãããã®è¦å®å¤ */ 145 146 /* 147 * å±æå¤æ° 148 */ 149 150 /* 151 * ãã¬ãã£ãã¯ã¹ã»ãªã¹ã 123 * 全域変数 124 */ 125 126 SYSTIM nd6_base_reachable_time = ND6_DEF_REACHABLE_TIME; /* ルータから通知された値 */ 127 SYSTIM nd6_reachable_time = ND6_DEF_REACHABLE_TIME; /* ルータから通知された値の補正値 */ 128 SYSTIM nd6_recalc_reachtm_interval = ND6_RECALC_REACHTM_INTERVAL; /* 到達可能状態の有効時間再計算間隔 */ 129 SYSTIM nd6_retrans_time = ND6_DEF_RETRANS_TIME; /* 近隣探索の送信間隔 */ 130 uint8_t ip6_defhlim = IPV6_DEFHLIM; /* ホップリミットの規定値 */ 131 132 /* 133 * 局所変数 134 */ 135 136 /* 137 * プレフィックス・リスト 152 138 */ 153 139 … … 155 141 156 142 /* 157 * ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ã143 * ディフォルトルータ・リスト 158 144 */ 159 145 160 146 static T_DEF_ROUTER nd6_def_router[NUM_ND6_DEF_RTR_ENTRY]; 161 static uint_t def_router_count = 0; /* ãªã¹ãã«ããã«ã¼ã¿æ°*/162 163 /* 164 * make_mask -- ãããç¨ã®ãã¹ã¯ãçæããã147 static uint_t def_router_count = 0; /* リストにあるルータ数 */ 148 149 /* 150 * make_mask -- マップ用のマスクを生成する。 165 151 */ 166 152 … … 171 157 int_t ix; 172 158 173 /* ãã¹ã¯ãçæããã*/159 /* マスクを生成する。*/ 174 160 mask = 1; 175 161 for (ix = index; ix -- > 0; ) … … 181 167 /* 182 168 * find_pfxlist_reachable_router -- 183 * æå®ãããã¬ãã£ãã¯ã¹ãéç¥ããã«ã¼ã¿ããªã³ã¯ä¸ã«åå¨ããããã§ãã¯ããã169 * 指定したプレフィックスを通知したルータがリンク上に存在するかチェックする。 184 170 */ 185 171 … … 205 191 206 192 /* 207 * pfxlist_onlink_check -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ãã®ãªã³ãªã³ã¯ç¶æ 208 ããã§ãã¯ããã 193 * pfxlist_onlink_check -- プレフィックス・リストのオンリンク状態をチェックする。 209 194 * 210 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã211 * ããã¯ãã¦ããå¼ã³åºããã¨ã195 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 196 * ロックしてから呼び出すこと。 212 197 */ 213 198 … … 230 215 if (ix >= 0) { 231 216 /* 232 * ãªã³ãªã³ã¯ç¶æ 233 ã®ãã¬ãã£ãã¯ã¹ãæä½ä¸ã¤åå¨ããã¨ãã®å¦çã 234 * åãã¬ãã£ãã¯ã¹ã®ãªã³ãªã³ã¯ç¶æ 235 ããããããéç¥ãã¦ããã«ã¼ã¿ã® 236 * ç¶æ 237 ã«å¾ã£ã¦è¨å®ããã 217 * オンリンク状態のプレフィックスが最低一つ存在するときの処理。 218 * 各プレフィックスのオンリンク状態を、それらを通知してきたルータの 219 * 状態に従って設定する。 238 220 */ 239 221 … … 256 238 else { 257 239 /* 258 * ã©ã®ãã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã§ã¯ãªãã 259 * ãã£ãã©ã«ãã«ã¼ã¿ãåå¨ããªãã¨ãã®å¦çã 260 * ãã¹ã¦ã®ãã¬ãã£ãã¯ã¹ã使ç¨å¯è½ç¶æ 261 ã«è¨å®ããã 240 * どのプレフィックスもオンリンクではなく、 241 * ディフォルトルータも存在しないときの処理。 242 * すべてのプレフィックスを使用可能状態に設定する。 262 243 */ 263 244 … … 275 256 276 257 /* 277 * åãã¬ãã£ãã¯ã¹æ¯ã«ãéç¥ãã¦ããã«ã¼ã¿ã®ç¶æ 278 㨠279 * ãªã³ãªã³ã¯ã®ç¶æ 280 ãä¸è´ããªããã°ããªã³ãªã³ã¯ç¶æ 281 ãæ´æ°ããã 258 * 各プレフィックス毎に、通知してきたルータの状態と 259 * オンリンクの状態が一致しなければ、オンリンク状態を更新する。 282 260 */ 283 261 for (ix = NUM_ND6_PREFIX_ENTRY; ix -- > 0; ) { … … 302 280 303 281 /* 304 * ãªã³ã¯ä¸ã«ãã¬ãã£ãã¯ã¹ãéç¥ãã¦ããã«ã¼ã¿ã305 * å°ãªãã¨ã 1 å°åå¨ããã確èªããã282 * リンク上にプレフィックスを通知しているルータが 283 * 少なくとも 1 台存在するか確認する。 306 284 */ 307 285 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { … … 317 295 if (ix >= 0) { 318 296 /* 319 * ãªã³ã¯ä¸ã«ãã¬ãã£ãã¯ã¹ãéç¥ãã¦ããã«ã¼ã¿ã320 * å°ãªãã¨ã 1 å°åå¨ããæã®å¦çã297 * リンク上にプレフィックスを通知しているルータが 298 * 少なくとも 1 台存在する時の処理。 321 299 */ 322 300 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { … … 334 312 else { 335 313 /* 336 * ãªã³ã¯ä¸ã«ãã¬ãã£ãã¯ã¹ãéç¥ãã¦ããã«ã¼ã¿ã 337 * 1 å°åå¨ããªãæã¯å 338 ¨ã¦ã®ã¢ãã¬ã¹ãå©ç¨ã§ããããã«ããã 314 * リンク上にプレフィックスを通知しているルータが 315 * 1 台存在しない時は全てのアドレスを利用できるようにする。 339 316 */ 340 317 for (ix = NUM_IN6_IFADDR_ENTRY; ix -- > 0; ) { … … 347 324 348 325 /* 349 * pfxrtr_add -- ãã¬ãã£ãã¯ã¹ã¨ã³ããªã¨ãã£ãã©ã«ãã«ã¼ã¿ã»ã¨ã³ããªããªã³ã¯ããã326 * pfxrtr_add -- プレフィックスエントリとディフォルトルータ・エントリをリンクする。 350 327 * 351 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã352 * ããã¯ãã¦ããå¼ã³åºããã¨ã328 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 329 * ロックしてから呼び出すこと。 353 330 */ 354 331 … … 356 333 pfxrtr_add (int_t prefix_index, int_t rtr_index) 357 334 { 358 /* ãã¬ãã£ãã¯ã¹ã¨ã³ããªã¨ãã£ãã©ã«ãã«ã¼ã¿ã»ã¨ã³ããªããªã³ã¯ããã*/335 /* プレフィックスエントリとディフォルトルータ・エントリをリンクする。*/ 359 336 nd6_prefix[prefix_index].routermap |= make_mask(rtr_index); 360 337 nd6_def_router[rtr_index].plistmap |= make_mask(prefix_index); … … 364 341 365 342 /* 366 * nd6_pfxrtr_lookup -- ãã¬ãã£ãã¯ã¹ã¨ã³ããªããã«ã¼ã¿ãæ¢ç´¢ããã343 * nd6_pfxrtr_lookup -- プレフィックスエントリからルータを探索する。 367 344 */ 368 345 … … 374 351 375 352 /* 376 * defrouter_select -- åªå 377 ãã£ãã©ã«ãã»ã«ã¼ã¿ãé¸æããªããã 353 * defrouter_select -- 優先ディフォルト・ルータを選択しなおす。 378 354 * 379 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã380 * ããã¯ãã¦ããå¼ã³åºããã¨ã355 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 356 * ロックしてから呼び出すこと。 381 357 */ 382 358 … … 392 368 if ((ln = nd6_lookup(&dr->addr, false)) != NULL && ND6_IS_LLINFO_PROBREACH(ln)) { 393 369 394 /* é¸æããã«ã¼ã¿ãå 395 é ã«ç§»ãã*/ 370 /* 選択したルータを先頭に移す。*/ 396 371 router = *dr; 397 372 for (tix = ix; tix > 0; tix --) … … 404 379 405 380 /* 406 * defrtrlist_update -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ããæ´æ°ããã381 * defrtrlist_update -- ディフォルトルータ・リストを更新する。 407 382 * 408 * æ»ãå¤ã¯ãã«ã¼ã¿ã®ã¤ã³ããã¯ã¹ã409 * ãã ããå¤ã -1 ãªãããã¬ãã£ãã¯ã¹ã»ãªã¹ãã¯æ´æ°ããªãã383 * 戻り値は、ルータのインデックス。 384 * ただし、値が -1 なら、プレフィックス・リストは更新しない。 410 385 */ 411 386 … … 420 395 syscall(wai_sem(SEM_ND6_DEFRTRLIST)); 421 396 422 /* ç»é²æ¸ã調ã¹ãã*/397 /* 登録済か調べる。*/ 423 398 if ((fdr = nd6_defrtrlist_lookup(src)) != NULL) { 424 /* ç»é²æ¸ã¿ã®å ´åã®å¦ç*/399 /* 登録済みの場合の処理 */ 425 400 if (lifetime == 0) { 426 401 nd6_defrtrlist_del(fdr); … … 429 404 } 430 405 else { 431 fdr->lifetime = lifetime * SYSTIM_HZ; /* lifetime ã®åä½ã¯ç§*/406 fdr->lifetime = lifetime * SYSTIM_HZ; /* lifetime の単位は秒 */ 432 407 fdr->flags = flags; 433 408 fdr->expire = now + fdr->lifetime; … … 443 418 if (fdr == NULL && def_router_count < NUM_ND6_DEF_RTR_ENTRY) { 444 419 /* 445 * def_router_count < NUM_ND6_DEF_RTR_ENTRY ã§ããã°ã446 * nd6_def_router[def_router_count]; ã空ãã¨ã³ããª420 * def_router_count < NUM_ND6_DEF_RTR_ENTRY であれば、 421 * nd6_def_router[def_router_count]; が空きエントリ 447 422 */ 448 423 fdr = &nd6_def_router[def_router_count]; 449 424 } 450 425 451 /* 空ãã¨ã³ããªããªããã°ãæå¹æéãçãã¨ã³ããªãåé¤ããã*/426 /* 空きエントリがなければ、有効時間が短いエントリを削除する。*/ 452 427 if (fdr == NULL) { 453 428 T_DEF_ROUTER *sdr = NULL; … … 458 433 diff = (int32_t)(dr->expire - now); 459 434 if (diff <= 0) { /* dr->expire <= now */ 460 /* æ¢ã«ãæå¹æéãéãã¦ããã*/435 /* 既に、有効時間が過ぎている。*/ 461 436 sdr = dr; 462 437 break; … … 471 446 } 472 447 473 /* åã¡ã³ãã«å¤ãè¨å®ããã*/448 /* 各メンバに値を設定する。*/ 474 449 fdr->plistmap = 0; 475 450 fdr->addr = *src; 476 fdr->lifetime = lifetime * SYSTIM_HZ; /* lifetime ã®åä½ã¯ç§*/451 fdr->lifetime = lifetime * SYSTIM_HZ; /* lifetime の単位は秒 */ 477 452 fdr->flags = flags; 478 453 fdr->expire = now + fdr->lifetime; … … 481 456 482 457 /* 483 * ãã£ãã©ã«ãã«ã¼ã¿ã¨ãã¦ç»é²ãããã484 * æ¢ã«ãã£ãã©ã«ãã«ã¼ã¿ãããã°é¸æããªãããªãã458 * ディフォルトルータとして登録するが、 459 * 既にディフォルトルータがあれば選択しなおさない。 485 460 */ 486 461 if (fdr - nd6_def_router != 0) … … 492 467 493 468 /* 494 * in6_ifadd -- ã¤ã³ã¿ãã§ã¼ã¹ã«ã¢ãã¬ã¹ã追å ããã469 * in6_ifadd -- インタフェースにアドレスを追加する。 495 470 */ 496 471 … … 506 481 507 482 /* 508 * ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ãæªç»é²ã§ããã°ä½ãããªãã483 * リンクローカルアドレスが未登録であれば何もしない。 509 484 */ 510 485 if ((lla->flags & IN6_IFF_DEFINED) == 0) … … 512 487 513 488 /* 514 * ã«ã¼ã¿ããéç¥ããããã¬ãã£ãã¯ã¹é·ãã515 * ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®ãã¬ãã£ãã¯ã¹é·ã¨516 * ç°ãªã£ã¦ããã°ã¨ã©ã¼489 * ルータから通知されたプレフィックス長が、 490 * リンクローカルアドレスのプレフィックス長と 491 * 異なっていればエラー 517 492 */ 518 493 if (lla->prefix_len != pr->prefix_len) 519 494 return E_PAR; 520 495 521 /* ãã¬ãã£ãã¯ã¹ãã¹ã¯ãçæããã*/496 /* プレフィックスマスクを生成する。*/ 522 497 in6_plen2pmask(&mask, pr->prefix_len); 523 498 524 /* ã¢ãã¬ã¹ãçæããã*/499 /* アドレスを生成する。*/ 525 500 for (ix = 0; ix < 4; ix ++) 526 501 addr.s6_addr32[ix] = (pr->prefix.s6_addr32[ix] & mask.s6_addr32[ix]) 527 502 | ( lla->addr.s6_addr32[ix] & ~mask.s6_addr32[ix]); 528 503 529 /* ãã©ã°ãåæåããã*/504 /* フラグを初期化する。*/ 530 505 ia->flags = 0; 531 506 … … 536 511 537 512 /* 538 * nd6_prefix_lookup -- ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã513 * nd6_prefix_lookup -- プレフィックスを探索する。 539 514 */ 540 515 … … 556 531 557 532 /* 558 * prelist_remove -- ãã¬ãã£ãã¯ã¹ãªã¹ããããã¬ãã£ãã¯ã¹ãåé¤ããã533 * prelist_remove -- プレフィックスリストからプレフィックスを削除する。 559 534 * 560 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã561 * ããã¯ãã¦ããå¼ã³åºããã¨ã535 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 536 * ロックしてから呼び出すこと。 562 537 */ 563 538 … … 569 544 int_t rix; 570 545 571 /* æå¹æéåãã«ããã*/546 /* 有効時間切れにする。*/ 572 547 pr->vltime = 0; 573 548 pr->pltime = 0; … … 579 554 } 580 555 581 /* ãã¬ãã£ãã¯ã¹ã¨ã³ããªã¨ãã£ãã©ã«ãã«ã¼ã¿ã»ã¨ã³ããªã®ãªã³ã¯ã解é¤ããã*/556 /* プレフィックスエントリとディフォルトルータ・エントリのリンクを解除する。*/ 582 557 pr->routermap = 0; 583 558 mask = make_mask(pr - nd6_prefix); … … 585 560 nd6_def_router[rix].plistmap &= ~mask; 586 561 587 /* ãã¬ãã£ãã¯ã¹ãç¡å¹ã«ããã*/562 /* プレフィックスを無効にする。*/ 588 563 pr->flags &= ~ND6_PREFIX_STATE_BUSY; 589 564 … … 592 567 593 568 /* 594 * nd6_prefix_onlink -- ãã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã«è¨å®ããã¢ãã¬ã¹ã使ç¨å¯è½ã«ããã569 * nd6_prefix_onlink -- プレフィックスをオンリンクに設定し、アドレスを使用可能にする。 595 570 * 596 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã597 * ããã¯ãã¦ããå¼ã³åºããã¨ã571 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 572 * ロックしてから呼び出すこと。 598 573 */ 599 574 … … 605 580 int_t ix; 606 581 607 /* æ¢ã«ãªã³ãªã³ã¯ç¶æ 608 ã«ãªã£ã¦ããå ´åã¯ã¨ã©ã¼ã*/ 582 /* 既にオンリンク状態になっている場合はエラー。*/ 609 583 if ((pr->flags & ND6_PREFIX_STATE_ONLINK) != 0) 610 584 return E_OBJ; 611 585 612 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ãæªç»é²ã§ããã°ä½ãããªãã*/586 /* リンクローカルアドレスが未登録であれば何もしない。*/ 613 587 lla = &ifp->in_ifaddrs[IPV6_IFADDR_IX_LINKLOCAL]; 614 588 if ((lla->flags & IN6_IFF_DEFINED) == 0) … … 616 590 617 591 /* 618 * æå®ããããã¬ãã£ãã¯ã¹ãå²ãå½ã¦ããã¦ããã¤ã³ã¿ãã§ã¼ã¹ã® 619 * ã¢ãã¬ã¹æ 620 å ±ãæ¢ãã 592 * 指定されたプレフィックスが割り当てられているインタフェースの 593 * アドレス情報を探す。 621 594 */ 622 595 for (ix = NUM_IN6_IFADDR_ENTRY; ix --; ) { … … 628 601 if (ix >= 0) { 629 602 630 /* ã¢ãã¬ã¹æ 631 å ±ã使ç¨å¯è½ã«ããã*/ 603 /* アドレス情報を使用可能にする。*/ 632 604 ia->flags &= ~IN6_IFF_DETACHED; 633 605 634 /* ãã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã«è¨å®ããã*/606 /* プレフィックスをオンリンクに設定する。*/ 635 607 pr->flags |= ND6_PREFIX_STATE_ONLINK; 636 608 } … … 640 612 641 613 /* 642 * nd6_prefix_offlink -- ãã¬ãã£ãã¯ã¹ããªããªã³ã¯ã«è¨å®ããã¢ãã¬ã¹ã使ç¨ä¸å¯ã«ããã614 * nd6_prefix_offlink -- プレフィックスをオフリンクに設定し、アドレスを使用不可にする。 643 615 * 644 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã645 * ããã¯ãã¦ããå¼ã³åºããã¨ã616 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 617 * ロックしてから呼び出すこと。 646 618 */ 647 619 … … 653 625 int_t ix; 654 626 655 /* æ¢ã«ãªããªã³ã¯ç¶æ 656 ã«ãªã£ã¦ããå ´åã¯ã¨ã©ã¼ã*/ 627 /* 既にオフリンク状態になっている場合はエラー。*/ 657 628 if ((pr->flags & ND6_PREFIX_STATE_ONLINK) == 0) 658 629 return E_OBJ; 659 630 660 631 /* 661 * æå®ããããã¬ãã£ãã¯ã¹ãå²ãå½ã¦ããã¦ããã¤ã³ã¿ãã§ã¼ã¹ã® 662 * ã¢ãã¬ã¹æ 663 å ±ãæ¢ãã 632 * 指定されたプレフィックスが割り当てられているインタフェースの 633 * アドレス情報を探す。 664 634 */ 665 635 for (ix = NUM_IN6_IFADDR_ENTRY; ix --; ) { … … 671 641 if (ix >= 0) { 672 642 673 /* ã¢ãã¬ã¹æ 674 å ±ã使ç¨ä¸å¯ã«ããã*/ 643 /* アドレス情報を使用不可にする。*/ 675 644 ia->flags |= IN6_IFF_DETACHED; 676 645 677 /* ãã¬ãã£ãã¯ã¹ããªããªã³ã¯ã«è¨å®ããã*/646 /* プレフィックスをオフリンクに設定する。*/ 678 647 pr->flags &= ~ND6_PREFIX_STATE_ONLINK; 679 648 } … … 683 652 684 653 /* 685 * in6_init_prefix_ltimes -- ãã¬ãã£ãã¯ã¹ã®æå¹æéãè¨å®ããã654 * in6_init_prefix_ltimes -- プレフィックスの有効時間を設定する。 686 655 */ 687 656 … … 691 660 SYSTIM now; 692 661 693 /* æ¨å¥¨æå¹æéãæå¹æéããé·ãã¨ãã¯ã¨ã©ã¼*/662 /* 推奨有効時間が有効時間より長いときはエラー */ 694 663 if (pr->pltime > pr->vltime) 695 664 return E_PAR; … … 712 681 713 682 /* 714 * nd6_prelist_add -- ãã¬ãã£ãã¯ã¹ãªã¹ãã«ãã¬ãã£ãã¯ã¹ã追å ããã683 * nd6_prelist_add -- プレフィックスリストにプレフィックスを追加する。 715 684 * 716 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã717 * ããã¯ãã¦ããå¼ã³åºããã¨ã685 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 686 * ロックしてから呼び出すこと。 718 687 */ 719 688 … … 725 694 ER error; 726 695 727 /* ãã¬ãã£ãã¯ã¹ãªã¹ããã空ãã®ãã¬ãã£ãã¯ã¹ã¨ã³ããªãæ¢ç´¢ããã*/696 /* プレフィックスリストから空きのプレフィックスエントリを探索する。*/ 728 697 for (ix = NUM_ND6_PREFIX_ENTRY; ix --; ) { 729 698 pr = &nd6_prefix[ix]; … … 732 701 } 733 702 734 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã«ç©ºãããªããã°ã¨ã©ã¼*/703 /* プレフィックスリストに空きがなければエラー */ 735 704 if (ix < 0) 736 705 return NULL; … … 738 707 pr->flags |= ND6_PREFIX_STATE_BUSY; 739 708 740 /* ãã¬ãã£ãã¯ã¹ã追å ããã*/709 /* プレフィックスを追加する。*/ 741 710 pr->prefix = pi->prefix; 742 711 pr->prefix_len = pi->prefix_len; 743 712 744 /* ãã©ã°ãè¨å®ããã*/713 /* フラグを設定する。*/ 745 714 if ((pi->flags & ND_OPT_PI_FLAG_ONLINK) != 0) 746 715 pr->flags |= ND6_PREFIX_FLAG_ONLINK; … … 748 717 pr->flags |= ND6_PREFIX_FLAG_AUTO; 749 718 750 /* ãã¬ãã£ãã¯ã¹ã®æå¹æéãè¨å®ããã*/719 /* プレフィックスの有効時間を設定する。*/ 751 720 pr->vltime = ntohl(pi->valid); 752 721 pr->pltime = ntohl(pi->preferred); … … 758 727 } 759 728 760 /* ã«ã¼ã¿ããããåæåããã*/729 /* ルータマップを初期化する。*/ 761 730 pr->routermap = 0; 762 731 763 /* ã«ã¼ã¿ã追å ããã*/732 /* ルータを追加する。*/ 764 733 pfxrtr_add(pr - nd6_prefix, rtr_index); 765 734 … … 768 737 769 738 /* 770 * prelist_update -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ããæ´æ°ããã739 * prelist_update -- プレフィックス・リストを更新する。 771 740 */ 772 741 … … 782 751 if ((pr = nd6_prefix_lookup(&pi->prefix, pi->prefix_len)) != NULL) { 783 752 /* 784 * ç»é²æ¸ã¿ã®å ´åã¯ããã¬ãã£ãã¯ã¹ãªã¹ããæ´æ°ããã753 * 登録済みの場合は、プレフィックスリストを更新する。 785 754 */ 786 755 787 756 /* 788 * ãã©ã°ã®æ´æ°ã®æ³¨æ:789 * on-link ããã㨠autonomous ãããã¯790 * 1 ãã 0 ã«å¤æ´ãã¦ã¯ãªããªãã757 * フラグの更新の注意: 758 * on-link ビットと autonomous ビットは 759 * 1 から 0 に変更してはならない。 791 760 */ 792 761 … … 798 767 if ((pi->flags & ND_OPT_PI_FLAG_ONLINK) != 0) { 799 768 /* 800 * éç¥ããããã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã®æã¯ã801 * æå¹æéãæ´æ°ããã769 * 通知されたプレフィックスがオンリンクの時は、 770 * 有効時間を更新する。 802 771 */ 803 772 pr->vltime = ntohl(pi->valid); … … 809 778 (pr->flags & ND6_PREFIX_STATE_ONLINK) == 0) { 810 779 /* 811 * ãªããªã³ã¯ã®ãã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã«ãªã£ãæã®å¦çãå®è¡ããã780 * オフリンクのプレフィックスがオンリンクになった時の処理を実行する。 812 781 */ 813 782 if (nd6_prefix_onlink(pr) != E_OK) { … … 821 790 pfxrtr_add(pr - nd6_prefix, router_index); 822 791 } 823 else { /* æªç»é²ã®å ´å*/824 825 /* æå¹æé 0 ã®ãã¬ãã£ãã¯ã¹ã¯è¿½å ããªãã*/792 else { /* 未登録の場合 */ 793 794 /* 有効時間 0 のプレフィックスは追加しない。*/ 826 795 if (pi->valid == 0) { 827 796 syscall(sig_sem(SEM_ND6_DEFRTRLIST)); … … 829 798 } 830 799 831 /* ãªããªã³ã¯ã§ã¢ãã¬ã¹èªåè¨å®ã«ä½¿ç¨ããªããã°è¿½å ããªãã*/800 /* オフリンクでアドレス自動設定に使用しなければ追加しない。*/ 832 801 if ((pi->flags & (ND_OPT_PI_FLAG_ONLINK | ND_OPT_PI_FLAG_AUTO)) != 833 802 (ND_OPT_PI_FLAG_ONLINK | ND_OPT_PI_FLAG_AUTO)) { … … 836 805 } 837 806 838 /* ãã¬ãã£ãã¯ã¹ã追å ããã*/807 /* プレフィックスを追加する。*/ 839 808 if ((pr = nd6_prelist_add(pi, router_index)) == NULL) { 840 809 syslog(LOG_ERROR, "[ND6 RTR] prefix add failed."); … … 845 814 if ((pr->flags & ND6_PREFIX_FLAG_ONLINK) == 0) { 846 815 /* 847 * ãªããªã³ã¯ã»ãã¬ãã£ãã¯ã¹ã®å ´åã¯ãæå¹æéã 0 ã«è¨å®ããã848 * ãã¨ã§æå¹æéåãã¨ãªãããªã¹ãããåé¤ãããã816 * オフリンク・プレフィックスの場合は、有効時間を 0 に設定する。 817 * あとで有効期限切れとなり、リストから削除される。 849 818 */ 850 819 pr->vltime = 0; … … 855 824 856 825 /* 857 * ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ãè¡ãã826 * ステートレス・アドレス自動設定を行う。 858 827 */ 859 828 if ((pr->flags & ND6_PREFIX_FLAG_AUTO) == 0) { … … 863 832 864 833 /* 865 * éç¥ããããã¬ãã£ãã¯ã¹ãå²ãå½ã¦ããã¦ããã¤ã³ã¿ãã§ã¼ã¹ã® 866 * ã¢ãã¬ã¹æ 867 å ±ãæ¢ãã 834 * 通知されたプレフィックスが割り当てられているインタフェースの 835 * アドレス情報を探す。 868 836 */ 869 837 for (ix = NUM_IN6_IFADDR_ENTRY; ix --; ) { … … 875 843 } 876 844 877 if (ix >= 0) { /* ç»é²æ¸ã¿ã®ã¨ã*/845 if (ix >= 0) { /* 登録済みのとき */ 878 846 if ((ia->flags & IN6_IFF_AUTOCONF) == 0) { 879 847 /* 880 * ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ã«ãã881 * è¨å®ããã¦ããªããã°æ´æ°ããªãã848 * ステートレス・アドレス自動設定により 849 * 設定されていなければ更新しない。 882 850 */ 883 851 ; … … 885 853 else if (ia->flags & IN6_IFF_TENTATIVE) { 886 854 /* 887 * éè¤æ¤åºä¸ãªãæ´æ°ããªãã855 * 重複検出中なら更新しない。 888 856 */ 889 857 ; … … 896 864 int_t ix; 897 865 898 /* æå¹æéãè¨å®ããã*/866 /* 有効時間を設定する。*/ 899 867 syscall(get_tim(&now)); 900 868 … … 908 876 if (pr->vltime > (2 * 60 * 60) || pr->vltime > vltime) { 909 877 /* 910 * lifetime.expire ãpi->valid (æå¹æé) ã¨911 * pi->preferred ( æ¨å¥¨æå¹æé) ã®åä½ã¯ [s]ã912 * éç¥ãããæå¹æéã 2 æé以ä¸ããç¾å¨ã®æ®ãæéãã913 * é·ããã°ãæ°ããæå¹æéã«ã¯ãéç¥ãããæå¹æéãè¨å®ããã878 * lifetime.expire、pi->valid (有効時間) と 879 * pi->preferred (推奨有効時間) の単位は [s]。 880 * 通知された有効時間が 2 時間以上か、現在の残り時間より 881 * 長ければ、新しい有効時間には、通知された有効時間を設定する。 914 882 */ 915 883 vltime = pr->vltime; … … 919 887 else { 920 888 /* 921 * IPsec ã¯æªå®è£ 922 ã®ããã2 æéãè¨å®ããã 889 * IPsec は未実装のため、2 時間を設定する。 923 890 */ 924 891 vltime = 2 * 60 * 60; … … 927 894 lla = &ifp->in_ifaddrs[IPV6_IFADDR_IX_LINKLOCAL]; 928 895 929 /* ãã¬ãã£ãã¯ã¹ãã¹ã¯ãçæããã*/896 /* プレフィックスマスクを生成する。*/ 930 897 in6_plen2pmask(&mask, pr->prefix_len); 931 898 932 /* ã¢ãã¬ã¹ãçæããã*/899 /* アドレスを生成する。*/ 933 900 for (ix = 0; ix < 4; ix ++) 934 901 addr.s6_addr32[ix] = (pr->prefix.s6_addr32[ix] & mask.s6_addr32[ix]) … … 941 908 } 942 909 943 else { /* æªç»é²ã®ã¨ã*/910 else { /* 未登録のとき */ 944 911 945 912 /* 946 * ãã¬ãã£ãã¯ã¹é·ããã§ãã¯ããã 947 * ããããã¬ãã£ãã¯ã¹é·ã¨ã¤ã³ã¿ãã§ã¼ã¹ ID ã®åè¨ã 948 * 128 ãããã«ä¸è´ããªãæã¯ããã¬ãã£ãã¯ã¹æ 949 å ±ãç¡è¦ããã 913 * プレフィックス長をチェックする。 914 * もし、プレフィックス長とインタフェース ID の合計が 915 * 128 ビットに一致しない時は、プレフィックス情報を無視する。 950 916 */ 951 917 if ((ifidlen = in6_if2idlen(ifp)) < 0) … … 972 938 973 939 /* 974 * nd6_prelist_timer -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ãã®ç®¡çã¿ã¤ãã¼940 * nd6_prelist_timer -- プレフィックス・リストの管理タイマー 975 941 */ 976 942 … … 983 949 984 950 syscall(get_tim(&now)); 985 now /= SYSTIM_HZ; /* æå¹æéã®åä½ã¯[s] */951 now /= SYSTIM_HZ; /* 有効時間の単位は [s] */ 986 952 987 953 syscall(wai_sem(SEM_ND6_DEFRTRLIST)); … … 996 962 997 963 /* 998 * nd6_rs_output -- ã«ã¼ã¿è¦è«ãåºåããã964 * nd6_rs_output -- ルータ要請を出力する。 999 965 */ 1000 966 … … 1011 977 1012 978 /* 1013 * éä¿¡å 1014 ã¢ãã¬ã¹ã«ã¯ããªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ãè¨å®ãããã 1015 * ã¾ã è¨å®ããããªããã°ãç¡æå®ãè¨å®ããã 979 * 送信元アドレスには、リンクローカルアドレスを設定するが、 980 * まだ設定されいなければ、無指定を設定する。 1016 981 */ 1017 982 if ((ifa = in6ifa_ifpwithix(IF_GET_IFNET(), IPV6_IFADDR_IX_LINKLOCAL)) != NULL && !IFA6_IS_NOTREADY(ifa)) … … 1022 987 len = (ROUTER_SOLICIT_HDR_SIZE + 7) >> 3 << 3; 1023 988 1024 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/989 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 1025 990 if (in6_get_datagram(&output, len, 0, &in6_addr_linklocal_allrouters, 1026 991 saddr, IPPROTO_ICMPV6, … … 1028 993 return; 1029 994 1030 /* ã«ã¼ã¿è¦è«ããããè¨å®ããã*/995 /* ルータ要請ヘッダを設定する。*/ 1031 996 rsh = GET_ROUTER_SOLICIT_HDR(output, IF_IP6_ROUTER_SOLICIT_HDR_OFFSET); 1032 997 rsh->hdr.type = ND_ROUTER_SOLICIT; … … 1034 999 rsh->nd_rs_reserved = 0; 1035 1000 1036 /* ãã§ãã¯ãµã ãè¨ç®ããã*/1001 /* チェックサムを計算する。*/ 1037 1002 rsh->hdr.sum = 0; 1038 1003 rsh->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)rsh - output->buf, len); 1039 1004 1040 /* éä¿¡ããã*/1005 /* 送信する。*/ 1041 1006 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 1042 1007 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 1048 1013 1049 1014 /* 1050 * nd6_defrtrlist_lookup -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ããæ¢ç´¢ããã1015 * nd6_defrtrlist_lookup -- ディフォルトルータ・リストを探索する。 1051 1016 */ 1052 1017 … … 1067 1032 1068 1033 /* 1069 * nd6_router_lookup -- ã«ã¼ã¿ã®ã¢ãã¬ã¹ãè¿ãã1034 * nd6_router_lookup -- ルータのアドレスを返す。 1070 1035 * 1071 1036 */ … … 1081 1046 1082 1047 /* 1083 * nd6_defrtrlist_del -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãããã«ã¼ã¿ãåé¤ããã1048 * nd6_defrtrlist_del -- ディフォルトルータ・リストからルータを削除する。 1084 1049 * 1085 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã1086 * ããã¯ãã¦ããå¼ã³åºããã¨ã1050 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 1051 * ロックしてから呼び出すこと。 1087 1052 */ 1088 1053 … … 1098 1063 if ((ia = in6ifa_ifpwithrtrix(ifp, rtrix)) != NULL) { 1099 1064 /* 1100 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ãã¬ãã£ãã¯ã¹ãéç¥ãã1101 * ã«ã¼ã¿ãå°éä¸è½ã«ããã1065 * ネットワークインタフェースのプレフィックスを通知した 1066 * ルータを到達不能にする。 1102 1067 */ 1103 1068 ia->router_index = IN6_RTR_IX_UNREACH; 1104 1069 } 1105 1070 1106 /* ãã¬ãã£ãã¯ã¹ãªã¹ãããã«ã¼ã¿ãåé¤ããã*/1071 /* プレフィックスリストからルータを削除する。*/ 1107 1072 mask = make_mask(rtrix); 1108 1073 for (pix = NUM_ND6_PREFIX_ENTRY; pix --; ) 1109 1074 nd6_prefix[pix].routermap &= ~mask; 1110 1075 1111 /* åé¤ããã«ã¼ã¿ä»¥éãåã«è©°ããã*/1076 /* 削除したルータ以降を前に詰める。*/ 1112 1077 for (rix = rtrix + 1; rix < def_router_count; rix ++) 1113 1078 nd6_def_router[rix - 1] = nd6_def_router[rix]; 1114 1079 1115 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã®ã«ã¼ã¿ãæ´æ°ããã*/1080 /* プレフィックスリストのルータも更新する。*/ 1116 1081 if (dr != nd6_def_router) { 1117 1082 1118 /* ãã¹ã¯ãçæããã*/1083 /* マスクを生成する。*/ 1119 1084 mask = 1; 1120 1085 for (ix = rtrix - 1; ix -- > 0; ) … … 1128 1093 def_router_count --; 1129 1094 1130 /* ãã¬ãã£ãã¯ã¹ã®ãªã³ãªã³ã¯ç¶æ 1131 ã確èªããã*/ 1095 /* プレフィックスのオンリンク状態を確認する。*/ 1132 1096 pfxlist_onlink_check(); 1133 1097 1134 1098 /* 1135 * åé¤ããã«ã¼ã¿ãåªå 1136 ãã£ãã©ã«ãã«ã¼ã¿ã®å ´åã¯ã 1137 * åªå 1138 ãã£ãã©ã«ãã«ã¼ã¿ãé¸æããªããã 1099 * 削除するルータが優先ディフォルトルータの場合は、 1100 * 優先ディフォルトルータを選択しなおす。 1139 1101 */ 1140 1102 if (rtrix == 0) … … 1143 1105 1144 1106 /* 1145 * nd6_defrtrlist_timer -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãã®ç®¡çã¿ã¤ãã¼1107 * nd6_defrtrlist_timer -- ディフォルトルータ・リストの管理タイマー 1146 1108 */ 1147 1109 … … 1167 1129 1168 1130 /* 1169 * nd6_get_drl -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ããç²å¾ããã1131 * nd6_get_drl -- ディフォルトルータ・リストを獲得する。 1170 1132 */ 1171 1133 … … 1178 1140 1179 1141 /* 1180 * nd6_get_prl -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ããç²å¾ããã1142 * nd6_get_prl -- プレフィックス・リストを獲得する。 1181 1143 */ 1182 1144 … … 1190 1152 1191 1153 /* 1192 * nd6_ra_input -- ã«ã¼ã¿éç¥ã®å 1193 ¥åå¦çã 1154 * nd6_ra_input -- ルータ通知の入力処理。 1194 1155 */ 1195 1156 … … 1215 1176 1216 1177 /* 1217 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã1218 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤1219 * ã»ãããé·ãçã1220 * ã»å§ç¹ã¢ãã¬ã¹ãããªã³ã¯ãã¼ã«ã«ã§ã¯ãªã(RFC2461)1178 * ヘッダのチェック、以下の場合は破棄する。 1179 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 1180 * ・ヘッダ長が短い 1181 * ・始点アドレスが、リンクローカルではない (RFC2461) 1221 1182 */ 1222 1183 if (ip6h->hlim != IPV6_MAXHLIM || … … 1227 1188 rah = GET_ROUTER_ADVERT_HDR(input, off); 1228 1189 1229 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/1190 /* 近隣探索オプションのオフセットを記録する。*/ 1230 1191 if (nd6_options(nd_opt_off, input->buf + (off + ROUTER_ADVERT_HDR_SIZE), 1231 1192 input->len - (off + ROUTER_ADVERT_HDR_SIZE)) != E_OK) 1232 1193 goto err_ret; 1233 1194 /* 1234 * å°éå¯è½ç¶æ 1235 ã®æå¹æéã®æ´æ° 1195 * 到達可能状態の有効時間の更新 1236 1196 1237 1197 */ 1238 1198 if (rah->reachable) { 1239 advrea = ntohl(rah->reachable) * SYSTIM_HZ / 1000; /* rah->reachable ã®åä½ã¯ms */1199 advrea = ntohl(rah->reachable) * SYSTIM_HZ / 1000; /* rah->reachable の単位は ms */ 1240 1200 if (advrea <= ND6_MAX_REACHABLE_TIME && 1241 1201 advrea != nd6_base_reachable_time) { … … 1249 1209 } 1250 1210 1251 /* è¿é£æ¢ç´¢ã®éä¿¡ééã®æ´æ°*/1211 /* 近隣探索の送信間隔の更新 */ 1252 1212 if (rah->retransmit) { 1253 1213 nd6_retrans_time = ntohl(rah->retransmit) * SYSTIM_HZ / 1000; 1254 /* rah->retransmit ã®åä½ã¯ms */1255 } 1256 1257 /* ããããªãããã®è¦å®å¤ã®æ´æ°*/1214 /* rah->retransmit の単位は ms */ 1215 } 1216 1217 /* ホップリミットの規定値の更新 */ 1258 1218 if (rah->nd_ra_current_hoplimit) { 1259 1219 ip6_defhlim = rah->nd_ra_current_hoplimit; 1260 1220 } 1261 1221 1262 /* ãã£ãã©ã«ãã«ã¼ã¿ãªã¹ãã®æ´æ°*/1222 /* ディフォルトルータリストの更新 */ 1263 1223 rix = defrtrlist_update(&ip6h->src, 1264 1224 ntohs(rah->nd_ra_router_lifetime), 1265 rah->nd_ra_flags); /* rah->nd_ra_router_lifetime ã®åä½ã¯ç§*/1266 1267 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã®æ´æ°*/1225 rah->nd_ra_flags); /* rah->nd_ra_router_lifetime の単位は秒 */ 1226 1227 /* プレフィックスリストの更新 */ 1268 1228 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFO_COUNT)]) { 1269 1229 T_ND_OPT_PREFIX_INFO *pi; … … 1273 1233 pi_off = off + ROUTER_ADVERT_HDR_SIZE 1274 1234 + nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFORMATION)] - 8; 1275 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 1276 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 1235 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 1277 1236 while (pi_count -- > 0) { 1278 1237 pi = (T_ND_OPT_PREFIX_INFO*)(input->buf + pi_off); 1279 1238 if (pi->type != ND_OPT_PREFIX_INFORMATION) 1280 /* ãªãã·ã§ã³ã¿ã¤ãããã¬ãã£ãã¯ã¹æ 1281 å ±ã§ãªããã°ä½ãããªãã*/ 1239 /* オプションタイプがプレフィックス情報でなければ何もしない。*/ 1282 1240 ; 1283 1241 else if (pi->len != 4) 1284 /* ãã¬ãã£ãã¯ã¹æ 1285 å ±ã®é·ãã 32 (8Ã4) ã§ãªããã°ä¸æ£ */ 1242 /* プレフィックス情報の長さが 32 (8×4) でなければ不正 */ 1286 1243 syslog(LOG_NOTICE, "[ND6 RTR] prefix opt len: %d.", pi->len); 1287 1244 else if (pi->prefix_len > 128) 1288 /* ãã¬ãã£ãã¯ã¹é·ã¯ 128 ããã以ä¸*/1245 /* プレフィックス長は 128 ビット以下 */ 1289 1246 syslog(LOG_NOTICE, "[ND6 RTR] prefix len: %d.", pi->prefix_len); 1290 1247 else if (IN6_IS_ADDR_MULTICAST(&pi->prefix) || 1291 1248 IN6_IS_ADDR_LINKLOCAL(&pi->prefix)) 1292 /* ãã«ããã£ã¹ãã¨ãªã³ã¯ãã¼ã«ã«ã¯ä¸æ£*/1249 /* マルチキャストとリンクローカルは不正 */ 1293 1250 syslog(LOG_NOTICE, "[ND6 RTR] invalid addr: %s from %s.", 1294 1251 ipv62str(NULL, &pi->prefix), ipv62str(NULL, &ip6h->src)); 1295 #if 0 /* FreeBSD 6.3 ã§åé¤ããã¦ããã*/1252 #if 0 /* FreeBSD 6.3 で削除されている。*/ 1296 1253 else if (IN6_IS_ADDR_AGGREGATE_UNICAST(&pi->prefix) && 1297 1254 (pi->prefix_len != 64) ) 1298 /* éç´å¯è½ã¦ããã£ã¹ãã§ããã¬ãã£ãã¯ã¹é·ã 64 ããã以å¤ã¯ä¸æ£*/1255 /* 集約可能ユニキャストで、プレフィックス長が 64 ビット以外は不正 */ 1299 1256 syslog(LOG_NOTICE, "[ND6 RTR] invalid prefix len for global: %d.", pi->prefix_len); 1300 1257 #endif 1301 1258 else if (ntohl(pi->preferred) > ntohl(pi->valid)) 1302 /* æ¨å¥¨æå¹æéãæå¹æéããé·ããã°ä¸æ£*/1259 /* 推奨有効時間が有効時間より長ければ不正 */ 1303 1260 syslog(LOG_NOTICE, "[ND6 RTR] preferred(%d) > valid time(%d).", ntohl(pi->preferred), ntohl(pi->valid)); 1304 1261 else { … … 1307 1264 if (rix >= 0) { 1308 1265 /* 1309 * defrtrlist_update ã®æ»ãå¤ã¯ãã«ã¼ã¿ã®ã¤ã³ããã¯ã¹ã1310 * ãã ããå¤ã -1 ãªãããã¬ãã£ãã¯ã¹ã»ãªã¹ãã¯æ´æ°ããªãã1266 * defrtrlist_update の戻り値は、ルータのインデックス。 1267 * ただし、値が -1 なら、プレフィックス・リストは更新しない。 1311 1268 */ 1312 prelist_update(pi, rix); /* ãã¬ãã£ãã¯ã¹ã»ãªã¹ããæ´æ°ããã*/1269 prelist_update(pi, rix); /* プレフィックス・リストを更新する。*/ 1313 1270 } 1314 1271 } 1315 pi_off += pi->len << 3; /* ãªãã·ã§ã³é·ã®åä½ã¯ 8 ãã¤ã*/1316 } 1317 } 1318 1319 /* MTU ã®æ´æ°*/1272 pi_off += pi->len << 3; /* オプション長の単位は 8 バイト */ 1273 } 1274 } 1275 1276 /* MTU の更新 */ 1320 1277 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_MTU)]) { 1321 1278 T_ND_OPT_MTU_HDR *optmtuh; … … 1326 1283 1327 1284 /* 1328 * å¤ã®ãã§ãã¯1285 * 値のチェック 1329 1286 * 1330 * ãªãã·ã§ã³é·: 11331 * äºç´: 01287 * オプション長: 1 1288 * 予約: 0 1332 1289 */ 1333 1290 if (optmtuh->len != 1 || optmtuh->reserved != 0) 1334 1291 goto err_ret; 1335 1292 1336 /* MTU ã IPv6 MMTUï¼1280 ãªã¯ãããï¼ä»¥ä¸ãªãç¡è¦ããã*/1293 /* MTU が IPv6 MMTU(1280 オクテット)以下なら無視する。*/ 1337 1294 mtu = ntohl(optmtuh->mtu); 1338 1295 if (mtu >= IPV6_MMTU) { … … 1343 1300 1344 1301 /* 1345 * ã«ã¼ã¿ã®å§ç¹ãªã³ã¯ã¢ãã¬ã¹ãè¿é£ãã£ãã·ã¥ã«ç»é²ããã1302 * ルータの始点リンクアドレスを近隣キャッシュに登録する。 1346 1303 */ 1347 1304 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)]) { 1348 1305 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + ROUTER_ADVERT_HDR_SIZE) + 1349 1306 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)] - 8); 1350 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 1351 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 1307 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 1352 1308 lladdr = (uint8_t *)(opth + 1); 1353 1309 lladdr_len = (opth->len << 3); … … 1355 1311 1356 1312 /* 1357 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼1313 * ネットワークインタフェースのアドレス長が一致しなければエラー 1358 1314 */ 1359 1315 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) 1360 1316 goto err_ret; 1361 1317 1362 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/1318 /* 近隣キャッシュに登録する。*/ 1363 1319 nd6_cache_lladdr(ifp, &ip6h->src, (T_IF_ADDR *)lladdr, ND_ROUTER_ADVERT, 0); 1364 1320 1365 1321 /* 1366 * ã«ã¼ã¿ã®å§ç¹ãªã³ã¯ã¢ãã¬ã¹ãè¿é£ãã£ãã·ã¥ã«ç»é²ããã®ã§ã 1367 * ãªã³ãªã³ã¯ç¶æ 1368 ãå¤åããå¯è½æ§ããããããããããã§ãã¯ããã 1322 * ルータの始点リンクアドレスを近隣キャッシュに登録したので、 1323 * オンリンク状態が変化する可能性があるため、それをチェックする。 1369 1324 */ 1370 1325 pfxlist_onlink_check(); … … 1380 1335 1381 1336 /* 1382 * ã«ã¼ã¿éç¥ãåä¿¡ããªãå ´åã¯ãç ´æ£ãã¦çµäºããã1337 * ルータ通知を受信しない場合は、破棄して終了する。 1383 1338 */ 1384 1339 NET_COUNT_ICMP6(net_count_nd6[NC_ND6_RA_IN_PACKETS], 1); … … 1391 1346 1392 1347 /* 1393 * nd6_rtrsol_ctl -- ã«ã¼ã¿è¦è«åºåã®å¶å¾¡1348 * nd6_rtrsol_ctl -- ルータ要請出力の制御 1394 1349 */ 1395 1350 … … 1400 1355 int_t try; 1401 1356 1402 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®ã¢ãã¬ã¹æ 1403 å ±ãå¾ãã*/ 1357 /* リンクローカルアドレスのアドレス情報を得る。*/ 1404 1358 if ((ifa = in6ifa_ifpwithix(IF_GET_IFNET(), IPV6_IFADDR_IX_LINKLOCAL)) == NULL) 1405 1359 return; 1406 1360 1407 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®éè¤æ¤åºçµäºãå¾ 1408 ã¤ã*/ 1361 /* リンクローカルアドレスの重複検出終了を待つ。*/ 1409 1362 do { 1410 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®éè¤æ¤åºçµäºå¾ 1411 ã¡æéãè¨å®ããã*/ 1363 /* リンクローカルアドレスの重複検出終了待ち時間を設定する。*/ 1412 1364 syscall(dly_tsk(net_rand() % TMO_ND6_RTR_SOL_DELAY)); 1413 1365 1414 /* å¾ 1415 ã£ã¦ããéã«éè¤ãæ¤åºããããçµäºããã*/ 1366 /* 待っている間に重複が検出されたら終了する。*/ 1416 1367 if (ifa->flags & IN6_IFF_DUPLICATED) 1417 1368 return; … … 1421 1372 for (try = 0; try < NUM_ND6_RTR_SOL_RETRY; try ++) { 1422 1373 1423 /* ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãã«ã¨ã³ããªãããã°çµäº*/1374 /* ディフォルトルータ・リストにエントリがあれば終了 */ 1424 1375 if (def_router_count > 0) 1425 1376 return; 1426 1377 1427 /* ã«ã¼ã¿è¦è«ãåºåããã*/1378 /* ルータ要請を出力する。*/ 1428 1379 nd6_rs_output(); 1429 1380 1430 /* åºåã® 2 åç®ä»¥éã®é 1431 延æéãè¨å®ããã*/ 1381 /* 出力の 2 回目以降の遅延時間を設定する。*/ 1432 1382 syscall(dly_tsk(TMO_ND6_RTR_SOL_INTERVAL)); 1433 1383 } … … 1437 1387 1438 1388 /* 1439 * nd6_onlink_prefix_lookup -- ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã1389 * nd6_onlink_prefix_lookup -- プレフィックスを探索する。 1440 1390 */ 1441 1391 … … 1450 1400 now /= SYSTIM_HZ; 1451 1401 1452 /* æ¨å¥¨æå¹æéå 1453 ã®ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã*/ 1402 /* 推奨有効時間内のプレフィックスを探索する。*/ 1454 1403 for (ix = NUM_ND6_PREFIX_ENTRY; ix -- > 0; ) { 1455 1404 pr = &nd6_prefix[ix]; … … 1463 1412 } 1464 1413 1465 /* æå¹æéå 1466 ã®ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã*/ 1414 /* 有効時間内のプレフィックスを探索する。*/ 1467 1415 for (ix = NUM_ND6_PREFIX_ENTRY; ix -- > 0; ) { 1468 1416 pr = &nd6_prefix[ix];
Note:
See TracChangeset
for help on using the changeset viewer.