Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_output.c

    • Property svn:keywords deleted
    • Property svn:mime-type changed from text/x-csrc to text/x-csrc;charset=UTF-8
    r270 r321  
    55 *                   Tomakomai National College of Technology, JAPAN
    66 *
    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プロジェクトを免責すること.
    3625 *
    37  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    38 ãŠ
    39  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
    40  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
    41  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
     26 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     27 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
     28 *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
     29 *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
    4230 *
    4331 *  @(#) $Id$
     
    127115
    128116/*
    129  *  関数
     117 *  関数
    130118 */
    131119
     
    134122
    135123/*
    136  *  変数
     124 *  変数
    137125 */
    138126
    139 /* 出力時のフラグを FSM 状æ
    140 ‹ã«ã‚ˆã‚Šé¸æŠžã™ã‚‹ãŸã‚ã®è¡¨ */
     127/* 出力時のフラグを FSM 状態により選択するための表 */
    141128
    142129const static uint8_t tcp_outflags[] = {
    143         TCP_FLG_RST | TCP_FLG_ACK,      /*  0, クローズ                             */
    144         0,                              /*  1, 受動オープン                       */
    145         TCP_FLG_SYN,                    /*  2, 能動オープン、SYN 送信済み    */
    146         TCP_FLG_SYN | TCP_FLG_ACK,      /*  3, SYM を受信し、SYN 送信済み      */
    147         TCP_FLG_ACK,                    /*  4, コネクション開設完了           */
    148         TCP_FLG_ACK,                    /*  5, FIN 受信、クローズå¾
    149 ã¡             */
    150         TCP_FLG_FIN | TCP_FLG_ACK,      /*  6, 終了して、FIN 送信済み          */
    151         TCP_FLG_FIN | TCP_FLG_ACK,      /*  7, 終了、FIN 交換済み、ACK å¾
    152 ã¡     */
    153         TCP_FLG_FIN | TCP_FLG_ACK,      /*  8, FIN 受信、終了、ACK å¾
    154 ã¡             */
    155         TCP_FLG_ACK,                    /*  9, 終了、FIN 伝達確認受信、FINå¾
    156 ã¡     */
    157         TCP_FLG_ACK,                    /* 10, 終了、時間å¾
    158 ã¡                     */
     130        TCP_FLG_RST | TCP_FLG_ACK,      /*  0, クローズ                             */
     131        0,                              /*  1, 受動オープン                   */
     132        TCP_FLG_SYN,                    /*  2, 能動オープン、SYN 送信済み  */
     133        TCP_FLG_SYN | TCP_FLG_ACK,      /*  3, SYM を受信し、SYN 送信済み        */
     134        TCP_FLG_ACK,                    /*  4, コネクション開設完了               */
     135        TCP_FLG_ACK,                    /*  5, FIN 受信、クローズ待ち            */
     136        TCP_FLG_FIN | TCP_FLG_ACK,      /*  6, 終了して、FIN 送信済み            */
     137        TCP_FLG_FIN | TCP_FLG_ACK,      /*  7, 終了、FIN 交換済み、ACK 待ち       */
     138        TCP_FLG_FIN | TCP_FLG_ACK,      /*  8, FIN 受信、終了、ACK 待ち         */
     139        TCP_FLG_ACK,                    /*  9, 終了、FIN 伝達確認受信、FIN待ち      */
     140        TCP_FLG_ACK,                    /* 10, 終了、時間待ち                  */
    159141        };
    160142
    161143/*
    162  *  send_segment -- TCP 出力処理
     144 *  send_segment -- TCP 出力処理
    163145 */
    164146
     
    190172
    191173        /*
    192          *  セグメント長を、相手の最大受信セグメント長に調整する。
    193          *  もし、è¶
    194 ãˆã¦ã„る場合は、è¶
    195 ãˆãŸåˆ†ã‚’後で送信する。
    196          *  このため、FIN ビットをクリアする。
     174         *  セグメント長を、相手の最大受信セグメント長に調整する。
     175         *  もし、超えている場合は、超えた分を後で送信する。
     176         *  このため、FIN ビットをクリアする。
    197177         *
    198          *  オリジナルでは、t_maxopd を制限長にしているが、
    199          *  本実è£
    200 ã§ã¯ã€ç›¸æ‰‹ã®æœ€å¤§å—信セグメントにする。
     178         *  オリジナルでは、t_maxopd を制限長にしているが、
     179         *  本実装では、相手の最大受信セグメントにする。
    201180         */
    202181        if (len + optlen > cep->maxseg) {
     
    207186
    208187        /*
    209          *  送信バッファが空になるときは PUSH フラグを設定する。
     188         *  送信バッファが空になるときは PUSH フラグを設定する。
    210189         */
    211190        if (len && doff + len >= cep->swbuf_count)
     
    218197
    219198                /*
    220                  *  送信ウインドバッファが開放されないようにして、
    221                  *  ネットワークバッファを出力に移す。
     199                 *  送信ウインドバッファが開放されないようにして、
     200                 *  ネットワークバッファを出力に移す。
    222201                 */
    223202                cep->swbufq->flags |= NB_FLG_NOREL_IFOUT;
     
    227206
    228207                /*
    229                  *  ACK 完了状æ
    230 ‹ã§ã€ã“の関数が呼び出されることもある。
    231                  *  この時は、len を 0 にして、処理を継続する。
     208                 *  ACK 完了状態で、この関数が呼び出されることもある。
     209                 *  この時は、len を 0 にして、処理を継続する。
    232210                 */
    233211                len = 0;
     
    256234
    257235                /*
    258                  *  送信ウインドバッファが開放されないようにして、
    259                  *  ネットワークバッファを出力に移す。
     236                 *  送信ウインドバッファが開放されないようにして、
     237                 *  ネットワークバッファを出力に移す。
    260238                 */
    261239                cep->swbufq->flags |= NB_FLG_NOREL_IFOUT;
     
    265243
    266244                /*
    267                  *  ACK 完了状æ
    268 ‹ã§ã€ã“の関数が呼び出されることもある。
    269                  *  この時は、len を 0 にして、処理を継続する。
     245                 *  ACK 完了状態で、この関数が呼び出されることもある。
     246                 *  この時は、len を 0 にして、処理を継続する。
    270247                 */
    271248                len = 0;
     
    292269
    293270        /*
    294          *  TCP オプションの設定を行う。
    295          *  本実è£
    296 ã§ã¯ã€æœ€å¤§ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºã®ã¿è¨­å®šã™ã‚‹ã€‚
     271         *  TCP オプションの設定を行う。
     272         *  本実装では、最大セグメントサイズのみ設定する。
    297273         */
    298274        if (flags & TCP_FLG_SYN) {
     
    310286                }
    311287
    312         /* TCP SDU に送信データをコピーする。*/
     288        /* TCP SDU に送信データをコピーする。*/
    313289
    314290        if (len > 0) {
     
    336312
    337313        /*
    338          * snd_max: 送信した最大 SEQ
    339          * snd_nxt: 次に送信する SEQ
     314         * snd_max: 送信した最大 SEQ
     315         * snd_nxt: 次に送信する SEQ
    340316         *
    341          *  相手から FIN を受信し、まだ FIN を送信していないか、
    342          *  送るデータがないときは、FIN を相手に届けるため、
    343          *  セグメントを送信するが、SEQ は進めない。
     317         *  相手から FIN を受信し、まだ FIN を送信していないか、
     318         *  送るデータがないときは、FIN を相手に届けるため、
     319         *  セグメントを送信するが、SEQ は進めない。
    344320         */
    345321        if ((flags & TCP_FLG_FIN) && (cep->flags & TCP_CEP_FLG_SENT_FIN) &&
     
    351327
    352328        /*
    353          *  SEQ、ACK、フラグの設定。
     329         *  SEQ、ACK、フラグの設定。
    354330         */
    355331        if (len > 0 || (flags & (TCP_FLG_SYN | TCP_FLG_FIN)) || cep->timer[TCP_TIM_PERSIST] != 0)
     
    359335
    360336        /*
    361          *  rcv_nxt: 受信を期å¾
    362 ã—ている最小の SEQ
     337         *  rcv_nxt: 受信を期待している最小の SEQ
    363338         */
    364339        tcph->ack   = htonl(cep->rcv_nxt);
     
    366341
    367342        /*
    368          *  受信ウィンドの計算
     343         *  受信ウィンドの計算
    369344         *
    370          *  rbufsz: 受信用バッファサイズ
    371          *  maxseg: 相手の最大受信セグメントサイズ       
     345         *  rbufsz: 受信用バッファサイズ
     346         *  maxseg: 相手の最大受信セグメントサイズ     
    372347         */
    373348        if (win < (cep->rbufsz / 4) && win < cep->maxseg)
     
    375350
    376351        /*
    377          *  rcv_nxt: 受信を期å¾
    378 ã—ている最小の SEQ
    379          *  rcv_adv: 受信を期å¾
    380 ã—ている最大の SEQ
     352         *  rcv_nxt: 受信を期待している最小の SEQ
     353         *  rcv_adv: 受信を期待している最大の SEQ
    381354         */
    382355        if ((int32_t)win < (int32_t)(cep->rcv_adv - cep->rcv_nxt))
     
    388361
    389362        /*
    390          *  緊急ポインタの設定
     363         *  緊急ポインタの設定
    391364         */
    392365        if (SEQ_GT(cep->snd_up, cep->snd_nxt)) {
     
    403376
    404377        /*
    405          *  チェックサムを設定する。
     378         *  チェックサムを設定する。
    406379         */
    407380        tcph->sum = 0;
     
    409382                             GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len);
    410383
    411         /* ネットワークバッファ長を調整する。*/
     384        /* ネットワークバッファ長を調整する。*/
    412385        output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len);
    413386
    414387        /*
    415          *  タイマの調整
     388         *  タイマの調整
    416389         */
    417390        if ((cep->flags & TCP_CEP_FLG_FORCE) == 0 || cep->timer[TCP_TIM_PERSIST] == 0) {
     
    419392
    420393                /*
    421                  *  次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。
     394                 *  次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。
    422395                 */
    423396                if (flags & TCP_FLG_SYN)
     
    431404
    432405                /*
    433                  *  次に送信する SEQ (snd_nxt) が
    434                  *  送信した最大 SEQ (snd_max) より進んでいれば、
    435                  *  送信した最大 SEQ (snd_max) を更新する。
     406                 *  次に送信する SEQ (snd_nxt) が
     407                 *  送信した最大 SEQ (snd_max) より進んでいれば、
     408                 *  送信した最大 SEQ (snd_max) を更新する。
    436409                 */
    437410                if (SEQ_GT(cep->snd_nxt, cep->snd_max)) {
    438411                        cep->snd_max = cep->snd_nxt;
    439412                        /*
    440                          *  もし、往復時間計測を行っていなければ、
    441                          *  この送信に時間を合わせる。
     413                         *  もし、往復時間計測を行っていなければ、
     414                         *  この送信に時間を合わせる。
    442415                         */
    443416                        if (cep->rtt == 0) {
    444417                                cep->rtt   = 1;
    445                                 cep->rtseq = startseq;  /* 更新前の cep->snd_nxt */
    446                                 }
    447                         }
    448 
    449                 /*
    450                  *  もし設定されていないか、ACK または保留が発生していなければ、
    451                  *  再送タイマを設定する。設定する初期値は、
    452                  * 「滑らかな往復時間 + 2 × 往復時間変動」である。
    453                  *  再送時間のバックオフに使われるシフトカウントも初期化する。
     418                                cep->rtseq = startseq;  /* 更新前の cep->snd_nxt */
     419                                }
     420                        }
     421
     422                /*
     423                 *  もし設定されていないか、ACK または保留が発生していなければ、
     424                 *  再送タイマを設定する。設定する初期値は、
     425                 * 「滑らかな往復時間 + 2 × 往復時間変動」である。
     426                 *  再送時間のバックオフに使われるシフトカウントも初期化する。
    454427                 */
    455428                if (cep->timer[TCP_TIM_REXMT] == 0 && cep->snd_nxt != cep->snd_una) {
     
    463436
    464437        /*
    465          *  次に送信する SEQ (snd_nxt) + 今回送信するデータ数 (len) が
    466          *  送信した最大 SEQ (snd_max) より進んでいれば、
    467          *  送信した最大 SEQ (snd_max) を更新する。
     438         *  次に送信する SEQ (snd_nxt) + 今回送信するデータ数 (len) が
     439         *  送信した最大 SEQ (snd_max) より進んでいれば、
     440         *  送信した最大 SEQ (snd_max) を更新する。
    468441         */
    469442        else if (SEQ_GT(cep->snd_nxt + len, cep->snd_max))
     
    483456#endif  /* of #ifdef TCP_CFG_TRACE */
    484457
    485         /* ネットワーク層 (IP) の出力関数を呼び出す。*/
     458        /* ネットワーク層 (IP) の出力関数を呼び出す。*/
    486459        if ((error = IP_OUTPUT(output, TMO_TCP_OUTPUT)) != E_OK)
    487460                goto err_ret;
    488461
    489462        /*
    490          *  相手に伝えたウィンドウサイズ (win) が 0 以上で、
    491          *  受信を期å¾
    492 ã—ている最小の SEQ (rcv_nxt) + win が
    493          *  受信を期å¾
    494 ã—ている最大の SEQ (rcv_adv) より進んでいれば
    495          *  受信を期å¾
    496 ã—ている最大の SEQ を更新する。
     463         *  相手に伝えたウィンドウサイズ (win) が 0 以上で、
     464         *  受信を期待している最小の SEQ (rcv_nxt) + win が
     465         *  受信を期待している最大の SEQ (rcv_adv) より進んでいれば
     466         *  受信を期待している最大の SEQ を更新する。
    497467         */
    498468        if (win > 0 && SEQ_GT(cep->rcv_nxt + win, cep->rcv_adv)) {
     
    501471
    502472        /*
    503          *  最後に送信した ACK (last_ack_sent) を更新する。
     473         *  最後に送信した ACK (last_ack_sent) を更新する。
    504474         */
    505475        cep->last_ack_sent = cep->rcv_nxt;
    506476
    507477        /*
    508          *  フラグの設定を行う。
     478         *  フラグの設定を行う。
    509479         */
    510480        cep->flags &= ~(TCP_CEP_FLG_ACK_NOW | TCP_CEP_FLG_DEL_ACK);
     
    516486err_ret:
    517487        /*
    518          * 以下に関係しないフラグをクリアーする。
    519          * ・送受信ウィンドバッファの省コピー機能
    520          * ・動的な通信端点の生成・削除機能
     488         * 以下に関係しないフラグをクリアーする。
     489         * ・送受信ウィンドバッファの省コピー機能
     490         * ・動的な通信端点の生成・削除機能
    521491         */
    522492        cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK |
     
    527497
    528498/*
    529  *  tcp_output -- TCP 出力処理
     499 *  tcp_output -- TCP 出力処理
    530500 */
    531501
     
    540510
    541511        /*
    542          *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
    543          *  snd_max: 送信した最大 SEQ
     512         *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
     513         *  snd_max: 送信した最大 SEQ
    544514         */
    545515        idle = (cep->snd_max == cep->snd_una);
    546516
    547517        /*
    548          *  idle:   ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“
    549          *  rxtcur: 現在の再送タイムアウト
     518         *  idle:   アイドル時間
     519         *  rxtcur: 現在の再送タイムアウト
    550520         */
    551521        if (idle && cep->idle >= cep->rxtcur)
    552522
    553523                /*
    554                  *  snd_cwnd: 輻輳ウィンドサイズ
    555                  *  maxseg  : 相手の最大受信セグメントサイズ
     524                 *  snd_cwnd: 輻輳ウィンドサイズ
     525                 *  maxseg  : 相手の最大受信セグメントサイズ
    556526                 *
    557                  *  長時間アイドルだったのでスロースタート制御に設定する。
     527                 *  長時間アイドルだったのでスロースタート制御に設定する。
    558528                 */
    559529                cep->snd_cwnd = cep->maxseg;
     
    563533
    564534                /*
    565                  *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
    566                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     535                 *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
     536                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    567537                 *
    568                  *  doff: 送信を開始するオフセット。
    569                  *                                    swbuf_count (送信バッファにあるオクテット数)
     538                 *  doff: 送信を開始するオフセット。
     539                 *                                    swbuf_count (送信バッファにあるオクテット数)
    570540                 *    0                               V
    571541                 *    +-------------------------------------------+
     
    573543                 *    +-------------------------------------------+
    574544                 *    ^               ^
    575                  *    |<------------->snd_nxt (前回送信した SEQ)
     545                 *    |<------------->snd_nxt (前回送信した SEQ)
    576546                 *    |       doff
    577                  *    snd_una (まだ確認されていない)
     547                 *    snd_una (まだ確認されていない)
    578548                 */
    579549                doff = (uint_t)(cep->snd_nxt - cep->snd_una);
    580550
    581551                /*
    582                  *  snd_wnd:  相手の受信可能ウィンドサイズ
    583                  *  snd_cwnd: 輻輳ウィンドサイズ
     552                 *  snd_wnd:  相手の受信可能ウィンドサイズ
     553                 *  snd_cwnd: 輻輳ウィンドサイズ
    584554                 *
    585                  *  win: どちらか小さいウィンドサイズに設定する。
     555                 *  win: どちらか小さいウィンドサイズに設定する。
    586556                 */
    587557                win   = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    588558       
    589                 /* 出力フラグの設定 */
     559                /* 出力フラグの設定 */
    590560                flags = tcp_outflags[cep->fsm_state];
    591561                if (cep->flags & TCP_CEP_FLG_NEED_FIN)
     
    596566
    597567                        /*
    598                          *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
    599                          *  そうでなければ、持続タイムアウトをキャンセルし、
    600                          *  再送信回数 (rxtshift) を 0 にする。
     568                         *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
     569                         *  そうでなければ、持続タイムアウトをキャンセルし、
     570                         *  再送信回数 (rxtshift) を 0 にする。
    601571                         */
    602572                        if (win == 0) {
    603573
    604574                                /*
    605                                  *  doff:        送信するオクテット数。
    606                                  *  swbuf_count: 送信バッファの使用中サイズ
     575                                 *  doff:        送信するオクテット数。
     576                                 *  swbuf_count: 送信バッファの使用中サイズ
    607577                                 *
    608                                  *  送信バッファに残っているオクテットが、これから
    609                                  *  送信しようとしているオクテット数より多ければ
    610                                  *  FIN フラグをクリアする。
     578                                 *  送信バッファに残っているオクテットが、これから
     579                                 *  送信しようとしているオクテット数より多ければ
     580                                 *  FIN フラグをクリアする。
    611581                                 */
    612582                                if (doff < cep->swbuf_count)
     
    616586                        else {
    617587                                /*
    618                                  *  TCP_TIM_PERSIST: 持続タイマ
    619                                  *  rxtshift:        再送信回数の log(2)
     588                                 *  TCP_TIM_PERSIST: 持続タイマ
     589                                 *  rxtshift:        再送信回数の log(2)
    620590                                 */
    621591                                cep->timer[TCP_TIM_PERSIST] = 0;
     
    625595
    626596                /*
    627                  *  len: 今回送信するオクテット数
    628                  *        swbuf_count (送信バッファにあるオクテット数)
     597                 *  len: 今回送信するオクテット数
     598                 *        swbuf_count (送信バッファにあるオクテット数)
    629599                 *                                    |
    630600                 *    0                               V
     
    634604                 *    ^               ^<------------->
    635605                 *    |               |      len
    636                  *    |<------------->snd_nxt (前回送信した SEQ)
     606                 *    |<------------->snd_nxt (前回送信した SEQ)
    637607                 *    |       doff
    638                  *    snd_una (まだ確認されていない)
     608                 *    snd_una (まだ確認されていない)
    639609                 */
    640610                if (cep->swbuf_count < win)
     
    644614
    645615                /*
    646                  *  すでに送信されていれば、SYN ビットをオフする。
    647                  *  しかし、以下の条件では送信を控える。
     616                 *  すでに送信されていれば、SYN ビットをオフする。
     617                 *  しかし、以下の条件では送信を控える。
    648618                 *
    649                  *    ・状æ
    650 ‹ãŒ SYN 送信。
    651                  *    ・セグメントがデータを含んでいる。
     619                 *    ・状態が SYN 送信。
     620                 *    ・セグメントがデータを含んでいる。
    652621                 */
    653622                if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) {
    654623                        flags &= ~TCP_FLG_SYN;
    655                         doff --;                /* -1 は SYN フラグ分 */
    656                         len ++;                 /* +1 は SYN フラグ分 */
     624                        doff --;                /* -1 は SYN フラグ分 */
     625                        len ++;                 /* +1 は SYN フラグ分 */
    657626                        if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT)
    658627                                break;
     
    667636
    668637                        /*
    669                          *  len が 0 以下なら、0 に設定する。
    670                          *  もし、送信ウィンドウサイズが 0 なら、
    671                          *  再送信タイマをキャンセルし、
    672                          *  前回送信した SEQ (snd_nxt) を
    673                          *  確認された最大送信 SEQ (snd_una) に戻す。
    674                          *  そして、持続タイマーが止まっていれば、再設定する。
     638                         *  len が 0 以下なら、0 に設定する。
     639                         *  もし、送信ウィンドウサイズが 0 なら、
     640                         *  再送信タイマをキャンセルし、
     641                         *  前回送信した SEQ (snd_nxt) を
     642                         *  確認された最大送信 SEQ (snd_una) に戻す。
     643                         *  そして、持続タイマーが止まっていれば、再設定する。
    675644                         */
    676645                        len = 0;
     
    686655
    687656                /*
    688                  *  今回送信するオクテット数 (len) は、
    689                  *  相手の最大受信セグメントサイズ (maxseg) をè¶
    690 ãˆãªã„ようにする。
     657                 *  今回送信するオクテット数 (len) は、
     658                 *  相手の最大受信セグメントサイズ (maxseg) を超えないようにする。
    691659                 */
    692660                if (len > cep->maxseg) {
     
    696664
    697665                /*
    698                  *        swbuf_count (送信バッファにあるオクテット数)
     666                 *        swbuf_count (送信バッファにあるオクテット数)
    699667                 *                                           |
    700668                 *    0                                      V
     
    704672                 *    ^               ^<------------->
    705673                 *    |               |      len
    706                  *    |<------------->snd_nxt (前回送信した SEQ)
     674                 *    |<------------->snd_nxt (前回送信した SEQ)
    707675                 *    |       doff
    708                  *    snd_una (まだ確認されていない)
     676                 *    snd_una (まだ確認されていない)
    709677                 *
    710                  *  今回送信後も、送信バッファにデータが残っていれば
    711                  *  FIN フラグをクリアする。
     678                 *  今回送信後も、送信バッファにデータが残っていれば
     679                 *  FIN フラグをクリアする。
    712680                 */
    713681                if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count))
     
    715683
    716684                /*
    717                  *  ここから win は、受信ウィンドウサイズ。
    718                  *  受信バッファの空き容量
     685                 *  ここから win は、受信ウィンドウサイズ。
     686                 *  受信バッファの空き容量
    719687                 */
    720688                win = cep->rbufsz - cep->rwbuf_count;
    721689
    722690                /*
    723                  *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
     691                 *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
    724692                 *
    725                  *  以下の条件で、送信を行う。
     693                 *  以下の条件で、送信を行う。
    726694                 *
    727                  *    ・フルサイズ (maxseg) のセグメントを送ることができる。
    728                  *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
    729                  *      送ることができる。
    730                  *    ・送信バッファを空にでき、アイドルか非é
    731 å»¶ã‚ªãƒ—ションが有効なとき。
     695                 *    ・フルサイズ (maxseg) のセグメントを送ることができる。
     696                 *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
     697                 *      送ることができる。
     698                 *    ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。
    732699                 */
    733700                if (len) {
    734701
    735702                        /*
    736                          *  今回送信するオクテット数 (len) が
    737                          *  相手の最大受信セグメントサイズ (maxseg) に
    738                          *  一致するときは送信する。
     703                         *  今回送信するオクテット数 (len) が
     704                         *  相手の最大受信セグメントサイズ (maxseg) に
     705                         *  一致するときは送信する。
    739706                         */
    740707                        if (len == cep->maxseg) {
     
    744711
    745712                        /*
    746                          *  今回の送信で、送信バッファを空にでき、
    747                          *  アイドルか非 PUSH オプションが有効なとき。
     713                         *  今回の送信で、送信バッファを空にでき、
     714                         *  アイドルか非 PUSH オプションが有効なとき。
    748715                         */
    749716                        if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) &&
     
    755722
    756723                        /*
    757                          *  max_sndwnd: 今までの最大送信ウィンドサイズ
    758                          *  snd_nxt:    次に送信する SEQ
    759                          *  snd_max:    送信した最大 SEQ
     724                         *  max_sndwnd: 今までの最大送信ウィンドサイズ
     725                         *  snd_nxt:    次に送信する SEQ
     726                         *  snd_max:    送信した最大 SEQ
    760727                         *
    761                          *  次の条件では送信を行う。
     728                         *  次の条件では送信を行う。
    762729                         *
    763                          *    ・強制送信フラグがセットされている。
    764                          *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
    765                          *      相手の最大の受信ウィンドウサイズが 0 より大きい。
    766                          *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
    767                          *      つまり、再送するとき。
     730                         *    ・強制送信フラグがセットされている。
     731                         *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
     732                         *      相手の最大の受信ウィンドウサイズが 0 より大きい。
     733                         *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
     734                         *      つまり、再送するとき。
    768735                         */
    769736                        if ((cep->flags & TCP_CEP_FLG_FORCE) ||
     
    777744
    778745                /*
    779                  *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
     746                 *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
    780747                 *
    781                  *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
    782                  *  受信バッファ容量の 1/2 の、いずれか小さいほうの
    783                  *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
     748                 *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
     749                 *  受信バッファ容量の 1/2 の、いずれか小さいほうの
     750                 *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
    784751                 */
    785752                if (win > 0) {
     
    787754
    788755                        /*
    789                          *  win:              受信バッファの空き容量
    790                          *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
    791                          *  rcv_adv:          受信を期å¾
    792 ã—ている最大の SEQ
    793                          *  rcv_nxt:          受信を期å¾
    794 ã—ている最小の SEQ
     756                         *  win:              受信バッファの空き容量
     757                         *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
     758                         *  rcv_adv:          受信を期待している最大の SEQ
     759                         *  rcv_nxt:          受信を期待している最小の SEQ
    795760                         */
    796761                        if (win < MAX_TCP_WIN_SIZE)
     
    807772       
    808773                /*
    809                  *  ACK を送信する。
     774                 *  ACK を送信する。
    810775                 */
    811776                if (cep->flags & TCP_CEP_FLG_ACK_NOW) {
     
    830795
    831796                /*
    832                  *  snd_nxt: 次に送信する SEQ
    833                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     797                 *  snd_nxt: 次に送信する SEQ
     798                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    834799                 *
    835                  *  相手から FIN を受信し、まだ FIN を送信していないか、
    836                  *  送るデータがないときは、FIN を相手に届けるため、
    837                  *  セグメントを送信する。
     800                 *  相手から FIN を受信し、まだ FIN を送信していないか、
     801                 *  送るデータがないときは、FIN を相手に届けるため、
     802                 *  セグメントを送信する。
    838803                 */
    839804                if ((flags & TCP_FLG_FIN) &&
     
    844809
    845810                /*
    846                  *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
    847                  *  持続タイマを設定する。
     811                 *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
     812                 *  持続タイマを設定する。
    848813                 */
    849814                if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT  ] == 0 &&
     
    860825
    861826/*
    862  *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
     827 *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
    863828 */
    864829
     
    870835
    871836        /*
    872          *  snd_wnd:  相手の受信可能ウィンドサイズ
    873          *  snd_cwnd: 輻輳ウィンドサイズ
     837         *  snd_wnd:  相手の受信可能ウィンドサイズ
     838         *  snd_cwnd: 輻輳ウィンドサイズ
    874839         *
    875          *  win: どちらか小さいウィンドサイズに設定する。
     840         *  win: どちらか小さいウィンドサイズに設定する。
    876841         */
    877842        win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    878843
    879844        /*
    880          *  相手の受信ウィンドが閉じている場合は、開くまでå¾
    881 æ©Ÿã™ã‚‹ã€‚
     845         *  相手の受信ウィンドが閉じている場合は、開くまで待機する。
    882846         */
    883847        if (win == 0) {
     
    888852#ifdef TCP_CFG_NON_BLOCKING
    889853
    890                 /* ノンブロッキングコール */
     854                /* ノンブロッキングコール */
    891855                if (!IS_PTR_DEFINED(cep->callback)) {
    892856                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    893857
    894                         /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     858                        /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    895859                        cep->snd_tskid = TA_NULL;
    896860                        cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    907871                                                   (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) {
    908872
    909                         /* ネットワークバッファを予約する。*/
     873                        /* ネットワークバッファを予約する。*/
    910874                        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND;
    911875                        }
    912876                else {
    913877
    914                         /* 送信ウィンドバッファを初期化する。*/
     878                        /* 送信ウィンドバッファを初期化する。*/
    915879                        tcp_init_swbuf(cep);
    916880
     
    921885                                uint_t len;
    922886
    923                                 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
     887                                /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
    924888                                len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf);
    925889
    926890#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    927891
    928                                 /* コールバック関数を呼び出す。*/
     892                                /* コールバック関数を呼び出す。*/
    929893                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
    930894
    931895#else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    932896
    933                                 /* コールバック関数を呼び出す。*/
     897                                /* コールバック関数を呼び出す。*/
    934898                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
    935899
     
    937901
    938902
    939                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     903                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    940904                                cep->snd_tskid = TA_NULL;
    941905                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    947911                                uint_t len;
    948912
    949                                 /* 送信ウィンドバッファにデータを書き込む。*/
     913                                /* 送信ウィンドバッファにデータを書き込む。*/
    950914                                len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len);
    951915
    952916#ifdef TCP_CFG_EXTENTIONS
    953917
    954                                 /* 送信緊急ポインタを設定する。*/
     918                                /* 送信緊急ポインタを設定する。*/
    955919                                if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB)
    956920                                        cep->snd_up = cep->snd_una + len;
     
    958922#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    959923
    960                                 /* フラグを、送信可能に設定し、強制的に送信する。*/
     924                                /* フラグを、送信可能に設定し、強制的に送信する。*/
    961925                                cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT;
    962926#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    963927
    964                                 /* コールバック関数を呼び出す。*/
     928                                /* コールバック関数を呼び出す。*/
    965929                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
    966930
    967931#else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    968932
    969                                 /* コールバック関数を呼び出す。*/
     933                                /* コールバック関数を呼び出す。*/
    970934                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
    971935
     
    973937
    974938
    975                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     939                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    976940                                cep->snd_tskid = TA_NULL;
    977941                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    985949
    986950/*
    987  *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
     951 *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
    988952 */
    989953
     
    992956{
    993957        /*
    994          *  受信確認が完了し、ネットワークインタフェースからの
    995          *  出力も完了したときは、送信ウィンドバッファキューを解放する。
    996          */
    997 
    998         /* 送信ウィンドバッファの使用中サイズをリセットする。*/
     958         *  受信確認が完了し、ネットワークインタフェースからの
     959         *  出力も完了したときは、送信ウィンドバッファキューを解放する。
     960         */
     961
     962        /* 送信ウィンドバッファの使用中サイズをリセットする。*/
    999963        cep->swbuf_count = 0;
    1000964
    1001         /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
     965        /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
    1002966        syscall(rel_net_buf(cep->swbufq));
    1003967        cep->swbufq = NULL;
    1004968
    1005         /* フラグを空きに設定する。*/
     969        /* フラグを空きに設定する。*/
    1006970        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE;
    1007971
    1008         /* 送信ウィンドバッファに空きができたことを知らせる。*/
     972        /* 送信ウィンドバッファに空きができたことを知らせる。*/
    1009973        syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY));
    1010974
    1011         /* 送信ウィンドバッファの空きå¾
    1012 ã¡ã®ã¨ãã¯ã€TCP 出力タスクを起動する。*/
     975        /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/
    1013976        if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) {
    1014977                sig_sem(SEM_TCP_POST_OUTPUT);
     
    1019982
    1020983/*
    1021  *  TCP 出力タスク
     984 *  TCP 出力タスク
    1022985 */
    1023986
     
    10381001#ifdef SUPPORT_INET6
    10391002
    1040         /* IPv6 のステートレス・アドレス自動設定を実行する。*/
     1003        /* IPv6 のステートレス・アドレス自動設定を実行する。*/
    10411004        in6_if_up(IF_GET_IFNET());
    10421005
     
    10451008        while (true) {
    10461009
    1047                 /* 出力がポストされるまでå¾
    1048 ã¤ã€‚*/
     1010                /* 出力がポストされるまで待つ。*/
    10491011                syscall(wai_sem(SEM_TCP_POST_OUTPUT));
    10501012
     
    10711033
    10721034                        /*
    1073                          *  ネットワークインタフェースから送信が終わっていないときは、
    1074                          *  送信を予約する。
     1035                         *  ネットワークインタフェースから送信が終わっていないときは、
     1036                         *  送信を予約する。
    10751037                         */
    10761038                        if (cep->flags & TCP_CEP_FLG_POST_OUTPUT &&
     
    10871049
    10881050                        /*
    1089                          *  送信予約中に、ネットワークインタフェースから送信が終了したら、
    1090                          *  送信を開始する。ただし、完å
    1091 ¨ã«é€ä¿¡ãŒçµ‚了したときは何もしない。
     1051                         *  送信予約中に、ネットワークインタフェースから送信が終了したら、
     1052                         *  送信を開始する。ただし、完全に送信が終了したときは何もしない。
    10921053                         */
    10931054                        if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) {
     
    11121073
    11131074                                        /*
    1114                                          *  tcp_con_cep のノンブロッキングコールで、
    1115                                          *  未割当のの場合は、ポート番号を割り当てる。
    1116                                          *  p_myaddr が NADR (-1) か、
    1117                                          *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
     1075                                         *  tcp_con_cep のノンブロッキングコールで、
     1076                                         *  未割当のの場合は、ポート番号を割り当てる。
     1077                                         *  p_myaddr が NADR (-1) か、
     1078                                         *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
    11181079                                         */
    11191080                                        if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY)
     
    11361097                                                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    11371098
    1138                                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     1099                                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    11391100                                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
    11401101                                                cep->snd_tskid = TA_NULL;
     
    11481109
    11491110                                if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) {
    1150                                         /* コネクションを閉じる。*/
     1111                                        /* コネクションを閉じる。*/
    11511112                                        tcp_close(cep);
    11521113                                        cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT;
     
    11541115
    11551116                                if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) {
    1156                                         /* snd_nxt をå
    1157 ƒã«æˆ»ã™ã€‚*/
     1117                                        /* snd_nxt を元に戻す。*/
    11581118                                        if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt))
    11591119                                                cep->snd_nxt = cep->snd_old_nxt;
     
    11681128                        } while (ix != last_ix);
    11691129
    1170                 /* 次回は、処理した通信端点を後回しにする。*/
     1130                /* 次回は、処理した通信端点を後回しにする。*/
    11711131                last_ix = sel_ix;
    11721132                }
Note: See TracChangeset for help on using the changeset viewer.