Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet6/nd6.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.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 責ãããã¨ï¼ 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; … … 388 367 389 368 /* 390 * nd6_cache_lladdr -- è¿é£æ¢ç´¢ãã£ãã·ã¥ã«ç»é²ããã369 * nd6_cache_lladdr -- 近隣探索キャッシュに登録する。 391 370 */ 392 371 … … 400 379 int_t newstate = ND6_LLINFO_INCOMPLETE; 401 380 402 /* ã¢ãã¬ã¹ãç¡æå®ãªãä½ãããªãã*/381 /* アドレスが無指定なら何もしない。*/ 403 382 if (IN6_IS_ADDR_UNSPECIFIED(from)) 404 383 return NULL; 405 384 406 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/385 /* 近隣キャッシュに登録する。*/ 407 386 syscall(wai_sem(SEM_ND6_CACHE)); 408 387 if ((ln = nd6_lookup(from, false)) == NULL) { … … 422 401 423 402 /* 424 * ç¶æ 425 é·ç§»è¡¨ 403 * 状態遷移表 426 404 * 427 405 * nd_na_flags 428 * newnetry olladdr lladdr llchange å¦ç (L: lladdr ãç»é²ãã)406 * newnetry olladdr lladdr llchange 処理 (L: lladdr を登録する) 429 407 * 430 408 * F F N - (1) … … 437 415 */ 438 416 439 /* ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã¦ããã°æ´æ°ããã*/417 /* データリンク層のアドレスが通知されていれば更新する。*/ 440 418 if (lladdr != NULL) { 441 419 ln->ifaddr = *(T_IF_ADDR *)lladdr; … … 459 437 } 460 438 461 /* è¿é£ãã£ãã·ã¥ã¨ã³ããªãæ´æ°ããã*/439 /* 近隣キャッシュエントリを更新する。*/ 462 440 if (doupdate) { 463 441 ln->state = newstate; … … 467 445 ln->expire = now + ND6_GCOLLECTION_TIME; 468 446 469 /* ã¢ãã¬ã¹è§£æ±ºå¾ 470 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã*/ 447 /* アドレス解決待ちのデータグラムがあれば送信する。*/ 471 448 nd6_output_hold(ifp, ln); 472 449 } … … 477 454 478 455 479 /* ã«ã¼ã¿éç¥ã®å¦ç*/456 /* ルータ通知の処理 */ 480 457 switch (type) { 481 458 … … 507 484 508 485 /* 509 * nd6_is_addr_neighbor -- æå®ãããã¢ãã¬ã¹ã®ãã¼ããåä¸ãªã³ã¯ã«ããããã§ãã¯ããã486 * nd6_is_addr_neighbor -- 指定されたアドレスのノードが同一リンクにあるかチェックする。 510 487 */ 511 488 … … 526 503 527 504 /* 528 * nd6_output -- è¿é£æ¢ç´¢ã®åºåé¢æ° 529 * 530 * 注æ: ã»ããã© SEM_ND6_CACHE ã«ããããã¯ç¶æ 531 ã§å¼åºããã¨ã 505 * nd6_output -- 近隣探索の出力関数 506 * 507 * 注意: セマフォ SEM_ND6_CACHE によりロック状態で呼出すこと。 532 508 */ 533 509 … … 539 515 540 516 /* 541 * ãã¦å 542 ã¢ãã¬ã¹ããã«ããã£ã¹ãããè¿é£ãã£ãã·ã¥ã 543 * ä¸è¦ã®å ´åã¯ç´ã¡ã«éä¿¡ããã 517 * あて先アドレスがマルチキャストか、近隣キャッシュが 518 * 不要の場合は直ちに送信する。 544 519 */ 545 520 if (!(IN6_IS_ADDR_MULTICAST(dst) || !IF_IN6_NEED_CACHE(ifp))) { 546 521 if (ln == NULL) { 547 /* è¿é£ãã£ãã·ã¥ãæªå®ç¾©ã®å ´å*/522 /* 近隣キャッシュが未定義の場合 */ 548 523 if (nd6_is_addr_neighbor(ifp, dst)) { 549 524 /* 550 * æå®ãããã¢ãã¬ã¹ã®ãã¼ããåä¸ãªã³ã¯ã«ããæã¯ã551 * è¿é£ãã£ãã·ã¥ãæ¢ç´¢ããæªå®ç¾©ã®å ´åã¯ç»é²ããã525 * 指定されたアドレスのノードが同一リンクにある時は、 526 * 近隣キャッシュを探索し、未定義の場合は登録する。 552 527 */ 553 528 ln = nd6_lookup(dst, true); … … 560 535 561 536 /* 562 * è¿é£ãã£ãã·ã¥ã®ç¶æ 563 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãåãã£ã¦ãã¦ãã 564 * å°éå¯è½æ§ã確èªããã¦ããªãã¨ãã¯ãå°éä¸è½éç¥ãéå§ããã 537 * 近隣キャッシュの状態が、データリンク層のアドレスが分かっていても、 538 * 到達可能性が確認されていないときは、到達不能通知を開始する。 565 539 */ 566 540 if (ln->state == ND6_LLINFO_STALE) { … … 572 546 573 547 /* 574 * è¿é£ãã£ãã·ã¥ã®ç¶æ 575 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹æªè§£æ±ºã®å ´å㯠576 * è¿é£æ¢ç´¢ãè¡ãã 548 * 近隣キャッシュの状態が、データリンク層のアドレス未解決の場合は 549 * 近隣探索を行う。 577 550 */ 578 551 if (ln->state <= ND6_LLINFO_INCOMPLETE) { 579 552 580 /* ã¿ã¤ã ã¢ã¦ãã®æå®ããã¼ãªã³ã°ãªãã¿ã¤ã ã¢ã¦ãã§çµäºããã*/553 /* タイムアウトの指定がポーリングならタイムアウトで終了する。*/ 581 554 if (tmout == TMO_POL) { 582 555 error = E_TMOUT; … … 587 560 ln->state = ND6_LLINFO_INCOMPLETE; 588 561 589 /* ãã§ã«ãæªè§£æ±ºã®ãããã¯ã¼ã¯ãããã¡ãããã°ãéæ¾ããã*/562 /* すでに、未解決のネットワークバッファがあれば、開放する。*/ 590 563 if (ln->hold != NULL) { 591 564 syscall(rel_net_buf(ln->hold)); … … 594 567 595 568 /* 596 * éä¿¡ããã³ãã£ã³ã°ããã597 * IF ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããªããã©ã°ãè¨å®ããã¦ããã¨ãã¯ã598 * éä¿¡ããã³ãã£ã³ã°ããªãã569 * 送信をペンディングする。 570 * IF でネットワークバッファを開放しないフラグが設定されているときは、 571 * 送信をペンディングしない。 599 572 */ 600 573 if ((output->flags & NB_FLG_NOREL_IFOUT) == 0) { 601 574 ln->hold = output; 602 575 603 /* ã¿ã¤ã ã¢ã¦ãã®è¨å®*/576 /* タイムアウトの設定 */ 604 577 if (tmout == TMO_FEVR) 605 578 ln->tmout = tmout; … … 620 593 if ((int32_t)(ln->expire - now) < 0) { 621 594 /* ln->expire < now */ 622 ln->expire += ND6_RETRANS_TIME; /* è¿é£æ¢ç´¢éä¿¡éé*/595 ln->expire += ND6_RETRANS_TIME; /* 近隣探索送信間隔 */ 623 596 ln->asked ++; 624 597 nd6_ns_output(ifp, &in6_addr_unspecified, dst, ln, false); … … 631 604 632 605 /* 633 * éè¤ãæ¤åºãããã¤ã³ã¿ãã§ã¼ã¹ã«ã¯åºåããªãã606 * 重複が検出されたインタフェースには出力しない。 634 607 */ 635 608 if ((ifp->flags & ND6_IFF_IFDISABLED) != 0) { … … 647 620 648 621 /* 649 * nd6_storelladdr -- åºåãããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ãè¿ãã622 * nd6_storelladdr -- 出力するネットワークインタフェースのアドレスを返す。 650 623 */ 651 624 … … 664 637 665 638 /* 666 * nd6_option -- è¿é£æ¢ç´¢ãªãã·ã§ã³ã®å¦ç 667 * 668 * 注æ: ãªãã·ã§ã³ãªãã»ããé 669 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã 639 * nd6_option -- 近隣探索オプションの処理 640 * 641 * 注意: オプションオフセット配列には、オフセット + 8 が設定されている。 670 642 */ 671 643 … … 675 647 T_ND_OPT_HDR *opth; 676 648 ER error = E_OK; 677 int_t pi_count = 0; /* ãã¬ãã£ãã¯ã¹æ 678 å ±ã®åæ° */ 649 int_t pi_count = 0; /* プレフィックス情報の個数 */ 679 650 680 651 opth = (T_ND_OPT_HDR *)nh; … … 683 654 while (error == E_OK && ((uint8_t *)opth - (uint8_t *)nh) < (256 - 8) && len > 0) { 684 655 685 /* ãªãã·ã§ã³é·ã 0 ã®æã¯ãä¸æ£ãªãªãã·ã§ã³ã¨ãã¦å¦çããã*/656 /* オプション長が 0 の時は、不正なオプションとして処理する。*/ 686 657 if (opth->len == 0) { 687 658 error = E_PAR; … … 689 660 } 690 661 691 /* ãªãã·ã§ã³ã®ã¿ã¤ãã«ããåå²ããã*/662 /* オプションのタイプにより分岐する。*/ 692 663 switch (opth->type) { 693 case ND_OPT_SOURCE_LINKADDR: /* éä¿¡å 694 ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ */ 695 case ND_OPT_TARGET_LINKADDR: /* 対象ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ */ 696 case ND_OPT_REDIRECTED_HEADER: /* ãªãã¤ã¬ã¯ãã»ããã */ 664 case ND_OPT_SOURCE_LINKADDR: /* 送信先ネットワークインタフェースのアドレス */ 665 case ND_OPT_TARGET_LINKADDR: /* 対象ネットワークインタフェースのアドレス */ 666 case ND_OPT_REDIRECTED_HEADER: /* リダイレクト・ヘッダ */ 697 667 case ND_OPT_MTU: /* MTU */ 698 668 if (opt[ND_OPT_OFF_ARRAY_IX(opth->type)]) { 699 /* ãã¬ãã£ãã¯ã¹æ 700 å ±ä»¥å¤ã®åããªãã·ã§ã³ãè¤æ°æå®ããã¦ããã*/ 669 /* プレフィックス情報以外の同じオプションが複数指定されている。*/ 701 670 error = E_PAR; 702 671 } … … 705 674 } 706 675 break; 707 case ND_OPT_PREFIX_INFORMATION: /* ãã¬ãã£ãã¯ã¹æ 708 å ± */ 676 case ND_OPT_PREFIX_INFORMATION: /* プレフィックス情報 */ 709 677 if (!opt[ND_OPT_OFF_ARRAY_IX(ND_OPT_PREFIX_INFORMATION)]) { 710 678 /* 711 * ãã¬ãã£ãã¯ã¹æ 712 å ±ã¯æåã«ç¾ãããªãã»ããã®ã¿è¨é²ããã 679 * プレフィックス情報は最初に現れたオフセットのみ記録する。 713 680 */ 714 681 opt[ND_OPT_OFF_ARRAY_IX(opth->type)] = (uint8_t *)opth - (uint8_t *)nh + 8; … … 718 685 default: 719 686 /* 720 * å°æ¥å®ç¾©ããããããã³ã«ã¸ã®æ¡å¼µã«å¯¾å¿ããããã721 * èªèã§ããªããªãã·ã§ã³ã¯åã«ç¡è¦ããå¦çãç¶è¡ããã687 * 将来定義されるプロトコルへの拡張に対応するため、 688 * 認識できないオプションは単に無視し、処理を続行する。 722 689 */ 723 690 break; 724 691 } 725 len -= opth->len << 3; /* ãªãã·ã§ã³é·ã®åä½ã¯ 8 ãã¤ã*/692 len -= opth->len << 3; /* オプション長の単位は 8 バイト */ 726 693 opth = (T_ND_OPT_HDR *)((uint8_t *)opth + (opth->len << 3)); 727 694 }
Note:
See TracChangeset
for help on using the changeset viewer.