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