Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/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
    r388 r389  
    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)) {
     
    404377
    405378        /*
    406          *  チェックサムを設定する。
     379         *  チェックサムを設定する。
    407380         */
    408381        tcph->sum = 0;
    409382        tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset, GET_TCP_HDR_SIZE(output, hdr_offset) + len);
    410383
    411         /* ネットワークバッファ長を調整する。*/
     384        /* ネットワークバッファ長を調整する。*/
    412385        output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, 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_NOT_CLEAR;
     
    526496
    527497/*
    528  *  tcp_output -- TCP 出力処理
     498 *  tcp_output -- TCP 出力処理
    529499 */
    530500
     
    539509
    540510        /*
    541          *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
    542          *  snd_max: 送信した最大 SEQ
     511         *  snd_una: 未確認の最小送信 SEQ        または、確認された最大送信 SEQ
     512         *  snd_max: 送信した最大 SEQ
    543513         */
    544514        idle = (cep->snd_max == cep->snd_una);
    545515
    546516        /*
    547          *  idle:   ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“
    548          *  rxtcur: 現在の再送タイムアウト
     517         *  idle:   アイドル時間
     518         *  rxtcur: 現在の再送タイムアウト
    549519         */
    550520        if (idle && cep->idle >= cep->rxtcur)
    551521
    552522                /*
    553                  *  snd_cwnd: 輻輳ウィンドサイズ
    554                  *  maxseg  : 相手の最大受信セグメントサイズ
     523                 *  snd_cwnd: 輻輳ウィンドサイズ
     524                 *  maxseg  : 相手の最大受信セグメントサイズ
    555525                 *
    556                  *  長時間アイドルだったのでスロースタート制御に設定する。
     526                 *  長時間アイドルだったのでスロースタート制御に設定する。
    557527                 */
    558528                cep->snd_cwnd = cep->maxseg;
     
    562532
    563533                /*
    564                  *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
    565                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     534                 *  snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ
     535                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    566536                 *
    567                  *  doff: 送信を開始するオフセット。
    568                  *                                    swbuf_count (送信バッファにあるオクテット数)
     537                 *  doff: 送信を開始するオフセット。
     538                 *                                    swbuf_count (送信バッファにあるオクテット数)
    569539                 *    0                               V
    570540                 *    +-------------------------------------------+
     
    572542                 *    +-------------------------------------------+
    573543                 *    ^               ^
    574                  *    |<------------->snd_nxt (前回送信した SEQ)
     544                 *    |<------------->snd_nxt (前回送信した SEQ)
    575545                 *    |       doff
    576                  *    snd_una (まだ確認されていない)
     546                 *    snd_una (まだ確認されていない)
    577547                 */
    578548                doff = (uint_t)(cep->snd_nxt - cep->snd_una);
    579549
    580550                /*
    581                  *  snd_wnd:  相手の受信可能ウィンドサイズ
    582                  *  snd_cwnd: 輻輳ウィンドサイズ
     551                 *  snd_wnd:  相手の受信可能ウィンドサイズ
     552                 *  snd_cwnd: 輻輳ウィンドサイズ
    583553                 *
    584                  *  win: どちらか小さいウィンドサイズに設定する。
     554                 *  win: どちらか小さいウィンドサイズに設定する。
    585555                 */
    586556                win   = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    587557       
    588                 /* 出力フラグの設定 */
     558                /* 出力フラグの設定 */
    589559                flags = tcp_outflags[cep->fsm_state];
    590560                if (cep->flags & TCP_CEP_FLG_NEED_FIN)
     
    595565
    596566                        /*
    597                          *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
    598                          *  そうでなければ、持続タイムアウトをキャンセルし、
    599                          *  再送信回数 (rxtshift) を 0 にする。
     567                         *  もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。
     568                         *  そうでなければ、持続タイムアウトをキャンセルし、
     569                         *  再送信回数 (rxtshift) を 0 にする。
    600570                         */
    601571                        if (win == 0) {
    602572
    603573                                /*
    604                                  *  doff:        送信するオクテット数。
    605                                  *  swbuf_count: 送信バッファの使用中サイズ
     574                                 *  doff:        送信するオクテット数。
     575                                 *  swbuf_count: 送信バッファの使用中サイズ
    606576                                 *
    607                                  *  送信バッファに残っているオクテットが、これから
    608                                  *  送信しようとしているオクテット数より多ければ
    609                                  *  FIN フラグをクリアする。
     577                                 *  送信バッファに残っているオクテットが、これから
     578                                 *  送信しようとしているオクテット数より多ければ
     579                                 *  FIN フラグをクリアする。
    610580                                 */
    611581                                if (doff < cep->swbuf_count)
     
    615585                        else {
    616586                                /*
    617                                  *  TCP_TIM_PERSIST: 持続タイマ
    618                                  *  rxtshift:        再送信回数の log(2)
     587                                 *  TCP_TIM_PERSIST: 持続タイマ
     588                                 *  rxtshift:        再送信回数の log(2)
    619589                                 */
    620590                                cep->timer[TCP_TIM_PERSIST] = 0;
     
    624594
    625595                /*
    626                  *  len: 今回送信するオクテット数
    627                  *        swbuf_count (送信バッファにあるオクテット数)
     596                 *  len: 今回送信するオクテット数
     597                 *        swbuf_count (送信バッファにあるオクテット数)
    628598                 *                                    |
    629599                 *    0                               V
     
    633603                 *    ^               ^<------------->
    634604                 *    |               |      len
    635                  *    |<------------->snd_nxt (前回送信した SEQ)
     605                 *    |<------------->snd_nxt (前回送信した SEQ)
    636606                 *    |       doff
    637                  *    snd_una (まだ確認されていない)
     607                 *    snd_una (まだ確認されていない)
    638608                 */
    639609                if (cep->swbuf_count < win)
     
    643613
    644614                /*
    645                  *  すでに送信されていれば、SYN ビットをオフする。
    646                  *  しかし、以下の条件では送信を控える。
     615                 *  すでに送信されていれば、SYN ビットをオフする。
     616                 *  しかし、以下の条件では送信を控える。
    647617                 *
    648                  *    ・状æ
    649 ‹ãŒ SYN 送信。
    650                  *    ・セグメントがデータを含んでいる。
     618                 *    ・状態が SYN 送信。
     619                 *    ・セグメントがデータを含んでいる。
    651620                 */
    652621                if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) {
    653622                        flags &= ~TCP_FLG_SYN;
    654                         doff --;                /* -1 は SYN フラグ分 */
    655                         len ++;                 /* +1 は SYN フラグ分 */
     623                        doff --;                /* -1 は SYN フラグ分 */
     624                        len ++;                 /* +1 は SYN フラグ分 */
    656625                        if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT)
    657626                                break;
     
    666635
    667636                        /*
    668                          *  len が 0 以下なら、0 に設定する。
    669                          *  もし、送信ウィンドウサイズが 0 なら、
    670                          *  再送信タイマをキャンセルし、
    671                          *  前回送信した SEQ (snd_nxt) を
    672                          *  確認された最大送信 SEQ (snd_una) に戻す。
    673                          *  そして、持続タイマーが止まっていれば、再設定する。
     637                         *  len が 0 以下なら、0 に設定する。
     638                         *  もし、送信ウィンドウサイズが 0 なら、
     639                         *  再送信タイマをキャンセルし、
     640                         *  前回送信した SEQ (snd_nxt) を
     641                         *  確認された最大送信 SEQ (snd_una) に戻す。
     642                         *  そして、持続タイマーが止まっていれば、再設定する。
    674643                         */
    675644                        len = 0;
     
    685654
    686655                /*
    687                  *  今回送信するオクテット数 (len) は、
    688                  *  相手の最大受信セグメントサイズ (maxseg) をè¶
    689 ãˆãªã„ようにする。
     656                 *  今回送信するオクテット数 (len) は、
     657                 *  相手の最大受信セグメントサイズ (maxseg) を超えないようにする。
    690658                 */
    691659                if (len > cep->maxseg) {
     
    695663
    696664                /*
    697                  *        swbuf_count (送信バッファにあるオクテット数)
     665                 *        swbuf_count (送信バッファにあるオクテット数)
    698666                 *                                           |
    699667                 *    0                                      V
     
    703671                 *    ^               ^<------------->
    704672                 *    |               |      len
    705                  *    |<------------->snd_nxt (前回送信した SEQ)
     673                 *    |<------------->snd_nxt (前回送信した SEQ)
    706674                 *    |       doff
    707                  *    snd_una (まだ確認されていない)
     675                 *    snd_una (まだ確認されていない)
    708676                 *
    709                  *  今回送信後も、送信バッファにデータが残っていれば
    710                  *  FIN フラグをクリアする。
     677                 *  今回送信後も、送信バッファにデータが残っていれば
     678                 *  FIN フラグをクリアする。
    711679                 */
    712680                if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count))
     
    714682
    715683                /*
    716                  *  ここから win は、受信ウィンドウサイズ。
    717                  *  受信バッファの空き容量
     684                 *  ここから win は、受信ウィンドウサイズ。
     685                 *  受信バッファの空き容量
    718686                 */
    719687                win = cep->rbufsz - cep->rwbuf_count;
    720688
    721689                /*
    722                  *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
     690                 *  愚かなウィンドウ・シンドロームの回避処理 (送信側)
    723691                 *
    724                  *  以下の条件で、送信を行う。
     692                 *  以下の条件で、送信を行う。
    725693                 *
    726                  *    ・フルサイズ (maxseg) のセグメントを送ることができる。
    727                  *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
    728                  *      送ることができる。
    729                  *    ・送信バッファを空にでき、アイドルか非é
    730 å»¶ã‚ªãƒ—ションが有効なとき。
     694                 *    ・フルサイズ (maxseg) のセグメントを送ることができる。
     695                 *    ・相手の最大の受信ウィンドウサイズの 1/2 のデータを
     696                 *      送ることができる。
     697                 *    ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。
    731698                 */
    732699                if (len) {
    733700
    734701                        /*
    735                          *  今回送信するオクテット数 (len) が
    736                          *  相手の最大受信セグメントサイズ (maxseg) に
    737                          *  一致するときは送信する。
     702                         *  今回送信するオクテット数 (len) が
     703                         *  相手の最大受信セグメントサイズ (maxseg) に
     704                         *  一致するときは送信する。
    738705                         */
    739706                        if (len == cep->maxseg) {
     
    743710
    744711                        /*
    745                          *  今回の送信で、送信バッファを空にでき、
    746                          *  アイドルか非 PUSH オプションが有効なとき。
     712                         *  今回の送信で、送信バッファを空にでき、
     713                         *  アイドルか非 PUSH オプションが有効なとき。
    747714                         */
    748715                        if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) &&
     
    754721
    755722                        /*
    756                          *  max_sndwnd: 今までの最大送信ウィンドサイズ
    757                          *  snd_nxt:    次に送信する SEQ
    758                          *  snd_max:    送信した最大 SEQ
     723                         *  max_sndwnd: 今までの最大送信ウィンドサイズ
     724                         *  snd_nxt:    次に送信する SEQ
     725                         *  snd_max:    送信した最大 SEQ
    759726                         *
    760                          *  次の条件では送信を行う。
     727                         *  次の条件では送信を行う。
    761728                         *
    762                          *    ・強制送信フラグがセットされている。
    763                          *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
    764                          *      相手の最大の受信ウィンドウサイズが 0 より大きい。
    765                          *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
    766                          *      つまり、再送するとき。
     729                         *    ・強制送信フラグがセットされている。
     730                         *    ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、
     731                         *      相手の最大の受信ウィンドウサイズが 0 より大きい。
     732                         *    ・次に送信する SEQ が送信した最大 SEQ より小さい、
     733                         *      つまり、再送するとき。
    767734                         */
    768735                        if ((cep->flags & TCP_CEP_FLG_FORCE) ||
     
    776743
    777744                /*
    778                  *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
     745                 *  愚かなウィンドウ・シンドロームの回避処理 (受信側)
    779746                 *
    780                  *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
    781                  *  受信バッファ容量の 1/2 の、いずれか小さいほうの
    782                  *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
     747                 *  ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは
     748                 *  受信バッファ容量の 1/2 の、いずれか小さいほうの
     749                 *  サイズで増加される場合は、ウィンドウサイズの更新を行う。
    783750                 */
    784751                if (win > 0) {
     
    786753
    787754                        /*
    788                          *  win:              受信バッファの空き容量
    789                          *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
    790                          *  rcv_adv:          受信を期å¾
    791 ã—ている最大の SEQ
    792                          *  rcv_nxt:          受信を期å¾
    793 ã—ている最小の SEQ
     755                         *  win:              受信バッファの空き容量
     756                         *  MAX_TCP_WIN_SIZE: TCP ヘッダの win フィールドに設定できる最大値
     757                         *  rcv_adv:          受信を期待している最大の SEQ
     758                         *  rcv_nxt:          受信を期待している最小の SEQ
    794759                         */
    795760                        if (win < MAX_TCP_WIN_SIZE)
     
    806771       
    807772                /*
    808                  *  ACK を送信する。
     773                 *  ACK を送信する。
    809774                 */
    810775                if (cep->flags & TCP_CEP_FLG_ACK_NOW) {
     
    829794
    830795                /*
    831                  *  snd_nxt: 次に送信する SEQ
    832                  *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
     796                 *  snd_nxt: 次に送信する SEQ
     797                 *  snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ
    833798                 *
    834                  *  相手から FIN を受信し、まだ FIN を送信していないか、
    835                  *  送るデータがないときは、FIN を相手に届けるため、
    836                  *  セグメントを送信する。
     799                 *  相手から FIN を受信し、まだ FIN を送信していないか、
     800                 *  送るデータがないときは、FIN を相手に届けるため、
     801                 *  セグメントを送信する。
    837802                 */
    838803                if ((flags & TCP_FLG_FIN) &&
     
    843808
    844809                /*
    845                  *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
    846                  *  持続タイマを設定する。
     810                 *  送信すべきデータがあり、再送タイマと持続タイマが切れているときは
     811                 *  持続タイマを設定する。
    847812                 */
    848813                if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT  ] == 0 &&
     
    859824
    860825/*
    861  *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
     826 *  tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て
    862827 */
    863828
     
    869834
    870835        /*
    871          *  snd_wnd:  相手の受信可能ウィンドサイズ
    872          *  snd_cwnd: 輻輳ウィンドサイズ
     836         *  snd_wnd:  相手の受信可能ウィンドサイズ
     837         *  snd_cwnd: 輻輳ウィンドサイズ
    873838         *
    874          *  win: どちらか小さいウィンドサイズに設定する。
     839         *  win: どちらか小さいウィンドサイズに設定する。
    875840         */
    876841        win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd;
    877842
    878843        /*
    879          *  相手の受信ウィンドが閉じている場合は、開くまでå¾
    880 æ©Ÿã™ã‚‹ã€‚
     844         *  相手の受信ウィンドが閉じている場合は、開くまで待機する。
    881845         */
    882846        if (win == 0) {
     
    887851#ifdef TCP_CFG_NON_BLOCKING
    888852
    889                 /* ノンブロッキングコール */
     853                /* ノンブロッキングコール */
    890854                if (!IS_PTR_DEFINED(cep->callback)) {
    891855                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    892856
    893                         /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     857                        /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    894858                        cep->snd_tskid = TA_NULL;
    895859                        cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    906870                                                   (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) {
    907871
    908                         /* ネットワークバッファを予約する。*/
     872                        /* ネットワークバッファを予約する。*/
    909873                        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND;
    910874                        }
    911875                else {
    912876
    913                         /* 送信ウィンドバッファを初期化する。*/
     877                        /* 送信ウィンドバッファを初期化する。*/
    914878                        tcp_init_swbuf(cep);
    915879
     
    920884                                uint_t len;
    921885
    922                                 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
     886                                /* 送信ウィンドバッファの書き込みアドレスを設定する。*/
    923887                                len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf);
    924888
    925                                 /* コールバック関数を呼び出す。*/
     889                                /* コールバック関数を呼び出す。*/
    926890#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    927891                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
     
    931895
    932896
    933                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     897                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    934898                                cep->snd_tskid = TA_NULL;
    935899                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    941905                                uint_t len;
    942906
    943                                 /* 送信ウィンドバッファにデータを書き込む。*/
     907                                /* 送信ウィンドバッファにデータを書き込む。*/
    944908                                len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len);
    945909
    946910#ifdef TCP_CFG_EXTENTIONS
    947911
    948                                 /* 送信緊急ポインタを設定する。*/
     912                                /* 送信緊急ポインタを設定する。*/
    949913                                if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB)
    950914                                        cep->snd_up = cep->snd_una + len;
     
    952916#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    953917
    954                                 /* フラグを、送信可能に設定し、強制的に送信する。*/
     918                                /* フラグを、送信可能に設定し、強制的に送信する。*/
    955919                                cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT;
    956920
    957                                 /* コールバック関数を呼び出す。*/
     921                                /* コールバック関数を呼び出す。*/
    958922#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    959923                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
     
    963927
    964928
    965                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     929                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    966930                                cep->snd_tskid = TA_NULL;
    967931                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
     
    975939
    976940/*
    977  *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
     941 *  tcptsk_free_swbufq -- 送信ウィンドバッファ開放
    978942 */
    979943
     
    982946{
    983947        /*
    984          *  受信確認が完了し、ネットワークインタフェースからの
    985          *  出力も完了したときは、送信ウィンドバッファキューを解放する。
    986          */
    987 
    988         /* 送信ウィンドバッファの使用中サイズをリセットする。*/
     948         *  受信確認が完了し、ネットワークインタフェースからの
     949         *  出力も完了したときは、送信ウィンドバッファキューを解放する。
     950         */
     951
     952        /* 送信ウィンドバッファの使用中サイズをリセットする。*/
    989953        cep->swbuf_count = 0;
    990954
    991         /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
     955        /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
    992956        syscall(rel_net_buf(cep->swbufq));
    993957        cep->swbufq = NULL;
    994958
    995         /* フラグを空きに設定する。*/
     959        /* フラグを空きに設定する。*/
    996960        cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE;
    997961
    998         /* 送信ウィンドバッファに空きができたことを知らせる。*/
     962        /* 送信ウィンドバッファに空きができたことを知らせる。*/
    999963        syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY));
    1000964
    1001         /* 送信ウィンドバッファの空きå¾
    1002 ã¡ã®ã¨ãã¯ã€TCP 出力タスクを起動する。*/
     965        /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/
    1003966        if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) {
    1004967                sig_sem(SEM_TCP_POST_OUTPUT);
     
    1009972
    1010973/*
    1011  *  TCP 出力タスク
     974 *  TCP 出力タスク
    1012975 */
    1013976
     
    1028991#ifdef _IP6_CFG
    1029992
    1030         /* IPv6 のステートレス・アドレス自動設定を実行する。*/
     993        /* IPv6 のステートレス・アドレス自動設定を実行する。*/
    1031994        in6_if_up(IF_GET_IFNET());
    1032995
     
    1035998        while (true) {
    1036999
    1037                 /* 出力がポストされるまでå¾
    1038 ã¤ã€‚*/
     1000                /* 出力がポストされるまで待つ。*/
    10391001                syscall(wai_sem(SEM_TCP_POST_OUTPUT));
    10401002
     
    10611023
    10621024                        /*
    1063                          *  ネットワークインタフェースから送信が終わっていないときは、
    1064                          *  送信を予約する。
     1025                         *  ネットワークインタフェースから送信が終わっていないときは、
     1026                         *  送信を予約する。
    10651027                         */
    10661028                        if (cep->flags & TCP_CEP_FLG_POST_OUTPUT &&
     
    10771039
    10781040                        /*
    1079                          *  送信予約中に、ネットワークインタフェースから送信が終了したら、
    1080                          *  送信を開始する。ただし、完å
    1081 ¨ã«é€ä¿¡ãŒçµ‚了したときは何もしない。
     1041                         *  送信予約中に、ネットワークインタフェースから送信が終了したら、
     1042                         *  送信を開始する。ただし、完全に送信が終了したときは何もしない。
    10821043                         */
    10831044                        if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) {
     
    11021063
    11031064                                        /*
    1104                                          *  tcp_con_cep のノンブロッキングコールで、
    1105                                          *  未割当のの場合は、ポート番号を割り当てる。
    1106                                          *  p_myaddr が NADR (-1) か、
    1107                                          *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
     1065                                         *  tcp_con_cep のノンブロッキングコールで、
     1066                                         *  未割当のの場合は、ポート番号を割り当てる。
     1067                                         *  p_myaddr が NADR (-1) か、
     1068                                         *  自ポート番号が TCP_PORTANY なら、自動で割り当てる。
    11081069                                         */
    11091070                                        if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY)
     
    11201081                                                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
    11211082
    1122                                                 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
     1083                                                /* 記憶されているタスク ID と API 機能コードをクリアーする。*/
    11231084                                                cep->snd_tfn   = cep->snd_nblk_tfn = TFN_TCP_UNDEF;
    11241085                                                cep->snd_tskid = TA_NULL;
     
    11321093
    11331094                                if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) {
    1134                                         /* コネクションを閉じる。*/
     1095                                        /* コネクションを閉じる。*/
    11351096                                        tcp_close(cep);
    11361097                                        cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT;
     
    11381099
    11391100                                if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) {
    1140                                         /* snd_nxt をå
    1141 ƒã«æˆ»ã™ã€‚*/
     1101                                        /* snd_nxt を元に戻す。*/
    11421102                                        if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt))
    11431103                                                cep->snd_nxt = cep->snd_old_nxt;
     
    11521112                        } while (ix != last_ix);
    11531113
    1154                 /* 次回は、処理した通信端点を後回しにする。*/
     1114                /* 次回は、処理した通信端点を後回しにする。*/
    11551115                last_ix = sel_ix;
    11561116                }
Note: See TracChangeset for help on using the changeset viewer.