Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet6/nd6_rtr.c
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/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
r388 r389 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 memcpy(&fdr->addr, src, sizeof(T_IN6_ADDR)); 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->in6_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 … … 724 693 int_t ix; 725 694 726 /* ãã¬ãã£ãã¯ã¹ãªã¹ããã空ãã®ãã¬ãã£ãã¯ã¹ã¨ã³ããªãæ¢ç´¢ããã*/695 /* プレフィックスリストから空きのプレフィックスエントリを探索する。*/ 727 696 for (ix = NUM_ND6_PREFIX_ENTRY; ix --; ) { 728 697 pr = &nd6_prefix[ix]; … … 731 700 } 732 701 733 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã«ç©ºãããªããã°ã¨ã©ã¼*/702 /* プレフィックスリストに空きがなければエラー */ 734 703 if (ix < 0) 735 704 return NULL; … … 737 706 pr->flags |= ND6_PREFIX_STATE_BUSY; 738 707 739 /* ãã¬ãã£ãã¯ã¹ã追å ããã*/708 /* プレフィックスを追加する。*/ 740 709 pr->prefix = pi->prefix; 741 710 pr->prefix_len = pi->prefix_len; 742 711 743 /* ãã©ã°ãè¨å®ããã*/712 /* フラグを設定する。*/ 744 713 if ((pi->flags & ND_OPT_PI_FLAG_ONLINK) != 0) 745 714 pr->flags |= ND6_PREFIX_FLAG_ONLINK; … … 747 716 pr->flags |= ND6_PREFIX_FLAG_AUTO; 748 717 749 /* ãã¬ãã£ãã¯ã¹ã®æå¹æéãè¨å®ããã*/718 /* プレフィックスの有効時間を設定する。*/ 750 719 pr->vltime = ntohl(pi->valid); 751 720 pr->pltime = ntohl(pi->preferred); … … 757 726 } 758 727 759 /* ã«ã¼ã¿ããããåæåããã*/728 /* ルータマップを初期化する。*/ 760 729 pr->routermap = 0; 761 730 762 /* ã«ã¼ã¿ã追å ããã*/731 /* ルータを追加する。*/ 763 732 pfxrtr_add(pr - nd6_prefix, rtr_index); 764 733 … … 767 736 768 737 /* 769 * prelist_update -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ããæ´æ°ããã738 * prelist_update -- プレフィックス・リストを更新する。 770 739 */ 771 740 … … 781 750 if ((pr = nd6_prefix_lookup(&pi->prefix, pi->prefix_len)) != NULL) { 782 751 /* 783 * ç»é²æ¸ã¿ã®å ´åã¯ããã¬ãã£ãã¯ã¹ãªã¹ããæ´æ°ããã752 * 登録済みの場合は、プレフィックスリストを更新する。 784 753 */ 785 754 786 755 /* 787 * ãã©ã°ã®æ´æ°ã®æ³¨æ:788 * on-link ããã㨠autonomous ãããã¯789 * 1 ãã 0 ã«å¤æ´ãã¦ã¯ãªããªãã756 * フラグの更新の注意: 757 * on-link ビットと autonomous ビットは 758 * 1 から 0 に変更してはならない。 790 759 */ 791 760 … … 797 766 if ((pi->flags & ND_OPT_PI_FLAG_ONLINK) != 0) { 798 767 /* 799 * éç¥ããããã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã®æã¯ã800 * æå¹æéãæ´æ°ããã768 * 通知されたプレフィックスがオンリンクの時は、 769 * 有効時間を更新する。 801 770 */ 802 771 pr->vltime = ntohl(pi->valid); … … 808 777 (pr->flags & ND6_PREFIX_STATE_ONLINK) == 0) { 809 778 /* 810 * ãªããªã³ã¯ã®ãã¬ãã£ãã¯ã¹ããªã³ãªã³ã¯ã«ãªã£ãæã®å¦çãå®è¡ããã779 * オフリンクのプレフィックスがオンリンクになった時の処理を実行する。 811 780 */ 812 781 if (nd6_prefix_onlink(pr) != E_OK) { … … 820 789 pfxrtr_add(pr - nd6_prefix, router_index); 821 790 } 822 else { /* æªç»é²ã®å ´å*/823 824 /* æå¹æé 0 ã®ãã¬ãã£ãã¯ã¹ã¯è¿½å ããªãã*/791 else { /* 未登録の場合 */ 792 793 /* 有効時間 0 のプレフィックスは追加しない。*/ 825 794 if (pi->valid == 0) { 826 795 syscall(sig_sem(SEM_ND6_DEFRTRLIST)); … … 828 797 } 829 798 830 /* ãªããªã³ã¯ã§ã¢ãã¬ã¹èªåè¨å®ã«ä½¿ç¨ããªããã°è¿½å ããªãã*/799 /* オフリンクでアドレス自動設定に使用しなければ追加しない。*/ 831 800 if ((pi->flags & (ND_OPT_PI_FLAG_ONLINK | ND_OPT_PI_FLAG_AUTO)) != 832 801 (ND_OPT_PI_FLAG_ONLINK | ND_OPT_PI_FLAG_AUTO)) { … … 835 804 } 836 805 837 /* ãã¬ãã£ãã¯ã¹ã追å ããã*/806 /* プレフィックスを追加する。*/ 838 807 if ((pr = nd6_prelist_add(pi, router_index)) == NULL) { 839 808 syslog(LOG_ERROR, "[ND6 RTR] prefix add failed."); … … 842 811 } 843 812 844 #if 1 /* ãã¬ãã£ãã¯ã¹ãæªç»é²ã®å ´åã ã表示ããã*/813 #if 1 /* プレフィックスが未登録の場合だけ表示する。*/ 845 814 syslog(LOG_NOTICE, "[ND6 RTR] add prefix: flags[MOH]: %02x, addr: %s\n" 846 815 " from: %s.", … … 851 820 if ((pr->flags & ND6_PREFIX_FLAG_ONLINK) == 0) { 852 821 /* 853 * ãªããªã³ã¯ã»ãã¬ãã£ãã¯ã¹ã®å ´åã¯ãæå¹æéã 0 ã«è¨å®ããã854 * ãã¨ã§æå¹æéåãã¨ãªãããªã¹ãããåé¤ãããã822 * オフリンク・プレフィックスの場合は、有効時間を 0 に設定する。 823 * あとで有効期限切れとなり、リストから削除される。 855 824 */ 856 825 pr->vltime = 0; … … 861 830 862 831 /* 863 * ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ãè¡ãã832 * ステートレス・アドレス自動設定を行う。 864 833 */ 865 834 if ((pr->flags & ND6_PREFIX_FLAG_AUTO) == 0) { … … 869 838 870 839 /* 871 * éç¥ããããã¬ãã£ãã¯ã¹ãå²ãå½ã¦ããã¦ããã¤ã³ã¿ãã§ã¼ã¹ã® 872 * ã¢ãã¬ã¹æ 873 å ±ãæ¢ãã 840 * 通知されたプレフィックスが割り当てられているインタフェースの 841 * アドレス情報を探す。 874 842 */ 875 843 for (ix = NUM_IN6_IFADDR_ENTRY; ix --; ) { … … 881 849 } 882 850 883 if (ix >= 0) { /* ç»é²æ¸ã¿ã®ã¨ã*/851 if (ix >= 0) { /* 登録済みのとき */ 884 852 if ((ia->flags & IN6_IFF_AUTOCONF) == 0) { 885 853 /* 886 * ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ã«ãã887 * è¨å®ããã¦ããªããã°æ´æ°ããªãã854 * ステートレス・アドレス自動設定により 855 * 設定されていなければ更新しない。 888 856 */ 889 857 ; … … 891 859 else if (ia->flags & IN6_IFF_TENTATIVE) { 892 860 /* 893 * éè¤æ¤åºä¸ãªãæ´æ°ããªãã861 * 重複検出中なら更新しない。 894 862 */ 895 863 ; … … 902 870 int_t ix; 903 871 904 /* æå¹æéãè¨å®ããã*/872 /* 有効時間を設定する。*/ 905 873 syscall(get_tim(&now)); 906 874 … … 914 882 if (pr->vltime > (2 * 60 * 60) || pr->vltime > vltime) { 915 883 /* 916 * lifetime.expire ãpi->valid (æå¹æé) ã¨917 * pi->preferred ( æ¨å¥¨æå¹æé) ã®åä½ã¯ [s]ã918 * éç¥ãããæå¹æéã 2 æé以ä¸ããç¾å¨ã®æ®ãæéãã919 * é·ããã°ãæ°ããæå¹æéã«ã¯ãéç¥ãããæå¹æéãè¨å®ããã884 * lifetime.expire、pi->valid (有効時間) と 885 * pi->preferred (推奨有効時間) の単位は [s]。 886 * 通知された有効時間が 2 時間以上か、現在の残り時間より 887 * 長ければ、新しい有効時間には、通知された有効時間を設定する。 920 888 */ 921 889 vltime = pr->vltime; … … 925 893 else { 926 894 /* 927 * IPsec ã¯æªå®è£ 928 ã®ããã2 æéãè¨å®ããã 895 * IPsec は未実装のため、2 時間を設定する。 929 896 */ 930 897 vltime = 2 * 60 * 60; … … 933 900 lla = &ifp->in6_ifaddrs[IPV6_IFADDR_IX_LINKLOCAL]; 934 901 935 /* ãã¬ãã£ãã¯ã¹ãã¹ã¯ãçæããã*/902 /* プレフィックスマスクを生成する。*/ 936 903 in6_plen2pmask(&mask, pr->prefix_len); 937 904 938 /* ã¢ãã¬ã¹ãçæããã*/905 /* アドレスを生成する。*/ 939 906 for (ix = 0; ix < 4; ix ++) 940 907 addr.s6_addr32[ix] = (pr->prefix.s6_addr32[ix] & mask.s6_addr32[ix]) … … 947 914 } 948 915 949 else { /* æªç»é²ã®ã¨ã*/916 else { /* 未登録のとき */ 950 917 951 918 /* 952 * ãã¬ãã£ãã¯ã¹é·ããã§ãã¯ããã 953 * ããããã¬ãã£ãã¯ã¹é·ã¨ã¤ã³ã¿ãã§ã¼ã¹ ID ã®åè¨ã 954 * 128 ãããã«ä¸è´ããªãæã¯ããã¬ãã£ãã¯ã¹æ 955 å ±ãç¡è¦ããã 919 * プレフィックス長をチェックする。 920 * もし、プレフィックス長とインタフェース ID の合計が 921 * 128 ビットに一致しない時は、プレフィックス情報を無視する。 956 922 */ 957 923 if ((ifidlen = in6_if2idlen(ifp)) < 0) … … 978 944 979 945 /* 980 * nd6_prelist_timer -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ãã®ç®¡çã¿ã¤ãã¼946 * nd6_prelist_timer -- プレフィックス・リストの管理タイマー 981 947 */ 982 948 … … 989 955 990 956 syscall(get_tim(&now)); 991 now /= SYSTIM_HZ; /* æå¹æéã®åä½ã¯[s] */957 now /= SYSTIM_HZ; /* 有効時間の単位は [s] */ 992 958 993 959 syscall(wai_sem(SEM_ND6_DEFRTRLIST)); … … 1002 968 1003 969 /* 1004 * nd6_rs_output -- ã«ã¼ã¿è¦è«ãåºåããã970 * nd6_rs_output -- ルータ要請を出力する。 1005 971 */ 1006 972 … … 1017 983 1018 984 /* 1019 * éä¿¡å 1020 ã¢ãã¬ã¹ã«ã¯ããªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ãè¨å®ãããã 1021 * ã¾ã è¨å®ããããªããã°ãç¡æå®ãè¨å®ããã 985 * 送信元アドレスには、リンクローカルアドレスを設定するが、 986 * まだ設定されいなければ、無指定を設定する。 1022 987 */ 1023 988 if ((ifa = in6ifa_ifpwithix(IF_GET_IFNET(), IPV6_IFADDR_IX_LINKLOCAL)) != NULL && !IFA6_IS_NOTREADY(ifa)) … … 1028 993 len = (ROUTER_SOLICIT_HDR_SIZE + 7) >> 3 << 3; 1029 994 1030 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/995 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 1031 996 if (in6_get_datagram(&output, len, 0, &in6_addr_linklocal_allrouters, 1032 997 saddr, IPPROTO_ICMPV6, … … 1034 999 return; 1035 1000 1036 /* ã«ã¼ã¿è¦è«ããããè¨å®ããã*/1001 /* ルータ要請ヘッダを設定する。*/ 1037 1002 rsh = GET_ROUTER_SOLICIT_HDR(output, IF_IP6_ROUTER_SOLICIT_HDR_OFFSET); 1038 1003 rsh->hdr.type = ND_ROUTER_SOLICIT; … … 1040 1005 rsh->nd_rs_reserved = 0; 1041 1006 1042 /* ãã§ãã¯ãµã ãè¨ç®ããã*/1007 /* チェックサムを計算する。*/ 1043 1008 rsh->hdr.sum = 0; 1044 1009 rsh->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)rsh - output->buf, len); 1045 1010 1046 /* éä¿¡ããã*/1011 /* 送信する。*/ 1047 1012 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 1048 1013 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 1054 1019 1055 1020 /* 1056 * nd6_defrtrlist_lookup -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ããæ¢ç´¢ããã1021 * nd6_defrtrlist_lookup -- ディフォルトルータ・リストを探索する。 1057 1022 */ 1058 1023 … … 1073 1038 1074 1039 /* 1075 * nd6_router_lookup -- ã«ã¼ã¿ã®ã¢ãã¬ã¹ãè¿ãã1040 * nd6_router_lookup -- ルータのアドレスを返す。 1076 1041 * 1077 1042 */ … … 1087 1052 1088 1053 /* 1089 * nd6_defrtrlist_del -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãããã«ã¼ã¿ãåé¤ããã1054 * nd6_defrtrlist_del -- ディフォルトルータ・リストからルータを削除する。 1090 1055 * 1091 * 注æ: ãã®é¢æ°ãå¼ã³åºãã¨ãã¯ãSEM_ND6_DEFRTRLIST ã§ã1092 * ããã¯ãã¦ããå¼ã³åºããã¨ã1056 * 注意: この関数を呼び出すときは、SEM_ND6_DEFRTRLIST で、 1057 * ロックしてから呼び出すこと。 1093 1058 */ 1094 1059 … … 1104 1069 if ((ia = in6ifa_ifpwithrtrix(ifp, rtrix)) != NULL) { 1105 1070 /* 1106 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ãã¬ãã£ãã¯ã¹ãéç¥ãã1107 * ã«ã¼ã¿ãå°éä¸è½ã«ããã1071 * ネットワークインタフェースのプレフィックスを通知した 1072 * ルータを到達不能にする。 1108 1073 */ 1109 1074 ia->router_index = IN6_RTR_IX_UNREACH; 1110 1075 } 1111 1076 1112 /* ãã¬ãã£ãã¯ã¹ãªã¹ãããã«ã¼ã¿ãåé¤ããã*/1077 /* プレフィックスリストからルータを削除する。*/ 1113 1078 mask = make_mask(rtrix); 1114 1079 for (pix = NUM_ND6_PREFIX_ENTRY; pix --; ) 1115 1080 nd6_prefix[pix].routermap &= ~mask; 1116 1081 1117 /* åé¤ããã«ã¼ã¿ä»¥éãåã«è©°ããã*/1082 /* 削除したルータ以降を前に詰める。*/ 1118 1083 for (rix = rtrix + 1; rix < def_router_count; rix ++) 1119 1084 nd6_def_router[rix - 1] = nd6_def_router[rix]; 1120 1085 1121 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã®ã«ã¼ã¿ãæ´æ°ããã*/1086 /* プレフィックスリストのルータも更新する。*/ 1122 1087 if (dr != nd6_def_router) { 1123 1088 1124 /* ãã¹ã¯ãçæããã*/1089 /* マスクを生成する。*/ 1125 1090 mask = 1; 1126 1091 for (ix = rtrix - 1; ix -- > 0; ) … … 1134 1099 def_router_count --; 1135 1100 1136 /* ãã¬ãã£ãã¯ã¹ã®ãªã³ãªã³ã¯ç¶æ 1137 ã確èªããã*/ 1101 /* プレフィックスのオンリンク状態を確認する。*/ 1138 1102 pfxlist_onlink_check(); 1139 1103 1140 1104 /* 1141 * åé¤ããã«ã¼ã¿ãåªå 1142 ãã£ãã©ã«ãã«ã¼ã¿ã®å ´åã¯ã 1143 * åªå 1144 ãã£ãã©ã«ãã«ã¼ã¿ãé¸æããªããã 1105 * 削除するルータが優先ディフォルトルータの場合は、 1106 * 優先ディフォルトルータを選択しなおす。 1145 1107 */ 1146 1108 if (rtrix == 0) … … 1149 1111 1150 1112 /* 1151 * nd6_defrtrlist_timer -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãã®ç®¡çã¿ã¤ãã¼1113 * nd6_defrtrlist_timer -- ディフォルトルータ・リストの管理タイマー 1152 1114 */ 1153 1115 … … 1173 1135 1174 1136 /* 1175 * nd6_get_drl -- ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ããç²å¾ããã1137 * nd6_get_drl -- ディフォルトルータ・リストを獲得する。 1176 1138 */ 1177 1139 … … 1184 1146 1185 1147 /* 1186 * nd6_get_prl -- ãã¬ãã£ãã¯ã¹ã»ãªã¹ããç²å¾ããã1148 * nd6_get_prl -- プレフィックス・リストを獲得する。 1187 1149 */ 1188 1150 … … 1196 1158 1197 1159 /* 1198 * nd6_ra_input -- ã«ã¼ã¿éç¥ã®å 1199 ¥åå¦çã 1160 * nd6_ra_input -- ルータ通知の入力処理。 1200 1161 */ 1201 1162 … … 1221 1182 1222 1183 /* 1223 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã1224 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤1225 * ã»ãããé·ãçã1226 * ã»å§ç¹ã¢ãã¬ã¹ãããªã³ã¯ãã¼ã«ã«ã§ã¯ãªã(RFC2461)1184 * ヘッダのチェック、以下の場合は破棄する。 1185 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 1186 * ・ヘッダ長が短い 1187 * ・始点アドレスが、リンクローカルではない (RFC2461) 1227 1188 */ 1228 1189 if (ip6h->hlim != IPV6_MAXHLIM || … … 1233 1194 rah = GET_ROUTER_ADVERT_HDR(input, off); 1234 1195 1235 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/1196 /* 近隣探索オプションのオフセットを記録する。*/ 1236 1197 if (nd6_options(nd_opt_off, input->buf + (off + ROUTER_ADVERT_HDR_SIZE), 1237 1198 input->len - (off + ROUTER_ADVERT_HDR_SIZE)) != E_OK) 1238 1199 goto err_ret; 1239 1200 /* 1240 * å°éå¯è½ç¶æ 1241 ã®æå¹æéã®æ´æ° 1201 * 到達可能状態の有効時間の更新 1242 1202 1243 1203 */ 1244 1204 if (rah->reachable) { 1245 advrea = ntohl(rah->reachable) * SYSTIM_HZ / 1000; /* rah->reachable ã®åä½ã¯ms */1205 advrea = ntohl(rah->reachable) * SYSTIM_HZ / 1000; /* rah->reachable の単位は ms */ 1246 1206 if (advrea <= ND6_MAX_REACHABLE_TIME && 1247 1207 advrea != nd6_base_reachable_time) { … … 1255 1215 } 1256 1216 1257 /* è¿é£æ¢ç´¢ã®éä¿¡ééã®æ´æ°*/1217 /* 近隣探索の送信間隔の更新 */ 1258 1218 if (rah->retransmit) { 1259 1219 nd6_retrans_time = ntohl(rah->retransmit) * SYSTIM_HZ / 1000; 1260 /* rah->retransmit ã®åä½ã¯ms */1261 } 1262 1263 /* ããããªãããã®è¦å®å¤ã®æ´æ°*/1220 /* rah->retransmit の単位は ms */ 1221 } 1222 1223 /* ホップリミットの規定値の更新 */ 1264 1224 if (rah->nd_ra_current_hoplimit) { 1265 1225 ip6_defhlim = rah->nd_ra_current_hoplimit; 1266 1226 } 1267 1227 1268 /* ãã£ãã©ã«ãã«ã¼ã¿ãªã¹ãã®æ´æ°*/1228 /* ディフォルトルータリストの更新 */ 1269 1229 rix = defrtrlist_update(&ip6h->src, 1270 1230 ntohs(rah->nd_ra_router_lifetime), 1271 rah->nd_ra_flags); /* rah->nd_ra_router_lifetime ã®åä½ã¯ç§*/1272 1273 /* ãã¬ãã£ãã¯ã¹ãªã¹ãã®æ´æ°*/1231 rah->nd_ra_flags); /* rah->nd_ra_router_lifetime の単位は秒 */ 1232 1233 /* プレフィックスリストの更新 */ 1274 1234 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFO_COUNT)]) { 1275 1235 T_ND_OPT_PREFIX_INFO *pi; … … 1279 1239 pi_off = off + ROUTER_ADVERT_HDR_SIZE 1280 1240 + nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFORMATION)] - 8; 1281 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 1282 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 1241 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 1283 1242 while (pi_count -- > 0) { 1284 1243 pi = (T_ND_OPT_PREFIX_INFO*)(input->buf + pi_off); 1285 1244 if (pi->type != ND_OPT_PREFIX_INFORMATION) 1286 /* ãªãã·ã§ã³ã¿ã¤ãããã¬ãã£ãã¯ã¹æ 1287 å ±ã§ãªããã°ä½ãããªãã*/ 1245 /* オプションタイプがプレフィックス情報でなければ何もしない。*/ 1288 1246 ; 1289 1247 else if (pi->len != 4) 1290 /* ãã¬ãã£ãã¯ã¹æ 1291 å ±ã®é·ãã 32 (8Ã4) ã§ãªããã°ä¸æ£ */ 1248 /* プレフィックス情報の長さが 32 (8×4) でなければ不正 */ 1292 1249 syslog(LOG_NOTICE, "[ND6 RTR] prefix opt len: %d.", pi->len); 1293 1250 else if (pi->prefix_len > 128) 1294 /* ãã¬ãã£ãã¯ã¹é·ã¯ 128 ããã以ä¸*/1251 /* プレフィックス長は 128 ビット以下 */ 1295 1252 syslog(LOG_NOTICE, "[ND6 RTR] prefix len: %d.", pi->prefix_len); 1296 1253 else if (IN6_IS_ADDR_MULTICAST(&pi->prefix) || 1297 1254 IN6_IS_ADDR_LINKLOCAL(&pi->prefix)) 1298 /* ãã«ããã£ã¹ãã¨ãªã³ã¯ãã¼ã«ã«ã¯ä¸æ£*/1255 /* マルチキャストとリンクローカルは不正 */ 1299 1256 syslog(LOG_NOTICE, "[ND6 RTR] invalid addr: %s from %s.", 1300 1257 ipv62str(NULL, &pi->prefix), ipv62str(NULL, &ip6h->src)); 1301 #if 0 /* FreeBSD 6.3 ã§åé¤ããã¦ããã*/1258 #if 0 /* FreeBSD 6.3 で削除されている。*/ 1302 1259 else if (IN6_IS_ADDR_AGGREGATE_UNICAST(&pi->prefix) && 1303 1260 (pi->prefix_len != 64) ) 1304 /* éç´å¯è½ã¦ããã£ã¹ãã§ããã¬ãã£ãã¯ã¹é·ã 64 ããã以å¤ã¯ä¸æ£*/1261 /* 集約可能ユニキャストで、プレフィックス長が 64 ビット以外は不正 */ 1305 1262 syslog(LOG_NOTICE, "[ND6 RTR] invalid prefix len for global: %d.", pi->prefix_len); 1306 1263 #endif 1307 1264 else if (ntohl(pi->preferred) > ntohl(pi->valid)) 1308 /* æ¨å¥¨æå¹æéãæå¹æéããé·ããã°ä¸æ£*/1265 /* 推奨有効時間が有効時間より長ければ不正 */ 1309 1266 syslog(LOG_NOTICE, "[ND6 RTR] preferred(%d) > valid time(%d).", ntohl(pi->preferred), ntohl(pi->valid)); 1310 1267 else { 1311 #if 0 /* ãã¬ãã£ãã¯ã¹ãæªç»é²ã®å ´åã ã表示ããã*/1268 #if 0 /* プレフィックスが未登録の場合だけ表示する。*/ 1312 1269 syslog(LOG_NOTICE, "[ND6 RTR] update prefix: flags[MOH]: %02x, addr: %s\n" 1313 1270 " from: %s.", … … 1316 1273 if (rix >= 0) { 1317 1274 /* 1318 * defrtrlist_update ã®æ»ãå¤ã¯ãã«ã¼ã¿ã®ã¤ã³ããã¯ã¹ã1319 * ãã ããå¤ã -1 ãªãããã¬ãã£ãã¯ã¹ã»ãªã¹ãã¯æ´æ°ããªãã1275 * defrtrlist_update の戻り値は、ルータのインデックス。 1276 * ただし、値が -1 なら、プレフィックス・リストは更新しない。 1320 1277 */ 1321 prelist_update(pi, rix); /* ãã¬ãã£ãã¯ã¹ã»ãªã¹ããæ´æ°ããã*/1278 prelist_update(pi, rix); /* プレフィックス・リストを更新する。*/ 1322 1279 } 1323 1280 } 1324 pi_off += pi->len << 3; /* ãªãã·ã§ã³é·ã®åä½ã¯ 8 ãã¤ã*/1325 } 1326 } 1327 1328 /* MTU ã®æ´æ°*/1281 pi_off += pi->len << 3; /* オプション長の単位は 8 バイト */ 1282 } 1283 } 1284 1285 /* MTU の更新 */ 1329 1286 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_MTU)]) { 1330 1287 T_ND_OPT_MTU_HDR *optmtuh; … … 1335 1292 1336 1293 /* 1337 * å¤ã®ãã§ãã¯1294 * 値のチェック 1338 1295 * 1339 * ãªãã·ã§ã³é·: 11340 * äºç´: 01296 * オプション長: 1 1297 * 予約: 0 1341 1298 */ 1342 1299 if (optmtuh->len != 1 || optmtuh->reserved != 0) 1343 1300 goto err_ret; 1344 1301 1345 /* MTU ã IPv6 MMTUï¼1280 ãªã¯ãããï¼ä»¥ä¸ãªãç¡è¦ããã*/1302 /* MTU が IPv6 MMTU(1280 オクテット)以下なら無視する。*/ 1346 1303 mtu = ntohl(optmtuh->mtu); 1347 1304 if (mtu >= IPV6_MMTU) { … … 1352 1309 1353 1310 /* 1354 * ã«ã¼ã¿ã®å§ç¹ãªã³ã¯ã¢ãã¬ã¹ãè¿é£ãã£ãã·ã¥ã«ç»é²ããã1311 * ルータの始点リンクアドレスを近隣キャッシュに登録する。 1355 1312 */ 1356 1313 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)]) { 1357 1314 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + ROUTER_ADVERT_HDR_SIZE) + 1358 1315 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)] - 8); 1359 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 1360 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 1316 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 1361 1317 lladdr = (uint8_t *)(opth + 1); 1362 1318 lladdr_len = (opth->len << 3); … … 1364 1320 1365 1321 /* 1366 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼1322 * ネットワークインタフェースのアドレス長が一致しなければエラー 1367 1323 */ 1368 1324 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) 1369 1325 goto err_ret; 1370 1326 1371 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/1327 /* 近隣キャッシュに登録する。*/ 1372 1328 nd6_cache_lladdr(ifp, &ip6h->src, (T_IF_ADDR *)lladdr, ND_ROUTER_ADVERT, 0); 1373 1329 1374 1330 /* 1375 * ã«ã¼ã¿ã®å§ç¹ãªã³ã¯ã¢ãã¬ã¹ãè¿é£ãã£ãã·ã¥ã«ç»é²ããã®ã§ã 1376 * ãªã³ãªã³ã¯ç¶æ 1377 ãå¤åããå¯è½æ§ããããããããããã§ãã¯ããã 1331 * ルータの始点リンクアドレスを近隣キャッシュに登録したので、 1332 * オンリンク状態が変化する可能性があるため、それをチェックする。 1378 1333 */ 1379 1334 pfxlist_onlink_check(); … … 1389 1344 1390 1345 /* 1391 * ã«ã¼ã¿éç¥ãåä¿¡ããªãå ´åã¯ãç ´æ£ãã¦çµäºããã1346 * ルータ通知を受信しない場合は、破棄して終了する。 1392 1347 */ 1393 1348 NET_COUNT_ICMP6(net_count_nd6[NC_ND6_RA_IN_PACKETS], 1); … … 1400 1355 1401 1356 /* 1402 * nd6_rtrsol_ctl -- ã«ã¼ã¿è¦è«åºåã®å¶å¾¡1357 * nd6_rtrsol_ctl -- ルータ要請出力の制御 1403 1358 */ 1404 1359 … … 1409 1364 int_t try; 1410 1365 1411 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®ã¢ãã¬ã¹æ 1412 å ±ãå¾ãã*/ 1366 /* リンクローカルアドレスのアドレス情報を得る。*/ 1413 1367 if ((ifa = in6ifa_ifpwithix(IF_GET_IFNET(), IPV6_IFADDR_IX_LINKLOCAL)) == NULL) 1414 1368 return; 1415 1369 1416 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®éè¤æ¤åºçµäºãå¾ 1417 ã¤ã*/ 1370 /* リンクローカルアドレスの重複検出終了を待つ。*/ 1418 1371 do { 1419 /* ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ã®éè¤æ¤åºçµäºå¾ 1420 ã¡æéãè¨å®ããã*/ 1372 /* リンクローカルアドレスの重複検出終了待ち時間を設定する。*/ 1421 1373 syscall(dly_tsk(net_rand() % TMO_ND6_RTR_SOL_DELAY)); 1422 1374 1423 /* å¾ 1424 ã£ã¦ããéã«éè¤ãæ¤åºããããçµäºããã*/ 1375 /* 待っている間に重複が検出されたら終了する。*/ 1425 1376 if (ifa->flags & IN6_IFF_DUPLICATED) 1426 1377 return; … … 1430 1381 for (try = 0; try < NUM_ND6_RTR_SOL_RETRY; try ++) { 1431 1382 1432 /* ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãã«ã¨ã³ããªãããã°çµäº*/1383 /* ディフォルトルータ・リストにエントリがあれば終了 */ 1433 1384 if (def_router_count > 0) 1434 1385 return; 1435 1386 1436 /* ã«ã¼ã¿è¦è«ãåºåããã*/1387 /* ルータ要請を出力する。*/ 1437 1388 nd6_rs_output(); 1438 1389 1439 /* åºåã® 2 åç®ä»¥éã®é 1440 延æéãè¨å®ããã*/ 1390 /* 出力の 2 回目以降の遅延時間を設定する。*/ 1441 1391 syscall(dly_tsk(TMO_ND6_RTR_SOL_INTERVAL)); 1442 1392 } … … 1446 1396 1447 1397 /* 1448 * nd6_onlink_prefix_lookup -- ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã1398 * nd6_onlink_prefix_lookup -- プレフィックスを探索する。 1449 1399 */ 1450 1400 … … 1459 1409 now /= SYSTIM_HZ; 1460 1410 1461 /* æ¨å¥¨æå¹æéå 1462 ã®ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã*/ 1411 /* 推奨有効時間内のプレフィックスを探索する。*/ 1463 1412 for (ix = NUM_ND6_PREFIX_ENTRY; ix -- > 0; ) { 1464 1413 pr = &nd6_prefix[ix]; … … 1472 1421 } 1473 1422 1474 /* æå¹æéå 1475 ã®ãã¬ãã£ãã¯ã¹ãæ¢ç´¢ããã*/ 1423 /* 有効時間内のプレフィックスを探索する。*/ 1476 1424 for (ix = NUM_ND6_PREFIX_ENTRY; ix -- > 0; ) { 1477 1425 pr = &nd6_prefix[ix];
Note:
See TracChangeset
for help on using the changeset viewer.