Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr.c
- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr.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 責ãããã¨ï¼ 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$ … … 135 123 136 124 /* 137 * å 138 ¨åå¤æ° 139 */ 140 141 /* 142 * TCP ã® SEQ ã®åæå¤ãããã°ã©ã ãèµ·åãã¦ãæåã« TCP ã»ã°ã¡ã³ãã 143 * éåä¿¡ããã¨ãã«ãget_tim() ã«ããåæåããã 125 * 全域変数 126 */ 127 128 /* 129 * TCP の SEQ の初期値、プログラムが起動して、最初に TCP セグメントを 130 * 送受信するときに、get_tim() により初期化する。 144 131 */ 145 132 T_TCP_SEQ tcp_iss = 0; … … 148 135 149 136 /* 150 * SNMP 㮠管çæ 151 å ±ãã¼ã¹ (MIB) 137 * SNMP の 管理情報ベース (MIB) 152 138 */ 153 139 … … 157 143 158 144 /* 159 * å±æå¤æ°160 */ 161 162 static uint16_t tcp_port_auto = TCP_PORT_FIRST_AUTO; /* èªåå²ãå½ã¦çªå·*/163 164 /* 165 * tcp_free_reassq -- åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã145 * 局所変数 146 */ 147 148 static uint16_t tcp_port_auto = TCP_PORT_FIRST_AUTO; /* 自動割り当て番号 */ 149 150 /* 151 * tcp_free_reassq -- 受信再構成キューのネットワークバッファを解放する。 166 152 * 167 * 注æ: 168 * å¿ 169 è¦ã§ããã°ããã®é¢æ°ãå¼ã³åºãåã«ãé信端ç¹ãããã¯ãã 170 * æ»ã£ãå¾ã解é¤ããå¿ 171 è¦ãããã 153 * 注意: 154 * 必要であれば、この関数を呼び出す前に、通信端点をロックし、 155 * 戻った後、解除する必要がある。 172 156 */ 173 157 … … 186 170 187 171 /* 188 * tcp_alloc_auto_port -- èªåå²ãå½ã¦ãã¼ãçªå·ãè¨å®ããã172 * tcp_alloc_auto_port -- 自動割り当てポート番号を設定する。 189 173 */ 190 174 … … 245 229 246 230 /* 247 * tcp_alloc_port -- æå®ããããã¼ãçªå·ãè¨å®ããã231 * tcp_alloc_port -- 指定されたポート番号を設定する。 248 232 */ 249 233 … … 265 249 266 250 /* 267 * tcp_init -- TCP ã¢ã¸ã¥ã¼ã«ã®åæå251 * tcp_init -- TCP モジュールの初期化 268 252 */ 269 253 … … 281 265 282 266 /* 283 * tcp_init_iss ã·ã¼ã±ã³ã¹çªå·ãåæåããã267 * tcp_init_iss シーケンス番号を初期化する。 284 268 */ 285 269 … … 311 295 312 296 /* 313 * tcp_close -- ã³ãã¯ã·ã§ã³ãéæ¾ããã297 * tcp_close -- コネクションを開放する。 314 298 */ 315 299 … … 317 301 tcp_close (T_TCP_CEP *cep) 318 302 { 319 /* ã¿ã¤ãã¼ãåæ¢ããã*/303 /* タイマーを停止する。*/ 320 304 tcp_cancel_timers(cep); 321 305 322 306 /* 323 * é信端ç¹ãããã¯ãã324 * åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã307 * 通信端点をロックし、 308 * 受信再構成キューのネットワークバッファを解放する。 325 309 */ 326 310 syscall(wai_sem(cep->semid_lock)); … … 328 312 syscall(sig_sem(cep->semid_lock)); 329 313 330 /* ç¶æ 331 ãæªä½¿ç¨ã«ããã*/ 314 /* 状態を未使用にする。*/ 332 315 cep->fsm_state = TCP_FSM_CLOSED; 333 316 334 317 /* 335 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã336 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½337 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½318 * 以下に関係しないフラグをクリアーする。 319 * ・送受信ウィンドバッファの省コピー機能 320 * ・動的な通信端点の生成・削除機能 338 321 */ 339 322 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | … … 343 326 344 327 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF || cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { 345 /* ãã³ããããã³ã°ã³ã¼ã«*/328 /* ノンブロッキングコール */ 346 329 347 330 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 … … 356 339 357 340 case TFN_TCP_ACP_CEP: 358 /* TCP é信端ç¹ããTCP åä»å£ã解æ¾ããã*/341 /* TCP 通信端点からTCP 受付口を解放する。*/ 359 342 cep->rep = NULL; 360 343 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)E_CLS); … … 363 346 case TFN_TCP_RCV_BUF: 364 347 365 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/348 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 366 349 len = TCP_GET_RWBUF_ADDR(cep, cep->rcv_p_buf); 367 350 368 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/351 /* 異常切断等のエラーを設定する。*/ 369 352 if (cep->error == E_TMOUT) 370 353 len = E_CLS; … … 377 360 case TFN_TCP_RCV_DAT: 378 361 379 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/362 /* 受信ウィンドバッファからデータを取り出す。*/ 380 363 len = TCP_READ_RWBUF(cep, cep->rcv_data, (uint_t)cep->rcv_len); 381 364 382 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/365 /* 異常切断等のエラーを設定する。*/ 383 366 if (cep->error == E_TMOUT) 384 367 len = E_CLS; … … 402 385 } 403 386 404 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/387 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 405 388 cep->rcv_tskid = TA_NULL; 406 389 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 412 395 413 396 case TFN_TCP_CON_CEP: 414 /* TCP é信端ç¹ãã TCP åä»å£ã解æ¾ããã*/397 /* TCP 通信端点から TCP 受付口を解放する。*/ 415 398 cep->rep = NULL; 416 399 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)E_CLS); … … 430 413 } 431 414 432 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/415 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 433 416 cep->snd_tskid = TA_NULL; 434 417 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 448 431 449 432 case TFN_TCP_ACP_CEP: 450 /* TCP é信端ç¹ããTCP åä»å£ã解æ¾ããã*/433 /* TCP 通信端点からTCP 受付口を解放する。*/ 451 434 cep->rep = NULL; 452 435 len = E_CLS; … … 456 439 case TFN_TCP_RCV_BUF: 457 440 458 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/441 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 459 442 len = TCP_GET_RWBUF_ADDR(cep, cep->rcv_p_buf); 460 443 461 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/444 /* 異常切断等のエラーを設定する。*/ 462 445 if (cep->error == E_TMOUT) 463 446 len = E_CLS; … … 470 453 case TFN_TCP_RCV_DAT: 471 454 472 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/455 /* 受信ウィンドバッファからデータを取り出す。*/ 473 456 len = TCP_READ_RWBUF(cep, cep->rcv_data, (uint_t)cep->rcv_len); 474 457 475 /* ç°å¸¸åæçã®ã¨ã©ã¼ãè¨å®ããã*/458 /* 異常切断等のエラーを設定する。*/ 476 459 if (cep->error == E_TMOUT) 477 460 len = E_CLS; … … 495 478 } 496 479 497 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/480 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 498 481 cep->rcv_tskid = TA_NULL; 499 482 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 506 489 507 490 case TFN_TCP_CON_CEP: 508 /* TCP é信端ç¹ãã TCP åä»å£ã解æ¾ããã*/491 /* TCP 通信端点から TCP 受付口を解放する。*/ 509 492 cep->rep = NULL; 510 493 len = E_CLS; … … 526 509 } 527 510 528 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/511 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 529 512 cep->snd_tskid = TA_NULL; 530 513 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 536 519 537 520 /* 538 * é信端ç¹ãããã¯ãã539 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã521 * 通信端点をロックし、 522 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 540 523 */ 541 524 syscall(wai_sem(cep->semid_lock)); … … 544 527 syscall(sig_sem(cep->semid_lock)); 545 528 546 /* æªä½¿ç¨ã«ãªã£ããã¨ãç¥ãããã*/529 /* 未使用になったことを知らせる。*/ 547 530 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 548 531 } 549 else { /* éãã³ããããã³ã°ã³ã¼ã«*/532 else { /* 非ノンブロッキングコール */ 550 533 551 534 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 552 535 553 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/536 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 554 537 cep->snd_tskid = cep->rcv_tskid = TA_NULL; 555 538 cep->snd_tfn = cep->rcv_tfn = TFN_TCP_UNDEF; 556 539 557 540 /* 558 * é信端ç¹ãããã¯ãã559 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã541 * 通信端点をロックし、 542 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 560 543 */ 561 544 syscall(wai_sem(cep->semid_lock)); … … 564 547 syscall(sig_sem(cep->semid_lock)); 565 548 566 /* æªä½¿ç¨ã«ãªã£ããã¨ãç¥ãããã*/549 /* 未使用になったことを知らせる。*/ 567 550 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 568 551 569 552 /* 570 * å 571 ¥åºåã¿ã¹ã¯ãèµ·åºãã¦ã 572 * éåä¿¡ä¸å¯ã«ãªã£ããã¨ãç¥ãããã 553 * 入出力タスクを起床して、 554 * 送受信不可になったことを知らせる。 573 555 */ 574 556 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); … … 585 567 586 568 /* 587 * tcp_drop -- TCP æ¥ç¶ãç ´æ£ããã569 * tcp_drop -- TCP 接続を破棄する。 588 570 */ 589 571 … … 603 585 cep->fsm_state = TCP_FSM_CLOSED; 604 586 605 /* éä¿¡ã¨ãéä¿¡å¾ã³ãã¯ã·ã§ã³ã®åæãæ示ããã*/587 /* 送信と、送信後コネクションの切断を指示する。*/ 606 588 cep->flags |= TCP_CEP_FLG_POST_OUTPUT | TCP_CEP_FLG_CLOSE_AFTER_OUTPUT; 607 589 sig_sem(SEM_TCP_POST_OUTPUT); … … 613 595 614 596 /* 615 * tcp_respond -- TCP ã®åä¸ã¡ãã»ã¼ã¸ãéä¿¡ããã597 * tcp_respond -- TCP の単一メッセージを送信する。 616 598 */ 617 599 … … 628 610 629 611 /* 630 * output ã NULL ã§ãªããã°ãããã¯å 631 ¥åããã»ã°ã¡ã³ãã® 632 * net_buf ã§ããã®ã¾ã¾åå©ç¨ããã 612 * output が NULL でなければ、これは入力したセグメントの 613 * net_buf で、そのまま再利用する。 633 614 */ 634 615 if (output != NULL) { … … 637 618 638 619 /* 639 * IPv4 ã§ã¯ãIP ãããã®ãªãã·ã§ã³ãåé¤ããã640 * IPv6 ã§ã¯ãæ¡å¼µããããåé¤ããã620 * IPv4 では、IP ヘッダのオプションを削除する。 621 * IPv6 では、拡張ヘッダを削除する。 641 622 */ 642 623 if (IP_REMOVE_OPTIONS(output) != E_OK) { … … 647 628 iph = GET_IP_HDR(output); 648 629 649 /* IP ã¢ãã¬ã¹ã交æããã*/630 /* IP アドレスを交換する。*/ 650 631 ipaddr = iph->src; 651 632 iph->src = iph->dst; … … 654 635 #if defined(SUPPORT_INET6) 655 636 656 /* ãã©ããã¯ã¯ã©ã¹ã¨ããã¼ã©ãã«ãã¯ãªã¢ããã*/637 /* トラヒッククラスとフローラベルをクリアする。*/ 657 638 iph->vcf = htonl(IP6_MAKE_VCF(IP6_VCF_V(ntohl(iph->vcf)), 0)); 658 639 659 640 #endif /* of #if defined(SUPPORT_INET6) */ 660 641 661 /* TCP SDU é·ã 0 ã«ããã*/642 /* TCP SDU 長を 0 にする。*/ 662 643 SET_IP_SDU_SIZE(iph, TCP_HDR_SIZE); 663 644 664 645 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET); 665 646 666 /* ãã¼ãçªå·ã交æããã*/647 /* ポート番号を交換する。*/ 667 648 portno = tcph->sport; 668 649 tcph->sport = tcph->dport; 669 650 tcph->dport = portno; 670 651 671 /* TCP ãããã«æ 672 å ±ãè¨å®ããã*/ 652 /* TCP ヘッダに情報を設定する。*/ 673 653 tcph->doff = TCP_MAKE_DATA_OFF(TCP_HDR_SIZE); 674 654 } 675 655 676 /* cep ã NULL ã§ããã°ãä½ãããªãã§çµäºããã*/656 /* cep が NULL であれば、何もしないで終了する。*/ 677 657 else if (cep == NULL) 678 658 return; … … 693 673 694 674 /* 695 * ãã§ãã¯ãµã ãè¨å®ããã675 * チェックサムを設定する。 696 676 */ 697 677 tcph->sum = IN_CKSUM(output, IPPROTO_TCP, IF_IP_TCP_HDR_OFFSET, 698 678 (uint_t)GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET)); 699 679 700 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/680 /* ネットワークバッファ長を調整する。*/ 701 681 output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET); 702 682 … … 707 687 #endif /* of #ifdef TCP_CFG_TRACE */ 708 688 709 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/689 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 710 690 IP_OUTPUT(output, TMO_TCP_OUTPUT); 711 691 } 712 692 713 693 /* 714 * tcp_set_header -- TCP ããããè¨å®ããã694 * tcp_set_header -- TCP ヘッダを設定する。 715 695 */ 716 696 … … 720 700 T_TCP_HDR *tcph = GET_TCP_HDR(nbuf, thoff); 721 701 722 /* TCP ãããã«æ 723 å ±ãè¨å®ããã*/ 702 /* TCP ヘッダに情報を設定する。*/ 724 703 tcph->sport = htons(cep->myaddr.portno); 725 704 tcph->dport = htons(cep->dstaddr.portno); … … 729 708 730 709 /* 731 * tcp_get_segment -- TCP ã»ã°ã¡ã³ããç²å¾ããããããè¨å®ããã710 * tcp_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。 732 711 * 733 * æ»ãå¤ ã¨ã©ã¼ã³ã¼ã734 * optlen ãªãã·ã§ã³ãµã¤ãºã4 ãªã¯ãããåä½735 * len TCP SDU ãµã¤ãº712 * 戻り値 エラーコード 713 * optlen オプションサイズ、4 オクテット単位 714 * len TCP SDU サイズ 736 715 */ 737 716 … … 742 721 ER error; 743 722 744 /* IP ãã¼ã¿ã°ã©ã ãç²å¾ããã*/723 /* IP データグラムを獲得する。*/ 745 724 if ((error = IN_GET_DATAGRAM(nbuf, 746 725 (uint_t)(TCP_HDR_SIZE + optlen + len), … … 754 733 } 755 734 756 /* TCP ãããã«æ 757 å ±ãè¨å®ããã*/ 735 /* TCP ヘッダに情報を設定する。*/ 758 736 tcp_set_header(*nbuf, cep, IF_IP_TCP_HDR_OFFSET, optlen); 759 737 … … 762 740 763 741 /* 764 * tcp_can_send_more -- éä¿¡ã§ããããé信端ç¹ã®ç¶æ 765 ãè¦ãã 742 * tcp_can_send_more -- 送信できるか、通信端点の状態を見る。 766 743 */ 767 744 … … 771 748 ER error; 772 749 773 /* éä¿¡ã§ããããCEP ã® FSM ç¶æ 774 ãè¦ãã*/ 750 /* 送信できるか、CEP の FSM 状態を見る。*/ 775 751 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) { 776 752 if ((error = cep->error) == E_OK) … … 779 755 #ifdef TCP_CFG_NON_BLOCKING 780 756 781 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/782 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/757 /* タイムアウトをチェックする。*/ 758 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 783 759 784 760 if (!IS_PTR_DEFINED(cep->callback)) … … 788 764 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 789 765 790 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/766 /* コールバック関数を呼び出す。*/ 791 767 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); 792 768 793 769 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 794 770 795 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/771 /* コールバック関数を呼び出す。*/ 796 772 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error); 797 773 … … 817 793 #ifdef TCP_CFG_NON_BLOCKING 818 794 819 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/820 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/795 /* タイムアウトをチェックする。*/ 796 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 821 797 if (!IS_PTR_DEFINED(cep->callback)) 822 798 error = E_OBJ; … … 825 801 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 826 802 827 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/803 /* コールバック関数を呼び出す。*/ 828 804 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)E_OBJ); 829 805 830 806 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 831 807 832 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/808 /* コールバック関数を呼び出す。*/ 833 809 error = E_OBJ; 834 810 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error); … … 856 832 857 833 /* 858 * tcp_can_recv_more -- åä¿¡ã§ããããé信端ç¹ã®ç¶æ 859 ãè¦ãã 834 * tcp_can_recv_more -- 受信できるか、通信端点の状態を見る。 860 835 * 861 * 注æ: æ»ãå¤836 * 注意: 戻り値 862 837 * 863 * E_OK åä¿¡å¯è½864 * E_OBJ ç¸æããåæãããããã¨ã©ã¼ãçºçããã838 * E_OK 受信可能 839 * E_OBJ 相手から切断されたか、エラーが発生した。 865 840 */ 866 841 … … 869 844 { 870 845 /* 871 * åä¿¡ã§ããããfsm_state ãè¦ããåä¿¡ã§ããªãå ´åã¯872 * é·ã 0ãã¾ãã¯ã¨ã©ã¼ãè¿ãã846 * 受信できるか、fsm_state を見る。受信できない場合は 847 * 長さ 0、またはエラーを返す。 873 848 */ 874 849 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state) && … … 878 853 #ifdef TCP_CFG_NON_BLOCKING 879 854 880 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/881 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/855 /* タイムアウトをチェックする。*/ 856 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 882 857 883 858 if (!IS_PTR_DEFINED(cep->callback)) … … 886 861 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 887 862 888 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/863 /* コールバック関数を呼び出す。*/ 889 864 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error); 890 865 891 866 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 892 867 893 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/868 /* コールバック関数を呼び出す。*/ 894 869 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); 895 870 … … 903 878 904 879 /* 905 * é信端ç¹ãããã¯ãã¦ã906 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã880 * 通信端点をロックして、 881 * 受信ウィンドバッファキューのネットワークバッファを解放する。 907 882 */ 908 883 syscall(wai_sem(cep->semid_lock)); … … 920 895 #ifdef TCP_CFG_NON_BLOCKING 921 896 922 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/923 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/897 /* タイムアウトをチェックする。*/ 898 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 924 899 if (!IS_PTR_DEFINED(cep->callback)) 925 900 *error = E_OBJ; … … 928 903 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 929 904 930 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/905 /* コールバック関数を呼び出す。*/ 931 906 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)E_OBJ); 932 907 933 908 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 934 909 935 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/910 /* コールバック関数を呼び出す。*/ 936 911 *error = E_OBJ; 937 912 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); … … 958 933 959 934 /* 960 * tcp_wait_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãå 961 ¥ãã®ãå¾ 962 ã¤ã 935 * tcp_wait_rwbuf -- 受信ウィンドバッファにデータが入るのを待つ。 963 936 */ 964 937 … … 970 943 971 944 if (cep->rwbuf_count == 0) { 972 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 973 ¥åãããã¾ã§å¾ 974 ã¤ã*/ 945 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 975 946 while (cep->rwbuf_count == 0) { 976 947 if ((error = twai_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY, TWF_ORW, &flag, tmout)) != E_OK) { … … 980 951 981 952 /* 982 * åä¿¡ã§ããããfsm_state ãè¦ããåä¿¡ã§ããªãç¶æ 983 ã§ã 984 * åä¿¡ã¦ã£ã³ããããã¡ã«æåããªãå ´åã¯çµäºããã 953 * 受信できるか、fsm_state を見る。受信できない状態で、 954 * 受信ウィンドバッファに文字がない場合は終了する。 985 955 */ 986 956 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state) && … … 988 958 989 959 /* 990 * é信端ç¹ãããã¯ãã¦ã991 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã960 * 通信端点をロックして、 961 * 受信ウィンドバッファキューのネットワークバッファを解放する。 992 962 */ 993 963 #ifdef TCP_CFG_RWBUF_CSAVE … … 1008 978 1009 979 /* 1010 * tcp_move_ra2rw -- åä¿¡åæ§æãã¥ã¼ã§åæ§æããã»ã°ã¡ã³ããåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ãã980 * tcp_move_ra2rw -- 受信再構成キューで再構成したセグメントを受信ウィンドバッファに書き込む。 1011 981 */ 1012 982 … … 1018 988 1019 989 /* 1020 * åä¿¡ãã¼ã¿ãåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ã¿ã1021 * rcv_nxt ãå®äºãã SEQ ã ãé²ããã990 * 受信データを受信ウィンドバッファに書き込み、 991 * rcv_nxt を完了した SEQ だけ進める。 1022 992 */ 1023 993 if (TCP_FSM_HAVE_ESTABLISHED(cep->fsm_state)) { … … 1028 998 break; 1029 999 1030 /* 次ã®ã»ã°ã¡ã³ãã«é²ãã*/1000 /* 次のセグメントに進む。*/ 1031 1001 cep->reassq = qhdr->next; 1032 1002 1033 /* FIN ãã©ã°ã®ã¿æ®ãã*/1003 /* FIN フラグのみ残す。*/ 1034 1004 flags &= TCP_FLG_FIN; 1035 1005 1036 /* ãã¼ã¿ãåä¿¡ã¦ã£ã³ããããã¡ã«æ¸ãè¾¼ãã*/1006 /* データを受信ウィンドバッファに書き込む。*/ 1037 1007 TCP_WRITE_RWBUF(cep, q, (uint_t)(GET_TCP_IP_Q_HDR(q)->thoff)); 1038 1008 } … … 1046 1016 1047 1017 /* 1048 * tcp_write_raque -- åä¿¡ã»ã°ã¡ã³ããåæ§æãã¦ãåä¿¡åæ§æãã¥ã¼ã«ç¹ãã1018 * tcp_write_raque -- 受信セグメントを再構成して、受信再構成キューに繋ぐ。 1049 1019 */ 1050 1020 … … 1057 1027 int32_t len; 1058 1028 1059 /* TCP ãããã®ä½ç½®ãä¿åããã*/1029 /* TCP ヘッダの位置を保存する。*/ 1060 1030 GET_TCP_IP_Q_HDR(input)->thoff = thoff; 1061 1031 1062 1032 /* 1063 * MAX_TCP_REALLOC_SIZE 以ä¸ã®å ´åã¯ãæ°ãã«ãããã¯ã¼ã¯ãããã¡ã1064 * å²å½ã¦ã¦ããã¼ã¿ãã³ãã¼ããã1065 * ãã®ã¨ããIP ã®ãªãã·ã§ã³ï¼æ¡å¼µãããï¼ã¨ TCP ã®ãªãã·ã§ã³ã¯åé¤ããã1033 * MAX_TCP_REALLOC_SIZE 以下の場合は、新たにネットワークバッファを 1034 * 割当てて、データをコピーする。 1035 * このとき、IP のオプション(拡張ヘッダ)と TCP のオプションは削除する。 1066 1036 */ 1067 1037 len = IF_IP_TCP_HDR_SIZE + inqhdr->slen; … … 1070 1040 1071 1041 /* 1072 * ãããã¯ã¼ã¯ãããã¡ã確ä¿ã§ããªãã¨ãã¯å²å½ã¦ãªãã1042 * ネットワークバッファが確保できないときは割当てない。 1073 1043 */ 1074 1044 if (tget_net_buf(&new, (uint_t)len, TMO_TCP_GET_NET_BUF) != E_OK) … … 1095 1065 1096 1066 /* 1097 * ä»å追å ããã»ã°ã¡ã³ãããå(p)ã¨å¾(q)ã®ã»ã°ã¡ã³ããæ¢ãã1067 * 今回追加するセグメントより前(p)と後(q)のセグメントを探す。 1098 1068 * 1099 1069 * +-------------------------+ … … 1118 1088 1119 1089 /* 1120 * å(p)ã®ã»ã°ã¡ã³ããããã°ãæ¢ã«ãä»åã¨åãã»ã°ã¡ã³ãã 1121 * ãããã¨ãããããã®å ´åã¯ããã®é¨åã¾ãã¯å 1122 ¨ã¦ãç ´æ£ããã 1090 * 前(p)のセグメントがあれば、既に、今回と同じセグメントが 1091 * あることもある。その場合は、その部分または全てを破棄する。 1123 1092 * 1124 1093 * qhdr->seq … … 1142 1111 1143 1112 /* 1144 * len ãæ£ã§ããã°ãå(p) ã®ã»ã°ã¡ã³ãã¨ä»åã®1145 * ã»ã°ã¡ã³ããéãªã£ã¦ããã1113 * len が正であれば、前(p) のセグメントと今回の 1114 * セグメントが重なっている。 1146 1115 */ 1147 1116 if (len >= inqhdr->slen) { 1148 1117 1149 1118 /* 1150 * len ãä»åã®ã»ã°ã¡ã³ãã¨åããªã1151 * ã¾ã£ããåãã»ã°ã¡ã³ããªã®ã§ä½ãããªãã1119 * len が今回のセグメントと同じなら 1120 * まったく同じセグメントなので何もしない。 1152 1121 */ 1153 1122 if (new != NULL) { … … 1160 1129 1161 1130 /* 1162 * 追å ããã»ã°ã¡ã³ãã® SDU ã len ååã«è©°ããã1131 * 追加するセグメントの SDU を len 分前に詰める。 1163 1132 */ 1164 1133 inqhdr->seq += len; … … 1169 1138 1170 1139 /* 1171 * ãã¥ã¼ã«ã¤ãªãåã«ãæ°ãããããã¯ã¼ã¯ãããã¡ã«ãã¼ã¿ã移ãã1172 * TCP ã®ãªãã·ã§ã³ã¯åé¤ããã1140 * キューにつなぐ前に、新しいネットワークバッファにデータを移す。 1141 * TCP のオプションは削除する。 1173 1142 */ 1174 1143 if (new != NULL) { … … 1183 1152 1184 1153 /* 1185 * éãªãå¾(q)ã®ã»ã°ã¡ã³ãã調æ´ããã1154 * 重なる後(q)のセグメントを調整する。 1186 1155 * 1187 1156 * inqhdr->seq … … 1203 1172 len = inqhdr->seq + inqhdr->slen - qhdr->seq; 1204 1173 if (len <= 0) 1205 /* len ãè² ãªãéãªã£ã¦ããªãã*/1174 /* len が負なら重なっていない。*/ 1206 1175 break; 1207 1176 else if (len < qhdr->slen) { 1208 1177 1209 1178 /* 1210 * å¾ãã§éãªã£ã¦ããã»ã°ã¡ã³ãã® SDU ã len ååã«è©°ããã1179 * 後ろで重なっているセグメントの SDU を len 分前に詰める。 1211 1180 * 1212 1181 * inqhdr->seq … … 1252 1221 1253 1222 /* 1254 * tcp_rexmt_val -- åéã¿ã¤ã ã¢ã¦ãå¤ãè¿ãã1223 * tcp_rexmt_val -- 再送タイムアウト値を返す。 1255 1224 */ 1256 1225 … … 1268 1237 1269 1238 /* 1270 * tcp_init_cep -- é信端ç¹ãåæåããã1239 * tcp_init_cep -- 通信端点を初期化する。 1271 1240 */ 1272 1241 … … 1276 1245 #ifdef TCP_CFG_RWBUF_CSAVE 1277 1246 /* 1278 * åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãæå¹ã«ããå ´åã 1279 * åä¿¡ã¦ã£ã³ããããã¡ãå 1280 ¨ã¦è§£æ¾ãããªããã¨ãããã®ã§ã 1281 * ããã§è§£æ¾ããã 1247 * 受信ウィンドバッファの省コピー機能を有効にした場合、 1248 * 受信ウィンドバッファが全て解放されないことがあるので、 1249 * ここで解放する。 1282 1250 */ 1283 1251 if (cep->rwbufq != NULL) { … … 1293 1261 cep->rbuf_rptr = cep->rbuf_wptr = cep->rbuf; 1294 1262 1295 cep->maxseg = DEF_TCP_SND_SEG; /* éä¿¡æ大ã»ã°ã¡ã³ããµã¤ãº*/1296 cep->srtt = TCP_TVAL_SRTT_BASE; /* æ»ãããªç§»åå¹³å*/1263 cep->maxseg = DEF_TCP_SND_SEG; /* 送信最大セグメントサイズ */ 1264 cep->srtt = TCP_TVAL_SRTT_BASE; /* 滑らかな移動平均 */ 1297 1265 cep->rttvar = ((TCP_TVAL_RTO_BASE - TCP_TVAL_SRTT_BASE) << TCP_RTTVAR_SHIFT) / 4; 1298 /* æ»ãããªåæ£*/1299 cep->rxtcur = TCP_TVAL_RTO_BASE; /* ç¾å¨ã®åéå¤*/1300 cep->snd_cwnd = MAX_TCP_WIN_SIZE; /* 輻輳ã¦ã£ã³ããµã¤ãº*/1301 cep->snd_ssthresh= MAX_TCP_WIN_SIZE; /* 輻輳ã¦ã£ã³ããµã¤ãº(snd_cwnd)ã® å¶éå¤*/1266 /* 滑らかな分散 */ 1267 cep->rxtcur = TCP_TVAL_RTO_BASE; /* 現在の再送値 */ 1268 cep->snd_cwnd = MAX_TCP_WIN_SIZE; /* 輻輳ウィンドサイズ */ 1269 cep->snd_ssthresh= MAX_TCP_WIN_SIZE; /* 輻輳ウィンドサイズ(snd_cwnd)の 制限値 */ 1302 1270 1303 1271 /* 1304 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã1305 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½1306 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½1272 * 以下に関係しないフラグをクリアーする。 1273 * ・送受信ウィンドバッファの省コピー機能 1274 * ・動的な通信端点の生成・削除機能 1307 1275 */ 1308 1276 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | 1309 1277 TCP_CEP_FLG_DYNAMIC | TCP_CEP_FLG_VALID); 1310 1278 1311 /* ã»ããã©ãåæåããã*/1279 /* セマフォを初期化する。*/ 1312 1280 sig_sem (cep->semid_lock); 1313 1281 1314 /* ãã©ã°ãåæåããã*/1282 /* フラグを初期化する。*/ 1315 1283 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); 1316 1284 syscall(clr_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY)); … … 1318 1286 1319 1287 /* 1320 * tcp_notify -- ICMP ã¨ã©ã¼ã®å¦ç1288 * tcp_notify -- ICMP エラーの処理 1321 1289 */ 1322 1290 … … 1334 1302 1335 1303 /* 1336 * ã³ãã¯ã·ã§ã³éè¨æ¸ã§ããã¹ãå°éä¸è½ã¨ã©ã¼ã®å ´åã¯ã1337 * åéã«ããå¦çããã1304 * コネクション開設済で、ホスト到達不能エラーの場合は、 1305 * 再送により処理する。 1338 1306 */ 1339 1307 if (cep->fsm_state == TCP_FSM_ESTABLISHED && … … 1342 1310 1343 1311 /* 1344 * ã³ãã¯ã·ã§ã³éè¨ä¸ãåãã¨ã©ã¼ãä½åº¦ãåä¿¡ããå ´åã¯ã 1345 * å¾ 1346 ã¡ç¶æ 1347 ã解é¤ãã対å¿ããé¢æ°ã«ã¨ã©ã¼ãè¿ãããã 1312 * コネクション開設中、同じエラーを何度か受信した場合は、 1313 * 待ち状態を解除し、対応する関数にエラーを返させる。 1348 1314 */ 1349 1315 if (cep->fsm_state < TCP_FSM_ESTABLISHED && cep->rxtshift > 3 && cep->net_error != E_OK) { … … 1354 1320 cep->net_error = error; 1355 1321 1356 /* éä¿¡ãæ示ããã*/1322 /* 送信を指示する。*/ 1357 1323 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1358 1324 sig_sem(SEM_TCP_POST_OUTPUT); … … 1362 1328 1363 1329 /* 1364 * tcp_find_cep -- ãã¼ãçªå·ãã TCP é信端ç¹ãå¾ãã1330 * tcp_find_cep -- ポート番号から TCP 通信端点を得る。 1365 1331 * 1366 * 注æ: dstaddr ã¯ã1367 * TINET-1.2 ãããããã¯ã¼ã¯ãã¤ããªã¼ãã1368 * TINET-1.1 ã¾ã§ã¯ããã¹ããã¤ããªã¼ã1332 * 注意: dstaddr は、 1333 * TINET-1.2 からネットワークバイトオーダ、 1334 * TINET-1.1 までは、ホストバイトオーダ 1369 1335 */ 1370 1336 … … 1375 1341 1376 1342 /* 1377 * ç¶æ 1378 ã SYN éä¿¡æ¸ã¿ä»¥å¾ã¯ã 1379 * IP ã¢ãã¬ã¹ã¨ãã¼ãçªå·ãä¸è´ããé信端ç¹ãæ¢ç´¢ããã 1343 * 状態が SYN 送信済み以後は、 1344 * IP アドレスとポート番号が一致する通信端点を探索する。 1380 1345 */ 1381 1346 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { … … 1388 1353 } 1389 1354 1390 /* ååãªã¼ãã³ä¸ã®é信端ç¹ãæ¢ç´¢ããã*/1355 /* 受動オープン中の通信端点を探索する。*/ 1391 1356 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { 1392 1357 if (cep->fsm_state == TCP_FSM_LISTEN && … … 1400 1365 1401 1366 /* 1402 * tcp_lock_cep -- TCP é信端ç¹ãããã¯ããã1367 * tcp_lock_cep -- TCP 通信端点をロックする。 1403 1368 */ 1404 1369 … … 1411 1376 *p_cep = NULL; 1412 1377 1413 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1378 /* TCP 通信端点 ID をチェックする。*/ 1414 1379 if (!VAID_TCP_CEPID(cepid)) 1415 1380 return E_ID; 1416 1381 1417 /* TCP é信端ç¹ãå¾ãã*/1382 /* TCP 通信端点を得る。*/ 1418 1383 cep = GET_TCP_CEP(cepid); 1419 1384 1420 /* TCP é信端ç¹ãããã¯ããã*/1385 /* TCP 通信端点をロックする。*/ 1421 1386 syscall(wai_sem(cep->semid_lock)); 1422 1387 1423 /* TCP é信端ç¹ããã§ãã¯ããã*/1388 /* TCP 通信端点をチェックする。*/ 1424 1389 if (!VALID_TCP_CEP(cep)) { 1425 1390 syscall(sig_sem(cep->semid_lock)); … … 1428 1393 1429 1394 /* 1430 * API æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1431 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1395 * API 機能コードとタスク識別子を記録する。 1396 * すでに記録されていれば、ペンディング中なのでエラー 1432 1397 */ 1433 1398 if (IS_TFN_TCP_RCV(tfn)) { … … 1451 1416 } 1452 1417 1453 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1418 /* 通信端点のロックを解除する。*/ 1454 1419 syscall(sig_sem(cep->semid_lock)); 1455 1420 … … 1465 1430 1466 1431 /* 1467 * ã³ãã¯ã·ã§ã³ã®ç¶æ 1468 1432 * コネクションの状態 1469 1433 */ 1470 1434 … … 1484 1448 1485 1449 /* 1486 * trace_putchar -- ã·ãªã¢ã«ãã¼ãã¸ã®æååºå1450 * trace_putchar -- シリアルポートへの文字出力 1487 1451 */ 1488 1452 … … 1495 1459 1496 1460 /* 1497 * ã·ãªã¢ã«ãã¼ãã¸ã®æ¸å¼ä»æåååºåã©ã¤ãã©ãª1498 */ 1499 1500 /* 1501 * æ°å¤å¤æã®ããã®å¤æ表1461 * シリアルポートへの書式付文字列出力ライブラリ 1462 */ 1463 1464 /* 1465 * 数値変換のための変換表 1502 1466 */ 1503 1467 … … 1506 1470 1507 1471 /* 1508 * convert -- trace_printf ã®æ°å¤å¤æ1472 * convert -- trace_printf の数値変換 1509 1473 */ 1510 1474 … … 1543 1507 1544 1508 /* 1545 * trace_printf -- ã·ãªã¢ã«ãã¼ãã¸ã®æ¸å¼ä»æåååºå1509 * trace_printf -- シリアルポートへの書式付文字列出力 1546 1510 */ 1547 1511 … … 1556 1520 va_start(ap, fmt); 1557 1521 while ((ch = *fmt ++) != '\0') { 1558 if (ch != '%') { /* æ¸å¼æå®ä»¥å¤*/1522 if (ch != '%') { /* 書式指定以外 */ 1559 1523 trace_putchar(portid, (char)ch); 1560 1524 continue; … … 1563 1527 width = longflag = 0; 1564 1528 padchar = ' '; 1565 if ((ch = *fmt ++) == '0') { /* ä¸ä½æ¡ã®0 */1529 if ((ch = *fmt ++) == '0') { /* 上位桁の 0 */ 1566 1530 padchar = '0'; 1567 1531 ch = *fmt ++; 1568 1532 } 1569 1533 1570 while ('0' <= ch && ch <= '9') { /* åºåå¹ 1571 */ 1534 while ('0' <= ch && ch <= '9') { /* 出力幅 */ 1572 1535 width = width * 10 + ch - '0'; 1573 1536 ch = *fmt ++; 1574 1537 } 1575 1538 1576 while (ch == 'l') { /* long (long) ã®æå®*/1539 while (ch == 'l') { /* long (long) の指定 */ 1577 1540 longflag ++; 1578 1541 ch = *fmt ++; … … 1635 1598 1636 1599 /* 1637 * TCP ãã©ã°æåå1600 * TCP フラグ文字列 1638 1601 */ 1639 1602 … … 1654 1617 1655 1618 /* 1656 * éä¿¡ TCP ãããã®ãã¬ã¼ã¹åºå1619 * 送信 TCP ヘッダのトレース出力 1657 1620 */ 1658 1621 … … 1705 1668 1706 1669 /* 1707 * åä¿¡ TCP ãããã®ãã¬ã¼ã¹åºå1670 * 受信 TCP ヘッダのトレース出力 1708 1671 * 1709 * 注æ: TCP ãããå 1710 ã¯ããã§ã«ãã¹ããã¤ããªã¼ã 1672 * 注意: TCP ヘッダ内は、すでにホストバイトオーダ 1711 1673 */ 1712 1674
Note:
See TracChangeset
for help on using the changeset viewer.