Ignore:
Timestamp:
Aug 3, 2017, 10:46:41 PM (7 years ago)
Author:
coas-nagasima
Message:

プロパティの文字コードにUTF-8を追加、キーワードを削除

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_gr_sakura/trunk/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
    r317 r318  
    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$
     
    125113
    126114/*
    127  *  関数
     115 *  関数
    128116 */
    129117
     
    132120
    133121/*
    134  *  変数
     122 *  変数
    135123 */
    136124
    137 /* 出力時のフラグを FSM 状æ
    138 ‹ã«ã‚ˆã‚Šé¸æŠžã™ã‚‹ãŸã‚ã®è¡¨ */
     125/* 出力時のフラグを FSM 状態により選択するための表 */
    139126
    140127const static uint8_t tcp_outflags[] = {
    141         TCP_FLG_RST | TCP_FLG_ACK,      /*  0, クローズ                             */
    142         0,                              /*  1, 受動オープン                       */
    143         TCP_FLG_SYN,                    /*  2, 能動オープン、SYN 送信済み    */
    144         TCP_FLG_SYN | TCP_FLG_ACK,      /*  3, SYM を受信し、SYN 送信済み      */
    145         TCP_FLG_ACK,                    /*  4, コネクション開設完了           */
    146         TCP_FLG_ACK,                    /*  5, FIN 受信、クローズå¾
    147 ã¡             */
    148         TCP_FLG_FIN | TCP_FLG_ACK,      /*  6, 終了して、FIN 送信済み          */
    149         TCP_FLG_FIN | TCP_FLG_ACK,      /*  7, 終了、FIN 交換済み、ACK å¾
    150 ã¡     */
    151         TCP_FLG_FIN | TCP_FLG_ACK,      /*  8, FIN 受信、終了、ACK å¾
    152 ã¡             */
    153         TCP_FLG_ACK,                    /*  9, 終了、FIN 伝達確認受信、FINå¾
    154 ã¡     */
    155         TCP_FLG_ACK,                    /* 10, 終了、時間å¾
    156 ã¡                     */
     128        TCP_FLG_RST | TCP_FLG_ACK,      /*  0, クローズ                             */
     129        0,                              /*  1, 受動オープン                   */
     130        TCP_FLG_SYN,                    /*  2, 能動オープン、SYN 送信済み  */
     131        TCP_FLG_SYN | TCP_FLG_ACK,      /*  3, SYM を受信し、SYN 送信済み        */
     132        TCP_FLG_ACK,                    /*  4, コネクション開設完了               */
     133        TCP_FLG_ACK,                    /*  5, FIN 受信、クローズ待ち            */
     134        TCP_FLG_FIN | TCP_FLG_ACK,      /*  6, 終了して、FIN 送信済み            */
     135        TCP_FLG_FIN | TCP_FLG_ACK,      /*  7, 終了、FIN 交換済み、ACK 待ち       */
     136        TCP_FLG_FIN | TCP_FLG_ACK,      /*  8, FIN 受信、終了、ACK 待ち         */
     137        TCP_FLG_ACK,                    /*  9, 終了、FIN 伝達確認受信、FIN待ち      */
     138        TCP_FLG_ACK,                    /* 10, 終了、時間待ち                  */
    157139        };
    158140
    159141/*
    160  *  send_segment -- TCP 出力処理
     142 *  send_segment -- TCP 出力処理
    161143 */
    162144
     
    188170
    189171        /*
    190          *  セグメント長を、相手の最大受信セグメント長に調整する。
    191          *  もし、è¶
    192 ãˆã¦ã„る場合は、è¶
    193 ãˆãŸåˆ†ã‚’後で送信する。
    194          *  このため、FIN ビットをクリアする。
     172         *  セグメント長を、相手の最大受信セグメント長に調整する。
     173         *  もし、超えている場合は、超えた分を後で送信する。
     174         *  このため、FIN ビットをクリアする。
    195175         *
    196          *  オリジナルでは、t_maxopd を制限長にしているが、
    197          *  本実è£
    198 ã§ã¯ã€ç›¸æ‰‹ã®æœ€å¤§å—信セグメントにする。
     176         *  オリジナルでは、t_maxopd を制限長にしているが、
     177         *  本実装では、相手の最大受信セグメントにする。
    199178         */
    200179        if (len + optlen > cep->maxseg) {
     
    205184
    206185        /*
    207          *  送信バッファが空になるときは PUSH フラグを設定する。
     186         *  送信バッファが空になるときは PUSH フラグを設定する。
    208187         */
    209188        if (len && doff + len >= cep->swbuf_count)
     
    216195
    217196                /*
    218                  *  送信ウインドバッファが開放されないようにして、
    219                  *  ネットワークバッファを出力に移す。
     197                 *  送信ウインドバッファが開放されないようにして、
     198                 *  ネットワークバッファを出力に移す。
    220199                 */
    221200                cep->swbufq->flags |= NB_FLG_NOREL_IFOUT;
     
    225204
    226205                /*
    227                  *  ACK 完了状æ
    228 ‹ã§ã€ã“の関数が呼び出されることもある。
    229                  *  この時は、len を 0 にして、処理を継続する。
     206                 *  ACK 完了状態で、この関数が呼び出されることもある。
     207                 *  この時は、len を 0 にして、処理を継続する。
    230208                 */
    231209                len = 0;
     
    254232
    255233                /*
    256                  *  送信ウインドバッファが開放されないようにして、
    257                  *  ネットワークバッファを出力に移す。
     234                 *  送信ウインドバッファが開放されないようにして、
     235                 *  ネットワークバッファを出力に移す。
    258236                 */
    259237                cep->swbufq->flags |= NB_FLG_NOREL_IFOUT;
     
    263241
    264242                /*
    265                  *  ACK 完了状æ
    266 ‹ã§ã€ã“の関数が呼び出されることもある。
    267                  *  この時は、len を 0 にして、処理を継続する。
     243                 *  ACK 完了状態で、この関数が呼び出されることもある。
     244                 *  この時は、len を 0 にして、処理を継続する。
    268245                 */
    269246                len = 0;
     
    290267
    291268        /*
    292          *  TCP オプションの設定を行う。
    293          *  本実è£
    294 ã§ã¯ã€æœ€å¤§ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºã®ã¿è¨­å®šã™ã‚‹ã€‚
     269         *  TCP オプションの設定を行う。
     270         *  本実装では、最大セグメントサイズのみ設定する。
    295271         */
    296272        hdr_offset = IF_IP_TCP_HDR_OFFSET(output);
     
    309285                }
    310286
    311         /* TCP SDU に送信データをコピーする。*/
     287        /* TCP SDU に送信データをコピーする。*/
    312288
    313289        if (len > 0) {
     
    335311
    336312        /*
    337          * snd_max: 送信した最大 SEQ
    338          * snd_nxt: 次に送信する SEQ
     313         * snd_max: 送信した最大 SEQ
     314         * snd_nxt: 次に送信する SEQ
    339315         *
    340          *  相手から FIN を受信し、まだ FIN を送信していないか、
    341          *  送るデータがないときは、FIN を相手に届けるため、
    342          *  セグメントを送信するが、SEQ は進めない。
     316         *  相手から FIN を受信し、まだ FIN を送信していないか、
     317         *  送るデータがないときは、FIN を相手に届けるため、
     318         *  セグメントを送信するが、SEQ は進めない。
    343319         */
    344320        if ((flags & TCP_FLG_FIN) && (cep->flags & TCP_CEP_FLG_SENT_FIN) &&
     
    350326
    351327        /*
    352          *  SEQ、ACK、フラグの設定。
     328         *  SEQ、ACK、フラグの設定。
    353329         */
    354330        if (len > 0 || (flags & (TCP_FLG_SYN | TCP_FLG_FIN)) || cep->timer[TCP_TIM_PERSIST] != 0)
     
    358334
    359335        /*
    360          *  rcv_nxt: 受信を期å¾
    361 ã—ている最小の SEQ
     336         *  rcv_nxt: 受信を期待している最小の SEQ
    362337         */
    363338        tcph->ack   = htonl(cep->rcv_nxt);
     
    365340
    366341        /*
    367          *  受信ウィンドの計算
     342         *  受信ウィンドの計算
    368343         *
    369          *  rbufsz: 受信用バッファサイズ
    370          *  maxseg: 相手の最大受信セグメントサイズ       
     344         *  rbufsz: 受信用バッファサイズ
     345         *  maxseg: 相手の最大受信セグメントサイズ     
    371346         */
    372347        if (win < (cep->rbufsz / 4) && win < cep->maxseg)
     
    374349
    375350        /*
    376          *  rcv_nxt: 受信を期å¾
    377 ã—ている最小の SEQ
    378          *  rcv_adv: 受信を期å¾
    379 ã—ている最大の SEQ
     351         *  rcv_nxt: 受信を期待している最小の SEQ
     352         *  rcv_adv: 受信を期待している最大の SEQ
    380353         */
    381354        if ((int32_t)win < (int32_t)(cep->rcv_adv - cep->rcv_nxt))
     
    387360
    388361        /*
    389          *  緊急ポインタの設定
     362         *  緊急ポインタの設定
    390363         */
    391364        if (SEQ_GT(cep->snd_up, cep->snd_nxt)) {
     
    402375
    403376        /*
    404          *  チェックサムを設定する。
     377         *  チェックサムを設定する。
    405378         */
    406379        tcph->sum = 0;
    407380        tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset, GET_TCP_HDR_SIZE(output, hdr_offset) + len);
    408381
    409         /* ネットワークバッファ長を調整する。*/
     382        /* ネットワークバッファ長を調整する。*/
    410383        output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset) + len);
    411384
    412385        /*
    413          *  タイマの調整
     386         *  タイマの調整
    414387         */
    415388        if ((cep->flags & TCP_CEP_FLG_FORCE) == 0 || cep->timer[TCP_TIM_PERSIST] == 0) {
     
    417390
    418391                /*
    419                  *  次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。
     392                 *  次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。
    420393                 */
    421394                if (flags & TCP_FLG_SYN)
     
    429402
    430403                /*
    431                  *  次に送信する SEQ (snd_nxt) が
    432                  *  送信した最大 SEQ (snd_max) より進んでいれば、
    433                  *  送信した最大 SEQ (snd_max) を更新する。
     404                 *  次に送信する SEQ (snd_nxt) が
     405                 *  送信した最大 SEQ (snd_max) より進んでいれば、
     406                 *  送信した最大 SEQ (snd_max) を更新する。
    434407                 */
    435408                if (SEQ_GT(cep->snd_nxt, cep->snd_max)) {
    436409                        cep->snd_max = cep->snd_nxt;
    437410                        /*
    438                          *  もし、往復時間計測を行っていなければ、
    439                          *  この送信に時間を合わせる。
     411                         *  もし、往復時間計測を行っていなければ、
     412                         *  この送信に時間を合わせる。
    440413                         */
    441414                        if (cep->rtt == 0) {
    442415                                cep->rtt   = 1;
    443                                 cep->rtseq = startseq;  /* 更新前の cep->snd_nxt */
    444                                 }
    445                         }
    446 
    447                 /*
    448                  *  もし設定されていないか、ACK または保留が発生していなければ、
    449                  *  再送タイマを設定する。設定する初期値は、
    450                  * 「滑らかな往復時間 + 2 × 往復時間変動」である。
    451                  *  再送時間のバックオフに使われるシフトカウントも初期化する。
     416                                cep->rtseq = startseq;  /* 更新前の cep->snd_nxt */
     417                                }
     418                        }
     419
     420                /*
     421                 *  もし設定されていないか、ACK または保留が発生していなければ、
     422                 *  再送タイマを設定する。設定する初期値は、
     423                 * 「滑らかな往復時間 + 2 × 往復時間変動」である。
     424                 *  再送時間のバックオフに使われるシフトカウントも初期化する。
    452425                 */
    453426                if (cep->timer[TCP_TIM_REXMT] == 0 && cep->snd_nxt != cep->snd_una) {
     
    461434
    462435        /*
    463          *  次に送信する SEQ (snd_nxt) + 今回送信するデータ数 (len) が
    464          *  送信した最大 SEQ (snd_max) より進んでいれば、
    465          *  送信した最大 SEQ (snd_max) を更新する。
     436         *  次に送信する SEQ (snd_nxt) + 今回送信するデータ数 (len) が
     437         *  送信した最大 SEQ (snd_max) より進んでいれば、
     438         *  送信した最大 SEQ (snd_max) を更新する。
    466439         */
    467440        else if (SEQ_GT(cep->snd_nxt + len, cep->snd_max))
     
    481454#endif  /* of #ifdef TCP_CFG_TRACE */
    482455
    483         /* ネットワーク層 (IP) の出力関数を呼び出す。*/
     456        /* ネットワーク層 (IP) の出力関数を呼び出す。*/
    484457        if ((error = IP_OUTPUT(output, TMO_TCP_OUTPUT)) != E_OK)
    485458                goto err_ret;
    486459
    487460        /*
    488          *  相手に伝えたウィンドウサイズ (win) が 0 以上で、
    489          *  受信を期å¾
    490 ã—ている最小の SEQ (rcv_nxt) + win が
    491          *  受信を期å¾
    492 ã—ている最大の SEQ (rcv_adv) より進んでいれば
    493          *  受信を期å¾
    494 ã—ている最大の SEQ を更新する。
     461         *  相手に伝えたウィンドウサイズ (win) が 0 以上で、
     462         *  受信を期待している最小の SEQ (rcv_nxt) + win が
     463         *  受信を期待している最大の SEQ (rcv_adv) より進んでいれば
     464         *  受信を期待している最大の SEQ を更新する。
    495465         */
    496466        if (win > 0 && SEQ_GT(cep->rcv_nxt + win, cep->rcv_adv)) {
     
    499469
    500470        /*
    501          *  最後に送信した ACK (last_ack_sent) を更新する。
     471         *  最後に送信した ACK (last_ack_sent) を更新する。
    502472         */
    503473        cep->last_ack_sent = cep->rcv_nxt;
    504474
    505475        /*
    506          *  フラグの設定を行う。
     476         *  フラグの設定を行う。
    507477         */
    508478        cep->flags &= ~(TCP_CEP_FLG_ACK_NOW | TCP_CEP_FLG_DEL_ACK);
     
    514484err_ret:
    515485        /*
    516          * 以下に関係しないフラグをクリアーする。
    517          * ・送受信ウィンドバッファの省コピー機能
    518          * ・動的な通信端点の生成・削除機能
     486         * 以下に関係しないフラグをクリアーする。
     487         * ・送受信ウィンドバッファの省コピー機能
     488         * ・動的な通信端点の生成・削除機能
    519489         */
    520490        cep->flags &= TCP_CEP_FLG_NOT_CLEAR;
     
    524494
    525495/*
    526  *  tcp_output -- TCP 出力処理
     496 *  tcp_output -- TCP 出力処理
    527497 */
    528498
     
    537507
    538508        /*
    539          *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
    540          *  snd_max: 送信した最大 SEQ
     509         *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
     510         *  snd_max: 送信した最大 SEQ
    541511         */
    542512        idle = (cep->snd_max == cep->snd_una);
    543513
    544514        /*
    545          *  idle:   ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“
    546          *  rxtcur: 現在の再送タイムアウト
     515         *  idle:   アイドル時間
     516         *  rxtcur: 現在の再送タイムアウト
    547517         */
    548518        if (idle && cep->idle >= cep->rxtcur)
    549519
    550520                /*
    551                  *  snd_cwnd: 輻輳ウィンドサイズ
    552                  *  maxseg  : 相手の最大受信セグメントサイズ
     521                 *  snd_cwnd: 輻輳ウィンドサイズ
     522                 *  maxseg  : 相手の最大受信セグメントサイズ
    553523                 *
    554                  *  長時間アイドルだったのでスロースタート制御に設定する。
     524                 *  長時間アイドルだったのでスロースタート制御に設定する。
    555525                 */
    556526                cep->snd_cwnd = cep->maxseg;
     
    560530
    561531                /*
    562                  *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
    563                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     532                 *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
     533                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    564534                 *
    565                  *  doff: 送信を開始するオフセット。
    566                  *                                    swbuf_count (送信バッファにあるオクテット数)
     535                 *  doff: 送信を開始するオフセット。
     536                 *                                    swbuf_count (送信バッファにあるオクテット数)
    567537                 *    0                               V
    568538                 *    +-------------------------------------------+
     
    570540                 *    +-------------------------------------------+
    571541                 *    ^               ^
    572                  *    |<------------->snd_nxt (前回送信した SEQ)
     542                 *    |<------------->snd_nxt (前回送信した SEQ)
    573543                 *    |       doff
    574                  *    snd_una (まだ確認されていない)
     544                 *    snd_una (まだ確認されていない)
    575545                 */
    576546                doff = (uint_t)(cep->snd_nxt - cep->snd_una);
    577547
    578548                /*
    579                  *  snd_wnd:  相手の受信可能ウィンドサイズ
    580                  *  snd_cwnd: 輻輳ウィンドサイズ
     549                 *  snd_wnd:  相手の受信可能ウィンドサイズ
     550                 *  snd_cwnd: 輻輳ウィンドサイズ
    581551                 *
    582                  *  win: どちらか小さいウィンドサイズに設定する。
     552                 *  win: どちらか小さいウィンドサイズに設定する。
    583553                 */
    584554                win   = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    585555       
    586                 /* 出力フラグの設定 */
     556                /* 出力フラグの設定 */
    587557                flags = tcp_outflags[cep->fsm_state];
    588558                if (cep->flags & TCP_CEP_FLG_NEED_FIN)
     
    593563
    594564                        /*
    595                          *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
    596                          *  そうでなければ、持続タイムアウトをキャンセルし、
    597                          *  再送信回数 (rxtshift) を 0 にする。
     565                         *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
     566                         *  そうでなければ、持続タイムアウトをキャンセルし、
     567                         *  再送信回数 (rxtshift) を 0 にする。
    598568                         */
    599569                        if (win == 0) {
    600570
    601571                                /*
    602                                  *  doff:        送信するオクテット数。
    603                                  *  swbuf_count: 送信バッファの使用中サイズ
     572                                 *  doff:        送信するオクテット数。
     573                                 *  swbuf_count: 送信バッファの使用中サイズ
    604574                                 *
    605                                  *  送信バッファに残っているオクテットが、これから
    606                                  *  送信しようとしているオクテット数より多ければ
    607                                  *  FIN フラグをクリアする。
     575                                 *  送信バッファに残っているオクテットが、これから
     576                                 *  送信しようとしているオクテット数より多ければ
     577                                 *  FIN フラグをクリアする。
    608578                                 */
    609579                                if (doff < cep->swbuf_count)
     
    613583                        else {
    614584                                /*
    615                                  *  TCP_TIM_PERSIST: 持続タイマ
    616                                  *  rxtshift:        再送信回数の log(2)
     585                                 *  TCP_TIM_PERSIST: 持続タイマ
     586                                 *  rxtshift:        再送信回数の log(2)
    617587                                 */
    618588                                cep->timer[TCP_TIM_PERSIST] = 0;
     
    622592
    623593                /*
    624                  *  len: 今回送信するオクテット数
    625                  *        swbuf_count (送信バッファにあるオクテット数)
     594                 *  len: 今回送信するオクテット数
     595                 *        swbuf_count (送信バッファにあるオクテット数)
    626596                 *                                    |
    627597                 *    0                               V
     
    631601                 *    ^               ^<------------->
    632602                 *    |               |      len
    633                  *    |<------------->snd_nxt (前回送信した SEQ)
     603                 *    |<------------->snd_nxt (前回送信した SEQ)
    634604                 *    |       doff
    635                  *    snd_una (まだ確認されていない)
     605                 *    snd_una (まだ確認されていない)
    636606                 */
    637607                if (cep->swbuf_count < win)
     
    641611
    642612                /*
    643                  *  すでに送信されていれば、SYN ビットをオフする。
    644                  *  しかし、以下の条件では送信を控える。
     613                 *  すでに送信されていれば、SYN ビットをオフする。
     614                 *  しかし、以下の条件では送信を控える。
    645615                 *
    646                  *    ・状æ
    647 ‹ãŒ SYN 送信。
    648                  *    ・セグメントがデータを含んでいる。
     616                 *    ・状態が SYN 送信。
     617                 *    ・セグメントがデータを含んでいる。
    649618                 */
    650619                if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) {
    651620                        flags &= ~TCP_FLG_SYN;
    652                         doff --;                /* -1 は SYN フラグ分 */
    653                         len ++;                 /* +1 は SYN フラグ分 */
     621                        doff --;                /* -1 は SYN フラグ分 */
     622                        len ++;                 /* +1 は SYN フラグ分 */
    654623                        if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT)
    655624                                break;
     
    664633
    665634                        /*
    666                          *  len が 0 以下なら、0 に設定する。
    667                          *  もし、送信ウィンドウサイズが 0 なら、
    668                          *  再送信タイマをキャンセルし、
    669                          *  前回送信した SEQ (snd_nxt) を
    670                          *  確認された最大送信 SEQ (snd_una) に戻す。
    671                          *  そして、持続タイマーが止まっていれば、再設定する。
     635                         *  len が 0 以下なら、0 に設定する。
     636                         *  もし、送信ウィンドウサイズが 0 なら、
     637                         *  再送信タイマをキャンセルし、
     638                         *  前回送信した SEQ (snd_nxt) を
     639                         *  確認された最大送信 SEQ (snd_una) に戻す。
     640                         *  そして、持続タイマーが止まっていれば、再設定する。
    672641                         */
    673642                        len = 0;
     
    683652
    684653                /*
    685                  *  今回送信するオクテット数 (len) は、
    686                  *  相手の最大受信セグメントサイズ (maxseg) をè¶
    687 ãˆãªã„ようにする。
     654                 *  今回送信するオクテット数 (len) は、
     655                 *  相手の最大受信セグメントサイズ (maxseg) を超えないようにする。
    688656                 */
    689657                if (len > cep->maxseg) {
     
    693661
    694662                /*
    695                  *        swbuf_count (送信バッファにあるオクテット数)
     663                 *        swbuf_count (送信バッファにあるオクテット数)
    696664                 *                                           |
    697665                 *    0                                      V
     
    701669                 *    ^               ^<------------->
    702670                 *    |               |      len
    703                  *    |<------------->snd_nxt (前回送信した SEQ)
     671                 *    |<------------->snd_nxt (前回送信した SEQ)
    704672                 *    |       doff
    705                  *    snd_una (まだ確認されていない)
     673                 *    snd_una (まだ確認されていない)
    706674                 *
    707                  *  今回送信後も、送信バッファにデータが残っていれば
    708                  *  FIN フラグをクリアする。
     675                 *  今回送信後も、送信バッファにデータが残っていれば
     676                 *  FIN フラグをクリアする。
    709677                 */
    710678                if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count))
     
    712680
    713681                /*
    714                  *  ここから win は、受信ウィンドウサイズ。
    715                  *  受信バッファの空き容量
     682                 *  ここから win は、受信ウィンドウサイズ。
     683                 *  受信バッファの空き容量
    716684                 */
    717685                win = cep->rbufsz - cep->rwbuf_count;
    718686
    719687                /*
    720                  *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
     688                 *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
    721689                 *
    722                  *  以下の条件で、送信を行う。
     690                 *  以下の条件で、送信を行う。
    723691                 *
    724                  *    ・フルサイズ (maxseg) のセグメントを送ることができる。
    725                  *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
    726                  *      送ることができる。
    727                  *    ・送信バッファを空にでき、アイドルか非é
    728 å»¶ã‚ªãƒ—ションが有効なとき。
     692                 *    ・フルサイズ (maxseg) のセグメントを送ることができる。
     693                 *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
     694                 *      送ることができる。
     695                 *    ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。
    729696                 */
    730697                if (len) {
    731698
    732699                        /*
    733                          *  今回送信するオクテット数 (len) が
    734                          *  相手の最大受信セグメントサイズ (maxseg) に
    735                          *  一致するときは送信する。
     700                         *  今回送信するオクテット数 (len) が
     701                         *  相手の最大受信セグメントサイズ (maxseg) に
     702                         *  一致するときは送信する。
    736703                         */
    737704                        if (len == cep->maxseg) {
     
    741708
    742709                        /*
    743                          *  今回の送信で、送信バッファを空にでき、
    744                          *  アイドルか非 PUSH オプションが有効なとき。
     710                         *  今回の送信で、送信バッファを空にでき、
     711                         *  アイドルか非 PUSH オプションが有効なとき。
    745712                         */
    746713                        if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) &&
     
    752719
    753720                        /*
    754                          *  max_sndwnd: 今までの最大送信ウィンドサイズ
    755                          *  snd_nxt:    次に送信する SEQ
    756                          *  snd_max:    送信した最大 SEQ
     721                         *  max_sndwnd: 今までの最大送信ウィンドサイズ
     722                         *  snd_nxt:    次に送信する SEQ
     723                         *  snd_max:    送信した最大 SEQ
    757724                         *
    758                          *  次の条件では送信を行う。
     725                         *  次の条件では送信を行う。
    759726                         *
    760                          *    ・強制送信フラグがセットされている。
    761                          *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
    762                          *      相手の最大の受信ウィンドウサイズが 0 より大きい。
    763                          *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
    764                          *      つまり、再送するとき。
     727                         *    ・強制送信フラグがセットされている。
     728                         *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
     729                         *      相手の最大の受信ウィンドウサイズが 0 より大きい。
     730                         *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
     731                         *      つまり、再送するとき。
    765732                         */
    766733                        if ((cep->flags & TCP_CEP_FLG_FORCE) ||
     
    774741
    775742                /*
    776                  *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
     743                 *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
    777744                 *
    778                  *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
    779                  *  受信バッファ容量の 1/2 の、いずれか小さいほうの
    780                  *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
     745                 *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
     746                 *  受信バッファ容量の 1/2 の、いずれか小さいほうの
     747                 *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
    781748                 */
    782749                if (win > 0) {
     
    784751
    785752                        /*
    786                          *  win:              受信バッファの空き容量
    787                          *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
    788                          *  rcv_adv:          受信を期å¾
    789 ã—ている最大の SEQ
    790                          *  rcv_nxt:          受信を期å¾
    791 ã—ている最小の SEQ
     753                         *  win:              受信バッファの空き容量
     754                         *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
     755                         *  rcv_adv:          受信を期待している最大の SEQ
     756                         *  rcv_nxt:          受信を期待している最小の SEQ
    792757                         */
    793758                        if (win < MAX_TCP_WIN_SIZE)
     
    804769       
    805770                /*
    806                  *  ACK を送信する。
     771                 *  ACK を送信する。
    807772                 */
    808773                if (cep->flags & TCP_CEP_FLG_ACK_NOW) {
     
    827792
    828793                /*
    829                  *  snd_nxt: 次に送信する SEQ
    830                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     794                 *  snd_nxt: 次に送信する SEQ
     795                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    831796                 *
    832                  *  相手から FIN を受信し、まだ FIN を送信していないか、
    833                  *  送るデータがないときは、FIN を相手に届けるため、
    834                  *  セグメントを送信する。
     797                 *  相手から FIN を受信し、まだ FIN を送信していないか、
     798                 *  送るデータがないときは、FIN を相手に届けるため、
     799                 *  セグメントを送信する。
    835800                 */
    836801                if ((flags & TCP_FLG_FIN) &&
     
    841806
    842807                /*
    843                  *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
    844                  *  持続タイマを設定する。
     808                 *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
     809                 *  持続タイマを設定する。
    845810                 */
    846811                if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT  ] == 0 &&
     
    857822
    858823/*
    859  *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
     824 *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
    860825 */
    861826
     
    867832
    868833        /*
    869          *  snd_wnd:  相手の受信可能ウィンドサイズ
    870          *  snd_cwnd: 輻輳ウィンドサイズ
     834         *  snd_wnd:  相手の受信可能ウィンドサイズ
     835         *  snd_cwnd: 輻輳ウィンドサイズ
    871836         *
    872          *  win: どちらか小さいウィンドサイズに設定する。
     837         *  win: どちらか小さいウィンドサイズに設定する。
    873838         */
    874839        win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    875840
    876841        /*
    877          *  相手の受信ウィンドが閉じている場合は、開くまでå¾
    878 æ©Ÿã™ã‚‹ã€‚
     842         *  相手の受信ウィンドが閉じている場合は、開くまで待機する。
    879843         */
    880844        if (win == 0) {
     
    885849#ifdef TCP_CFG_NON_BLOCKING
    886850
    887                 /* ノンブロッキングコール */
     851                /* ノンブロッキングコール */
    888852                if (!IS_PTR_DEFINED(cep->callback)) {
    889853                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    890854
    891                         /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     855                        /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    892856                        cep->snd_tskid = TA_NULL;
    893857                        cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    904868                                                   (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) {
    905869
    906                         /* ネットワークバッファを予約する。*/
     870                        /* ネットワークバッファを予約する。*/
    907871                        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND;
    908872                        }
    909873                else {
    910874
    911                         /* 送信ウィンドバッファを初期化する。*/
     875                        /* 送信ウィンドバッファを初期化する。*/
    912876                        tcp_init_swbuf(cep);
    913877
     
    918882                                uint_t len;
    919883
    920                                 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
     884                                /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
    921885                                len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf);
    922886
    923                                 /* コールバック関数を呼び出す。*/
     887                                /* コールバック関数を呼び出す。*/
    924888#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    925889                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
     
    929893
    930894
    931                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     895                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    932896                                cep->snd_tskid = TA_NULL;
    933897                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    939903                                uint_t len;
    940904
    941                                 /* 送信ウィンドバッファにデータを書き込む。*/
     905                                /* 送信ウィンドバッファにデータを書き込む。*/
    942906                                len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len);
    943907
    944908#ifdef TCP_CFG_EXTENTIONS
    945909
    946                                 /* 送信緊急ポインタを設定する。*/
     910                                /* 送信緊急ポインタを設定する。*/
    947911                                if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB)
    948912                                        cep->snd_up = cep->snd_una + len;
     
    950914#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    951915
    952                                 /* フラグを、送信可能に設定し、強制的に送信する。*/
     916                                /* フラグを、送信可能に設定し、強制的に送信する。*/
    953917                                cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT;
    954918
    955                                 /* コールバック関数を呼び出す。*/
     919                                /* コールバック関数を呼び出す。*/
    956920#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    957921                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
     
    961925
    962926
    963                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     927                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    964928                                cep->snd_tskid = TA_NULL;
    965929                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    973937
    974938/*
    975  *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
     939 *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
    976940 */
    977941
     
    980944{
    981945        /*
    982          *  受信確認が完了し、ネットワークインタフェースからの
    983          *  出力も完了したときは、送信ウィンドバッファキューを解放する。
    984          */
    985 
    986         /* 送信ウィンドバッファの使用中サイズをリセットする。*/
     946         *  受信確認が完了し、ネットワークインタフェースからの
     947         *  出力も完了したときは、送信ウィンドバッファキューを解放する。
     948         */
     949
     950        /* 送信ウィンドバッファの使用中サイズをリセットする。*/
    987951        cep->swbuf_count = 0;
    988952
    989         /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
     953        /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
    990954        syscall(rel_net_buf(cep->swbufq));
    991955        cep->swbufq = NULL;
    992956
    993         /* フラグを空きに設定する。*/
     957        /* フラグを空きに設定する。*/
    994958        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE;
    995959
    996         /* 送信ウィンドバッファに空きができたことを知らせる。*/
     960        /* 送信ウィンドバッファに空きができたことを知らせる。*/
    997961        syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY));
    998962
    999         /* 送信ウィンドバッファの空きå¾
    1000 ã¡ã®ã¨ãã¯ã€TCP 出力タスクを起動する。*/
     963        /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/
    1001964        if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) {
    1002965                sig_sem(SEM_TCP_POST_OUTPUT);
     
    1007970
    1008971/*
    1009  *  TCP 出力タスク
     972 *  TCP 出力タスク
    1010973 */
    1011974
     
    1026989#ifdef _IP6_CFG
    1027990
    1028         /* IPv6 のステートレス・アドレス自動設定を実行する。*/
     991        /* IPv6 のステートレス・アドレス自動設定を実行する。*/
    1029992        in6_if_up(IF_GET_IFNET());
    1030993
     
    1033996        while (true) {
    1034997
    1035                 /* 出力がポストされるまでå¾
    1036 ã¤ã€‚*/
     998                /* 出力がポストされるまで待つ。*/
    1037999                syscall(wai_sem(SEM_TCP_POST_OUTPUT));
    10381000
     
    10591021
    10601022                        /*
    1061                          *  ネットワークインタフェースから送信が終わっていないときは、
    1062                          *  送信を予約する。
     1023                         *  ネットワークインタフェースから送信が終わっていないときは、
     1024                         *  送信を予約する。
    10631025                         */
    10641026                        if (cep->flags & TCP_CEP_FLG_POST_OUTPUT &&
     
    10751037
    10761038                        /*
    1077                          *  送信予約中に、ネットワークインタフェースから送信が終了したら、
    1078                          *  送信を開始する。ただし、完å
    1079 ¨ã«é€ä¿¡ãŒçµ‚了したときは何もしない。
     1039                         *  送信予約中に、ネットワークインタフェースから送信が終了したら、
     1040                         *  送信を開始する。ただし、完全に送信が終了したときは何もしない。
    10801041                         */
    10811042                        if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) {
     
    11001061
    11011062                                        /*
    1102                                          *  tcp_con_cep のノンブロッキングコールで、
    1103                                          *  未割当のの場合は、ポート番号を割り当てる。
    1104                                          *  p_myaddr が NADR (-1) か、
    1105                                          *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
     1063                                         *  tcp_con_cep のノンブロッキングコールで、
     1064                                         *  未割当のの場合は、ポート番号を割り当てる。
     1065                                         *  p_myaddr が NADR (-1) か、
     1066                                         *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
    11061067                                         */
    11071068                                        if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY)
     
    11181079                                                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    11191080
    1120                                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     1081                                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    11211082                                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
    11221083                                                cep->snd_tskid = TA_NULL;
     
    11301091
    11311092                                if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) {
    1132                                         /* コネクションを閉じる。*/
     1093                                        /* コネクションを閉じる。*/
    11331094                                        tcp_close(cep);
    11341095                                        cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT;
     
    11361097
    11371098                                if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) {
    1138                                         /* snd_nxt をå
    1139 ƒã«æˆ»ã™ã€‚*/
     1099                                        /* snd_nxt を元に戻す。*/
    11401100                                        if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt))
    11411101                                                cep->snd_nxt = cep->snd_old_nxt;
     
    11501110                        } while (ix != last_ix);
    11511111
    1152                 /* 次回は、処理した通信端点を後回しにする。*/
     1112                /* 次回は、処理した通信端点を後回しにする。*/
    11531113                last_ix = sel_ix;
    11541114                }
Note: See TracChangeset for help on using the changeset viewer.