Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_output.c
- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_output.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r270 r321 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * 7 * ä¸è¨èä½æ¨©è 8 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 9 * ã«ãã£ã¦å 10 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 11 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 12 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 13 å¸ï¼ä»¥ä¸ï¼ 14 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 15 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 16 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 17 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 18 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 19 * ç¨ã§ããå½¢ã§åé 20 å¸ããå ´åã«ã¯ï¼åé 21 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 22 * è 23 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 24 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 25 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 26 * ç¨ã§ããªãå½¢ã§åé 27 å¸ããå ´åã«ã¯ï¼æ¬¡ã®æ¡ä»¶ãæºãããã¨ï¼ 28 * (a) åé 29 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 30 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 31 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 32 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 33 * 害ãããï¼ä¸è¨èä½æ¨©è 34 ããã³TOPPERSããã¸ã§ã¯ããå 35 責ãããã¨ï¼ 7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 8 * によって公表されている GNU General Public License の Version 2 に記 9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 11 * 利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次の条件を満たすこと. 21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 36 25 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 127 115 128 116 /* 129 * é¢æ°117 * 関数 130 118 */ 131 119 … … 134 122 135 123 /* 136 * å¤æ°124 * 変数 137 125 */ 138 126 139 /* åºåæã®ãã©ã°ã FSM ç¶æ 140 ã«ããé¸æããããã®è¡¨ */ 127 /* 出力時のフラグを FSM 状態により選択するための表 */ 141 128 142 129 const 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, 終了、時間待ち */ 159 141 }; 160 142 161 143 /* 162 * send_segment -- TCP åºåå¦ç144 * send_segment -- TCP 出力処理 163 145 */ 164 146 … … 190 172 191 173 /* 192 * ã»ã°ã¡ã³ãé·ããç¸æã®æ大åä¿¡ã»ã°ã¡ã³ãé·ã«èª¿æ´ããã 193 * ãããè¶ 194 ãã¦ããå ´åã¯ãè¶ 195 ããåãå¾ã§éä¿¡ããã 196 * ãã®ãããFIN ããããã¯ãªã¢ããã 174 * セグメント長を、相手の最大受信セグメント長に調整する。 175 * もし、超えている場合は、超えた分を後で送信する。 176 * このため、FIN ビットをクリアする。 197 177 * 198 * ãªãªã¸ãã«ã§ã¯ãt_maxopd ãå¶éé·ã«ãã¦ãããã 199 * æ¬å®è£ 200 ã§ã¯ãç¸æã®æ大åä¿¡ã»ã°ã¡ã³ãã«ããã 178 * オリジナルでは、t_maxopd を制限長にしているが、 179 * 本実装では、相手の最大受信セグメントにする。 201 180 */ 202 181 if (len + optlen > cep->maxseg) { … … 207 186 208 187 /* 209 * éä¿¡ãããã¡ã空ã«ãªãã¨ã㯠PUSH ãã©ã°ãè¨å®ããã188 * 送信バッファが空になるときは PUSH フラグを設定する。 210 189 */ 211 190 if (len && doff + len >= cep->swbuf_count) … … 218 197 219 198 /* 220 * éä¿¡ã¦ã¤ã³ããããã¡ãéæ¾ãããªãããã«ãã¦ã221 * ãããã¯ã¼ã¯ãããã¡ãåºåã«ç§»ãã199 * 送信ウインドバッファが開放されないようにして、 200 * ネットワークバッファを出力に移す。 222 201 */ 223 202 cep->swbufq->flags |= NB_FLG_NOREL_IFOUT; … … 227 206 228 207 /* 229 * ACK å®äºç¶æ 230 ã§ããã®é¢æ°ãå¼ã³åºããããã¨ãããã 231 * ãã®æã¯ãlen ã 0 ã«ãã¦ãå¦çãç¶ç¶ããã 208 * ACK 完了状態で、この関数が呼び出されることもある。 209 * この時は、len を 0 にして、処理を継続する。 232 210 */ 233 211 len = 0; … … 256 234 257 235 /* 258 * éä¿¡ã¦ã¤ã³ããããã¡ãéæ¾ãããªãããã«ãã¦ã259 * ãããã¯ã¼ã¯ãããã¡ãåºåã«ç§»ãã236 * 送信ウインドバッファが開放されないようにして、 237 * ネットワークバッファを出力に移す。 260 238 */ 261 239 cep->swbufq->flags |= NB_FLG_NOREL_IFOUT; … … 265 243 266 244 /* 267 * ACK å®äºç¶æ 268 ã§ããã®é¢æ°ãå¼ã³åºããããã¨ãããã 269 * ãã®æã¯ãlen ã 0 ã«ãã¦ãå¦çãç¶ç¶ããã 245 * ACK 完了状態で、この関数が呼び出されることもある。 246 * この時は、len を 0 にして、処理を継続する。 270 247 */ 271 248 len = 0; … … 292 269 293 270 /* 294 * TCP ãªãã·ã§ã³ã®è¨å®ãè¡ãã 295 * æ¬å®è£ 296 ã§ã¯ãæ大ã»ã°ã¡ã³ããµã¤ãºã®ã¿è¨å®ããã 271 * TCP オプションの設定を行う。 272 * 本実装では、最大セグメントサイズのみ設定する。 297 273 */ 298 274 if (flags & TCP_FLG_SYN) { … … 310 286 } 311 287 312 /* TCP SDU ã«éä¿¡ãã¼ã¿ãã³ãã¼ããã*/288 /* TCP SDU に送信データをコピーする。*/ 313 289 314 290 if (len > 0) { … … 336 312 337 313 /* 338 * snd_max: éä¿¡ããæ大SEQ339 * snd_nxt: 次ã«éä¿¡ããSEQ314 * snd_max: 送信した最大 SEQ 315 * snd_nxt: 次に送信する SEQ 340 316 * 341 * ç¸æãã FIN ãåä¿¡ããã¾ã FIN ãéä¿¡ãã¦ããªããã342 * éããã¼ã¿ããªãã¨ãã¯ãFIN ãç¸æã«å±ããããã343 * ã»ã°ã¡ã³ããéä¿¡ããããSEQ ã¯é²ããªãã317 * 相手から FIN を受信し、まだ FIN を送信していないか、 318 * 送るデータがないときは、FIN を相手に届けるため、 319 * セグメントを送信するが、SEQ は進めない。 344 320 */ 345 321 if ((flags & TCP_FLG_FIN) && (cep->flags & TCP_CEP_FLG_SENT_FIN) && … … 351 327 352 328 /* 353 * SEQ ãACKããã©ã°ã®è¨å®ã329 * SEQ、ACK、フラグの設定。 354 330 */ 355 331 if (len > 0 || (flags & (TCP_FLG_SYN | TCP_FLG_FIN)) || cep->timer[TCP_TIM_PERSIST] != 0) … … 359 335 360 336 /* 361 * rcv_nxt: åä¿¡ãæå¾ 362 ãã¦ããæå°ã® SEQ 337 * rcv_nxt: 受信を期待している最小の SEQ 363 338 */ 364 339 tcph->ack = htonl(cep->rcv_nxt); … … 366 341 367 342 /* 368 * åä¿¡ã¦ã£ã³ãã®è¨ç®343 * 受信ウィンドの計算 369 344 * 370 * rbufsz: åä¿¡ç¨ãããã¡ãµã¤ãº371 * maxseg: ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº345 * rbufsz: 受信用バッファサイズ 346 * maxseg: 相手の最大受信セグメントサイズ 372 347 */ 373 348 if (win < (cep->rbufsz / 4) && win < cep->maxseg) … … 375 350 376 351 /* 377 * rcv_nxt: åä¿¡ãæå¾ 378 ãã¦ããæå°ã® SEQ 379 * rcv_adv: åä¿¡ãæå¾ 380 ãã¦ããæ大㮠SEQ 352 * rcv_nxt: 受信を期待している最小の SEQ 353 * rcv_adv: 受信を期待している最大の SEQ 381 354 */ 382 355 if ((int32_t)win < (int32_t)(cep->rcv_adv - cep->rcv_nxt)) … … 388 361 389 362 /* 390 * ç·æ¥ãã¤ã³ã¿ã®è¨å®363 * 緊急ポインタの設定 391 364 */ 392 365 if (SEQ_GT(cep->snd_up, cep->snd_nxt)) { … … 403 376 404 377 /* 405 * ãã§ãã¯ãµã ãè¨å®ããã378 * チェックサムを設定する。 406 379 */ 407 380 tcph->sum = 0; … … 409 382 GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len); 410 383 411 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/384 /* ネットワークバッファ長を調整する。*/ 412 385 output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len); 413 386 414 387 /* 415 * ã¿ã¤ãã®èª¿æ´388 * タイマの調整 416 389 */ 417 390 if ((cep->flags & TCP_CEP_FLG_FORCE) == 0 || cep->timer[TCP_TIM_PERSIST] == 0) { … … 419 392 420 393 /* 421 * 次ã«éä¿¡ãã SEQ (snd_nxt) ãä»åéä¿¡ãããã¼ã¿æ°åé²ããã394 * 次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。 422 395 */ 423 396 if (flags & TCP_FLG_SYN) … … 431 404 432 405 /* 433 * 次ã«éä¿¡ãã SEQ (snd_nxt) ã434 * éä¿¡ããæ大 SEQ (snd_max) ããé²ãã§ããã°ã435 * éä¿¡ããæ大 SEQ (snd_max) ãæ´æ°ããã406 * 次に送信する SEQ (snd_nxt) が 407 * 送信した最大 SEQ (snd_max) より進んでいれば、 408 * 送信した最大 SEQ (snd_max) を更新する。 436 409 */ 437 410 if (SEQ_GT(cep->snd_nxt, cep->snd_max)) { 438 411 cep->snd_max = cep->snd_nxt; 439 412 /* 440 * ãããå¾å¾©æéè¨æ¸¬ãè¡ã£ã¦ããªããã°ã441 * ãã®éä¿¡ã«æéãåãããã413 * もし、往復時間計測を行っていなければ、 414 * この送信に時間を合わせる。 442 415 */ 443 416 if (cep->rtt == 0) { 444 417 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 * 再送時間のバックオフに使われるシフトカウントも初期化する。 454 427 */ 455 428 if (cep->timer[TCP_TIM_REXMT] == 0 && cep->snd_nxt != cep->snd_una) { … … 463 436 464 437 /* 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) を更新する。 468 441 */ 469 442 else if (SEQ_GT(cep->snd_nxt + len, cep->snd_max)) … … 483 456 #endif /* of #ifdef TCP_CFG_TRACE */ 484 457 485 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/458 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 486 459 if ((error = IP_OUTPUT(output, TMO_TCP_OUTPUT)) != E_OK) 487 460 goto err_ret; 488 461 489 462 /* 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 を更新する。 497 467 */ 498 468 if (win > 0 && SEQ_GT(cep->rcv_nxt + win, cep->rcv_adv)) { … … 501 471 502 472 /* 503 * æå¾ã«éä¿¡ãã ACK (last_ack_sent) ãæ´æ°ããã473 * 最後に送信した ACK (last_ack_sent) を更新する。 504 474 */ 505 475 cep->last_ack_sent = cep->rcv_nxt; 506 476 507 477 /* 508 * ãã©ã°ã®è¨å®ãè¡ãã478 * フラグの設定を行う。 509 479 */ 510 480 cep->flags &= ~(TCP_CEP_FLG_ACK_NOW | TCP_CEP_FLG_DEL_ACK); … … 516 486 err_ret: 517 487 /* 518 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã519 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½520 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½488 * 以下に関係しないフラグをクリアーする。 489 * ・送受信ウィンドバッファの省コピー機能 490 * ・動的な通信端点の生成・削除機能 521 491 */ 522 492 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | … … 527 497 528 498 /* 529 * tcp_output -- TCP åºåå¦ç499 * tcp_output -- TCP 出力処理 530 500 */ 531 501 … … 540 510 541 511 /* 542 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQ ã¾ãã¯ã確èªãããæ大éä¿¡SEQ543 * snd_max: éä¿¡ããæ大SEQ512 * snd_una: 未確認の最小送信 SEQ または、確認された最大送信 SEQ 513 * snd_max: 送信した最大 SEQ 544 514 */ 545 515 idle = (cep->snd_max == cep->snd_una); 546 516 547 517 /* 548 * idle: ã¢ã¤ãã«æé549 * rxtcur: ç¾å¨ã®åéã¿ã¤ã ã¢ã¦ã518 * idle: アイドル時間 519 * rxtcur: 現在の再送タイムアウト 550 520 */ 551 521 if (idle && cep->idle >= cep->rxtcur) 552 522 553 523 /* 554 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº555 * maxseg : ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº524 * snd_cwnd: 輻輳ウィンドサイズ 525 * maxseg : 相手の最大受信セグメントサイズ 556 526 * 557 * é·æéã¢ã¤ãã«ã ã£ãã®ã§ã¹ãã¼ã¹ã¿ã¼ãå¶å¾¡ã«è¨å®ããã527 * 長時間アイドルだったのでスロースタート制御に設定する。 558 528 */ 559 529 cep->snd_cwnd = cep->maxseg; … … 563 533 564 534 /* 565 * snd_nxt: 次ã«éä¿¡ãã SEQããã®æç¹ã§ã¯ãååéä¿¡ããSEQ566 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ535 * snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ 536 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 567 537 * 568 * doff: éä¿¡ãéå§ãããªãã»ããã569 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)538 * doff: 送信を開始するオフセット。 539 * swbuf_count (送信バッファにあるオクテット数) 570 540 * 0 V 571 541 * +-------------------------------------------+ … … 573 543 * +-------------------------------------------+ 574 544 * ^ ^ 575 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)545 * |<------------->snd_nxt (前回送信した SEQ) 576 546 * | doff 577 * snd_una ( ã¾ã 確èªããã¦ããªã)547 * snd_una (まだ確認されていない) 578 548 */ 579 549 doff = (uint_t)(cep->snd_nxt - cep->snd_una); 580 550 581 551 /* 582 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº583 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº552 * snd_wnd: 相手の受信可能ウィンドサイズ 553 * snd_cwnd: 輻輳ウィンドサイズ 584 554 * 585 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã555 * win: どちらか小さいウィンドサイズに設定する。 586 556 */ 587 557 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 588 558 589 /* åºåãã©ã°ã®è¨å®*/559 /* 出力フラグの設定 */ 590 560 flags = tcp_outflags[cep->fsm_state]; 591 561 if (cep->flags & TCP_CEP_FLG_NEED_FIN) … … 596 566 597 567 /* 598 * ãããéä¿¡ã¦ã¤ã³ããµã¤ãº (win) ã 0 ãªã 1 ãªã¯ãããéä¿¡ããã599 * ããã§ãªããã°ãæç¶ã¿ã¤ã ã¢ã¦ãããã£ã³ã»ã«ãã600 * åéä¿¡åæ° (rxtshift) ã 0 ã«ããã568 * もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。 569 * そうでなければ、持続タイムアウトをキャンセルし、 570 * 再送信回数 (rxtshift) を 0 にする。 601 571 */ 602 572 if (win == 0) { 603 573 604 574 /* 605 * doff: éä¿¡ãããªã¯ãããæ°ã606 * swbuf_count: éä¿¡ãããã¡ã®ä½¿ç¨ä¸ãµã¤ãº575 * doff: 送信するオクテット数。 576 * swbuf_count: 送信バッファの使用中サイズ 607 577 * 608 * éä¿¡ãããã¡ã«æ®ã£ã¦ãããªã¯ããããããããã609 * éä¿¡ãããã¨ãã¦ãããªã¯ãããæ°ããå¤ããã°610 * FIN ãã©ã°ãã¯ãªã¢ããã578 * 送信バッファに残っているオクテットが、これから 579 * 送信しようとしているオクテット数より多ければ 580 * FIN フラグをクリアする。 611 581 */ 612 582 if (doff < cep->swbuf_count) … … 616 586 else { 617 587 /* 618 * TCP_TIM_PERSIST: æç¶ã¿ã¤ã619 * rxtshift: åéä¿¡åæ°ã®log(2)588 * TCP_TIM_PERSIST: 持続タイマ 589 * rxtshift: 再送信回数の log(2) 620 590 */ 621 591 cep->timer[TCP_TIM_PERSIST] = 0; … … 625 595 626 596 /* 627 * len: ä»åéä¿¡ãããªã¯ãããæ°628 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)597 * len: 今回送信するオクテット数 598 * swbuf_count (送信バッファにあるオクテット数) 629 599 * | 630 600 * 0 V … … 634 604 * ^ ^<-------------> 635 605 * | | len 636 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)606 * |<------------->snd_nxt (前回送信した SEQ) 637 607 * | doff 638 * snd_una ( ã¾ã 確èªããã¦ããªã)608 * snd_una (まだ確認されていない) 639 609 */ 640 610 if (cep->swbuf_count < win) … … 644 614 645 615 /* 646 * ãã§ã«éä¿¡ããã¦ããã°ãSYN ãããããªãããã647 * ãããã以ä¸ã®æ¡ä»¶ã§ã¯éä¿¡ãæ§ããã616 * すでに送信されていれば、SYN ビットをオフする。 617 * しかし、以下の条件では送信を控える。 648 618 * 649 * ã»ç¶æ 650 ã SYN éä¿¡ã 651 * ã»ã»ã°ã¡ã³ãããã¼ã¿ãå«ãã§ããã 619 * ・状態が SYN 送信。 620 * ・セグメントがデータを含んでいる。 652 621 */ 653 622 if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) { 654 623 flags &= ~TCP_FLG_SYN; 655 doff --; /* -1 㯠SYN ãã©ã°å*/656 len ++; /* +1 㯠SYN ãã©ã°å*/624 doff --; /* -1 は SYN フラグ分 */ 625 len ++; /* +1 は SYN フラグ分 */ 657 626 if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT) 658 627 break; … … 667 636 668 637 /* 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 * そして、持続タイマーが止まっていれば、再設定する。 675 644 */ 676 645 len = 0; … … 686 655 687 656 /* 688 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã¯ã 689 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ãè¶ 690 ããªãããã«ããã 657 * 今回送信するオクテット数 (len) は、 658 * 相手の最大受信セグメントサイズ (maxseg) を超えないようにする。 691 659 */ 692 660 if (len > cep->maxseg) { … … 696 664 697 665 /* 698 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)666 * swbuf_count (送信バッファにあるオクテット数) 699 667 * | 700 668 * 0 V … … 704 672 * ^ ^<-------------> 705 673 * | | len 706 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)674 * |<------------->snd_nxt (前回送信した SEQ) 707 675 * | doff 708 * snd_una ( ã¾ã 確èªããã¦ããªã)676 * snd_una (まだ確認されていない) 709 677 * 710 * ä»åéä¿¡å¾ããéä¿¡ãããã¡ã«ãã¼ã¿ãæ®ã£ã¦ããã°711 * FIN ãã©ã°ãã¯ãªã¢ããã678 * 今回送信後も、送信バッファにデータが残っていれば 679 * FIN フラグをクリアする。 712 680 */ 713 681 if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count)) … … 715 683 716 684 /* 717 * ãããã win ã¯ãåä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã718 * åä¿¡ãããã¡ã®ç©ºã容é685 * ここから win は、受信ウィンドウサイズ。 686 * 受信バッファの空き容量 719 687 */ 720 688 win = cep->rbufsz - cep->rwbuf_count; 721 689 722 690 /* 723 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (éä¿¡å´)691 * 愚かなウィンドウ・シンドロームの回避処理 (送信側) 724 692 * 725 * 以ä¸ã®æ¡ä»¶ã§ãéä¿¡ãè¡ãã693 * 以下の条件で、送信を行う。 726 694 * 727 * ã»ãã«ãµã¤ãº (maxseg) ã®ã»ã°ã¡ã³ããéããã¨ãã§ããã 728 * ã»ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 ã®ãã¼ã¿ã 729 * éããã¨ãã§ããã 730 * ã»éä¿¡ãããã¡ã空ã«ã§ããã¢ã¤ãã«ãéé 731 延ãªãã·ã§ã³ãæå¹ãªã¨ãã 695 * ・フルサイズ (maxseg) のセグメントを送ることができる。 696 * ・相手の最大の受信ウィンドウサイズの 1/2 のデータを 697 * 送ることができる。 698 * ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。 732 699 */ 733 700 if (len) { 734 701 735 702 /* 736 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã737 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ã«738 * ä¸è´ããã¨ãã¯éä¿¡ããã703 * 今回送信するオクテット数 (len) が 704 * 相手の最大受信セグメントサイズ (maxseg) に 705 * 一致するときは送信する。 739 706 */ 740 707 if (len == cep->maxseg) { … … 744 711 745 712 /* 746 * ä»åã®éä¿¡ã§ãéä¿¡ãããã¡ã空ã«ã§ãã747 * ã¢ã¤ãã«ãé PUSH ãªãã·ã§ã³ãæå¹ãªã¨ãã713 * 今回の送信で、送信バッファを空にでき、 714 * アイドルか非 PUSH オプションが有効なとき。 748 715 */ 749 716 if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) && … … 755 722 756 723 /* 757 * max_sndwnd: ä»ã¾ã§ã®æ大éä¿¡ã¦ã£ã³ããµã¤ãº758 * snd_nxt: 次ã«éä¿¡ããSEQ759 * snd_max: éä¿¡ããæ大SEQ724 * max_sndwnd: 今までの最大送信ウィンドサイズ 725 * snd_nxt: 次に送信する SEQ 726 * snd_max: 送信した最大 SEQ 760 727 * 761 * 次ã®æ¡ä»¶ã§ã¯éä¿¡ãè¡ãã728 * 次の条件では送信を行う。 762 729 * 763 * ã»å¼·å¶éä¿¡ãã©ã°ãã»ããããã¦ããã764 * ã»ãã¼ã¿é·ãç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 以ä¸ã§ã765 * ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã 0 ãã大ããã766 * ã»æ¬¡ã«éä¿¡ãã SEQ ãéä¿¡ããæ大 SEQ ããå°ããã767 * ã¤ã¾ããåéããã¨ãã730 * ・強制送信フラグがセットされている。 731 * ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、 732 * 相手の最大の受信ウィンドウサイズが 0 より大きい。 733 * ・次に送信する SEQ が送信した最大 SEQ より小さい、 734 * つまり、再送するとき。 768 735 */ 769 736 if ((cep->flags & TCP_CEP_FLG_FORCE) || … … 777 744 778 745 /* 779 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (åä¿¡å´)746 * 愚かなウィンドウ・シンドロームの回避処理 (受信側) 780 747 * 781 * ã¦ã£ã³ãã¦ãµã¤ãºããã«ãµã¤ãºã® 2 åã®ã»ã°ã¡ã³ãããããã¯782 * åä¿¡ãããã¡å®¹éã® 1/2 ã®ãããããå°ããã»ãã®783 * ãµã¤ãºã§å¢å ãããå ´åã¯ãã¦ã£ã³ãã¦ãµã¤ãºã®æ´æ°ãè¡ãã748 * ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは 749 * 受信バッファ容量の 1/2 の、いずれか小さいほうの 750 * サイズで増加される場合は、ウィンドウサイズの更新を行う。 784 751 */ 785 752 if (win > 0) { … … 787 754 788 755 /* 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 795 760 */ 796 761 if (win < MAX_TCP_WIN_SIZE) … … 807 772 808 773 /* 809 * ACK ãéä¿¡ããã774 * ACK を送信する。 810 775 */ 811 776 if (cep->flags & TCP_CEP_FLG_ACK_NOW) { … … 830 795 831 796 /* 832 * snd_nxt: 次ã«éä¿¡ããSEQ833 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ797 * snd_nxt: 次に送信する SEQ 798 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 834 799 * 835 * ç¸æãã FIN ãåä¿¡ããã¾ã FIN ãéä¿¡ãã¦ããªããã836 * éããã¼ã¿ããªãã¨ãã¯ãFIN ãç¸æã«å±ããããã837 * ã»ã°ã¡ã³ããéä¿¡ããã800 * 相手から FIN を受信し、まだ FIN を送信していないか、 801 * 送るデータがないときは、FIN を相手に届けるため、 802 * セグメントを送信する。 838 803 */ 839 804 if ((flags & TCP_FLG_FIN) && … … 844 809 845 810 /* 846 * éä¿¡ãã¹ããã¼ã¿ããããåéã¿ã¤ãã¨æç¶ã¿ã¤ããåãã¦ããã¨ãã¯847 * æç¶ã¿ã¤ããè¨å®ããã811 * 送信すべきデータがあり、再送タイマと持続タイマが切れているときは 812 * 持続タイマを設定する。 848 813 */ 849 814 if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT ] == 0 && … … 860 825 861 826 /* 862 * tcptsk_alloc_swbufq -- éä¿¡ã¦ã£ã³ããããã¡å²ãå½ã¦827 * tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て 863 828 */ 864 829 … … 870 835 871 836 /* 872 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº873 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº837 * snd_wnd: 相手の受信可能ウィンドサイズ 838 * snd_cwnd: 輻輳ウィンドサイズ 874 839 * 875 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã840 * win: どちらか小さいウィンドサイズに設定する。 876 841 */ 877 842 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 878 843 879 844 /* 880 * ç¸æã®åä¿¡ã¦ã£ã³ããéãã¦ããå ´åã¯ãéãã¾ã§å¾ 881 æ©ããã 845 * 相手の受信ウィンドが閉じている場合は、開くまで待機する。 882 846 */ 883 847 if (win == 0) { … … 888 852 #ifdef TCP_CFG_NON_BLOCKING 889 853 890 /* ãã³ããããã³ã°ã³ã¼ã«*/854 /* ノンブロッキングコール */ 891 855 if (!IS_PTR_DEFINED(cep->callback)) { 892 856 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 893 857 894 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/858 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 895 859 cep->snd_tskid = TA_NULL; 896 860 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 907 871 (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) { 908 872 909 /* ãããã¯ã¼ã¯ãããã¡ãäºç´ããã*/873 /* ネットワークバッファを予約する。*/ 910 874 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND; 911 875 } 912 876 else { 913 877 914 /* éä¿¡ã¦ã£ã³ããããã¡ãåæåããã*/878 /* 送信ウィンドバッファを初期化する。*/ 915 879 tcp_init_swbuf(cep); 916 880 … … 921 885 uint_t len; 922 886 923 /* éä¿¡ã¦ã£ã³ããããã¡ã®æ¸ãè¾¼ã¿ã¢ãã¬ã¹ãè¨å®ããã*/887 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/ 924 888 len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf); 925 889 926 890 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 927 891 928 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/892 /* コールバック関数を呼び出す。*/ 929 893 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); 930 894 931 895 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 932 896 933 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/897 /* コールバック関数を呼び出す。*/ 934 898 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); 935 899 … … 937 901 938 902 939 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/903 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 940 904 cep->snd_tskid = TA_NULL; 941 905 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 947 911 uint_t len; 948 912 949 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/913 /* 送信ウィンドバッファにデータを書き込む。*/ 950 914 len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len); 951 915 952 916 #ifdef TCP_CFG_EXTENTIONS 953 917 954 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/918 /* 送信緊急ポインタを設定する。*/ 955 919 if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB) 956 920 cep->snd_up = cep->snd_una + len; … … 958 922 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 959 923 960 /* ãã©ã°ããéä¿¡å¯è½ã«è¨å®ããå¼·å¶çã«éä¿¡ããã*/924 /* フラグを、送信可能に設定し、強制的に送信する。*/ 961 925 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT; 962 926 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 963 927 964 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/928 /* コールバック関数を呼び出す。*/ 965 929 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); 966 930 967 931 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 968 932 969 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/933 /* コールバック関数を呼び出す。*/ 970 934 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); 971 935 … … 973 937 974 938 975 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/939 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 976 940 cep->snd_tskid = TA_NULL; 977 941 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 985 949 986 950 /* 987 * tcptsk_free_swbufq -- éä¿¡ã¦ã£ã³ããããã¡éæ¾951 * tcptsk_free_swbufq -- 送信ウィンドバッファ開放 988 952 */ 989 953 … … 992 956 { 993 957 /* 994 * å信確èªãå®äºãããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããã®995 * åºåãå®äºããã¨ãã¯ãéä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã解æ¾ããã996 */ 997 998 /* éä¿¡ã¦ã£ã³ããããã¡ã®ä½¿ç¨ä¸ãµã¤ãºããªã»ããããã*/958 * 受信確認が完了し、ネットワークインタフェースからの 959 * 出力も完了したときは、送信ウィンドバッファキューを解放する。 960 */ 961 962 /* 送信ウィンドバッファの使用中サイズをリセットする。*/ 999 963 cep->swbuf_count = 0; 1000 964 1001 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/965 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 1002 966 syscall(rel_net_buf(cep->swbufq)); 1003 967 cep->swbufq = NULL; 1004 968 1005 /* ãã©ã°ã空ãã«è¨å®ããã*/969 /* フラグを空きに設定する。*/ 1006 970 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE; 1007 971 1008 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããã§ãããã¨ãç¥ãããã*/972 /* 送信ウィンドバッファに空きができたことを知らせる。*/ 1009 973 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); 1010 974 1011 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãå¾ 1012 ã¡ã®ã¨ãã¯ãTCP åºåã¿ã¹ã¯ãèµ·åããã*/ 975 /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/ 1013 976 if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) { 1014 977 sig_sem(SEM_TCP_POST_OUTPUT); … … 1019 982 1020 983 /* 1021 * TCP åºåã¿ã¹ã¯984 * TCP 出力タスク 1022 985 */ 1023 986 … … 1038 1001 #ifdef SUPPORT_INET6 1039 1002 1040 /* IPv6 ã®ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ãå®è¡ããã*/1003 /* IPv6 のステートレス・アドレス自動設定を実行する。*/ 1041 1004 in6_if_up(IF_GET_IFNET()); 1042 1005 … … 1045 1008 while (true) { 1046 1009 1047 /* åºåããã¹ããããã¾ã§å¾ 1048 ã¤ã*/ 1010 /* 出力がポストされるまで待つ。*/ 1049 1011 syscall(wai_sem(SEM_TCP_POST_OUTPUT)); 1050 1012 … … 1071 1033 1072 1034 /* 1073 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµãã£ã¦ããªãã¨ãã¯ã1074 * éä¿¡ãäºç´ããã1035 * ネットワークインタフェースから送信が終わっていないときは、 1036 * 送信を予約する。 1075 1037 */ 1076 1038 if (cep->flags & TCP_CEP_FLG_POST_OUTPUT && … … 1087 1049 1088 1050 /* 1089 * éä¿¡äºç´ä¸ã«ããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµäºãããã 1090 * éä¿¡ãéå§ããããã ããå®å 1091 ¨ã«éä¿¡ãçµäºããã¨ãã¯ä½ãããªãã 1051 * 送信予約中に、ネットワークインタフェースから送信が終了したら、 1052 * 送信を開始する。ただし、完全に送信が終了したときは何もしない。 1092 1053 */ 1093 1054 if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) { … … 1112 1073 1113 1074 /* 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 なら、自動で割り当てる。 1118 1079 */ 1119 1080 if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY) … … 1136 1097 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 1137 1098 1138 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/1099 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 1139 1100 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; 1140 1101 cep->snd_tskid = TA_NULL; … … 1148 1109 1149 1110 if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) { 1150 /* ã³ãã¯ã·ã§ã³ãéããã*/1111 /* コネクションを閉じる。*/ 1151 1112 tcp_close(cep); 1152 1113 cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT; … … 1154 1115 1155 1116 if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) { 1156 /* snd_nxt ãå 1157 ã«æ»ãã*/ 1117 /* snd_nxt を元に戻す。*/ 1158 1118 if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt)) 1159 1119 cep->snd_nxt = cep->snd_old_nxt; … … 1168 1128 } while (ix != last_ix); 1169 1129 1170 /* 次åã¯ãå¦çããé信端ç¹ãå¾åãã«ããã*/1130 /* 次回は、処理した通信端点を後回しにする。*/ 1171 1131 last_ix = sel_ix; 1172 1132 }
Note:
See TracChangeset
for help on using the changeset viewer.