Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet6/frag6.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/frag6.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$ … … 121 109 122 110 /* 123 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼é 124 å 111 * データグラム再構成キュー配列 125 112 */ 126 113 … … 129 116 130 117 /* 131 * ip6_get_frag_queue -- ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ãç²å¾ããã118 * ip6_get_frag_queue -- データグラム再構成キューを獲得する。 132 119 */ 133 120 … … 139 126 140 127 /* 141 * frag6_free_queue -- ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã解æ¾ããã128 * frag6_free_queue -- データグラム再構成キューを解放する。 142 129 * 143 * 注æ: ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼é 144 åãããã¯ãã¦ããå¼ã³åºããã¨ã 130 * 注意: データグラム再構成キュー配列をロックしてから呼び出すこと。 145 131 */ 146 132 … … 162 148 163 149 /* 164 * frag6_timer -- ãã¼ã¿ã°ã©ã åæ§æ管çã¿ã¤ã150 * frag6_timer -- データグラム再構成管理タイマ 165 151 */ 166 152 … … 184 170 185 171 /* 186 * å 187 é ã®æçã®ãªãã»ããã 0 ã®æã®ã¿ 188 * ICMPv6 ã¨ã©ã¼ã¡ãã»ã¼ã¸ãéä¿¡ããã 172 * 先頭の断片のオフセットが 0 の時のみ 173 * ICMPv6 エラーメッセージを送信する。 189 174 */ 190 175 191 /* å 192 é ã®æçããã¼ã¿ã°ã©ã åæ§æãã¥ã¼ããå¤ãã*/ 176 /* 先頭の断片をデータグラム再構成キューから外す。*/ 193 177 ip6_frag_queue[ix] = qip6h->next_frag; 194 178 195 /* ãã¦å 196 ã¢ãã¬ã¹ãå 197 ã«æ»ãã*/ 179 /* あて先アドレスを元に戻す。*/ 198 180 GET_IP6_HDR(frag)->dst = ip6_frag_dest[ix]; 199 181 200 /* ICMPv6 ã¨ã©ã¼ã¡ãã»ã¼ã¸ãéä¿¡ããã*/182 /* ICMPv6 エラーメッセージを送信する。*/ 201 183 icmp6_error(frag, ICMP6_TIME_EXCEEDED, 202 184 ICMP6_TIME_EXCEED_REASSEMBLY, 0); 203 185 } 204 186 205 /* ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã解æ¾ããã*/187 /* データグラム再構成キューを解放する。*/ 206 188 NET_COUNT_IP6(net_count_ip6[NC_IP6_FRAG_IN_TMOUT], 1); 207 189 NET_COUNT_IP6(net_count_ip6[NC_IP6_FRAG_IN_DROP], 1); … … 216 198 217 199 /* 218 * frag6_input -- æçãããã®å 219 ¥åé¢æ° 200 * frag6_input -- 断片ヘッダの入力関数 220 201 */ 221 202 … … 241 222 #endif /* #ifdef IP6_CFG_FRAGMENT */ 242 223 243 /* ãããã¯ã¼ã¯ãããã¡ã®æ®ãã®é·ãããã§ãã¯ããã*/224 /* ネットワークバッファの残りの長さをチェックする。*/ 244 225 if (input->len - off < sizeof(T_IP6_FRAG_HDR)) 245 226 goto buf_rel; 246 227 247 228 /* 248 * 巨大ãã¤ãã¼ããªãã·ã§ã³ã¨æçããããåæã«ä½¿ç¨ãããã¨ã¯ 249 * ã§ããªãããã¤ãã¼ãé·ãã 0 ãªãã巨大ãã¤ãã¼ããªãã·ã§ã³ã 250 * æå®ããã¦ãããã¨ã«ãªãã®ã§ ICMP ã§ã¨ã©ã¼ãéä¿¡è 251 ã« 252 * éç¥ããã 229 * 巨大ペイロードオプションと断片ヘッダを同時に使用することは 230 * できない。ペイロード長がが 0 なら、巨大ペイロードオプションが 231 * 指定されていることになるので ICMP でエラーを送信者に 232 * 通知する。 253 233 */ 254 234 ip6h = GET_IP6_HDR(input); … … 262 242 263 243 /* 264 * ãªãã»ããã 0 ã§ãæçµãã©ã°ã¡ã³ãã§ããã°ã265 * åå²ä¸è¦ã®ãã¼ã¿ã°ã©ã ãªã®ã§ã266 * 次ããããæãå¤æ°ã調æ´ãã¦çµäºããã244 * オフセットが 0 で、最終フラグメントであれば、 245 * 分割不要のデータグラムなので、 246 * 次ヘッダを指す変数を調整して終了する。 267 247 */ 268 248 ip6fh = (T_IP6_FRAG_HDR *)(input->buf + off); … … 276 256 277 257 /* 278 * ãã¤ãã¼ãé·ããã§ãã¯ããã258 * ペイロード長をチェックする。 279 259 */ 280 260 if ((ip6fh->off_flag & IP6F_MORE_FRAG) && … … 291 271 292 272 /* 293 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼é 294 åããã対å¿ããã¨ã³ããªãæ¢ãã 273 * データグラム再構成キュー配列から、対応するエントリを探す。 295 274 */ 296 275 for (ix = NUM_IP6_FRAG_QUEUE; ix -- > 0; ) { … … 310 289 311 290 /* 312 * æçã®æ£å½æ§ããã§ãã¯ããã291 * 断片の正当性をチェックする。 313 292 */ 314 293 unfraglen = 0; … … 317 296 318 297 /* 319 * å 320 ¥åããæçãå 321 é ã®æç 322 * åå²ã§ããªãé¨åã®é·ã unfraglen ãè¨ç®ããã 298 * 入力した断片が先頭の断片 299 * 分割できない部分の長さ unfraglen を計算する。 323 300 */ 324 301 unfraglen = (off - IF_HDR_SIZE) - sizeof(T_IP6_HDR); … … 352 329 353 330 /* 354 * ip6fq == NULL ã§ããã°ã対å¿ããã¨ã³ããªã¯ç¡ãã®ã§ã 355 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼é 356 åã«ãã¨ã³ããªã追å ããã 331 * ip6fq == NULL であれば、対応するエントリは無いので、 332 * データグラム再構成キュー配列に、エントリを追加する。 357 333 */ 358 334 for (ix = NUM_IP6_FRAG_QUEUE; ix -- > 0; ) { 359 335 360 /* 空ãã¨ã³ããªãæ¢ãã*/336 /* 空きエントリを探す。*/ 361 337 if (ip6_frag_queue[ix] == NULL) { 362 338 ip6fq = &ip6_frag_queue[ix]; … … 366 342 367 343 /* 368 * ip6fq == NULL ã§ããã°ã空ãã¨ã³ããªãç¡ãã®ã§ã369 * ã¿ã¤ã ã¢ã¦ãï¼hlimï¼ãçãã¨ã³ããªãéæ¾ããã344 * ip6fq == NULL であれば、空きエントリが無いので、 345 * タイムアウト(hlim)が短いエントリを開放する。 370 346 */ 371 347 if (ip6fq == NULL) { … … 385 361 386 362 /* 387 * ã¨ã³ããªãè¨å®ããã363 * エントリを設定する。 388 364 */ 389 365 *ip6fq = input; … … 398 374 399 375 /* 400 * æçã®æ£å½æ§ããã§ãã¯ããã376 * 断片の正当性をチェックする。 401 377 */ 402 378 unfraglen = 0; … … 405 381 406 382 /* 407 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã®æåã®æçãå 408 é ã®æç 409 * åå²ã§ããªãé¨åã®é·ã unfraglen ãè¨ç®ããã 383 * データグラム再構成キューの最初の断片が先頭の断片 384 * 分割できない部分の長さ unfraglen を計算する。 410 385 */ 411 386 unfraglen = (GET_QIP6_HDR(*ip6fq)->foff - IF_HDR_SIZE) - sizeof(T_IP6_HDR); … … 416 391 417 392 /* 418 * å 419 ¥åããæçãå 420 é ã®æç 421 * åå²ã§ããªãé¨åã®é·ã unfraglen ãè¨ç®ããã 393 * 入力した断片が先頭の断片 394 * 分割できない部分の長さ unfraglen を計算する。 422 395 */ 423 396 unfraglen = (off - IF_HDR_SIZE) - sizeof(T_IP6_HDR); … … 453 426 454 427 /* 455 * å 456 ¥åããæçãå 457 é ã®æç 458 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã®æå¾ã®æçãã 459 * ãã¼ã¿ã°ã©ã ã®æ大é·ãè¶ 460 ãã¦ããªãããã§ãã¯ããã 461 */ 462 463 /* æå¾ã®æçãæ¢ç´¢ããã*/ 428 * 入力した断片が先頭の断片 429 * データグラム再構成キューの最後の断片が、 430 * データグラムの最大長を超えていないかチェックする。 431 */ 432 433 /* 最後の断片を探索する。*/ 464 434 next = *ip6fq; 465 435 while ((qip6h = GET_QIP6_HDR(next))->next_frag != NULL) 466 436 next = qip6h->next_frag; 467 437 468 /* æå¾ã®æçã®ãªãã»ããã¨æçãµã¤ãºãè¨ç®ããã*/438 /* 最後の断片のオフセットと断片サイズを計算する。*/ 469 439 qip6fh = (T_IP6_FRAG_HDR *)(next->buf + qip6h->foff); 470 440 fragoff = ntohs(qip6fh->off_flag & IP6F_OFF_MASK); … … 473 443 474 444 /* 475 * ãã¼ã¿ã°ã©ã ã®æ大é·ãè¶ 476 ãã¦ããå ´åã¯ã 477 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼å 478 ¨ä½ãç ´æ£ããã 445 * データグラムの最大長を超えている場合は、 446 * データグラム再構成キュー全体を破棄する。 479 447 */ 480 448 frag6_free_queue(ip6fq); … … 484 452 } 485 453 486 /* ECN ã®æ£å½æ§ãã§ãã¯ã¯æªå®è£ 487 */ 488 489 /* 490 * æçãã¨ã³ããªã«æ¿å 491 ¥ããã 492 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ãããå 493 ¥åããæçããåã®æçãæ¢ç´¢ããã 454 /* ECN の正当性チェックは未実装 */ 455 456 /* 457 * 断片をエントリに挿入する。 458 * データグラム再構成キューから、入力した断片より前の断片を探索する。 494 459 */ 495 460 prev = NULL; … … 505 470 506 471 /* 507 * prev ã¯ãå 508 ¥åããæçããåã®æçããã ã NULL ã®å ´åã¯ã 509 * å 510 ¥åããæçããã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã®ä¸ã§æãåã®æçã 511 * next ã¯ãå 512 ¥åããæçããå¾ã®æçããã ã NULL ã®å ´åã¯ã 513 * å 514 ¥åããæçããã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã®ä¸ã§æãå¾ã®æçã 472 * prev は、入力した断片より前の断片。ただし NULL の場合は、 473 * 入力した断片がデータグラム再構成キューの中で最も前の断片。 474 * next は、入力した断片より後の断片。ただし NULL の場合は、 475 * 入力した断片がデータグラム再構成キューの中で最も後の断片。 515 476 */ 516 477 fragoff = ntohs(ip6fh->off_flag & IP6F_OFF_MASK); … … 518 479 519 480 /* 520 * åã®æçã¨ãå 521 ¥åããæçãéãªã£ã¦ããªãããã§ãã¯ããã 481 * 前の断片と、入力した断片が重なっていないかチェックする。 522 482 * 523 483 * qfragoff … … 542 502 if (diff > 0) { 543 503 544 /* éãªã£ã¦ããã°ãå 545 ¥åããæçãç ´æ£ãã¦çµäºããã*/ 504 /* 重なっていれば、入力した断片を破棄して終了する。*/ 546 505 syscall(rel_net_buf(input)); 547 506 goto sig_ret; … … 552 511 553 512 /* 554 * å¾ã®æçã¨ãå 555 ¥åããæçãéãªã£ã¦ããªãããã§ãã¯ããã 513 * 後の断片と、入力した断片が重なっていないかチェックする。 556 514 * 557 515 * fragoff … … 576 534 if (diff > 0) { 577 535 578 /* éãªã£ã¦ããã°ãå 579 ¥åããæçãç ´æ£ãã¦çµäºããã*/ 536 /* 重なっていれば、入力した断片を破棄して終了する。*/ 580 537 syscall(rel_net_buf(input)); 581 538 goto sig_ret; … … 583 540 } 584 541 585 /* å 586 ¥åããæçãè¨å®ããã*/ 542 /* 入力した断片を設定する。*/ 587 543 qip6h = GET_QIP6_HDR(input); 588 544 qip6h->foff = off; … … 598 554 599 555 /* 600 * å 601 ¨ã¦ã®æçãåä¿¡ããããã§ãã¯ããã 556 * 全ての断片を受信したかチェックする。 602 557 */ 603 558 plen = 0; … … 608 563 if (ntohs(qip6fh->off_flag & IP6F_OFF_MASK) != plen) { 609 564 610 /* æçãé£ç¶ãã¦ããªãã*/565 /* 断片が連続していない。*/ 611 566 goto sig_ret; 612 567 } … … 616 571 if (ntohs(qip6fh->off_flag & IP6F_MORE_FRAG) != 0) { 617 572 618 /* æå¾ã®æçãåä¿¡ãã¦ããªãã*/573 /* 最後の断片を受信していない。*/ 619 574 goto sig_ret; 620 575 } 621 576 622 577 /* 623 * å 624 ¨ã¦ã®æçãåä¿¡ããã®ã§ãåæ§æããã 625 */ 626 627 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããã*/ 578 * 全ての断片を受信したので、再構成する。 579 */ 580 581 /* ネットワークバッファを獲得する。*/ 628 582 qip6h = GET_QIP6_HDR(*ip6fq); 629 583 qip6fh = (T_IP6_FRAG_HDR *)((*ip6fq)->buf + qip6h->foff); … … 631 585 632 586 /* 633 * æçãããã®ç´åã®ãããã® NEXT ãã£ã¼ã«ãã®ã¢ãã¬ã¹ãç²å¾ãã 634 * å 635 ã«æ»ãã 587 * 断片ヘッダの直前のヘッダの NEXT フィールドのアドレスを獲得し、 588 * 元に戻す。 636 589 */ 637 590 if ((prev_next = ip6_get_prev_hdr(*ip6fq, qip6h->foff)) == NULL) { … … 646 599 647 600 /* 648 * IPv6 ãããã¨åå²ã§ããªãé¨åã 649 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã®ä¸ã®å 650 é ã®æçããã³ãã¼ããã 601 * IPv6 ヘッダと分割できない部分を 602 * データグラム再構成キューの中の先頭の断片からコピーする。 651 603 */ 652 604 memcpy(input->buf, (*ip6fq)->buf, qip6h->foff); 653 605 654 /* éä¿¡å 655 ã¢ãã¬ã¹ãå 656 ã«æ»ãã*/ 606 /* 送信先アドレスを元に戻す。*/ 657 607 ip6h = GET_IP6_HDR(input); 658 608 memcpy(&ip6h->dst, &ip6_frag_dest[ip6fq - ip6_frag_queue], sizeof(T_IN6_ADDR)); 659 609 660 /* offp ããåæ§æããæçã®å 661 é ã«è¨å®ããã*/ 610 /* offp を、再構成した断片の先頭に設定する。*/ 662 611 *offp = qip6h->foff; 663 612 664 /* ãããã¯ã¼ã¯ãããã¡é·ãè¨å®ããã*/613 /* ネットワークバッファ長を設定する。*/ 665 614 input->len = plen + qip6h->foff; 666 615 667 616 /* 668 * å 669 ¨ã¦ã®æçãã³ãã¼ããã 617 * 全ての断片をコピーする。 670 618 */ 671 619 frag = *ip6fq; … … 680 628 } 681 629 682 /* ãã¤ãã¼ãé·ãè¨å®ããã*/630 /* ペイロード長を設定する。*/ 683 631 ip6h->plen = htons(plen); 684 632 … … 692 640 } 693 641 694 /* ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã解æ¾ããã*/642 /* データグラム再構成キューを解放する。*/ 695 643 frag6_free_queue(ip6fq); 696 644 } … … 703 651 704 652 /* 705 * ãã¼ã¿ã°ã©ã ã®åå²ã»åæ§æè¡ããªãå ´åã¯ãå 706 ¨æçãç ´æ£ãã 707 * æå¾ã®æçãåä¿¡ããã¨ãã 708 * ICMP ã¨ã©ã¼ãéä¿¡è 709 ã«éç¥ããã 653 * データグラムの分割・再構成行わない場合は、全断片を破棄し、 654 * 最後の断片を受信したとき、 655 * ICMP エラーを送信者に通知する。 710 656 */ 711 657 if ((ip6fh->off_flag & IP6F_MORE_FRAG) == 0) {
Note:
See TracChangeset
for help on using the changeset viewer.