Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet6/ip6_input.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/ip6_input.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$ … … 161 149 162 150 /* 163 * é¢æ°151 * 関数 164 152 */ 165 153 … … 167 155 168 156 /* 169 * ä¸ä½ãããã³ã«é¸ææ§é ä½157 * 上位プロトコル選択構造体 170 158 */ 171 159 172 160 typedef struct t_proto_switch { 173 uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *); /* å 174 ¥åé¢æ° */ 175 uint_t proto; /* ãããã³ã«çªå· */ 161 uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *); /* 入力関数 */ 162 uint_t proto; /* プロトコル番号 */ 176 163 } T_PROTO_SWITCH; 177 164 178 165 static const T_PROTO_SWITCH proto_switch[] = { 179 { esp6_input, IPPROTO_ESP }, /* IPv6 æå·åããã*/180 { ah6_input, IPPROTO_AH }, /* IPv6 èªè¨¼ããã*/181 { frag6_input, IPPROTO_FRAGMENT }, /* æçããã*/182 { route6_input, IPPROTO_ROUTING }, /* çµè·¯å¶å¾¡ããã*/183 { dest6_input, IPPROTO_DSTOPTS }, /* IPv6 çµç¹ãªãã·ã§ã³*/166 { esp6_input, IPPROTO_ESP }, /* IPv6 暗号化ヘッダ */ 167 { ah6_input, IPPROTO_AH }, /* IPv6 認証ヘッダ */ 168 { frag6_input, IPPROTO_FRAGMENT }, /* 断片ヘッダ */ 169 { route6_input, IPPROTO_ROUTING }, /* 経路制御ヘッダ */ 170 { dest6_input, IPPROTO_DSTOPTS }, /* IPv6 終点オプション */ 184 171 { ip6_no_header_input, 185 IPPROTO_NONE }, /* 次ãããç¡ã*/172 IPPROTO_NONE }, /* 次ヘッダ無し */ 186 173 { icmp6_input, IPPROTO_ICMPV6 }, 187 174 … … 207 194 208 195 /* 209 * get_upper_proto -- ä¸ä½ãããã³ã«å¦çé¢æ°ãè¿ãã196 * get_upper_proto -- 上位プロトコル処理関数を返す。 210 197 */ 211 198 … … 222 209 223 210 /* 224 * ip6_no_header_input -- 次ããããç¡ãã®å ´åã®å 225 ¥åå¦ç 211 * ip6_no_header_input -- 次ヘッダが無しの場合の入力処理 226 212 */ 227 213 … … 234 220 235 221 /* 236 * ip6_hopopts_input -- ä¸ç¶ç¹ãªãã·ã§ã³å 237 ¥åå¦ç 238 * 239 * æ¬å®è£ 240 ã§ã¯ãããã£ã³ã°ä»¥å¤ã®ãªãã·ã§ã³ãå 241 ¨ã¦æªç¥ãªãã·ã§ã³ã¨ãã¦å¦çããã 242 * 243 * æ»ãå¤: 244 * 245 * 0 ä»¥ä¸ æ£å¸¸ 246 * IP6_OPT_RET_ERR (-1) ã¨ã©ã¼ãå¼åºå´ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããã 247 * IP6_OPT_RET_REL (-2) ã¨ã©ã¼ããããã¯ã¼ã¯ãããã¡ã¯éæ¾ããã¦ããã 222 * ip6_hopopts_input -- 中継点オプション入力処理 223 * 224 * 本実装では、パディング以外のオプションを全て未知オプションとして処理する。 225 * 226 * 戻り値: 227 * 228 * 0 以上 正常 229 * IP6_OPT_RET_ERR (-1) エラー、呼出側でネットワークバッファを開放する。 230 * IP6_OPT_RET_REL (-2) エラー、ネットワークバッファは開放されている。 248 231 */ 249 232 … … 293 276 294 277 /* 295 * ip6_get_prev_hdr -- ç´åã®æ¡å¼µãããã® next ãã£ã¼ã«ãã®ã¢ãã¬ã¹ãè¿ãã296 * 297 * 注æ: off ã«ã¯ IF_HDR_SIZE ãå«ã¾ãã¦ããã278 * ip6_get_prev_hdr -- 直前の拡張ヘッダの next フィールドのアドレスを返す。 279 * 280 * 注意: off には IF_HDR_SIZE も含まれている。 298 281 */ 299 282 … … 339 322 340 323 /* 341 * ip6_init -- IPv6 ã®åæåé¢æ°324 * ip6_init -- IPv6 の初期化関数 342 325 */ 343 326 … … 350 333 351 334 /* 352 * ip6_input -- IPv6 ã®å 353 ¥åé¢æ° 335 * ip6_input -- IPv6 の入力関数 354 336 */ 355 337 … … 368 350 NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInReceives, 1); 369 351 370 /* IP ãããã®é·ãããã§ãã¯ããã*/352 /* IP ヘッダの長さをチェックする。*/ 371 353 if (input->len < IF_IP6_HDR_SIZE) { 372 354 NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1); … … 377 359 ip6h = GET_IP6_HDR(input); 378 360 379 /* ãã¼ã¸ã§ã³ããã§ãã¯ããã*/361 /* バージョンをチェックする。*/ 380 362 if (IP6_VCF_V(ntohl(ip6h->vcf)) != IPV6_VERSION) { 381 363 NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_VER], 1); … … 385 367 386 368 /* 387 * 次ã®ãã¼ã¿ã°ã©ã ã¯ç ´æ£ããã369 * 次のデータグラムは破棄する。 388 370 * 389 * ã»å§ç¹ã¢ãã¬ã¹ããã«ããã£ã¹ã390 * ã»çµç¹ã¢ãã¬ã¹ãæªå®ç¾©371 * ・始点アドレスがマルチキャスト 372 * ・終点アドレスが未定義 391 373 * 392 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ãã«ã¼ãããã¯ã§ãªãã¨ãã393 * 次ã®ãã¼ã¿ã°ã©ã ãç ´æ£ããã374 * ネットワークインタフェースがループバックでないとき、 375 * 次のデータグラムも破棄する。 394 376 * 395 * ã»å§ç¹ã¢ãã¬ã¹ãã«ã¼ãããã¯396 * ã»çµç¹ã¢ãã¬ã¹ãã«ã¼ãããã¯377 * ・始点アドレスがループバック 378 * ・終点アドレスがループバック 397 379 * 398 * æªæã®ããã¦ã¼ã¶ã TCP/UDP ã¹ã¿ãã¯ã®æ··ä¹±ã399 * ã»ãã¥ãªãã£ãã§ãã¯ããã¤ãã¹ãããããIPv4400 * ãããã¢ãã¬ã¹ãæªç¨ãããã¨ãé²ããã401 * 以ä¸ã®ãã¼ã¿ã°ã©ã ã¯ç ´æ£ããã380 * 悪意のあるユーザが TCP/UDP スタックの混乱や 381 * セキュリティチェックをバイパスするため、IPv4 382 * マップアドレスを悪用することを防ぐため 383 * 以下のデータグラムは破棄する。 402 384 * 403 * ã»å§ç¹ã¢ãã¬ã¹ã::ffff:127.0.0.1404 * ã»çµç¹ã¢ãã¬ã¹ã::ffff:127.0.0.1385 * ・始点アドレスが ::ffff:127.0.0.1 386 * ・終点アドレスが ::ffff:127.0.0.1 405 387 */ 406 388 … … 435 417 436 418 if (IN6_IS_ADDR_MULTICAST(&ip6h->dst)) { 437 /* å®å 438 ããã«ããã£ã¹ãã®å ´åã®å¦ç */ 419 /* 宛先がマルチキャストの場合の処理 */ 439 420 NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInMcastPkts, 1); 440 421 if (!in6_lookup_multi(ifp, &ip6h->dst)) { … … 451 432 } 452 433 453 /* ã¢ãã¬ã¹ãæªè§£æ±ºã®å ´åã¯ãã¼ã¿ã°ã©ã ãç ´æ£ããã*/434 /* アドレスが未解決の場合はデータグラムを破棄する。*/ 454 435 if (IFA6_IS_NOTREADY(ia6)) { 455 436 NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_ADDR], 1); … … 459 440 } 460 441 461 /* ãªãã»ãããè¨å®ããã*/442 /* オフセットを設定する。*/ 462 443 offp = GET_IP6_NEXT_HDR(input) - input->buf; 463 444 464 /* ãã¤ãã¼ãé·ãåãåºãã*/445 /* ペイロード長を取り出す。*/ 465 446 plen = ntohs(ip6h->plen); 466 447 467 448 468 /* 次ãããã®ä½ç½®ãåæåããã*/449 /* 次ヘッダの位置を初期化する。*/ 469 450 nextp = offsetof(T_IP6_HDR, next); 470 451 471 452 /* 472 * ä¸ç¶ç¹ (Hop-by-Hop) ãªãã·ã§ã³ãããã®ãã§ãã¯453 * 中継点 (Hop-by-Hop) オプションヘッダのチェック 473 454 */ 474 455 if (ip6h->next == IPPROTO_HOPOPTS) { 475 456 476 /* ä¸ç¶ç¹ãããã®é·ãããã§ãã¯ããã*/457 /* 中継点ヘッダの長さをチェックする。*/ 477 458 if (plen < sizeof(T_IP6_HBH_HDR)) { 478 459 NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1); … … 495 476 496 477 /* 497 * ãã¤ãã¼ãé·ã 0 ã§ãä¸ç¶ç¹ãªãã·ã§ã³ãããã¨ãã¯ã 498 * 巨大ãã¤ãã¼ãã»ãªãã·ã§ã³ãå«ã¾ããªããã°ãªããªãã 499 * ãã®ã¨ãã巨大ãã¤ãã¼ãã»ãªãã·ã§ã³ã«ãã 500 * ãã¤ãã¼ãé·ããã§ãã¯ããå¿ 501 è¦ãããããæ¬å®è£ 502 ã§ã¯ã 503 * 巨大ãã¤ãã¼ãã»ãªãã·ã§ã³ãæªç¥ã®ãªãã·ã§ã³ã¨ã㦠504 * æ±ãã®ã§ãä½ãããªãã 478 * ペイロード長が 0 で、中継点オプションがあるときは、 479 * 巨大ペイロード・オプションが含まれなければならない。 480 * このとき、巨大ペイロード・オプションにある 481 * ペイロード長をチェックする必要があるが、本実装では、 482 * 巨大ペイロード・オプションを未知のオプションとして 483 * 扱うので、何もしない。 505 484 */ 506 485 next = ((T_IP6_HBH_HDR *)(ip6h + 1))->next; … … 509 488 next = ip6h->next; 510 489 511 /* IPv6 ãã¼ã¿ã°ã©ã é·ããã§ãã¯ããã*/490 /* IPv6 データグラム長をチェックする。*/ 512 491 if (input->len - IF_IP6_HDR_SIZE < plen) { 513 492 NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1); … … 518 497 input->len = IF_IP6_HDR_SIZE + plen; 519 498 520 /* ä¸ä½ãããã³ã«å¦çé¢æ°ãå¼ã³åºãã*/499 /* 上位プロトコル処理関数を呼び出す。*/ 521 500 nest = 0; 522 501 while (next != IPPROTO_DONE) { … … 531 510 NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInUnknownProtos, 1); 532 511 533 /* icmp6_error ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããã*/512 /* icmp6_error でネットワークバッファを開放する。*/ 534 513 icmp6_error(input, ICMP6_PARAM_PROB, 535 514 ICMP6_PARAMPROB_NEXT_HEADER, nextp); … … 548 527 549 528 /* 550 * ip6_nexthdr -- 次ã®ãããã®ãªãã»ãããè¿ãã551 * 552 * æ»ãå¤ == -1 : æå¾ã®ããããã¾ãã¯ã¨ã©ã¼ã553 * æ»ãå¤ > 0 : ããã«ããããç¶ãã529 * ip6_nexthdr -- 次のヘッダのオフセットを返す。 530 * 531 * 戻り値 == -1 : 最後のヘッダ、またはエラー。 532 * 戻り値 > 0 : さらにヘッダが続く。 554 533 */ 555 534 … … 569 548 break; 570 549 571 case IPPROTO_FRAGMENT: /* æçããã*/550 case IPPROTO_FRAGMENT: /* 断片ヘッダ */ 572 551 if (nbuf->len < off + sizeof(T_IP6_FRAG_HDR)) 573 552 return (ER_UINT)-1; 574 553 575 /* ä¸éã®ãã©ã°ã¡ã³ãã®å ´åã¯å¦çããããã*/554 /* 中間のフラグメントの場合は処理をやめる。*/ 576 555 ip6fh = (T_IP6_FRAG_HDR *)(nbuf->buf + off); 577 556 if (ntohs(ip6fh->off_flag) & IP6F_MORE_FRAG) … … 582 561 break; 583 562 584 case IPPROTO_AH: /* IPv6 èªè¨¼ããã*/585 case IPPROTO_HOPOPTS: /* IPv6 ä¸ç¶ç¹ (Hop-by-Hop) ãªãã·ã§ã³*/586 case IPPROTO_ROUTING: /* çµè·¯å¶å¾¡ããã*/587 case IPPROTO_DSTOPTS: /* IPv6 çµç¹ãªãã·ã§ã³*/563 case IPPROTO_AH: /* IPv6 認証ヘッダ */ 564 case IPPROTO_HOPOPTS: /* IPv6 中継点 (Hop-by-Hop) オプション */ 565 case IPPROTO_ROUTING: /* 経路制御ヘッダ */ 566 case IPPROTO_DSTOPTS: /* IPv6 終点オプション */ 588 567 if (nbuf->len < off + sizeof(T_IP6_EXT_HDR)) 589 568 return (ER_UINT)-1; … … 602 581 603 582 /* 604 * ip6_lasthdr -- æå¾ã®ãããã®ãªãã»ãããè¿ãã583 * ip6_lasthdr -- 最後のヘッダのオフセットを返す。 605 584 */ 606 585 … … 621 600 622 601 /* 623 * ip6_unknown_opt -- æªç¥ã®ãªãã·ã§ã³ã®å¦ç624 * 625 * æ»ãå¤:626 * 627 * 0 ä»¥ä¸ æ£å¸¸ããªãã·ã§ã³é·ã628 * IP6_OPT_RET_ERR (-1) ã¨ã©ã¼ãå¼åºå´ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããã629 * IP6_OPT_RET_REL (-2) ã¨ã©ã¼ããããã¯ã¼ã¯ãããã¡ã¯éæ¾ããã¦ããã602 * ip6_unknown_opt -- 未知のオプションの処理 603 * 604 * 戻り値: 605 * 606 * 0 以上 正常、オプション長。 607 * IP6_OPT_RET_ERR (-1) エラー、呼出側でネットワークバッファを開放する。 608 * IP6_OPT_RET_REL (-2) エラー、ネットワークバッファは開放されている。 630 609 */ 631 610 … … 634 613 { 635 614 switch (IP6OPT_TYPE(*opt)) { 636 case IP6OPT_TYPE_SKIP: /* ç¡è¦ããã*/615 case IP6OPT_TYPE_SKIP: /* 無視する。 */ 637 616 return *(opt + 1); 638 617 break; 639 case IP6OPT_TYPE_ICMP: /* ç ´æ£ãã¦ããã«ããã£ã¹ãã§ãªããã° ICMP ãè¿éããã*/618 case IP6OPT_TYPE_ICMP: /* 破棄して、マルチキャストでなければ ICMP を返送する。 */ 640 619 if (IN6_IS_ADDR_MULTICAST(&GET_IP6_HDR(input)->dst)) 641 620 return IP6_OPT_RET_ERR; 642 621 /* no break; */ 643 case IP6OPT_TYPE_FORCEICMP: /* ç ´æ£ãã¦ãICMP ãè¿éããã*/622 case IP6OPT_TYPE_FORCEICMP: /* 破棄して、ICMP を返送する。 */ 644 623 icmp6_error(input, ICMP6_PARAM_PROB, 645 624 ICMP6_PARAMPROB_OPTION, … … 647 626 return IP6_OPT_RET_REL; 648 627 break; 649 /*case IP6OPT_TYPE_DISCARD: ãã¼ã¿ã°ã©ã ãç ´æ£ããã*/628 /*case IP6OPT_TYPE_DISCARD: データグラムを破棄する。 */ 650 629 } 651 630 … … 654 633 655 634 /* 656 * ip6_remove_exthdrs -- IPv6 æ¡å¼µããããåé¤ãã以éãåã«è©°ããã635 * ip6_remove_exthdrs -- IPv6 拡張ヘッダを削除し、以降を前に詰める。 657 636 */ 658 637 … … 663 642 uint_t next; 664 643 665 /* éå§ãªãã»ããã IP ãããã«è¨å®ããã*/644 /* 開始オフセットを IP ヘッダに設定する。*/ 666 645 off = ((uint8_t *)GET_IP6_HDR(nbuf)) - nbuf->buf; 667 646 668 /* æçµããããæ¢ç´¢ããã*/647 /* 最終ヘッダを探索する。*/ 669 648 off = ip6_lasthdr(nbuf, off, IPPROTO_IPV6, &next); 670 649
Note:
See TracChangeset
for help on using the changeset viewer.