Changeset 318 for asp3_gr_sakura/trunk/tinet/netinet/tcp_subr.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/tcp_subr.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$ … … 129 117 130 118 /* 131 * å 132 ¨åå¤æ° 133 */ 134 135 /* 136 * TCP ã® SEQ ã®åæå¤ãããã°ã©ã ãèµ·åãã¦ãæåã« TCP ã»ã°ã¡ã³ãã 137 * éåä¿¡ããã¨ãã«ãget_tim() ã«ããåæåããã 119 * 全域変数 120 */ 121 122 /* 123 * TCP の SEQ の初期値、プログラムが起動して、最初に TCP セグメントを 124 * 送受信するときに、get_tim() により初期化する。 138 125 */ 139 126 T_TCP_SEQ tcp_iss = 0; … … 142 129 143 130 /* 144 * SNMP 㮠管çæ 145 å ±ãã¼ã¹ (MIB) 131 * SNMP の 管理情報ベース (MIB) 146 132 */ 147 133 … … 151 137 152 138 /* 153 * å±æå¤æ°154 */ 155 156 static uint16_t tcp_port_auto = TCP_PORT_FIRST_AUTO; /* èªåå²ãå½ã¦çªå·*/139 * 局所変数 140 */ 141 142 static uint16_t tcp_port_auto = TCP_PORT_FIRST_AUTO; /* 自動割り当て番号 */ 157 143 158 144 #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 159 145 160 146 /* 161 * ã¿ã¹ã¯ããã® Time Wait ç¶æ 162 CEP åé¢æ©è½ 163 */ 164 165 /* 166 * å¤æ° 147 * タスクからの Time Wait 状態 CEP 分離機能 148 */ 149 150 /* 151 * 変数 167 152 */ 168 153 … … 170 155 171 156 /* 172 * tcp_move_twcep -- å¿ 173 è¦ãªæ 174 å ±ã Time Wait ç¨ TCP é信端ç¹ã«ç§»ãã¦ã 175 * æ¨æºã® TCP é信端ç¹ãéæ¾ããã 157 * tcp_move_twcep -- 必要な情報を Time Wait 用 TCP 通信端点に移して、 158 * 標準の TCP 通信端点を開放する。 176 159 */ 177 160 … … 181 164 T_TCP_TWCEP* twcep; 182 165 183 /* 空ãã® Time Wait ç¨ TCP é信端ç¹ãæ¢ç´¢ããã*/166 /* 空きの Time Wait 用 TCP 通信端点を探索する。*/ 184 167 for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) { 185 168 if (twcep->fsm_state != TCP_FSM_TIME_WAIT) { 186 169 187 170 /* 188 * é信端ç¹ãããã¯ãã 189 * å¿ 190 è¦ãªæ 191 å ±ã Time Wait ç¨ TCP é信端ç¹ã«ç§»ãã 171 * 通信端点をロックし、 172 * 必要な情報を Time Wait 用 TCP 通信端点に移す。 192 173 */ 193 174 syscall(wai_sem(cep->semid_lock)); … … 202 183 twcep->timer_2msl = cep->timer[TCP_TIM_2MSL]; 203 184 204 /* é信端ç¹ãããã¯ã解é¤ããã*/185 /* 通信端点をロックを解除する。*/ 205 186 syscall(sig_sem(cep->semid_lock)); 206 187 207 /* æ¨æº TCP é信端ç¹ãéæ¾ããã*/188 /* 標準 TCP 通信端点を開放する。*/ 208 189 tcp_close(cep); 209 190 … … 214 195 215 196 /* 216 * tcp_find_twcep -- ãã¼ãçªå·ãã Time Wait ç¨ TCP é信端ç¹ãå¾ãã197 * tcp_find_twcep -- ポート番号から Time Wait 用 TCP 通信端点を得る。 217 198 */ 218 199 … … 226 207 227 208 /* 228 * ç¶æ 229 ã TIME WAIT ã§ã 230 * IP ã¢ãã¬ã¹ã¨ãã¼ãçªå·ãä¸è´ããé信端ç¹ãæ¢ç´¢ããã 209 * 状態が TIME WAIT で、 210 * IP アドレスとポート番号が一致する通信端点を探索する。 231 211 */ 232 212 for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) { … … 245 225 246 226 /* 247 * tcp_find_cep -- ãã¼ãçªå·ãã TCP é信端ç¹ãå¾ãã227 * tcp_find_cep -- ポート番号から TCP 通信端点を得る。 248 228 */ 249 229 … … 257 237 258 238 /* 259 * ç¶æ 260 ã SYN éä¿¡æ¸ã¿ä»¥å¾ã¯ã 261 * IP ã¢ãã¬ã¹ã¨ãã¼ãçªå·ãä¸è´ãã TCP é信端ç¹ãæ¢ç´¢ããã 239 * 状態が SYN 送信済み以後は、 240 * IP アドレスとポート番号が一致する TCP 通信端点を探索する。 262 241 */ 263 242 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { … … 270 249 } 271 250 272 /* IPv4 ã§ååãªã¼ãã³ä¸ã® TCP é信端ç¹ãå 273 ã«æ¢ç´¢ããã*/ 251 /* IPv4 で受動オープン中の TCP 通信端点を先に探索する。*/ 274 252 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { 275 253 if ((cep->flags & TCP_CEP_FLG_IPV4) && … … 281 259 } 282 260 283 /* ååãªã¼ãã³ä¸ã® TCP é信端ç¹ãæ¢ç´¢ããã*/261 /* 受動オープン中の TCP 通信端点を探索する。*/ 284 262 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { 285 263 … … 327 305 328 306 /* 329 * tcp_is_addr_accept -- åä¿¡å¯è½ãª IP ã¢ãã¬ã¹ã¨ãã¼ãçªå·ã§ãããã¨ã確èªããã307 * tcp_is_addr_accept -- 受信可能な IP アドレスとポート番号であることを確認する。 330 308 */ 331 309 … … 340 318 341 319 /* 342 * 次ã®ã¨ãã¯ç ´æ£ããã 343 * ã»ãã¼ãçªå·ãåä¸ã§ãéåä¿¡ IP ã¢ãã¬ã¹ ãåä¸ã 344 * ãã ããéä¿¡å 345 IP ã¢ãã¬ã¹ããã¼ã«ã«ã«ã¼ãããã¯ãªãè¯ãã 346 * ã»ãã«ããã£ã¹ãã¢ãã¬ã¹ 320 * 次のときは破棄する。 321 * ・ポート番号が同一で、送受信 IP アドレス が同一。 322 * ただし、送信元 IP アドレスがローカルループバックなら良い。 323 * ・マルチキャストアドレス 347 324 */ 348 325 … … 354 331 355 332 /* 356 * 次ã®ã¨ãã¯ãåä¿¡å¯è½ã§ã¯ãªãã357 * ã»ãã¼ãçªå·ãåä¸ã§ãéåä¿¡ IP ã¢ãã¬ã¹ ãåä¸ã358 * ã»ãã«ããã£ã¹ãã¢ãã¬ã¹333 * 次のときは、受信可能ではない。 334 * ・ポート番号が同一で、送受信 IP アドレス が同一。 335 * ・マルチキャストアドレス 359 336 */ 360 337 if (tcph->dport == tcph->sport && IN_ARE_HDR_ADDR_EQUAL(input)) … … 370 347 371 348 /* 372 * tcp_free_reassq -- åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã349 * tcp_free_reassq -- 受信再構成キューのネットワークバッファを解放する。 373 350 * 374 * 注æ: 375 * å¿ 376 è¦ã§ããã°ããã®é¢æ°ãå¼ã³åºãåã«ãé信端ç¹ãããã¯ãã 377 * æ»ã£ãå¾ã解é¤ããå¿ 378 è¦ãããã 351 * 注意: 352 * 必要であれば、この関数を呼び出す前に、通信端点をロックし、 353 * 戻った後、解除する必要がある。 379 354 */ 380 355 … … 393 368 394 369 /* 395 * tcp_alloc_auto_port -- èªåå²ãå½ã¦ãã¼ãçªå·ãè¨å®ããã370 * tcp_alloc_auto_port -- 自動割り当てポート番号を設定する。 396 371 */ 397 372 … … 480 455 481 456 /* 482 * tcp_alloc_port -- æå®ããããã¼ãçªå·ãè¨å®ããã457 * tcp_alloc_port -- 指定されたポート番号を設定する。 483 458 */ 484 459 … … 500 475 501 476 /* 502 * tcp_init -- TCP ã¢ã¸ã¥ã¼ã«ã®åæå477 * tcp_init -- TCP モジュールの初期化 503 478 */ 504 479 … … 516 491 517 492 /* 518 * tcp_init_iss ã·ã¼ã±ã³ã¹çªå·ãåæåããã493 * tcp_init_iss シーケンス番号を初期化する。 519 494 */ 520 495 … … 530 505 531 506 /* 532 * tcp_close -- ã³ãã¯ã·ã§ã³ãéæ¾ããã507 * tcp_close -- コネクションを開放する。 533 508 */ 534 509 … … 536 511 tcp_close (T_TCP_CEP *cep) 537 512 { 538 /* ã¿ã¤ãã¼ãåæ¢ããã*/513 /* タイマーを停止する。*/ 539 514 tcp_cancel_timers(cep); 540 515 541 516 /* 542 * é信端ç¹ãããã¯ãã543 * åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã517 * 通信端点をロックし、 518 * 受信再構成キューのネットワークバッファを解放する。 544 519 */ 545 520 syscall(wai_sem(cep->semid_lock)); … … 547 522 syscall(sig_sem(cep->semid_lock)); 548 523 549 /* ç¶æ 550 ãæªä½¿ç¨ã«ããã*/ 524 /* 状態を未使用にする。*/ 551 525 cep->fsm_state = TCP_FSM_CLOSED; 552 526 553 527 /* 554 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã555 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½556 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½557 * ã»é信端ç¹ã®ãããã¯ã¼ã¯å±¤ãããã³ã«528 * 以下に関係しないフラグをクリアーする。 529 * ・送受信ウィンドバッファの省コピー機能 530 * ・動的な通信端点の生成・削除機能 531 * ・通信端点のネットワーク層プロトコル 558 532 */ 559 533 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; … … 562 536 563 537 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF || cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { 564 /* ãã³ããããã³ã°ã³ã¼ã«*/538 /* ノンブロッキングコール */ 565 539 566 540 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 … … 575 549 576 550 case TFN_TCP_ACP_CEP: 577 /* TCP é信端ç¹ããTCP åä»å£ã解æ¾ããã*/551 /* TCP 通信端点からTCP 受付口を解放する。*/ 578 552 cep->rep = NULL; 579 553 … … 587 561 case TFN_TCP_RCV_BUF: 588 562 589 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/563 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 590 564 len = TCP_GET_RWBUF_ADDR(cep, cep->rcv_p_buf); 591 565 592 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/566 /* 異常切断等のエラーを設定する。*/ 593 567 if (cep->error == E_TMOUT) 594 568 len = E_CLS; … … 601 575 case TFN_TCP_RCV_DAT: 602 576 603 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/577 /* 受信ウィンドバッファからデータを取り出す。*/ 604 578 len = TCP_READ_RWBUF(cep, cep->rcv_data, (uint_t)cep->rcv_len); 605 579 606 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/580 /* 異常切断等のエラーを設定する。*/ 607 581 if (cep->error == E_TMOUT) 608 582 len = E_CLS; … … 626 600 } 627 601 628 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/602 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 629 603 cep->rcv_tskid = TA_NULL; 630 604 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 636 610 637 611 case TFN_TCP_CON_CEP: 638 /* TCP é信端ç¹ãã TCP åä»å£ã解æ¾ããã*/612 /* TCP 通信端点から TCP 受付口を解放する。*/ 639 613 cep->rep = NULL; 640 614 … … 659 633 } 660 634 661 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/635 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 662 636 cep->snd_tskid = TA_NULL; 663 637 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 678 652 case TFN_TCP_ACP_CEP: 679 653 680 /* TCP é信端ç¹ããTCP åä»å£ã解æ¾ããã*/654 /* TCP 通信端点からTCP 受付口を解放する。*/ 681 655 cep->rep = NULL; 682 656 … … 685 659 #endif 686 660 687 /* æ¥ç¶ã¨ã©ã¼ãè¨å®ããã*/661 /* 接続エラーを設定する。*/ 688 662 len = E_CLS; 689 663 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len); … … 692 666 case TFN_TCP_RCV_BUF: 693 667 694 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/668 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 695 669 len = TCP_GET_RWBUF_ADDR(cep, cep->rcv_p_buf); 696 670 697 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/671 /* 異常切断等のエラーを設定する。*/ 698 672 if (cep->error == E_TMOUT) 699 673 len = E_CLS; … … 706 680 case TFN_TCP_RCV_DAT: 707 681 708 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/682 /* 受信ウィンドバッファからデータを取り出す。*/ 709 683 len = TCP_READ_RWBUF(cep, cep->rcv_data, (uint_t)cep->rcv_len); 710 684 711 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/685 /* 異常切断等のエラーを設定する。*/ 712 686 if (cep->error == E_TMOUT) 713 687 len = E_CLS; … … 731 705 } 732 706 733 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/707 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 734 708 cep->rcv_tskid = TA_NULL; 735 709 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 743 717 case TFN_TCP_CON_CEP: 744 718 745 /* TCP é信端ç¹ããTCP åä»å£ã解æ¾ããã*/719 /* TCP 通信端点からTCP 受付口を解放する。*/ 746 720 cep->rep = NULL; 747 721 … … 750 724 #endif 751 725 752 /* æ¥ç¶ã¨ã©ã¼ãè¨å®ããã*/726 /* 接続エラーを設定する。*/ 753 727 len = E_CLS; 754 728 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); … … 769 743 } 770 744 771 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/745 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 772 746 cep->snd_tskid = TA_NULL; 773 747 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 779 753 780 754 /* 781 * é信端ç¹ãããã¯ãã782 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã755 * 通信端点をロックし、 756 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 783 757 */ 784 758 syscall(wai_sem(cep->semid_lock)); … … 787 761 syscall(sig_sem(cep->semid_lock)); 788 762 789 /* æªä½¿ç¨ã«ãªã£ããã¨ãç¥ãããã*/763 /* 未使用になったことを知らせる。*/ 790 764 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 791 765 } 792 else { /* éãã³ããããã³ã°ã³ã¼ã«*/766 else { /* 非ノンブロッキングコール */ 793 767 794 768 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 795 769 796 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/770 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 797 771 cep->snd_tskid = cep->rcv_tskid = TA_NULL; 798 772 cep->snd_tfn = cep->rcv_tfn = TFN_TCP_UNDEF; 799 773 800 774 /* 801 * é信端ç¹ãããã¯ãã802 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã775 * 通信端点をロックし、 776 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 803 777 */ 804 778 syscall(wai_sem(cep->semid_lock)); … … 807 781 syscall(sig_sem(cep->semid_lock)); 808 782 809 /* æªä½¿ç¨ã«ãªã£ããã¨ãç¥ãããã*/783 /* 未使用になったことを知らせる。*/ 810 784 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 811 785 812 786 /* 813 * å 814 ¥åºåã¿ã¹ã¯ãèµ·åºãã¦ã 815 * éåä¿¡ä¸å¯ã«ãªã£ããã¨ãç¥ãããã 787 * 入出力タスクを起床して、 788 * 送受信不可になったことを知らせる。 816 789 */ 817 790 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); … … 828 801 829 802 /* 830 * tcp_drop -- TCP æ¥ç¶ãç ´æ£ããã803 * tcp_drop -- TCP 接続を破棄する。 831 804 */ 832 805 … … 846 819 cep->fsm_state = TCP_FSM_CLOSED; 847 820 848 /* éä¿¡ã¨ãéä¿¡å¾ã³ãã¯ã·ã§ã³ã®åæãæ示ããã*/821 /* 送信と、送信後コネクションの切断を指示する。*/ 849 822 cep->flags |= TCP_CEP_FLG_POST_OUTPUT | TCP_CEP_FLG_CLOSE_AFTER_OUTPUT; 850 823 sig_sem(SEM_TCP_POST_OUTPUT); … … 857 830 858 831 /* 859 * tcp_respond -- TCP ã®åä¸ã¡ãã»ã¼ã¸ãéä¿¡ããã832 * tcp_respond -- TCP の単一メッセージを送信する。 860 833 */ 861 834 … … 872 845 873 846 /* 874 * output ã NULL ã§ãªããã°ãããã¯å 875 ¥åããã»ã°ã¡ã³ãã® 876 * net_buf ã§ããã®ã¾ã¾åå©ç¨ããã 847 * output が NULL でなければ、これは入力したセグメントの 848 * net_buf で、そのまま再利用する。 877 849 */ 878 850 if (output != NULL) { … … 880 852 881 853 /* 882 * IPv4 ã§ã¯ãIP ãããã®ãªãã·ã§ã³ãåé¤ããã883 * IPv6 ã§ã¯ãæ¡å¼µããããåé¤ããã854 * IPv4 では、IP ヘッダのオプションを削除する。 855 * IPv6 では、拡張ヘッダを削除する。 884 856 */ 885 857 if (IP_REMOVE_OPTIONS(output) != E_OK) { … … 892 864 #if defined(_IP6_CFG) 893 865 894 /* ãã©ããã¯ã¯ã©ã¹ã¨ããã¼ã©ãã«ãã¯ãªã¢ããã*/866 /* トラヒッククラスとフローラベルをクリアする。*/ 895 867 SET_IP_CF(output, 0); 896 868 897 869 #endif /* of #if defined(_IP6_CFG) */ 898 870 899 /* TCP SDU é·ã 0 ã«ããã*/871 /* TCP SDU 長を 0 にする。*/ 900 872 SET_IP_SDU_SIZE(output, TCP_HDR_SIZE); 901 873 902 874 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET(output)); 903 875 904 /* ãã¼ãçªå·ã交æããã*/876 /* ポート番号を交換する。*/ 905 877 portno = tcph->sport; 906 878 tcph->sport = tcph->dport; 907 879 tcph->dport = portno; 908 880 909 /* TCP ãããã«æ 910 å ±ãè¨å®ããã*/ 881 /* TCP ヘッダに情報を設定する。*/ 911 882 tcph->doff = TCP_MAKE_DATA_OFF(TCP_HDR_SIZE); 912 883 } 913 884 914 /* cep ã NULL ã§ããã°ãä½ãããªãã§çµäºããã*/885 /* cep が NULL であれば、何もしないで終了する。*/ 915 886 else if (cep == NULL) 916 887 return; … … 931 902 932 903 /* 933 * ãã§ãã¯ãµã ãè¨å®ããã904 * チェックサムを設定する。 934 905 */ 935 906 hdr_offset = IF_IP_TCP_HDR_OFFSET(output); … … 937 908 (uint_t)GET_TCP_HDR_SIZE(output, hdr_offset)); 938 909 939 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/910 /* ネットワークバッファ長を調整する。*/ 940 911 output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset); 941 912 … … 946 917 #endif /* of #ifdef TCP_CFG_TRACE */ 947 918 948 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/919 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 949 920 IP_OUTPUT(output, TMO_TCP_OUTPUT); 950 921 } 951 922 #if 0 952 923 /* 953 * tcp_get_segment -- TCP ã»ã°ã¡ã³ããç²å¾ããããããè¨å®ããã924 * tcp_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。 954 925 * 955 * æ»ãå¤ ã¨ã©ã¼ã³ã¼ã956 * optlen ãªãã·ã§ã³ãµã¤ãºã4 ãªã¯ãããåä½957 * maxlen æ大ã»ã°ã¡ã³ããµã¤ãºï¼IF/IP/TCP ããããµã¤ãºãå«ã¾ãªãï¼958 * len TCP SDU ãµã¤ãº926 * 戻り値 エラーコード 927 * optlen オプションサイズ、4 オクテット単位 928 * maxlen 最大セグメントサイズ(IF/IP/TCP ヘッダサイズを含まない) 929 * len TCP SDU サイズ 959 930 */ 960 931 … … 966 937 ER error; 967 938 968 /* IP ãã¼ã¿ã°ã©ã ãç²å¾ããã*/939 /* IP データグラムを獲得する。*/ 969 940 if ((error = IN_GET_DATAGRAM(nbuf, 970 941 (uint_t)(TCP_HDR_SIZE + optlen + len), … … 978 949 } 979 950 980 /* TCP ãããã«æ 981 å ±ãè¨å®ããã*/ 982 983 /* TCP ãããã«æ 984 å ±ãè¨å®ããã*/ 951 /* TCP ヘッダに情報を設定する。*/ 952 953 /* TCP ヘッダに情報を設定する。*/ 985 954 tcph = GET_TCP_HDR(*nbuf, IF_IP_TCP_HDR_OFFSET(*nbuf)); 986 955 tcph->sport = htons(cep->myaddr.portno); … … 993 962 #endif 994 963 /* 995 * tcpn_get_segment -- TCP ã»ã°ã¡ã³ããç²å¾ããããããè¨å®ããã964 * tcpn_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。 996 965 * 997 * æ»ãå¤ ã¨ã©ã¼ã³ã¼ã998 * optlen ãªãã·ã§ã³ãµã¤ãºã4 ãªã¯ãããåä½999 * maxlen æ大ã»ã°ã¡ã³ããµã¤ãºï¼IF/IP/TCP ããããµã¤ãºãå«ãï¼1000 * len TCP SDU ãµã¤ãº966 * 戻り値 エラーコード 967 * optlen オプションサイズ、4 オクテット単位 968 * maxlen 最大セグメントサイズ(IF/IP/TCP ヘッダサイズを含む) 969 * len TCP SDU サイズ 1001 970 */ 1002 971 … … 1008 977 ER error; 1009 978 1010 /* IP ãã¼ã¿ã°ã©ã ãç²å¾ããã*/979 /* IP データグラムを獲得する。*/ 1011 980 if ((error = IN_GET_DATAGRAM(nbuf, 1012 981 (uint_t)(TCP_HDR_SIZE + optlen + len), … … 1020 989 } 1021 990 1022 /* TCP ãããã«æ 1023 å ±ãè¨å®ããã*/ 1024 1025 /* TCP ãããã«æ 1026 å ±ãè¨å®ããã*/ 991 /* TCP ヘッダに情報を設定する。*/ 992 993 /* TCP ヘッダに情報を設定する。*/ 1027 994 tcph = GET_TCP_HDR(*nbuf, IF_IP_TCP_HDR_OFFSET(*nbuf)); 1028 995 tcph->sport = htons(cep->myaddr.portno); … … 1035 1002 1036 1003 /* 1037 * tcp_can_send_more -- éä¿¡ã§ããããé信端ç¹ã®ç¶æ 1038 ãè¦ãã 1004 * tcp_can_send_more -- 送信できるか、通信端点の状態を見る。 1039 1005 */ 1040 1006 … … 1044 1010 ER error; 1045 1011 1046 /* éä¿¡ã§ããããCEP ã® FSM ç¶æ 1047 ãè¦ãã*/ 1012 /* 送信できるか、CEP の FSM 状態を見る。*/ 1048 1013 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) { 1049 1014 if ((error = cep->error) == E_OK) … … 1052 1017 #ifdef TCP_CFG_NON_BLOCKING 1053 1018 1054 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1055 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1019 /* タイムアウトをチェックする。*/ 1020 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1056 1021 1057 1022 if (!IS_PTR_DEFINED(cep->callback)) 1058 1023 error = E_OBJ; 1059 1024 else { 1060 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1025 /* コールバック関数を呼び出す。*/ 1061 1026 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1062 1027 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); … … 1083 1048 #ifdef TCP_CFG_NON_BLOCKING 1084 1049 1085 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1086 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1050 /* タイムアウトをチェックする。*/ 1051 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1087 1052 if (!IS_PTR_DEFINED(cep->callback)) 1088 1053 error = E_OBJ; … … 1090 1055 error = E_OBJ; 1091 1056 1092 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1057 /* コールバック関数を呼び出す。*/ 1093 1058 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1094 1059 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); … … 1116 1081 1117 1082 /* 1118 * tcp_can_recv_more -- åä¿¡ã§ããããé信端ç¹ã®ç¶æ 1119 ãè¦ãã 1083 * tcp_can_recv_more -- 受信できるか、通信端点の状態を見る。 1120 1084 * 1121 * 注æ: æ»ãå¤1085 * 注意: 戻り値 1122 1086 * 1123 * E_OK åä¿¡å¯è½1124 * E_OBJ ç¸æããåæãããããã¨ã©ã¼ãçºçããã1087 * E_OK 受信可能 1088 * E_OBJ 相手から切断されたか、エラーが発生した。 1125 1089 */ 1126 1090 … … 1129 1093 { 1130 1094 /* 1131 * åä¿¡ã§ããããfsm_state ãè¦ããåä¿¡ã§ããªãå ´åã¯1132 * é·ã 0ãã¾ãã¯ã¨ã©ã¼ãè¿ãã1095 * 受信できるか、fsm_state を見る。受信できない場合は 1096 * 長さ 0、またはエラーを返す。 1133 1097 */ 1134 1098 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state) && … … 1138 1102 #ifdef TCP_CFG_NON_BLOCKING 1139 1103 1140 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1141 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1104 /* タイムアウトをチェックする。*/ 1105 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1142 1106 1143 1107 if (!IS_PTR_DEFINED(cep->callback)) 1144 1108 *error = E_OBJ; 1145 1109 else { 1146 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1110 /* コールバック関数を呼び出す。*/ 1147 1111 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1148 1112 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error); … … 1157 1121 1158 1122 /* 1159 * é信端ç¹ãããã¯ãã¦ã1160 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã1123 * 通信端点をロックして、 1124 * 受信ウィンドバッファキューのネットワークバッファを解放する。 1161 1125 */ 1162 1126 syscall(wai_sem(cep->semid_lock)); … … 1174 1138 #ifdef TCP_CFG_NON_BLOCKING 1175 1139 1176 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1177 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1140 /* タイムアウトをチェックする。*/ 1141 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1178 1142 if (!IS_PTR_DEFINED(cep->callback)) 1179 1143 *error = E_OBJ; … … 1181 1145 *error = E_OBJ; 1182 1146 1183 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1147 /* コールバック関数を呼び出す。*/ 1184 1148 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1185 1149 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error); … … 1206 1170 1207 1171 /* 1208 * tcp_wait_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãå 1209 ¥ãã®ãå¾ 1210 ã¤ã 1172 * tcp_wait_rwbuf -- 受信ウィンドバッファにデータが入るのを待つ。 1211 1173 */ 1212 1174 … … 1218 1180 1219 1181 if (cep->rwbuf_count == 0) { 1220 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 1221 ¥åãããã¾ã§å¾ 1222 ã¤ã*/ 1182 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 1223 1183 while (cep->rwbuf_count == 0) { 1224 1184 if ((error = twai_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY, TWF_ORW, &flag, tmout)) != E_OK) { … … 1228 1188 1229 1189 /* 1230 * åä¿¡ã§ããããfsm_state ãè¦ããåä¿¡ã§ããªãç¶æ 1231 ã§ã 1232 * åä¿¡ã¦ã£ã³ããããã¡ã«æåããªãå ´åã¯çµäºããã 1190 * 受信できるか、fsm_state を見る。受信できない状態で、 1191 * 受信ウィンドバッファに文字がない場合は終了する。 1233 1192 */ 1234 1193 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state) && … … 1236 1195 1237 1196 /* 1238 * é信端ç¹ãããã¯ãã¦ã1239 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã1197 * 通信端点をロックして、 1198 * 受信ウィンドバッファキューのネットワークバッファを解放する。 1240 1199 */ 1241 1200 syscall(wai_sem(cep->semid_lock)); … … 1255 1214 1256 1215 /* 1257 * tcp_move_ra2rw -- åä¿¡åæ§æãã¥ã¼ã§åæ§æããã»ã°ã¡ã³ããåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ãã1216 * tcp_move_ra2rw -- 受信再構成キューで再構成したセグメントを受信ウィンドバッファに書き込む。 1258 1217 */ 1259 1218 … … 1265 1224 1266 1225 /* 1267 * åä¿¡ãã¼ã¿ãåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ã¿ã1268 * rcv_nxt ãå®äºãã SEQ ã ãé²ããã1226 * 受信データを受信ウィンドバッファに書き込み、 1227 * rcv_nxt を完了した SEQ だけ進める。 1269 1228 */ 1270 1229 if (TCP_FSM_HAVE_ESTABLISHED(cep->fsm_state)) { … … 1275 1234 break; 1276 1235 1277 /* 次ã®ã»ã°ã¡ã³ãã«é²ãã*/1236 /* 次のセグメントに進む。*/ 1278 1237 cep->reassq = qhdr->next; 1279 1238 1280 /* FIN ãã©ã°ã®ã¿æ®ãã*/1239 /* FIN フラグのみ残す。*/ 1281 1240 flags &= TCP_FLG_FIN; 1282 1241 1283 /* ãã¼ã¿ãåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ãã*/1242 /* データを受信ウィンドバッファに書き込む。*/ 1284 1243 TCP_WRITE_RWBUF(cep, q, (uint_t)(GET_IP_TCP_Q_HDR_OFFSET(q))); 1285 1244 } … … 1293 1252 1294 1253 /* 1295 * tcp_write_raque -- åä¿¡ã»ã°ã¡ã³ããåæ§æãã¦ãåä¿¡åæ§æãã¥ã¼ã«ç¹ãã1254 * tcp_write_raque -- 受信セグメントを再構成して、受信再構成キューに繋ぐ。 1296 1255 */ 1297 1256 … … 1304 1263 int32_t len; 1305 1264 1306 /* TCP ãããã®ä½ç½®ãä¿åããã*/1265 /* TCP ヘッダの位置を保存する。*/ 1307 1266 SET_IP_TCP_Q_HDR_OFFSET(input, thoff); 1308 1267 1309 1268 /* 1310 * MAX_TCP_REALLOC_SIZE 以ä¸ã®å ´åã¯ãæ°ãã«ãããã¯ã¼ã¯ãããã¡ã1311 * å²å½ã¦ã¦ããã¼ã¿ãã³ãã¼ããã1312 * ãã®ã¨ããIP ã®ãªãã·ã§ã³ï¼æ¡å¼µãããï¼ã¨ TCP ã®ãªãã·ã§ã³ã¯åé¤ããã1269 * MAX_TCP_REALLOC_SIZE 以下の場合は、新たにネットワークバッファを 1270 * 割当てて、データをコピーする。 1271 * このとき、IP のオプション(拡張ヘッダ)と TCP のオプションは削除する。 1313 1272 */ 1314 1273 len = IF_IP_TCP_HDR_SIZE(input) + inqhdr->slen; … … 1317 1276 1318 1277 /* 1319 * ãããã¯ã¼ã¯ãããã¡ã確ä¿ã§ããªãã¨ãã¯å²å½ã¦ãªãã1278 * ネットワークバッファが確保できないときは割当てない。 1320 1279 */ 1321 1280 if (tget_net_buf(&new, (uint_t)len, TMO_TCP_GET_NET_BUF) != E_OK) … … 1342 1301 1343 1302 /* 1344 * ä»å追å ããã»ã°ã¡ã³ãããå(p)ã¨å¾(q)ã®ã»ã°ã¡ã³ããæ¢ãã1303 * 今回追加するセグメントより前(p)と後(q)のセグメントを探す。 1345 1304 * 1346 1305 * +-------------------------+ … … 1365 1324 1366 1325 /* 1367 * å(p)ã®ã»ã°ã¡ã³ããããã°ãæ¢ã«ãä»åã¨åãã»ã°ã¡ã³ãã 1368 * ãããã¨ãããããã®å ´åã¯ããã®é¨åã¾ãã¯å 1369 ¨ã¦ãç ´æ£ããã 1326 * 前(p)のセグメントがあれば、既に、今回と同じセグメントが 1327 * あることもある。その場合は、その部分または全てを破棄する。 1370 1328 * 1371 1329 * qhdr->seq … … 1389 1347 1390 1348 /* 1391 * len ãæ£ã§ããã°ãå(p) ã®ã»ã°ã¡ã³ãã¨ä»åã®1392 * ã»ã°ã¡ã³ããéãªã£ã¦ããã1349 * len が正であれば、前(p) のセグメントと今回の 1350 * セグメントが重なっている。 1393 1351 */ 1394 1352 if (len >= inqhdr->slen) { 1395 1353 1396 1354 /* 1397 * len ãä»åã®ã»ã°ã¡ã³ãã¨åããªã1398 * ã¾ã£ããåãã»ã°ã¡ã³ããªã®ã§ä½ãããªãã1355 * len が今回のセグメントと同じなら 1356 * まったく同じセグメントなので何もしない。 1399 1357 */ 1400 1358 if (new != NULL) { … … 1407 1365 1408 1366 /* 1409 * 追å ããã»ã°ã¡ã³ãã® SDU ã len ååã«è©°ããã1367 * 追加するセグメントの SDU を len 分前に詰める。 1410 1368 */ 1411 1369 inqhdr->seq += len; … … 1416 1374 1417 1375 /* 1418 * ãã¥ã¼ã«ã¤ãªãåã«ãæ°ãããããã¯ã¼ã¯ãããã¡ã«ãã¼ã¿ã移ãã1419 * TCP ã®ãªãã·ã§ã³ã¯åé¤ããã1376 * キューにつなぐ前に、新しいネットワークバッファにデータを移す。 1377 * TCP のオプションは削除する。 1420 1378 */ 1421 1379 if (new != NULL) { … … 1430 1388 1431 1389 /* 1432 * éãªãå¾(q)ã®ã»ã°ã¡ã³ãã調æ´ããã1390 * 重なる後(q)のセグメントを調整する。 1433 1391 * 1434 1392 * inqhdr->seq … … 1450 1408 len = inqhdr->seq + inqhdr->slen - qhdr->seq; 1451 1409 if (len <= 0) 1452 /* len ãè² ãªãéãªã£ã¦ããªãã*/1410 /* len が負なら重なっていない。*/ 1453 1411 break; 1454 1412 else if (len < qhdr->slen) { 1455 1413 1456 1414 /* 1457 * å¾ãã§éãªã£ã¦ããã»ã°ã¡ã³ãã® SDU ã len ååã«è©°ããã1415 * 後ろで重なっているセグメントの SDU を len 分前に詰める。 1458 1416 * 1459 1417 * inqhdr->seq … … 1499 1457 1500 1458 /* 1501 * tcp_rexmt_val -- åéã¿ã¤ã ã¢ã¦ãå¤ãè¿ãã1459 * tcp_rexmt_val -- 再送タイムアウト値を返す。 1502 1460 */ 1503 1461 … … 1515 1473 1516 1474 /* 1517 * tcp_init_cep -- é信端ç¹ãåæåããã1475 * tcp_init_cep -- 通信端点を初期化する。 1518 1476 */ 1519 1477 … … 1524 1482 #ifdef TCP_CFG_RWBUF_CSAVE 1525 1483 /* 1526 * åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãæå¹ã«ããå ´åã 1527 * åä¿¡ã¦ã£ã³ããããã¡ãå 1528 ¨ã¦è§£æ¾ãããªããã¨ãããã®ã§ã 1529 * ããã§è§£æ¾ããã 1484 * 受信ウィンドバッファの省コピー機能を有効にした場合、 1485 * 受信ウィンドバッファが全て解放されないことがあるので、 1486 * ここで解放する。 1530 1487 */ 1531 1488 if (cep->rwbufq != NULL) { … … 1542 1499 cep->rbuf_rptr = cep->rbuf_wptr = cep->rbuf; 1543 1500 1544 cep->maxseg = DEF_TCP_SND_SEG; /* éä¿¡æ大ã»ã°ã¡ã³ããµã¤ãº*/1545 cep->srtt = TCP_TVAL_SRTT_BASE; /* æ»ãããªç§»åå¹³å*/1501 cep->maxseg = DEF_TCP_SND_SEG; /* 送信最大セグメントサイズ */ 1502 cep->srtt = TCP_TVAL_SRTT_BASE; /* 滑らかな移動平均 */ 1546 1503 cep->rttvar = ((TCP_TVAL_RTO_BASE - TCP_TVAL_SRTT_BASE) << TCP_RTTVAR_SHIFT) / 4; 1547 /* æ»ãããªåæ£*/1548 cep->rxtcur = TCP_TVAL_RTO_BASE; /* ç¾å¨ã®åéå¤*/1549 cep->snd_cwnd = MAX_TCP_WIN_SIZE; /* 輻輳ã¦ã£ã³ããµã¤ãº*/1550 cep->snd_ssthresh= MAX_TCP_WIN_SIZE; /* 輻輳ã¦ã£ã³ããµã¤ãº(snd_cwnd)ã® å¶éå¤*/1504 /* 滑らかな分散 */ 1505 cep->rxtcur = TCP_TVAL_RTO_BASE; /* 現在の再送値 */ 1506 cep->snd_cwnd = MAX_TCP_WIN_SIZE; /* 輻輳ウィンドサイズ */ 1507 cep->snd_ssthresh= MAX_TCP_WIN_SIZE; /* 輻輳ウィンドサイズ(snd_cwnd)の 制限値 */ 1551 1508 1552 1509 /* 1553 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã1554 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½1555 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½1556 * ã»é信端ç¹ã®ãããã¯ã¼ã¯å±¤ãããã³ã«1510 * 以下に関係しないフラグをクリアーする。 1511 * ・送受信ウィンドバッファの省コピー機能 1512 * ・動的な通信端点の生成・削除機能 1513 * ・通信端点のネットワーク層プロトコル 1557 1514 */ 1558 1515 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; 1559 1516 1560 /* ã»ããã©ãåæåããã*/1517 /* セマフォを初期化する。*/ 1561 1518 sig_sem(cep->semid_lock); 1562 1519 1563 /* ãã©ã°ãåæåããã*/1520 /* フラグを初期化する。*/ 1564 1521 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); 1565 1522 syscall(clr_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY)); … … 1567 1524 1568 1525 /* 1569 * tcp_notify -- ICMP ã¨ã©ã¼ã®å¦ç1526 * tcp_notify -- ICMP エラーの処理 1570 1527 */ 1571 1528 … … 1578 1535 1579 1536 /* 1580 * ã³ãã¯ã·ã§ã³éè¨æ¸ã§ããã¹ãå°éä¸è½ã¨ã©ã¼ã®å ´åã¯ã1581 * åéã«ããå¦çããã1537 * コネクション開設済で、ホスト到達不能エラーの場合は、 1538 * 再送により処理する。 1582 1539 */ 1583 1540 if (cep->fsm_state == TCP_FSM_ESTABLISHED && … … 1586 1543 1587 1544 /* 1588 * ã³ãã¯ã·ã§ã³éè¨ä¸ãåãã¨ã©ã¼ãä½åº¦ãåä¿¡ããå ´åã¯ã 1589 * å¾ 1590 ã¡ç¶æ 1591 ã解é¤ãã対å¿ããé¢æ°ã«ã¨ã©ã¼ãè¿ãããã 1545 * コネクション開設中、同じエラーを何度か受信した場合は、 1546 * 待ち状態を解除し、対応する関数にエラーを返させる。 1592 1547 */ 1593 1548 if (cep->fsm_state < TCP_FSM_ESTABLISHED && cep->rxtshift > 3 && cep->net_error != E_OK) { … … 1598 1553 cep->net_error = error; 1599 1554 1600 /* éä¿¡ãæ示ããã*/1555 /* 送信を指示する。*/ 1601 1556 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1602 1557 sig_sem(SEM_TCP_POST_OUTPUT); … … 1606 1561 1607 1562 /* 1608 * tcp_lock_cep -- TCP é信端ç¹ãããã¯ããã1563 * tcp_lock_cep -- TCP 通信端点をロックする。 1609 1564 */ 1610 1565 … … 1617 1572 *p_cep = NULL; 1618 1573 1619 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1574 /* TCP 通信端点 ID をチェックする。*/ 1620 1575 if (!VALID_TCP_CEPID(cepid)) 1621 1576 return E_ID; 1622 1577 1623 /* TCP é信端ç¹ãå¾ãã*/1578 /* TCP 通信端点を得る。*/ 1624 1579 cep = GET_TCP_CEP(cepid); 1625 1580 1626 /* TCP é信端ç¹ãããã¯ããã*/1581 /* TCP 通信端点をロックする。*/ 1627 1582 syscall(wai_sem(cep->semid_lock)); 1628 1583 1629 /* TCP é信端ç¹ããã§ãã¯ããã*/1584 /* TCP 通信端点をチェックする。*/ 1630 1585 if (!VALID_TCP_CEP(cep)) { 1631 1586 syscall(sig_sem(cep->semid_lock)); … … 1634 1589 1635 1590 /* 1636 * API æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1637 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1591 * API 機能コードとタスク識別子を記録する。 1592 * すでに記録されていれば、ペンディング中なのでエラー 1638 1593 */ 1639 1594 if (IS_TFN_TCP_RCV(tfn)) { … … 1657 1612 } 1658 1613 1659 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1614 /* 通信端点のロックを解除する。*/ 1660 1615 syscall(sig_sem(cep->semid_lock)); 1661 1616 … … 1667 1622 1668 1623 /* 1669 * ãã¬ã¼ã¹åºåã«ç¨ããã·ãªã¢ã«ãã¼ãçªå·1624 * トレース出力に用いるシリアルポート番号 1670 1625 */ 1671 1626 … … 1675 1630 1676 1631 /* 1677 * ã³ãã¯ã·ã§ã³ã®ç¶æ 1678 1632 * コネクションの状態 1679 1633 */ 1680 1634 … … 1694 1648 1695 1649 /* 1696 * trace_putchar -- ã·ãªã¢ã«ãã¼ãã¸ã®æååºå1650 * trace_putchar -- シリアルポートへの文字出力 1697 1651 */ 1698 1652 … … 1705 1659 1706 1660 /* 1707 * ã·ãªã¢ã«ãã¼ãã¸ã®æ¸å¼ä»æåååºåã©ã¤ãã©ãª1708 */ 1709 1710 /* 1711 * æ°å¤å¤æã®ããã®å¤æ表1661 * シリアルポートへの書式付文字列出力ライブラリ 1662 */ 1663 1664 /* 1665 * 数値変換のための変換表 1712 1666 */ 1713 1667 … … 1716 1670 1717 1671 /* 1718 * convert -- trace_printf ã®æ°å¤å¤æ1672 * convert -- trace_printf の数値変換 1719 1673 */ 1720 1674 … … 1753 1707 1754 1708 /* 1755 * trace_printf -- ã·ãªã¢ã«ãã¼ãã¸ã®æ¸å¼ä»æåååºå1709 * trace_printf -- シリアルポートへの書式付文字列出力 1756 1710 */ 1757 1711 … … 1766 1720 va_start(ap, fmt); 1767 1721 while ((ch = *fmt ++) != '\0') { 1768 if (ch != '%') { /* æ¸å¼æå®ä»¥å¤*/1722 if (ch != '%') { /* 書式指定以外 */ 1769 1723 trace_putchar(portid, (char)ch); 1770 1724 continue; … … 1773 1727 width = longflag = 0; 1774 1728 padchar = ' '; 1775 if ((ch = *fmt ++) == '0') { /* ä¸ä½æ¡ã®0 */1729 if ((ch = *fmt ++) == '0') { /* 上位桁の 0 */ 1776 1730 padchar = '0'; 1777 1731 ch = *fmt ++; 1778 1732 } 1779 1733 1780 while ('0' <= ch && ch <= '9') { /* åºåå¹ 1781 */ 1734 while ('0' <= ch && ch <= '9') { /* 出力幅 */ 1782 1735 width = width * 10 + ch - '0'; 1783 1736 ch = *fmt ++; 1784 1737 } 1785 1738 1786 while (ch == 'l') { /* long (long) ã®æå®*/1739 while (ch == 'l') { /* long (long) の指定 */ 1787 1740 longflag ++; 1788 1741 ch = *fmt ++; … … 1845 1798 1846 1799 /* 1847 * TCP ãã©ã°æåå1800 * TCP フラグ文字列 1848 1801 */ 1849 1802 … … 1864 1817 1865 1818 /* 1866 * éä¿¡ TCP ãããã®ãã¬ã¼ã¹åºå1819 * 送信 TCP ヘッダのトレース出力 1867 1820 */ 1868 1821 … … 1925 1878 1926 1879 /* 1927 * åä¿¡ TCP ãããã®ãã¬ã¼ã¹åºå1880 * 受信 TCP ヘッダのトレース出力 1928 1881 * 1929 * 注æ: TCP ãããå 1930 ã¯ããã§ã«ãã¹ããã¤ããªã¼ã 1882 * 注意: TCP ヘッダ内は、すでにホストバイトオーダ 1931 1883 */ 1932 1884
Note:
See TracChangeset
for help on using the changeset viewer.