Changeset 318 for asp3_gr_sakura/trunk/tinet/netinet/ip_input.c
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/tinet/netinet/ip_input.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=UTF-8
r317 r318 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$ … … 140 128 141 129 /* 142 * å¤æ°130 * 変数 143 131 */ 144 132 … … 146 134 147 135 /* 148 * SNMP 㮠管çæ 149 å ±ãã¼ã¹ (MIB) 136 * SNMP の 管理情報ベース (MIB) 150 137 */ 151 138 … … 157 144 158 145 /* 159 * ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼146 * データグラム再構成キュー 160 147 */ 161 148 … … 164 151 165 152 /* 166 * é¢æ°153 * 関数 167 154 */ 168 155 … … 171 158 172 159 /* 173 * ip_get_frag_queue -- ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ãç²å¾ããã160 * ip_get_frag_queue -- データグラム再構成キューを獲得する。 174 161 */ 175 162 … … 181 168 182 169 /* 183 * ip_freef -- ãã¼ã¿ã°ã©ã åæ§æãã¥ã¼ã解æ¾ããã170 * ip_freef -- データグラム再構成キューを解放する。 184 171 */ 185 172 … … 199 186 200 187 /* 201 * ip_frag_timer -- ãã¼ã¿ã°ã©ã åæ§æ管çã¿ã¤ã188 * ip_frag_timer -- データグラム再構成管理タイマ 202 189 */ 203 190 … … 222 209 223 210 /* 224 * ip_reass -- ãã¼ã¿ã°ã©ã ãåæ§æããã211 * ip_reass -- データグラムを再構成する。 225 212 */ 226 213 … … 246 233 247 234 /* 248 * ID ãIPã¢ãã¬ã¹ãä¸ä½ãããã³ã«ãç°ãªããã©ã°ã¡ã³ãããã¥ã¼ã«æãã°ç ´æ£ããã235 * ID、IPアドレス、上位プロトコルが異なるフラグメントがキューに有れば破棄する。 249 236 */ 250 237 frag = ip_frag_queue[ix]; … … 263 250 NET_COUNT_IP4(net_count_ip4[NC_IP4_FRAG_IN], 1); 264 251 265 /* æ°è¦ã® ID ãªããå®å 266 ã¢ãã¬ã¹ãä¿åãã¦ããã¥ã¼ã«ã¤ãªãã*/ 252 /* 新規の ID なら、宛先アドレスを保存して、キューにつなぐ。*/ 267 253 frag_dst [ix] = dst; 268 254 ip_frag_queue[ix] = input; … … 270 256 input = NULL; 271 257 272 /* åæ§æã¿ã¤ã ã¢ã¦ããè¨å®ããã*/258 /* 再構成タイムアウトを設定する。*/ 273 259 ip4h->ttl = IP4_FRAGTTL; 274 260 } 275 261 else { 276 262 277 /* æ£ããä½ç½®ã«æ¿å 278 ¥ããã*/ 263 /* 正しい位置に挿入する。*/ 279 264 prev = NULL; 280 265 while (frag != NULL && … … 293 278 input = NULL; 294 279 295 /* å 296 ¨ã¦ã®ãã©ã°ã¡ã³ããæã£ã¦ããã調ã¹ãã*/ 280 /* 全てのフラグメントが揃っているか調べる。*/ 297 281 off = 0; 298 282 for (frag = ip_frag_queue[ix]; frag != NULL; frag = GET_QIP4_HDR(frag)->next) { 299 283 if ((IP4_FLGOFF_OFF(GET_QIP4_HDR(frag)->flg_off) << 3) != off) { 300 /* éä¸ãæãã¦ãããçµäºããã*/284 /* 途中が抜けていたら終了する。*/ 301 285 syscall(sig_sem(SEM_IP4_FRAG_QUEUE)); 302 286 return NULL; … … 306 290 } 307 291 308 /* å 309 ¨ã¦ã®ãã©ã°ã¡ã³ããæã£ããåæ§æããã*/ 292 /* 全てのフラグメントが揃ったら再構成する。*/ 310 293 if ((GET_QIP4_HDR(prev)->flg_off & IP4_MF) == 0) { 311 294 312 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããã*/295 /* ネットワークバッファを獲得する。*/ 313 296 if (tget_net_buf(&input, IF_IP4_HDR_SIZE + off, TMO_IP4_FRAG_GET_NET_BUF) == E_OK) { 314 297 NET_COUNT_IP4(net_count_ip4[NC_IP4_FRAG_IN_OK], 1); 315 298 NET_COUNT_MIB(ip_stats.ipReasmOKs, 1); 316 299 317 /* IPv4 ããããè¨å®ããã*/300 /* IPv4 ヘッダを設定する。*/ 318 301 frag = ip_frag_queue[ix]; 319 302 ip4h = GET_IP4_HDR(input); … … 325 308 ip4h->flg_off = ip4h->id = 0; 326 309 327 /* ãã¼ã¿ã°ã©ã ãåæ§æããã*/310 /* データグラムを再構成する。*/ 328 311 off = IP4_HDR_SIZE; 329 312 while (frag != NULL) { … … 339 322 NET_COUNT_MIB(ip_stats.ipReasmFails, 1); 340 323 } 341 /* ãã¥ã¼ã空ã«ããã*/324 /* キューを空にする。*/ 342 325 ip_freef(ix); 343 326 } … … 350 333 351 334 /* 352 * ip_init -- IP ã®åæå335 * ip_init -- IP の初期化 353 336 */ 354 337 … … 360 343 361 344 /* 362 * ip_remove_options -- IPv4 ãããã®ãªãã·ã§ã³ãåé¤ãã以éãåã«è©°ããã345 * ip_remove_options -- IPv4 ヘッダのオプションを削除し、以降を前に詰める。 363 346 */ 364 347 … … 384 367 385 368 /* 386 * ip_input -- IP ã®å 387 ¥åé¢æ° 369 * ip_input -- IP の入力関数 388 370 */ 389 371 390 372 #if defined(SUPPORT_IPSEC) 391 373 /* 392 * TODO: IPsec SPãæ¤ç´¢ãããã±ããããªã¸ã§ã¯ããããã©ããå¤å®ããå¦çãå®è£ 393 ãã 374 * TODO: IPsec SPを検索し、パケットをリジェクトするかどうか判定する処理を実装する 394 375 */ 395 376 #endif /* of defined(SUPPORT_IPSEC) */ … … 407 388 NET_COUNT_MIB(ip_stats.ipInReceives, 1); 408 389 409 /* IP ãããã®é·ãããã§ãã¯ããã*/390 /* IP ヘッダの長さをチェックする。*/ 410 391 if (input->len < IF_IP4_HDR_SIZE) { 411 392 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_SHORT], 1); … … 417 398 hlen = GET_IP4_HDR_SIZE(input); 418 399 419 /* ãã¼ã¸ã§ã³ããã§ãã¯ããã*/400 /* バージョンをチェックする。*/ 420 401 if (IP4_VHL_V(ip4h->vhl) != IPV4_VERSION) { 421 402 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_VER], 1); … … 424 405 } 425 406 426 /* IP ãããã®é·ãããã§ãã¯ãããªãã·ã§ã³ã解æããã*/407 /* IP ヘッダの長さをチェックし、オプションを解析する。*/ 427 408 if (hlen > IP4_HDR_SIZE) { 428 409 NET_COUNT_IP4(net_count_ip4[NC_IP4_OPTS], 1); 429 /* %%% ãªãã·ã§ã³ã®è§£æ%%% */430 } 431 432 /* ãã¼ã¿ã°ã©ã é·ããã§ãã¯ããã*/410 /* %%% オプションの解析 %%% */ 411 } 412 413 /* データグラム長をチェックする。*/ 433 414 if (ntohs(ip4h->len) > input->len - IF_HDR_SIZE) { 434 415 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_SHORT], 1); … … 437 418 } 438 419 439 /* ãããã¯ã¼ã¯ãããã¡ã®é·ãããã¼ã¿ã°ã©ã é·ã«èª¿æ´ããã*/420 /* ネットワークバッファの長さをデータグラム長に調整する。*/ 440 421 input->len = (uint16_t)(ntohs(ip4h->len) + IF_HDR_SIZE); 441 422 442 /* ãã§ãã¯ãµã ããã§ãã¯ããã*/423 /* チェックサムをチェックする。*/ 443 424 if (in_cksum(ip4h, hlen) != 0) { 444 425 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_CKSUM], 1); … … 447 428 } 448 429 449 /* IP ãããã®é·ãããã§ãã¯ããä¸ä½ã ICMP 以å¤ã¯ãªãã·ã§ã³ãæ¶å»ããã*/430 /* IP ヘッダの長さをチェックし、上位が ICMP 以外はオプションを消去する。*/ 450 431 if (hlen > IP4_HDR_SIZE && ip4h->proto != IPPROTO_ICMP) { 451 432 memset((uint8_t*)ip4h + IP4_HDR_SIZE, 0, hlen - IP4_HDR_SIZE); 452 433 } 453 434 454 /* éä¿¡å 455 ã¢ãã¬ã¹ããã§ãã¯ããã*/ 435 /* 送信元アドレスをチェックする。*/ 456 436 src = ntohl(ip4h->src); 457 437 bc = (ifp->in4_ifaddr.addr & ifp->in4_ifaddr.mask) | ~ifp->in4_ifaddr.mask; … … 475 455 #endif /* of #ifdef SUPPORT_LOOP */ 476 456 477 /* ãã¦å 478 ã¢ãã¬ã¹ããã§ãã¯ããã*/ 457 /* あて先アドレスをチェックする。*/ 479 458 dst = ntohl(ip4h->dst); 480 459 … … 482 461 483 462 /* 484 * DHCP_CFG ãå®ç¾©ããã¦ããã¨ãã¯ããã¼ã«ã«ã¢ãã¬ã¹ãæªå®ç¾©ã®485 * å ´åããã¼ã¿ã°ã©ã ãåä¿¡ããã463 * DHCP_CFG が定義されているときは、ローカルアドレスが未定義の 464 * 場合もデータグラムを受信する。 486 465 */ 487 466 … … 507 486 #ifdef IP4_CFG_FRAGMENT 508 487 509 /* åå²ããã¦ããããã§ãã¯ããã*/488 /* 分割されているかチェックする。*/ 510 489 if (ntohs(ip4h->flg_off) & (IP4_MF | IP4_OFFMASK)) { 511 490 if ((input = ip_reass(ip4h, input)) == NULL) … … 515 494 #else /* of #ifdef IP4_CFG_FRAGMENT */ 516 495 517 /* åå²ããã¦ããããã§ãã¯ããã*/496 /* 分割されているかチェックする。*/ 518 497 if (ntohs(ip4h->flg_off) & (IP4_MF | IP4_OFFMASK)) { 519 498 T_IN4_ADDR src; … … 533 512 534 513 #if defined(SUPPORT_IPSEC) 535 /* ããã§ipsec4_in_rejectãå®è¡ãã*/514 /* ここでipsec4_in_rejectを実行する */ 536 515 if ((ip4h->proto != IPPROTO_ESP) && ipsec4_in_reject (input)) { 537 516 goto buf_rel; … … 539 518 #endif /* of #if defined(SUPPORT_IPSEC) */ 540 519 541 /* ãããã³ã«ãé¸æãã*/520 /* プロトコルを選択する */ 542 521 switch (ip4h->proto) { 543 522 … … 577 556 NET_COUNT_MIB(ip_stats.ipInUnknownProtos, 1); 578 557 579 /* ãã¼ã«ã« IP ã¢ãã¬ã¹ã«å±ãããã¼ã¿ã°ã©ã ã®ã¿ ICMP ã¨ã©ã¼ãéç¥ããã*/558 /* ローカル IP アドレスに届いたデータグラムのみ ICMP エラーを通知する。*/ 580 559 if (dst == ifp->in4_ifaddr.addr) { 581 560 T_IN4_ADDR src; … … 586 565 } 587 566 /* 588 * icmp_error ã§ã¯ããããã¯ã¼ã¯ãããã¡ input ãè¿å´ããªãã®ã§589 * éæ¾ãã¦ããçµäºããã567 * icmp_error では、ネットワークバッファ input を返却しないので 568 * 開放してから終了する。 590 569 */ 591 570 break;
Note:
See TracChangeset
for help on using the changeset viewer.