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