Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet6/nd6_nbr.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_nbr.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$ … … 124 112 125 113 /* 126 * å±æé¢æ°114 * 局所関数 127 115 */ 128 116 … … 134 122 135 123 /* 136 * nd6_dad_duplicated -- éè¤ã¢ãã¬ã¹ãæ¤åºããæã®å¦ç124 * nd6_dad_duplicated -- 重複アドレスを検出した時の処理 137 125 */ 138 126 … … 147 135 ifa->flags |= IN6_IFF_DUPLICATED; 148 136 149 /* ã¿ã¤ãã¼ãåæ¢ããã*/137 /* タイマーを停止する。*/ 150 138 untimeout((callout_func)nd6_dad_timer, ifa); 151 139 152 140 /* 153 * ãã IPv6 ã¢ãã¬ã¹ããã¦ãã¼ã¯ã«å²ãå½ã¦ãã154 * ï¼ã¤ã¼ãµãããç¨ã® EUI-64ï¼ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹ããã¼ã¹ã¨ãã155 * ã¤ã³ã¿ãã§ã¼ã¹ ID ã§çæãããã®ã§ããã°ã156 * ãã®ã¤ã³ã¿ãã§ã¼ã¹ã§ã® IPv6 ã®åä½ã¯ç¡å¹ã«ãã¹ãã§ãã157 * ï¼RFC2462bis-03 ã»ã¯ã·ã§ã³ 5.4.5ï¼ã141 * もし IPv6 アドレスが、ユニークに割り当てらた 142 * (イーサネット用の EUI-64)ハードウェアアドレスをベースとした 143 * インタフェース ID で生成されたのであれば、 144 * このインタフェースでの IPv6 の動作は無効にすべきである 145 * (RFC2462bis-03 セクション 5.4.5)。 158 146 */ 159 147 if (IN6_IS_ADDR_LINKLOCAL(&ifa->addr)) … … 163 151 164 152 /* 165 * nd6_dad_ns_output -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) è¦è«ãåºåããã153 * nd6_dad_ns_output -- 重複アドレス検出 (DAD) 要請を出力する。 166 154 */ 167 155 … … 176 164 177 165 /* 178 * nd6_dad_ns_input -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) è¦è«å 179 ¥å 166 * nd6_dad_ns_input -- 重複アドレス検出 (DAD) 要請入力 180 167 */ 181 168 … … 186 173 187 174 /* 188 * ã¾ã ãéè¤ã¢ãã¬ã¹æ¤åºè¦è«ãåºåãã¦ããªãå ´å175 * まだ、重複アドレス検出要請を出力していない場合 189 176 */ 190 177 if (ifa->ns_ocount == 0) … … 195 182 196 183 /* 197 * nd6_dad_na_input -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) éç¥å 198 ¥å 184 * nd6_dad_na_input -- 重複アドレス検出 (DAD) 通知入力 199 185 */ 200 186 … … 208 194 209 195 /* 210 * nd6_dad_timer -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) ã¿ã¤ãã¼196 * nd6_dad_timer -- 重複アドレス検出 (DAD) タイマー 211 197 */ 212 198 … … 229 215 nd6_dad_ns_output(ifp, ifa); 230 216 231 /* ã¿ã¤ã ã¢ã¦ããè¿é£æ¢ç´¢ã®éä¿¡ééã«è¨å®ããã*/217 /* タイムアウトを近隣探索の送信間隔に設定する。*/ 232 218 timeout((callout_func)nd6_dad_timer, ifa, ND6_RETRANS_TIME * NET_TIMER_HZ / SYSTIM_HZ); 233 219 } … … 241 227 242 228 /* 243 * nd6_ns_input -- è¿é£è¦è«ã®å 244 ¥åå¦çã 229 * nd6_ns_input -- 近隣要請の入力処理。 245 230 */ 246 231 … … 264 249 265 250 /* 266 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã267 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤268 * ã»ãããé·ãçã251 * ヘッダのチェック、以下の場合は破棄する。 252 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 253 * ・ヘッダ長が短い 269 254 */ 270 255 if (ip6h->hlim != IPV6_MAXHLIM || input->len - off < NEIGHBOR_SOLICIT_HDR_SIZE) … … 275 260 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) { 276 261 /* 277 * å§ç¹ã¢ãã¬ã¹ãç¡æå®ãªããéè¤ã¢ãã¬ã¹æ¤åº 278 * ãã¦å 279 ã¢ãã¬ã¹ã¯ãè¦è«ãã«ããã£ã¹ãã§ãªããã°ãªããªãã 262 * 始点アドレスが無指定なら、重複アドレス検出 263 * あて先アドレスは、要請マルチキャストでなければならない。 280 264 */ 281 265 if (!IN6_IS_ADDR_NS_MULTICAST(&ip6h->dst)) … … 283 267 } 284 268 285 /* ç®çã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼*/269 /* 目的アドレスがマルチキャストならエラー */ 286 270 if (IN6_IS_ADDR_MULTICAST(&nsh->target)) 287 271 goto err_ret; 288 272 289 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/273 /* 近隣探索オプションのオフセットを記録する。*/ 290 274 if (nd6_options(nd_opt_off, input->buf + (off + NEIGHBOR_SOLICIT_HDR_SIZE), 291 275 input->len - (off + NEIGHBOR_SOLICIT_HDR_SIZE)) != E_OK) 292 276 goto err_ret; 293 277 294 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ (å§ç¹ãªã³ã¯ã¢ãã¬ã¹) */278 /* 近隣探索オプション (始点リンクアドレス) */ 295 279 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)]) { 296 280 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + NEIGHBOR_SOLICIT_HDR_SIZE) + 297 281 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_SOURCE_LINKADDR)] - 8); 298 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 299 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 282 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 300 283 lladdr = (uint8_t *)(opth + 1); 301 284 lladdr_len = (opth->len << 3); … … 305 288 goto err_ret; 306 289 307 /* å®å 308 ã¢ãã¬ã¹ããã«ããã£ã¹ããªãè¿é£éç¥ã«ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãä»ããã*/ 290 /* 宛先アドレスがマルチキャストなら近隣通知にデータリンク層のアドレスを付ける。*/ 309 291 if (IN6_IS_ADDR_MULTICAST(&ip6h->dst)) 310 292 tlladdr = true; … … 313 295 314 296 /* 315 * ç®çã¢ãã¬ã¹ããèªåã®ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã« 316 * å²ãå½ã¦ããã¦ããã¢ãã¬ã¹ã調ã¹ãã 317 * ãªãã代çãµã¼ãã¹ã¯å®è£ 318 ãã¦ããªãã 297 * 目的アドレスが、自分のネットワークインタフェースに 298 * 割り当てられているアドレスか調べる。 299 * なお、代理サービスは実装していない。 319 300 */ 320 301 ifa = in6_lookup_ifaddr(ifp, &nsh->target); … … 323 304 goto free_ret; 324 305 325 /* æ¢ç´¢çµæã¢ãã¬ã¹ãéè¤ãã¦ããã°å¿çããªãã§çµäºããã*/306 /* 探索結果アドレスが重複していれば応答しないで終了する。*/ 326 307 if (ifa->flags & IN6_IFF_DUPLICATED) 327 308 goto err_ret; 328 309 329 310 /* 330 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼311 * ネットワークインタフェースのアドレス長が一致しなければエラー 331 312 */ 332 313 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) … … 334 315 335 316 /* 336 * å§ç¹ã¢ãã¬ã¹ãèªåã®ã¢ãã¬ã¹ã¨ä¸è´ããã°éè¤ãã¦ããã317 * 始点アドレスが自分のアドレスと一致すれば重複している。 337 318 */ 338 319 if (IN6_ARE_ADDR_EQUAL(&ifa->addr, &ip6h->src)) 339 320 goto free_ret; 340 321 341 /* éè¤æ¤åºä¸ã«ãè¿é£è¦è«ãåä¿¡ããã¨ãã®å¦ç*/322 /* 重複検出中に、近隣要請を受信したときの処理 */ 342 323 if (ifa->flags & IN6_IFF_TENTATIVE) { 343 324 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) … … 352 333 353 334 /* 354 * å§ç¹ã¢ãã¬ã¹ãç¡æå®ãªããéä¿¡ç¸æã¯éè¤ã¢ãã¬ã¹æ¤åºä¸ã§ã 355 * ç´æ¥éä¿¡ãããã¨ã¯ã§ããªãã®ã§ãå 356 ¨ãã¼ããã«ããã£ã¹ã 357 * ã¢ãã¬ã¹ã«éä¿¡ããã 335 * 始点アドレスが無指定なら、送信相手は重複アドレス検出中で、 336 * 直接送信することはできないので、全ノードマルチキャスト 337 * アドレスに送信する。 358 338 */ 359 339 if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->src)) { … … 362 342 } 363 343 364 /* è¿é£ãã£ãã·ã¥ã«ç»é²ããã*/344 /* 近隣キャッシュに登録する。*/ 365 345 nd6_cache_lladdr(ifp, &ip6h->src, (T_IF_ADDR *)lladdr, ND_NEIGHBOR_SOLICIT, 0); 366 346 … … 377 357 378 358 /* 379 * nd6_ns_output -- è¿é£è¦è«ãåºåããã359 * nd6_ns_output -- 近隣要請を出力する。 380 360 */ 381 361 … … 396 376 return; 397 377 398 /* è¿é£è¦è«ãã¤ãã¼ãé·ãè¨ç®ããã*/378 /* 近隣要請ペイロード長を計算する。*/ 399 379 if (!dad && IF_SOFTC_TO_IFADDR(ifp->ic)) 400 380 len = (NEIGHBOR_SOLICIT_HDR_SIZE + ND_OPT_HDR_SIZE + sizeof(T_IF_ADDR) + 7) >> 3 << 3; … … 403 383 404 384 /* 405 * è¦è«ãã«ããã£ã¹ãã»ã¢ãã¬ã¹å®ã®è¿é£æ¢ç´¢ã§ã¯ã406 * ä»ã®ãªã³ã¯ããã®å½é ããããã¼ã¿ã°ã©ã ã407 * æé¤ãããããããããªãããã« IPV6_MAXHLIM (255) ãè¨å®ããã385 * 要請マルチキャスト・アドレス宛の近隣探索では、 386 * 他のリンクからの偽造されたデータグラムを 387 * 排除するため、ホップリミットに IPV6_MAXHLIM (255) を設定する。 408 388 */ 409 389 if (IN6_IS_ADDR_UNSPECIFIED(daddr) || IN6_IS_ADDR_MULTICAST(daddr)) 410 390 ipflags = IPV6_OUT_SET_HOP_LIMIT(IPV6_OUT_FLG_HOP_LIMIT, IPV6_MAXHLIM); 411 391 412 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/392 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 413 393 if (in6_get_datagram(&output, len, 0, daddr, NULL, 414 394 IPPROTO_ICMPV6, IPV6_MAXHLIM, … … 420 400 if (IN6_IS_ADDR_UNSPECIFIED(daddr)) { 421 401 422 /* å®å 423 ã¢ãã¬ã¹ãç¡æå®ã®å ´åã¯ãè¦è«ãã«ããã£ã¹ãã¢ãã¬ã¹ãè¨å®ããã*/ 402 /* 宛先アドレスが無指定の場合は、要請マルチキャストアドレスを設定する。*/ 424 403 ip6h->dst.s6_addr32[0] = IPV6_ADDR_INT32_MLL; 425 404 ip6h->dst.s6_addr32[2] = IPV6_ADDR_INT32_ONE; … … 428 407 } 429 408 430 /* éä¿¡å 431 ã¢ãã¬ã¹ã®è¨å® */ 409 /* 送信元アドレスの設定 */ 432 410 if (!dad) { 433 411 434 /* éè¤ã¢ãã¬ã¹æ¤åºã§ã¯ãªãæã®éä¿¡å 435 ã¢ãã¬ã¹æ±ºå®å¦çã*/ 412 /* 重複アドレス検出ではない時の送信元アドレス決定処理。*/ 436 413 T_IN6_ADDR *saddr; 437 414 438 415 if (ln && ln->hold) { 439 416 /* 440 * éä¿¡ããã³ãã£ã³ã°ããã¦ãããã¼ã¿ã°ã©ã ã® 441 * éä¿¡å 442 ã¢ãã¬ã¹ãå©ç¨ããã 417 * 送信がペンディングされているデータグラムの 418 * 送信元アドレスを利用する。 443 419 */ 444 420 if (ln->hold->len > IF_IP6_HDR_SIZE) … … 454 430 else { 455 431 /* 456 * å®å 457 ã¢ãã¬ã¹ã«ãµããããéä¿¡å 458 ã¢ãã¬ã¹ãã 459 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããæ¢ç´¢ãã¦å©ç¨ããã 432 * 宛先アドレスにふさわしい送信元アドレスを、 433 * ネットワークインタフェースから探索して利用する。 460 434 */ 461 435 T_IN6_IFADDR *ifa; … … 470 444 else { 471 445 472 /* éè¤ã¢ãã¬ã¹æ¤åºæã®éä¿¡å 473 ã¢ãã¬ã¹ã¯ç¡æå®ã*/ 446 /* 重複アドレス検出時の送信元アドレスは無指定。*/ 474 447 memset(&ip6h->src, 0, sizeof(T_IN6_ADDR)); 475 448 } 476 449 477 /* è¿é£è¦è«ããããè¨å®ããã*/450 /* 近隣要請ヘッダを設定する。*/ 478 451 nsh = GET_NEIGHBOR_SOLICIT_HDR(output, IF_IP6_NEIGHBOR_SOLICIT_HDR_OFFSET); 479 452 nsh->hdr.type = ND_NEIGHBOR_SOLICIT; … … 484 457 if (!dad && (mac = IF_SOFTC_TO_IFADDR(ifp->ic)) != NULL) { 485 458 486 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã¨ãã¦ãæ¢ç´¢ç®æ¨ã® MAC ã¢ãã¬ã¹ãè¨å®ããã*/459 /* 近隣探索オプションとして、探索目標の MAC アドレスを設定する。*/ 487 460 T_ND_OPT_HDR *opth; 488 461 uint_t optlen; … … 496 469 } 497 470 498 /* ãã§ãã¯ãµã ãè¨ç®ããã*/471 /* チェックサムを計算する。*/ 499 472 nsh->hdr.sum = 0; 500 473 nsh->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)nsh - output->buf, len); 501 474 502 /* éä¿¡ããã*/475 /* 送信する。*/ 503 476 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 504 477 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 510 483 511 484 /* 512 * nd6_na_input -- è¿é£éç¥ã®å 513 ¥åå¦çã 485 * nd6_na_input -- 近隣通知の入力処理。 514 486 */ 515 487 … … 534 506 535 507 /* 536 * ãããã®ãã§ãã¯ã以ä¸ã®å ´åã¯ç ´æ£ããã537 * ã»ããããªãããã IPV6_MAXHLIM (255) 以å¤538 * ã»ãããé·ãçã508 * ヘッダのチェック、以下の場合は破棄する。 509 * ・ホップリミットが IPV6_MAXHLIM (255) 以外 510 * ・ヘッダ長が短い 539 511 */ 540 512 if (ip6h->hlim != IPV6_MAXHLIM || input->len - off < NEIGHBOR_ADVERT_HDR_SIZE) … … 543 515 nah = (T_NEIGHBOR_ADVERT_HDR *)(input->buf + off); 544 516 545 /* ç®çã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼*/517 /* 目的アドレスがマルチキャストならエラー */ 546 518 if (IN6_IS_ADDR_MULTICAST(&nah->target)) 547 519 goto err_ret; 548 520 549 /* è¿é£è¦è«ã¸ã®å¿çã§ãå®å 550 ã¢ãã¬ã¹ããã«ããã£ã¹ããªãã¨ã©ã¼ */ 521 /* 近隣要請への応答で、宛先アドレスがマルチキャストならエラー */ 551 522 if ((nah->nd_na_flags_reserved & ND_NA_FLG_SOLICITED) && 552 523 IN6_IS_ADDR_MULTICAST(&ip6h->dst)) 553 524 goto err_ret; 554 525 555 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ã®ãªãã»ãããè¨é²ããã*/526 /* 近隣探索オプションのオフセットを記録する。*/ 556 527 if (nd6_options(nd_opt_off, input->buf + (off + NEIGHBOR_ADVERT_HDR_SIZE), 557 528 input->len - (off + NEIGHBOR_ADVERT_HDR_SIZE)) != E_OK) 558 529 goto err_ret; 559 530 560 /* è¿é£æ¢ç´¢ãªãã·ã§ã³ (ç®çãªã³ã¯ã¢ãã¬ã¹) */531 /* 近隣探索オプション (目的リンクアドレス) */ 561 532 if (nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_TARGET_LINKADDR)]) { 562 533 opth = (T_ND_OPT_HDR *)((uint8_t *)(input->buf + off + NEIGHBOR_ADVERT_HDR_SIZE) + 563 534 nd_opt_off[ND_OPT_OFF_ARRAY_IX(ND_OPT_TARGET_LINKADDR)] - 8); 564 /* 注æ: ãªãã·ã§ã³ãªãã»ããé 565 åã«ã¯ããªãã»ãã + 8 ãè¨å®ããã¦ããã*/ 535 /* 注意: オプションオフセット配列には、オフセット + 8 が設定されている。*/ 566 536 lladdr = (uint8_t *)(opth + 1); 567 537 lladdr_len = (opth->len << 3); … … 571 541 572 542 /* 573 * ç®çã¢ãã¬ã¹ãèªåã®ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã«å²ãå½ã¦ããã¦ããã¢ãã¬ã¹ã®574 * ããããã«ä¸è´ããã¨ãã¯ãéè¤ãã¦ãããã¨ãæå³ãã¦ããã543 * 目的アドレスが自分のネットワークインタフェースに割り当てられているアドレスの 544 * いずれかに一致したときは、重複していることを意味している。 575 545 */ 576 546 if (ifa) { … … 583 553 584 554 /* 585 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹é·ãä¸è´ããªããã°ã¨ã©ã¼555 * ネットワークインタフェースのアドレス長が一致しなければエラー 586 556 */ 587 557 if (lladdr && lladdr_len != ((sizeof(T_IF_ADDR) + sizeof(T_ND_OPT_HDR) + 7) & ~7)) 588 558 goto err_ret; 589 559 590 /* è¿é£ãã£ãã·ã¥ãæ¢ç´¢ããã*/560 /* 近隣キャッシュを探索する。*/ 591 561 syscall(wai_sem(SEM_ND6_CACHE)); 592 562 if ((ln = nd6_lookup(&nah->target, false)) == NULL) 593 563 goto free_ret; 594 564 595 /* è¿é£ãã£ãã·ã¥ã®ç¶æ 596 ãããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹æªè§£æ±ºã®å ´å */ 565 /* 近隣キャッシュの状態が、データリンク層のアドレス未解決の場合 */ 597 566 if (ln->state == ND6_LLINFO_INCOMPLETE) { 598 /* éç¥ããããã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ã®é·ãã 0 ã®å ´å*/567 /* 通知されたデータリンク層のアドレスの長さが 0 の場合 */ 599 568 if (lladdr == NULL) 600 569 goto free_ret; … … 631 600 632 601 /* 633 * ç¶æ 634 é·ç§»è¡¨ 602 * 状態遷移表 635 603 * 636 604 * nd_na_flags_reserved 637 * OVERRIDE SOLICTED lladdr llchange å¦ç (L: lladdr ãç»é²ãã)605 * OVERRIDE SOLICTED lladdr llchange 処理 (L: lladdr を登録する) 638 606 * 639 607 * F F N - (2c) … … 651 619 */ 652 620 if ((nah->nd_na_flags_reserved & ND_NA_FLG_OVERRIDE) == 0 && (lladdr != NULL && llchange)) { /* (1) */ 653 /* ç¶æ 654 ã REACHABLE ãªã STALE ã«é·ç§»ããã*/ 621 /* 状態が REACHABLE なら STALE に遷移する。*/ 655 622 if (ln->state == ND6_LLINFO_REACHABLE) { 656 623 syscall(get_tim(&now)); … … 664 631 lladdr == NULL) { /* (2c) */ 665 632 666 /* ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã¦ããã°æ´æ°ããã*/633 /* データリンク層のアドレスが通知されていれば更新する。*/ 667 634 if (lladdr != NULL) 668 635 ln->ifaddr = *(T_IF_ADDR *)lladdr; 669 636 670 /* è¿é£è¦è«ã¸ã®å¿çãªã REACHABLE ã«é·ç§»ããã*/637 /* 近隣要請への応答なら REACHABLE に遷移する。*/ 671 638 if (nah->nd_na_flags_reserved & ND_NA_FLG_SOLICITED) { 672 639 ln->state = ND6_LLINFO_REACHABLE; … … 678 645 } 679 646 /* 680 * ãã¼ã¿ãªã³ã¯å±¤ã®ã¢ãã¬ã¹ãéç¥ããã681 * ç°ãªãã¢ãã¬ã¹ãªãæ´æ°ããã647 * データリンク層のアドレスが通知され、 648 * 異なるアドレスなら更新する。 682 649 */ 683 650 else if (lladdr != NULL && llchange) { … … 688 655 } 689 656 690 /* ã«ã¼ã¿éç¥ãã©ã°ã®å¦ç*/657 /* ルータ通知フラグの処理 */ 691 658 if ((ln->flags & ND6_LLIF_ROUTER ) != 0 && 692 659 (nah->nd_na_flags_reserved & ND_NA_FLG_ROUTER) == 0) { 693 660 /* 694 * éä¿¡ç¸æãã«ã¼ã¿éç¥ãã©ã°ãç¡å¹ã«ããå ´åã695 * ãã£ãã©ã«ãã»ã«ã¼ã¿ãªã¹ããã対象ã®ã«ã¼ã¿ãåé¤ãã696 * è¿é£æ¢ç´¢ãã£ãã·ã¥ãæ´æ°ããã661 * 送信相手がルータ通知フラグを無効にした場合。 662 * ディフォルト・ルータリストから対象のルータを削除し、 663 * 近隣探索キャッシュを更新する。 697 664 */ 698 665 T_DEF_ROUTER *dr = NULL; … … 712 679 ln->asked = 0; 713 680 714 /* ã¢ãã¬ã¹è§£æ±ºå¾ 715 ã¡ã®ãã¼ã¿ã°ã©ã ãããã°éä¿¡ããã*/ 681 /* アドレス解決待ちのデータグラムがあれば送信する。*/ 716 682 nd6_output_hold(ifp, ln); 717 683 … … 727 693 728 694 /* 729 * nd6_na_output -- è¿é£éç¥ãåºåããã695 * nd6_na_output -- 近隣通知を出力する。 730 696 */ 731 697 … … 745 711 746 712 /* 747 * è¿é£éç¥ãã¤ãã¼ãé·ãè¨ç®ããã748 * tlladdr ãçãªããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ã追å ããã713 * 近隣通知ペイロード長を計算する。 714 * tlladdr が真ならネットワークインタフェースのアドレスを追加する。 749 715 */ 750 716 if (tlladdr && IF_SOFTC_TO_IFADDR(ifp->ic)) … … 754 720 755 721 /* 756 * ä»ã®ãªã³ã¯ããã®å½é ããããã¼ã¿ã°ã©ã ã757 * æé¤ãããããããããªãããã« IPV6_MAXHLIM (255) ãè¨å®ããã722 * 他のリンクからの偽造されたデータグラムを 723 * 排除するため、ホップリミットに IPV6_MAXHLIM (255) を設定する。 758 724 */ 759 725 ipflags = IPV6_OUT_SET_HOP_LIMIT(IPV6_OUT_FLG_HOP_LIMIT, IPV6_MAXHLIM); 760 726 761 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããIPv6 ããããè¨å®ããã*/727 /* ネットワークバッファを獲得し、IPv6 ヘッダを設定する。*/ 762 728 if (in6_get_datagram(&output, len, 0, daddr, NULL, 763 729 IPPROTO_ICMPV6, IPV6_MAXHLIM, … … 769 735 if (IN6_IS_ADDR_UNSPECIFIED(daddr)) { 770 736 /* 771 * å®å 772 ã¢ãã¬ã¹ãç¡æå®ã®å ´åã¯ã 773 * ãªã³ã¯ãã¼ã«ã«å 774 ¨ãã¼ãã»ãã«ããã£ã¹ãã¢ãã¬ã¹ãè¨å®ããã 737 * 宛先アドレスが無指定の場合は、 738 * リンクローカル全ノード・マルチキャストアドレスを設定する。 775 739 */ 776 740 ip6h->dst.s6_addr32[0] = IPV6_ADDR_INT32_MLL; … … 784 748 785 749 /* 786 * å®å 787 ã¢ãã¬ã¹ã«ãµããããéä¿¡å 788 ã¢ãã¬ã¹ãã 789 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããæ¢ç´¢ãã¦å©ç¨ããã 750 * 宛先アドレスにふさわしい送信元アドレスを、 751 * ネットワークインタフェースから探索して利用する。 790 752 */ 791 753 if ((ifa = in6_ifawithifp(ifp, &ip6h->dst)) == NULL) { … … 795 757 memcpy(&ip6h->src, &ifa->addr, sizeof(T_IN6_ADDR)); 796 758 797 /* è¿é£éç¥ããããè¨å®ããã*/759 /* 近隣通知ヘッダを設定する。*/ 798 760 nah = GET_NEIGHBOR_ADVERT_HDR(output, IF_IP6_NEIGHBOR_ADVERT_HDR_OFFSET); 799 761 nah->hdr.type = ND_NEIGHBOR_ADVERT; … … 801 763 memcpy(&nah->target, taddr, sizeof(T_IN6_ADDR)); 802 764 803 /* tlladdr ãçãªããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ã®ã¢ãã¬ã¹ã追å ããã*/765 /* tlladdr が真ならネットワークインタフェースのアドレスを追加する。*/ 804 766 if (tlladdr && (mac = IF_SOFTC_TO_IFADDR(ifp->ic)) != NULL) { 805 767 … … 819 781 nah->nd_na_flags_reserved = flags; 820 782 821 /* ãã§ãã¯ãµã ãè¨ç®ããã*/783 /* チェックサムを計算する。*/ 822 784 nah->hdr.sum = 0; 823 785 nah->hdr.sum = in6_cksum(output, IPPROTO_ICMPV6, (uint8_t*)nah - output->buf, len); 824 786 825 /* éä¿¡ããã*/787 /* 送信する。*/ 826 788 NET_COUNT_ICMP6(net_count_nd6[NC_ICMP6_OUT_OCTETS], 827 789 output->len - GET_IF_IP6_HDR_SIZE(output)); … … 833 795 834 796 /* 835 * nd6_dad_start -- éè¤ã¢ãã¬ã¹æ¤åº (DAD) ãéå§ããã797 * nd6_dad_start -- 重複アドレス検出 (DAD) を開始する。 836 798 * 837 * 第3å¼æ°ã®tick ã¯ãã¤ã³ã¿ãã§ã¼ã¹ãèµ·åããã¦ãããéè¤æ¤åºã 838 * éä¿¡ããã¾ã§ã®æå°é 839 延å¤ã§ããã 799 * 第3引数のtick は、インタフェースが起動されてから、重複検出を 800 * 送信するまでの最小遅延値である。 840 801 */ 841 802 … … 843 804 nd6_dad_start (T_IFNET *ifp, T_IN6_IFADDR *ifa, int_t *tick) 844 805 { 845 /* ãã©ã°ããã§ãã¯ããã*/806 /* フラグをチェックする。*/ 846 807 if (!(ifa->flags & IN6_IFF_TENTATIVE)) 847 808 return; … … 860 821 return; 861 822 862 /* éè¤ã¢ãã¬ã¹æ¤åºã«ã¦ã³ã¿ããªã»ããããã*/823 /* 重複アドレス検出カウンタをリセットする。*/ 863 824 ifa->ns_icount = ifa->na_icount = ifa->ns_ocount = 0; 864 825 865 826 /* 866 * éè¤ã¢ãã¬ã¹æ¤åºè¦è«ãéä¿¡ããããã ããã¤ã³ã¿ãã§ã¼ã¹ã 867 * åæåããç´å¾ã«ãæåã«éä¿¡ããå ´åã¯ãã©ã³ãã ãªé 868 延ãè¡ãã 827 * 重複アドレス検出要請を送信する。ただし、インタフェースを 828 * 初期化した直後に、最初に送信する場合は、ランダムな遅延を行う。 869 829 */ 870 830 if (tick == NULL) { 871 831 nd6_dad_ns_output(ifp, ifa); 872 832 873 /* ã¿ã¤ã ã¢ã¦ããè¿é£æ¢ç´¢ã®éä¿¡ééã«è¨å®ããã*/833 /* タイムアウトを近隣探索の送信間隔に設定する。*/ 874 834 timeout((callout_func)nd6_dad_timer, ifa, ND6_RETRANS_TIME * NET_TIMER_HZ / SYSTIM_HZ); 875 835 } … … 877 837 int_t ntick; 878 838 879 if (*tick == 0) /* æåã®éä¿¡*/839 if (*tick == 0) /* 最初の送信 */ 880 840 ntick = net_rand() % (ND6_FIRST_DAD_DELAY_TIME * NET_TIMER_HZ / SYSTIM_HZ); 881 841 else
Note:
See TracChangeset
for help on using the changeset viewer.