Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet6/nd6.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.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 責ãããã¨ï¼ 36 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 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プロジェクトを免責すること. 25 * 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 132 120 133 121 /* 134 * è¿é£ãã£ãã·ã¥122 * 近隣キャッシュ 135 123 */ 136 124 … … 138 126 139 127 /* 140 * nd6_free -- ã«ã¼ã¿ãåé¤ããã128 * nd6_free -- ルータを削除する。 141 129 */ 142 130 … … 150 138 ln->state = ND6_LLINFO_INCOMPLETE; 151 139 152 /* ãã¬ãã£ãã¯ã¹ã»ãªã¹ãããã«ã¼ã¿ãåé¤ããã*/140 /* プレフィックス・リストからルータを削除する。*/ 153 141 nd6_defrtrlist_del(dr); 154 142 } … … 156 144 157 145 /* 158 * nd6_timer -- è¿é£æ¢ç´¢ç®¡çã¿ã¤ãã¼146 * nd6_timer -- 近隣探索管理タイマー 159 147 */ 160 148 … … 167 155 int_t ix; 168 156 169 /* è¿é£ãã£ãã·ã¥ã®å¦ç*/157 /* 近隣キャッシュの処理 */ 170 158 syscall(wai_sem(SEM_ND6_CACHE)); 171 159 syscall(get_tim(&now)); … … 177 165 switch (ln->state) { 178 166 179 case ND6_LLINFO_INCOMPLETE: /* æªè§£æ±º*/167 case ND6_LLINFO_INCOMPLETE: /* 未解決 */ 180 168 if (ln->asked < ND6_MAX_MCAST_QUERY) { 181 169 /* 182 * ãã«ããã£ã¹ãã¢ãã¬ã¹è¦è«ã®åéåæ°ä»¥ä¸ã®å ´åã®å¦ç170 * マルチキャストアドレス要請の再送回数以下の場合の処理 183 171 */ 184 172 ln->asked ++; 185 ln->expire = now + ND6_RETRANS_TIME; /* è¿é£æ¢ç´¢éä¿¡éé*/173 ln->expire = now + ND6_RETRANS_TIME; /* 近隣探索送信間隔 */ 186 174 nd6_ns_output(ifp, &in6_addr_unspecified, &ln->addr, ln, false); 187 175 } … … 189 177 if (ln->hold != NULL) { 190 178 /* 191 * æçµçã«ã¯ãä¿çããã¦ãããããã¯ã¼ã¯ãããã¡ã 192 * ããã°ãICMP6 ERROR ãèªåèªèº«ã«è¿ãããã¨ã 193 * ãããã¯ã¼ã¯ãããã¡ãéæ¾ããã 194 * ããããç¾å¨ãicmp6_error ã®å®è£ 195 ãä¸å®å 196 ¨ã®ããã 197 * ãããã¯ã¼ã¯ãããã¡ã®éæ¾ã®ã¿è¡ãã 179 * 最終的には、保留されているネットワークバッファが 180 * あれば、ICMP6 ERROR を自分自身に返したあと、 181 * ネットワークバッファを開放する。 182 * しかし、現在、icmp6_error の実装が不完全のため、 183 * ネットワークバッファの開放のみ行う。 198 184 */ 199 #if 0 /* ä¿ç*/185 #if 0 /* 保留 */ 200 186 icmp6_error(ln->hold, ICMP6_DST_UNREACH, 201 187 ICMP6_DST_UNREACH_ADDR, 0); … … 209 195 break; 210 196 211 case ND6_LLINFO_REACHABLE: /* å°éå¯è½*/197 case ND6_LLINFO_REACHABLE: /* 到達可能 */ 212 198 if (ln->expire) { 213 199 ln->expire = now + ND6_GCOLLECTION_TIME; … … 216 202 break; 217 203 218 case ND6_LLINFO_STALE: /* å°éå¯è½æ§ã¯æªç¢ºèª*/204 case ND6_LLINFO_STALE: /* 到達可能性は未確認 */ 219 205 if (ln->expire) { 220 206 if (ln->hold != NULL) { … … 227 213 break; 228 214 229 case ND6_LLINFO_DELAY: /* å°éå¯è½æ§ã®ç¢ºèªå¾ 230 æ© */ 215 case ND6_LLINFO_DELAY: /* 到達可能性の確認待機 */ 231 216 ln->asked = 1; 232 ln->expire = now + ND6_RETRANS_TIME; /* è¿é£æ¢ç´¢éä¿¡éé*/217 ln->expire = now + ND6_RETRANS_TIME; /* 近隣探索送信間隔 */ 233 218 ln->state = ND6_LLINFO_PROBE; 234 219 nd6_ns_output(ifp, &ln->addr, &ln->addr, ln, false); 235 220 break; 236 221 237 case ND6_LLINFO_PROBE: /* å°éå¯è½æ§ã確èªä¸*/222 case ND6_LLINFO_PROBE: /* 到達可能性を確認中 */ 238 223 if (ln->asked < ND6_MAX_UCAST_QUERY) { 239 224 /* 240 * ã¦ããã£ã¹ãã¢ãã¬ã¹è¦è«ã®åéåæ°ä»¥ä¸ã®å ´åã®å¦ç225 * ユニキャストアドレス要請の再送回数以下の場合の処理 241 226 */ 242 227 ln->asked ++; 243 ln->expire += ND6_RETRANS_TIME; /* è¿é£æ¢ç´¢éä¿¡éé*/228 ln->expire += ND6_RETRANS_TIME; /* 近隣探索送信間隔 */ 244 229 nd6_ns_output(ifp, &ln->addr, &ln->addr, ln, false); 245 230 } … … 259 244 syscall(sig_sem(SEM_ND6_CACHE)); 260 245 261 /* ãã£ãã©ã«ãã«ã¼ã¿ã»ãªã¹ãã®å¦ç*/246 /* ディフォルトルータ・リストの処理 */ 262 247 nd6_defrtrlist_timer(); 263 248 264 /* ãã¬ãã£ãã¯ã¹ã»ãªã¹ãã®å¦ç*/249 /* プレフィックス・リストの処理 */ 265 250 nd6_prelist_timer(); 266 251 267 /* ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ã®å¦ç*/252 /* ネットワークインタフェースのアドレスの処理 */ 268 253 in6_ifaddr_timer(ifp); 269 254 270 255 /* 271 * å°éå¯è½ç¶æ 272 ã®æå¹æéã®æ´æ° 256 * 到達可能状態の有効時間の更新 273 257 */ 274 258 if ((int32_t)(nd6_recalc_reachtm_interval - now) < 0) { … … 281 265 282 266 /* 283 * nd6_get_cache -- è¿é£ãã£ãã·ã¥ãç²å¾ããã267 * nd6_get_cache -- 近隣キャッシュを獲得する。 284 268 */ 285 269 … … 291 275 292 276 /* 293 * nd6_ifattach -- è¿é£æ¢ç´¢ã®åæè¨å®ãè¡ãã277 * nd6_ifattach -- 近隣探索の初期設定を行う。 294 278 */ 295 279 … … 300 284 301 285 /* 302 * nd6_output_hold -- è¿é£æ¢ç´¢ãã£ãã·ã¥ã«ä¿çããã¦ãã 303 * ã¢ãã¬ã¹è§£æ±ºå¾ 304 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã 305 * 306 * 注æ: ã»ããã© SEM_ND6_CACHE ã«ããããã¯ç¶æ 307 ã§å¼åºããã¨ã 286 * nd6_output_hold -- 近隣探索キャッシュに保留されている 287 * アドレス解決待ちのデータグラムがあれば送信する。 288 * 289 * 注意: セマフォ SEM_ND6_CACHE によりロック状態で呼出すこと。 308 290 */ 309 291 … … 313 295 SYSTIM now; 314 296 315 /* ã¢ãã¬ã¹è§£æ±ºå¾ 316 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã*/ 297 /* アドレス解決待ちのデータグラムがあれば送信する。*/ 317 298 if (ln->hold) { 318 299 319 /* ã¿ã¤ã ã¢ã¦ãã®å¦ç*/300 /* タイムアウトの処理 */ 320 301 if (ln->tmout != TMO_FEVR) { 321 302 322 303 /* 323 * ã¿ã¤ã ã¢ã¦ãã®æå®ãæ°¸ä¹ 324 ã§ãªããæéãéãã¦ããã°ã 325 * åºåããªãã§çµäºããã 304 * タイムアウトの指定が永久でなく、時間を過ぎていれば、 305 * 出力しないで終了する。 326 306 */ 327 307 syscall(get_tim(&now)); … … 341 321 342 322 /* 343 * nd6_lookup -- è¿é£æ¢ç´¢ãã£ãã·ã¥ãæ¢ç´¢ããã 344 * 345 * 注æ: ã»ããã© SEM_ND6_CACHE ã«ããããã¯ç¶æ 346 ã§å¼åºããã¨ã 323 * nd6_lookup -- 近隣探索キャッシュを探索する。 324 * 325 * 注意: セマフォ SEM_ND6_CACHE によりロック状態で呼出すこと。 347 326 * 348 327 */ … … 356 335 for (ix = NUM_ND6_CACHE_ENTRY; ix -- > 0; ) { 357 336 if (nd6_cache[ix].state == 0) { 358 /* æªä½¿ç¨ã¨ã³ããªã®ã¤ã³ããã¯ã¹ãè¨é²ããã*/337 /* 未使用エントリのインデックスを記録する。*/ 359 338 if (fix == -1) 360 339 fix = ix; … … 364 343 } 365 344 else if ((int32_t)(nd6_cache[ix].expire - min) < 0) { /* nd6_cache[ix].expire < min */ 366 /* æå¹æéãæçã¨ã³ããªã®ã¤ã³ããã¯ã¹ãè¨é²ããã*/345 /* 有効期限が最短エントリのインデックスを記録する。*/ 367 346 min = nd6_cache[ix].expire; 368 347 mix = ix; … … 387 366 388 367 /* 389 * nd6_cache_lladdr -- è¿é£æ¢ç´¢ãã£ãã·ã¥ã«ç»é²ããã368 * nd6_cache_lladdr -- 近隣探索キャッシュに登録する。 390 369 */ 391 370 … … 399 378 int_t newstate = ND6_LLINFO_INCOMPLETE; 400 379 401 /* ã¢ãã¬ã¹ãç¡æå®ãªãä½ãããªãã*/380 /* アドレスが無指定なら何もしない。*/ 402 381 if (IN6_IS_ADDR_UNSPECIFIED(from)) 403 382 return NULL; 404 383 405 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/384 /* 近隣キャッシュに登録する。*/ 406 385 syscall(wai_sem(SEM_ND6_CACHE)); 407 386 if ((ln = nd6_lookup(from, false)) == NULL) { … … 421 400 422 401 /* 423 * ç¶æ 424 é·ç§»è¡¨ 402 * 状態遷移表 425 403 * 426 404 * nd_na_flags 427 * newnetry olladdr lladdr llchange å¦ç (L: lladdr ãç»é²ãã)405 * newnetry olladdr lladdr llchange 処理 (L: lladdr を登録する) 428 406 * 429 407 * F F N - (1) … … 436 414 */ 437 415 438 /* ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã¦ããã°æ´æ°ããã*/416 /* データリンク層のアドレスが通知されていれば更新する。*/ 439 417 if (lladdr != NULL) { 440 418 ln->ifaddr = *(T_IF_ADDR *)lladdr; … … 458 436 } 459 437 460 /* è¿é£ãã£ãã·ã¥ã¨ã³ããªãæ´æ°ããã*/438 /* 近隣キャッシュエントリを更新する。*/ 461 439 if (doupdate) { 462 440 ln->state = newstate; … … 466 444 ln->expire = now + ND6_GCOLLECTION_TIME; 467 445 468 /* ã¢ãã¬ã¹è§£æ±ºå¾ 469 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã*/ 446 /* アドレス解決待ちのデータグラムがあれば送信する。*/ 470 447 nd6_output_hold(ifp, ln); 471 448 } … … 476 453 477 454 478 /* ã«ã¼ã¿éç¥ã®å¦ç*/455 /* ルータ通知の処理 */ 479 456 switch (type) { 480 457 … … 506 483 507 484 /* 508 * nd6_is_addr_neighbor -- æå®ãããã¢ãã¬ã¹ã®ãã¼ããåä¸ãªã³ã¯ã«ããããã§ãã¯ããã485 * nd6_is_addr_neighbor -- 指定されたアドレスのノードが同一リンクにあるかチェックする。 509 486 */ 510 487 … … 525 502 526 503 /* 527 * nd6_output -- è¿é£æ¢ç´¢ã®åºåé¢æ° 528 * 529 * 注æ: ã»ããã© SEM_ND6_CACHE ã«ããããã¯ç¶æ 530 ã§å¼åºããã¨ã 504 * nd6_output -- 近隣探索の出力関数 505 * 506 * 注意: セマフォ SEM_ND6_CACHE によりロック状態で呼出すこと。 531 507 */ 532 508 … … 538 514 539 515 /* 540 * ãã¦å 541 ã¢ãã¬ã¹ããã«ããã£ã¹ãããè¿é£ãã£ãã·ã¥ã 542 * ä¸è¦ã®å ´åã¯ç´ã¡ã«éä¿¡ããã 516 * あて先アドレスがマルチキャストか、近隣キャッシュが 517 * 不要の場合は直ちに送信する。 543 518 */ 544 519 if (!(IN6_IS_ADDR_MULTICAST(dst) || !IF_IN6_NEED_CACHE(ifp))) { 545 520 if (ln == NULL) { 546 /* è¿é£ãã£ãã·ã¥ãæªå®ç¾©ã®å ´å*/521 /* 近隣キャッシュが未定義の場合 */ 547 522 if (nd6_is_addr_neighbor(ifp, dst)) { 548 523 /* 549 * æå®ãããã¢ãã¬ã¹ã®ãã¼ããåä¸ãªã³ã¯ã«ããæã¯ã550 * è¿é£ãã£ãã·ã¥ãæ¢ç´¢ããæªå®ç¾©ã®å ´åã¯ç»é²ããã524 * 指定されたアドレスのノードが同一リンクにある時は、 525 * 近隣キャッシュを探索し、未定義の場合は登録する。 551 526 */ 552 527 ln = nd6_lookup(dst, true); … … 559 534 560 535 /* 561 * è¿é£ãã£ãã·ã¥ã®ç¶æ 562 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãåãã£ã¦ãã¦ãã 563 * å°éå¯è½æ§ã確èªããã¦ããªãã¨ãã¯ãå°éä¸è½éç¥ãéå§ããã 536 * 近隣キャッシュの状態が、データリンク層のアドレスが分かっていても、 537 * 到達可能性が確認されていないときは、到達不能通知を開始する。 564 538 */ 565 539 if (ln->state == ND6_LLINFO_STALE) { … … 571 545 572 546 /* 573 * è¿é£ãã£ãã·ã¥ã®ç¶æ 574 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹æªè§£æ±ºã®å ´å㯠575 * è¿é£æ¢ç´¢ãè¡ãã 547 * 近隣キャッシュの状態が、データリンク層のアドレス未解決の場合は 548 * 近隣探索を行う。 576 549 */ 577 550 if (ln->state <= ND6_LLINFO_INCOMPLETE) { 578 551 579 /* ã¿ã¤ã ã¢ã¦ãã®æå®ããã¼ãªã³ã°ãªãã¿ã¤ã ã¢ã¦ãã§çµäºããã*/552 /* タイムアウトの指定がポーリングならタイムアウトで終了する。*/ 580 553 if (tmout == TMO_POL) { 581 554 error = E_TMOUT; … … 586 559 ln->state = ND6_LLINFO_INCOMPLETE; 587 560 588 /* ãã§ã«ãæªè§£æ±ºã®ãããã¯ã¼ã¯ãããã¡ãããã°ãéæ¾ããã*/561 /* すでに、未解決のネットワークバッファがあれば、開放する。*/ 589 562 if (ln->hold != NULL) { 590 563 syscall(rel_net_buf(ln->hold)); … … 592 565 593 566 /* 594 * éä¿¡ããã³ãã£ã³ã°ããã595 * IF ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããªããã©ã°ãè¨å®ããã¦ããã¨ãã¯ã596 * éä¿¡ããã³ãã£ã³ã°ããªãã567 * 送信をペンディングする。 568 * IF でネットワークバッファを開放しないフラグが設定されているときは、 569 * 送信をペンディングしない。 597 570 */ 598 571 if ((output->flags & NB_FLG_NOREL_IFOUT) == 0) { 599 572 ln->hold = output; 600 573 601 /* ã¿ã¤ã ã¢ã¦ãã®è¨å®*/574 /* タイムアウトの設定 */ 602 575 if (tmout == TMO_FEVR) 603 576 ln->tmout = tmout; … … 618 591 if ((int32_t)(ln->expire - now) < 0) { 619 592 /* ln->expire < now */ 620 ln->expire += ND6_RETRANS_TIME; /* è¿é£æ¢ç´¢éä¿¡éé*/593 ln->expire += ND6_RETRANS_TIME; /* 近隣探索送信間隔 */ 621 594 ln->asked ++; 622 595 nd6_ns_output(ifp, &in6_addr_unspecified, dst, ln, false); … … 629 602 630 603 /* 631 * éè¤ãæ¤åºãããã¤ã³ã¿ãã§ã¼ã¹ã«ã¯åºåããªãã604 * 重複が検出されたインタフェースには出力しない。 632 605 */ 633 606 if ((ifp->flags & ND6_IFF_IFDISABLED) != 0) { … … 645 618 646 619 /* 647 * nd6_storelladdr -- åºåãããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ãè¿ãã620 * nd6_storelladdr -- 出力するネットワークインタフェースのアドレスを返す。 648 621 */ 649 622 … … 662 635 663 636 /* 664 * nd6_option -- è¿é£æ¢ç´¢ãªãã·ã§ã³ã®å¦ç 665 * 666 * 注æ: ãªãã·ã§ã³ãªãã»ããé 667 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã 637 * nd6_option -- 近隣探索オプションの処理 638 * 639 * 注意: オプションオフセット配列には、オフセット + 8 が設定されている。 668 640 */ 669 641 … … 673 645 T_ND_OPT_HDR *opth; 674 646 ER error = E_OK; 675 int_t pi_count = 0; /* ãã¬ãã£ãã¯ã¹æ 676 å ±ã®åæ° */ 647 int_t pi_count = 0; /* プレフィックス情報の個数 */ 677 648 678 649 opth = (T_ND_OPT_HDR *)nh; … … 681 652 while (error == E_OK && ((uint8_t *)opth - (uint8_t *)nh) < (256 - 8) && len > 0) { 682 653 683 /* ãªãã·ã§ã³é·ã 0 ã®æã¯ãä¸æ£ãªãªãã·ã§ã³ã¨ãã¦å¦çããã*/654 /* オプション長が 0 の時は、不正なオプションとして処理する。*/ 684 655 if (opth->len == 0) { 685 656 error = E_PAR; … … 687 658 } 688 659 689 /* ãªãã·ã§ã³ã®ã¿ã¤ãã«ããåå²ããã*/660 /* オプションのタイプにより分岐する。*/ 690 661 switch (opth->type) { 691 case ND_OPT_SOURCE_LINKADDR: /* éä¿¡å 692 ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ */ 693 case ND_OPT_TARGET_LINKADDR: /* 対象ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ */ 694 case ND_OPT_REDIRECTED_HEADER: /* ãªãã¤ã¬ã¯ãã»ããã */ 662 case ND_OPT_SOURCE_LINKADDR: /* 送信先ネットワークインタフェースのアドレス */ 663 case ND_OPT_TARGET_LINKADDR: /* 対象ネットワークインタフェースのアドレス */ 664 case ND_OPT_REDIRECTED_HEADER: /* リダイレクト・ヘッダ */ 695 665 case ND_OPT_MTU: /* MTU */ 696 666 if (opt[ND_OPT_OFF_ARRAY_IX(opth->type)]) { 697 /* ãã¬ãã£ãã¯ã¹æ 698 å ±ä»¥å¤ã®åããªãã·ã§ã³ãè¤æ°æå®ããã¦ããã*/ 667 /* プレフィックス情報以外の同じオプションが複数指定されている。*/ 699 668 error = E_PAR; 700 669 } … … 703 672 } 704 673 break; 705 case ND_OPT_PREFIX_INFORMATION: /* ãã¬ãã£ãã¯ã¹æ 706 å ± */ 674 case ND_OPT_PREFIX_INFORMATION: /* プレフィックス情報 */ 707 675 if (!opt[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFORMATION)]) { 708 676 /* 709 * ãã¬ãã£ãã¯ã¹æ 710 å ±ã¯æåã«ç¾ãããªãã»ããã®ã¿è¨é²ããã 677 * プレフィックス情報は最初に現れたオフセットのみ記録する。 711 678 */ 712 679 opt[ND_OPT_OFF_ARRAY_IX(opth->type)] = (uint8_t *)opth - (uint8_t *)nh + 8; … … 716 683 default: 717 684 /* 718 * å°æ¥å®ç¾©ããããããã³ã«ã¸ã®æ¡å¼µã«å¯¾å¿ããããã719 * èªèã§ããªããªãã·ã§ã³ã¯åã«ç¡è¦ããå¦çãç¶è¡ããã685 * 将来定義されるプロトコルへの拡張に対応するため、 686 * 認識できないオプションは単に無視し、処理を続行する。 720 687 */ 721 688 break; 722 689 } 723 len -= opth->len << 3; /* ãªãã·ã§ã³é·ã®åä½ã¯ 8 ãã¤ã*/690 len -= opth->len << 3; /* オプション長の単位は 8 バイト */ 724 691 opth = (T_ND_OPT_HDR *)((uint8_t *)opth + (opth->len << 3)); 725 692 }
Note:
See TracChangeset
for help on using the changeset viewer.