Changeset 318 for asp3_gr_sakura/trunk/tinet/netinet/tcp_output.c
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- 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
totext/x-csrc; charset=UTF-8
r317 r318 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$ … … 125 113 126 114 /* 127 * é¢æ°115 * 関数 128 116 */ 129 117 … … 132 120 133 121 /* 134 * å¤æ°122 * 変数 135 123 */ 136 124 137 /* åºåæã®ãã©ã°ã FSM ç¶æ 138 ã«ããé¸æããããã®è¡¨ */ 125 /* 出力時のフラグを FSM 状態により選択するための表 */ 139 126 140 127 const 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, 終了、時間待ち */ 157 139 }; 158 140 159 141 /* 160 * send_segment -- TCP åºåå¦ç142 * send_segment -- TCP 出力処理 161 143 */ 162 144 … … 188 170 189 171 /* 190 * ã»ã°ã¡ã³ãé·ããç¸æã®æ大åä¿¡ã»ã°ã¡ã³ãé·ã«èª¿æ´ããã 191 * ãããè¶ 192 ãã¦ããå ´åã¯ãè¶ 193 ããåãå¾ã§éä¿¡ããã 194 * ãã®ãããFIN ããããã¯ãªã¢ããã 172 * セグメント長を、相手の最大受信セグメント長に調整する。 173 * もし、超えている場合は、超えた分を後で送信する。 174 * このため、FIN ビットをクリアする。 195 175 * 196 * ãªãªã¸ãã«ã§ã¯ãt_maxopd ãå¶éé·ã«ãã¦ãããã 197 * æ¬å®è£ 198 ã§ã¯ãç¸æã®æ大åä¿¡ã»ã°ã¡ã³ãã«ããã 176 * オリジナルでは、t_maxopd を制限長にしているが、 177 * 本実装では、相手の最大受信セグメントにする。 199 178 */ 200 179 if (len + optlen > cep->maxseg) { … … 205 184 206 185 /* 207 * éä¿¡ãããã¡ã空ã«ãªãã¨ã㯠PUSH ãã©ã°ãè¨å®ããã186 * 送信バッファが空になるときは PUSH フラグを設定する。 208 187 */ 209 188 if (len && doff + len >= cep->swbuf_count) … … 216 195 217 196 /* 218 * éä¿¡ã¦ã¤ã³ããããã¡ãéæ¾ãããªãããã«ãã¦ã219 * ãããã¯ã¼ã¯ãããã¡ãåºåã«ç§»ãã197 * 送信ウインドバッファが開放されないようにして、 198 * ネットワークバッファを出力に移す。 220 199 */ 221 200 cep->swbufq->flags |= NB_FLG_NOREL_IFOUT; … … 225 204 226 205 /* 227 * ACK å®äºç¶æ 228 ã§ããã®é¢æ°ãå¼ã³åºããããã¨ãããã 229 * ãã®æã¯ãlen ã 0 ã«ãã¦ãå¦çãç¶ç¶ããã 206 * ACK 完了状態で、この関数が呼び出されることもある。 207 * この時は、len を 0 にして、処理を継続する。 230 208 */ 231 209 len = 0; … … 254 232 255 233 /* 256 * éä¿¡ã¦ã¤ã³ããããã¡ãéæ¾ãããªãããã«ãã¦ã257 * ãããã¯ã¼ã¯ãããã¡ãåºåã«ç§»ãã234 * 送信ウインドバッファが開放されないようにして、 235 * ネットワークバッファを出力に移す。 258 236 */ 259 237 cep->swbufq->flags |= NB_FLG_NOREL_IFOUT; … … 263 241 264 242 /* 265 * ACK å®äºç¶æ 266 ã§ããã®é¢æ°ãå¼ã³åºããããã¨ãããã 267 * ãã®æã¯ãlen ã 0 ã«ãã¦ãå¦çãç¶ç¶ããã 243 * ACK 完了状態で、この関数が呼び出されることもある。 244 * この時は、len を 0 にして、処理を継続する。 268 245 */ 269 246 len = 0; … … 290 267 291 268 /* 292 * TCP ãªãã·ã§ã³ã®è¨å®ãè¡ãã 293 * æ¬å®è£ 294 ã§ã¯ãæ大ã»ã°ã¡ã³ããµã¤ãºã®ã¿è¨å®ããã 269 * TCP オプションの設定を行う。 270 * 本実装では、最大セグメントサイズのみ設定する。 295 271 */ 296 272 hdr_offset = IF_IP_TCP_HDR_OFFSET(output); … … 309 285 } 310 286 311 /* TCP SDU ã«éä¿¡ãã¼ã¿ãã³ãã¼ããã*/287 /* TCP SDU に送信データをコピーする。*/ 312 288 313 289 if (len > 0) { … … 335 311 336 312 /* 337 * snd_max: éä¿¡ããæ大SEQ338 * snd_nxt: 次ã«éä¿¡ããSEQ313 * snd_max: 送信した最大 SEQ 314 * snd_nxt: 次に送信する SEQ 339 315 * 340 * ç¸æãã FIN ãåä¿¡ããã¾ã FIN ãéä¿¡ãã¦ããªããã341 * éããã¼ã¿ããªãã¨ãã¯ãFIN ãç¸æã«å±ããããã342 * ã»ã°ã¡ã³ããéä¿¡ããããSEQ ã¯é²ããªãã316 * 相手から FIN を受信し、まだ FIN を送信していないか、 317 * 送るデータがないときは、FIN を相手に届けるため、 318 * セグメントを送信するが、SEQ は進めない。 343 319 */ 344 320 if ((flags & TCP_FLG_FIN) && (cep->flags & TCP_CEP_FLG_SENT_FIN) && … … 350 326 351 327 /* 352 * SEQ ãACKããã©ã°ã®è¨å®ã328 * SEQ、ACK、フラグの設定。 353 329 */ 354 330 if (len > 0 || (flags & (TCP_FLG_SYN | TCP_FLG_FIN)) || cep->timer[TCP_TIM_PERSIST] != 0) … … 358 334 359 335 /* 360 * rcv_nxt: åä¿¡ãæå¾ 361 ãã¦ããæå°ã® SEQ 336 * rcv_nxt: 受信を期待している最小の SEQ 362 337 */ 363 338 tcph->ack = htonl(cep->rcv_nxt); … … 365 340 366 341 /* 367 * åä¿¡ã¦ã£ã³ãã®è¨ç®342 * 受信ウィンドの計算 368 343 * 369 * rbufsz: åä¿¡ç¨ãããã¡ãµã¤ãº370 * maxseg: ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº344 * rbufsz: 受信用バッファサイズ 345 * maxseg: 相手の最大受信セグメントサイズ 371 346 */ 372 347 if (win < (cep->rbufsz / 4) && win < cep->maxseg) … … 374 349 375 350 /* 376 * rcv_nxt: åä¿¡ãæå¾ 377 ãã¦ããæå°ã® SEQ 378 * rcv_adv: åä¿¡ãæå¾ 379 ãã¦ããæ大㮠SEQ 351 * rcv_nxt: 受信を期待している最小の SEQ 352 * rcv_adv: 受信を期待している最大の SEQ 380 353 */ 381 354 if ((int32_t)win < (int32_t)(cep->rcv_adv - cep->rcv_nxt)) … … 387 360 388 361 /* 389 * ç·æ¥ãã¤ã³ã¿ã®è¨å®362 * 緊急ポインタの設定 390 363 */ 391 364 if (SEQ_GT(cep->snd_up, cep->snd_nxt)) { … … 402 375 403 376 /* 404 * ãã§ãã¯ãµã ãè¨å®ããã377 * チェックサムを設定する。 405 378 */ 406 379 tcph->sum = 0; 407 380 tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset, GET_TCP_HDR_SIZE(output, hdr_offset) + len); 408 381 409 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/382 /* ネットワークバッファ長を調整する。*/ 410 383 output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset) + len); 411 384 412 385 /* 413 * ã¿ã¤ãã®èª¿æ´386 * タイマの調整 414 387 */ 415 388 if ((cep->flags & TCP_CEP_FLG_FORCE) == 0 || cep->timer[TCP_TIM_PERSIST] == 0) { … … 417 390 418 391 /* 419 * 次ã«éä¿¡ãã SEQ (snd_nxt) ãä»åéä¿¡ãããã¼ã¿æ°åé²ããã392 * 次に送信する SEQ (snd_nxt) を今回送信するデータ数分進める。 420 393 */ 421 394 if (flags & TCP_FLG_SYN) … … 429 402 430 403 /* 431 * 次ã«éä¿¡ãã SEQ (snd_nxt) ã432 * éä¿¡ããæ大 SEQ (snd_max) ããé²ãã§ããã°ã433 * éä¿¡ããæ大 SEQ (snd_max) ãæ´æ°ããã404 * 次に送信する SEQ (snd_nxt) が 405 * 送信した最大 SEQ (snd_max) より進んでいれば、 406 * 送信した最大 SEQ (snd_max) を更新する。 434 407 */ 435 408 if (SEQ_GT(cep->snd_nxt, cep->snd_max)) { 436 409 cep->snd_max = cep->snd_nxt; 437 410 /* 438 * ãããå¾å¾©æéè¨æ¸¬ãè¡ã£ã¦ããªããã°ã439 * ãã®éä¿¡ã«æéãåãããã411 * もし、往復時間計測を行っていなければ、 412 * この送信に時間を合わせる。 440 413 */ 441 414 if (cep->rtt == 0) { 442 415 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 * 再送時間のバックオフに使われるシフトカウントも初期化する。 452 425 */ 453 426 if (cep->timer[TCP_TIM_REXMT] == 0 && cep->snd_nxt != cep->snd_una) { … … 461 434 462 435 /* 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) を更新する。 466 439 */ 467 440 else if (SEQ_GT(cep->snd_nxt + len, cep->snd_max)) … … 481 454 #endif /* of #ifdef TCP_CFG_TRACE */ 482 455 483 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/456 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 484 457 if ((error = IP_OUTPUT(output, TMO_TCP_OUTPUT)) != E_OK) 485 458 goto err_ret; 486 459 487 460 /* 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 を更新する。 495 465 */ 496 466 if (win > 0 && SEQ_GT(cep->rcv_nxt + win, cep->rcv_adv)) { … … 499 469 500 470 /* 501 * æå¾ã«éä¿¡ãã ACK (last_ack_sent) ãæ´æ°ããã471 * 最後に送信した ACK (last_ack_sent) を更新する。 502 472 */ 503 473 cep->last_ack_sent = cep->rcv_nxt; 504 474 505 475 /* 506 * ãã©ã°ã®è¨å®ãè¡ãã476 * フラグの設定を行う。 507 477 */ 508 478 cep->flags &= ~(TCP_CEP_FLG_ACK_NOW | TCP_CEP_FLG_DEL_ACK); … … 514 484 err_ret: 515 485 /* 516 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã517 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½518 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½486 * 以下に関係しないフラグをクリアーする。 487 * ・送受信ウィンドバッファの省コピー機能 488 * ・動的な通信端点の生成・削除機能 519 489 */ 520 490 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; … … 524 494 525 495 /* 526 * tcp_output -- TCP åºåå¦ç496 * tcp_output -- TCP 出力処理 527 497 */ 528 498 … … 537 507 538 508 /* 539 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQ ã¾ãã¯ã確èªãããæ大éä¿¡SEQ540 * snd_max: éä¿¡ããæ大SEQ509 * snd_una: 未確認の最小送信 SEQ または、確認された最大送信 SEQ 510 * snd_max: 送信した最大 SEQ 541 511 */ 542 512 idle = (cep->snd_max == cep->snd_una); 543 513 544 514 /* 545 * idle: ã¢ã¤ãã«æé546 * rxtcur: ç¾å¨ã®åéã¿ã¤ã ã¢ã¦ã515 * idle: アイドル時間 516 * rxtcur: 現在の再送タイムアウト 547 517 */ 548 518 if (idle && cep->idle >= cep->rxtcur) 549 519 550 520 /* 551 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº552 * maxseg : ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº521 * snd_cwnd: 輻輳ウィンドサイズ 522 * maxseg : 相手の最大受信セグメントサイズ 553 523 * 554 * é·æéã¢ã¤ãã«ã ã£ãã®ã§ã¹ãã¼ã¹ã¿ã¼ãå¶å¾¡ã«è¨å®ããã524 * 長時間アイドルだったのでスロースタート制御に設定する。 555 525 */ 556 526 cep->snd_cwnd = cep->maxseg; … … 560 530 561 531 /* 562 * snd_nxt: 次ã«éä¿¡ãã SEQããã®æç¹ã§ã¯ãååéä¿¡ããSEQ563 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ532 * snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ 533 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 564 534 * 565 * doff: éä¿¡ãéå§ãããªãã»ããã566 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)535 * doff: 送信を開始するオフセット。 536 * swbuf_count (送信バッファにあるオクテット数) 567 537 * 0 V 568 538 * +-------------------------------------------+ … … 570 540 * +-------------------------------------------+ 571 541 * ^ ^ 572 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)542 * |<------------->snd_nxt (前回送信した SEQ) 573 543 * | doff 574 * snd_una ( ã¾ã 確èªããã¦ããªã)544 * snd_una (まだ確認されていない) 575 545 */ 576 546 doff = (uint_t)(cep->snd_nxt - cep->snd_una); 577 547 578 548 /* 579 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº580 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº549 * snd_wnd: 相手の受信可能ウィンドサイズ 550 * snd_cwnd: 輻輳ウィンドサイズ 581 551 * 582 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã552 * win: どちらか小さいウィンドサイズに設定する。 583 553 */ 584 554 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 585 555 586 /* åºåãã©ã°ã®è¨å®*/556 /* 出力フラグの設定 */ 587 557 flags = tcp_outflags[cep->fsm_state]; 588 558 if (cep->flags & TCP_CEP_FLG_NEED_FIN) … … 593 563 594 564 /* 595 * ãããéä¿¡ã¦ã¤ã³ããµã¤ãº (win) ã 0 ãªã 1 ãªã¯ãããéä¿¡ããã596 * ããã§ãªããã°ãæç¶ã¿ã¤ã ã¢ã¦ãããã£ã³ã»ã«ãã597 * åéä¿¡åæ° (rxtshift) ã 0 ã«ããã565 * もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。 566 * そうでなければ、持続タイムアウトをキャンセルし、 567 * 再送信回数 (rxtshift) を 0 にする。 598 568 */ 599 569 if (win == 0) { 600 570 601 571 /* 602 * doff: éä¿¡ãããªã¯ãããæ°ã603 * swbuf_count: éä¿¡ãããã¡ã®ä½¿ç¨ä¸ãµã¤ãº572 * doff: 送信するオクテット数。 573 * swbuf_count: 送信バッファの使用中サイズ 604 574 * 605 * éä¿¡ãããã¡ã«æ®ã£ã¦ãããªã¯ããããããããã606 * éä¿¡ãããã¨ãã¦ãããªã¯ãããæ°ããå¤ããã°607 * FIN ãã©ã°ãã¯ãªã¢ããã575 * 送信バッファに残っているオクテットが、これから 576 * 送信しようとしているオクテット数より多ければ 577 * FIN フラグをクリアする。 608 578 */ 609 579 if (doff < cep->swbuf_count) … … 613 583 else { 614 584 /* 615 * TCP_TIM_PERSIST: æç¶ã¿ã¤ã616 * rxtshift: åéä¿¡åæ°ã®log(2)585 * TCP_TIM_PERSIST: 持続タイマ 586 * rxtshift: 再送信回数の log(2) 617 587 */ 618 588 cep->timer[TCP_TIM_PERSIST] = 0; … … 622 592 623 593 /* 624 * len: ä»åéä¿¡ãããªã¯ãããæ°625 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)594 * len: 今回送信するオクテット数 595 * swbuf_count (送信バッファにあるオクテット数) 626 596 * | 627 597 * 0 V … … 631 601 * ^ ^<-------------> 632 602 * | | len 633 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)603 * |<------------->snd_nxt (前回送信した SEQ) 634 604 * | doff 635 * snd_una ( ã¾ã 確èªããã¦ããªã)605 * snd_una (まだ確認されていない) 636 606 */ 637 607 if (cep->swbuf_count < win) … … 641 611 642 612 /* 643 * ãã§ã«éä¿¡ããã¦ããã°ãSYN ãããããªãããã644 * ãããã以ä¸ã®æ¡ä»¶ã§ã¯éä¿¡ãæ§ããã613 * すでに送信されていれば、SYN ビットをオフする。 614 * しかし、以下の条件では送信を控える。 645 615 * 646 * ã»ç¶æ 647 ã SYN éä¿¡ã 648 * ã»ã»ã°ã¡ã³ãããã¼ã¿ãå«ãã§ããã 616 * ・状態が SYN 送信。 617 * ・セグメントがデータを含んでいる。 649 618 */ 650 619 if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) { 651 620 flags &= ~TCP_FLG_SYN; 652 doff --; /* -1 㯠SYN ãã©ã°å*/653 len ++; /* +1 㯠SYN ãã©ã°å*/621 doff --; /* -1 は SYN フラグ分 */ 622 len ++; /* +1 は SYN フラグ分 */ 654 623 if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT) 655 624 break; … … 664 633 665 634 /* 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 * そして、持続タイマーが止まっていれば、再設定する。 672 641 */ 673 642 len = 0; … … 683 652 684 653 /* 685 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã¯ã 686 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ãè¶ 687 ããªãããã«ããã 654 * 今回送信するオクテット数 (len) は、 655 * 相手の最大受信セグメントサイズ (maxseg) を超えないようにする。 688 656 */ 689 657 if (len > cep->maxseg) { … … 693 661 694 662 /* 695 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)663 * swbuf_count (送信バッファにあるオクテット数) 696 664 * | 697 665 * 0 V … … 701 669 * ^ ^<-------------> 702 670 * | | len 703 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)671 * |<------------->snd_nxt (前回送信した SEQ) 704 672 * | doff 705 * snd_una ( ã¾ã 確èªããã¦ããªã)673 * snd_una (まだ確認されていない) 706 674 * 707 * ä»åéä¿¡å¾ããéä¿¡ãããã¡ã«ãã¼ã¿ãæ®ã£ã¦ããã°708 * FIN ãã©ã°ãã¯ãªã¢ããã675 * 今回送信後も、送信バッファにデータが残っていれば 676 * FIN フラグをクリアする。 709 677 */ 710 678 if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count)) … … 712 680 713 681 /* 714 * ãããã win ã¯ãåä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã715 * åä¿¡ãããã¡ã®ç©ºã容é682 * ここから win は、受信ウィンドウサイズ。 683 * 受信バッファの空き容量 716 684 */ 717 685 win = cep->rbufsz - cep->rwbuf_count; 718 686 719 687 /* 720 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (éä¿¡å´)688 * 愚かなウィンドウ・シンドロームの回避処理 (送信側) 721 689 * 722 * 以ä¸ã®æ¡ä»¶ã§ãéä¿¡ãè¡ãã690 * 以下の条件で、送信を行う。 723 691 * 724 * ã»ãã«ãµã¤ãº (maxseg) ã®ã»ã°ã¡ã³ããéããã¨ãã§ããã 725 * ã»ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 ã®ãã¼ã¿ã 726 * éããã¨ãã§ããã 727 * ã»éä¿¡ãããã¡ã空ã«ã§ããã¢ã¤ãã«ãéé 728 延ãªãã·ã§ã³ãæå¹ãªã¨ãã 692 * ・フルサイズ (maxseg) のセグメントを送ることができる。 693 * ・相手の最大の受信ウィンドウサイズの 1/2 のデータを 694 * 送ることができる。 695 * ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。 729 696 */ 730 697 if (len) { 731 698 732 699 /* 733 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã734 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ã«735 * ä¸è´ããã¨ãã¯éä¿¡ããã700 * 今回送信するオクテット数 (len) が 701 * 相手の最大受信セグメントサイズ (maxseg) に 702 * 一致するときは送信する。 736 703 */ 737 704 if (len == cep->maxseg) { … … 741 708 742 709 /* 743 * ä»åã®éä¿¡ã§ãéä¿¡ãããã¡ã空ã«ã§ãã744 * ã¢ã¤ãã«ãé PUSH ãªãã·ã§ã³ãæå¹ãªã¨ãã710 * 今回の送信で、送信バッファを空にでき、 711 * アイドルか非 PUSH オプションが有効なとき。 745 712 */ 746 713 if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) && … … 752 719 753 720 /* 754 * max_sndwnd: ä»ã¾ã§ã®æ大éä¿¡ã¦ã£ã³ããµã¤ãº755 * snd_nxt: 次ã«éä¿¡ããSEQ756 * snd_max: éä¿¡ããæ大SEQ721 * max_sndwnd: 今までの最大送信ウィンドサイズ 722 * snd_nxt: 次に送信する SEQ 723 * snd_max: 送信した最大 SEQ 757 724 * 758 * 次ã®æ¡ä»¶ã§ã¯éä¿¡ãè¡ãã725 * 次の条件では送信を行う。 759 726 * 760 * ã»å¼·å¶éä¿¡ãã©ã°ãã»ããããã¦ããã761 * ã»ãã¼ã¿é·ãç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 以ä¸ã§ã762 * ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã 0 ãã大ããã763 * ã»æ¬¡ã«éä¿¡ãã SEQ ãéä¿¡ããæ大 SEQ ããå°ããã764 * ã¤ã¾ããåéããã¨ãã727 * ・強制送信フラグがセットされている。 728 * ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、 729 * 相手の最大の受信ウィンドウサイズが 0 より大きい。 730 * ・次に送信する SEQ が送信した最大 SEQ より小さい、 731 * つまり、再送するとき。 765 732 */ 766 733 if ((cep->flags & TCP_CEP_FLG_FORCE) || … … 774 741 775 742 /* 776 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (åä¿¡å´)743 * 愚かなウィンドウ・シンドロームの回避処理 (受信側) 777 744 * 778 * ã¦ã£ã³ãã¦ãµã¤ãºããã«ãµã¤ãºã® 2 åã®ã»ã°ã¡ã³ãããããã¯779 * åä¿¡ãããã¡å®¹éã® 1/2 ã®ãããããå°ããã»ãã®780 * ãµã¤ãºã§å¢å ãããå ´åã¯ãã¦ã£ã³ãã¦ãµã¤ãºã®æ´æ°ãè¡ãã745 * ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは 746 * 受信バッファ容量の 1/2 の、いずれか小さいほうの 747 * サイズで増加される場合は、ウィンドウサイズの更新を行う。 781 748 */ 782 749 if (win > 0) { … … 784 751 785 752 /* 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 792 757 */ 793 758 if (win < MAX_TCP_WIN_SIZE) … … 804 769 805 770 /* 806 * ACK ãéä¿¡ããã771 * ACK を送信する。 807 772 */ 808 773 if (cep->flags & TCP_CEP_FLG_ACK_NOW) { … … 827 792 828 793 /* 829 * snd_nxt: 次ã«éä¿¡ããSEQ830 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ794 * snd_nxt: 次に送信する SEQ 795 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 831 796 * 832 * ç¸æãã FIN ãåä¿¡ããã¾ã FIN ãéä¿¡ãã¦ããªããã833 * éããã¼ã¿ããªãã¨ãã¯ãFIN ãç¸æã«å±ããããã834 * ã»ã°ã¡ã³ããéä¿¡ããã797 * 相手から FIN を受信し、まだ FIN を送信していないか、 798 * 送るデータがないときは、FIN を相手に届けるため、 799 * セグメントを送信する。 835 800 */ 836 801 if ((flags & TCP_FLG_FIN) && … … 841 806 842 807 /* 843 * éä¿¡ãã¹ããã¼ã¿ããããåéã¿ã¤ãã¨æç¶ã¿ã¤ããåãã¦ããã¨ãã¯844 * æç¶ã¿ã¤ããè¨å®ããã808 * 送信すべきデータがあり、再送タイマと持続タイマが切れているときは 809 * 持続タイマを設定する。 845 810 */ 846 811 if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT ] == 0 && … … 857 822 858 823 /* 859 * tcptsk_alloc_swbufq -- éä¿¡ã¦ã£ã³ããããã¡å²ãå½ã¦824 * tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て 860 825 */ 861 826 … … 867 832 868 833 /* 869 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº870 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº834 * snd_wnd: 相手の受信可能ウィンドサイズ 835 * snd_cwnd: 輻輳ウィンドサイズ 871 836 * 872 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã837 * win: どちらか小さいウィンドサイズに設定する。 873 838 */ 874 839 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 875 840 876 841 /* 877 * ç¸æã®åä¿¡ã¦ã£ã³ããéãã¦ããå ´åã¯ãéãã¾ã§å¾ 878 æ©ããã 842 * 相手の受信ウィンドが閉じている場合は、開くまで待機する。 879 843 */ 880 844 if (win == 0) { … … 885 849 #ifdef TCP_CFG_NON_BLOCKING 886 850 887 /* ãã³ããããã³ã°ã³ã¼ã«*/851 /* ノンブロッキングコール */ 888 852 if (!IS_PTR_DEFINED(cep->callback)) { 889 853 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 890 854 891 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/855 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 892 856 cep->snd_tskid = TA_NULL; 893 857 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 904 868 (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) { 905 869 906 /* ãããã¯ã¼ã¯ãããã¡ãäºç´ããã*/870 /* ネットワークバッファを予約する。*/ 907 871 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND; 908 872 } 909 873 else { 910 874 911 /* éä¿¡ã¦ã£ã³ããããã¡ãåæåããã*/875 /* 送信ウィンドバッファを初期化する。*/ 912 876 tcp_init_swbuf(cep); 913 877 … … 918 882 uint_t len; 919 883 920 /* éä¿¡ã¦ã£ã³ããããã¡ã®æ¸ãè¾¼ã¿ã¢ãã¬ã¹ãè¨å®ããã*/884 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/ 921 885 len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf); 922 886 923 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/887 /* コールバック関数を呼び出す。*/ 924 888 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 925 889 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); … … 929 893 930 894 931 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/895 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 932 896 cep->snd_tskid = TA_NULL; 933 897 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 939 903 uint_t len; 940 904 941 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/905 /* 送信ウィンドバッファにデータを書き込む。*/ 942 906 len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len); 943 907 944 908 #ifdef TCP_CFG_EXTENTIONS 945 909 946 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/910 /* 送信緊急ポインタを設定する。*/ 947 911 if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB) 948 912 cep->snd_up = cep->snd_una + len; … … 950 914 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 951 915 952 /* ãã©ã°ããéä¿¡å¯è½ã«è¨å®ããå¼·å¶çã«éä¿¡ããã*/916 /* フラグを、送信可能に設定し、強制的に送信する。*/ 953 917 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT; 954 918 955 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/919 /* コールバック関数を呼び出す。*/ 956 920 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 957 921 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); … … 961 925 962 926 963 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/927 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 964 928 cep->snd_tskid = TA_NULL; 965 929 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 973 937 974 938 /* 975 * tcptsk_free_swbufq -- éä¿¡ã¦ã£ã³ããããã¡éæ¾939 * tcptsk_free_swbufq -- 送信ウィンドバッファ開放 976 940 */ 977 941 … … 980 944 { 981 945 /* 982 * å信確èªãå®äºãããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããã®983 * åºåãå®äºããã¨ãã¯ãéä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã解æ¾ããã984 */ 985 986 /* éä¿¡ã¦ã£ã³ããããã¡ã®ä½¿ç¨ä¸ãµã¤ãºããªã»ããããã*/946 * 受信確認が完了し、ネットワークインタフェースからの 947 * 出力も完了したときは、送信ウィンドバッファキューを解放する。 948 */ 949 950 /* 送信ウィンドバッファの使用中サイズをリセットする。*/ 987 951 cep->swbuf_count = 0; 988 952 989 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/953 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 990 954 syscall(rel_net_buf(cep->swbufq)); 991 955 cep->swbufq = NULL; 992 956 993 /* ãã©ã°ã空ãã«è¨å®ããã*/957 /* フラグを空きに設定する。*/ 994 958 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE; 995 959 996 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããã§ãããã¨ãç¥ãããã*/960 /* 送信ウィンドバッファに空きができたことを知らせる。*/ 997 961 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); 998 962 999 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãå¾ 1000 ã¡ã®ã¨ãã¯ãTCP åºåã¿ã¹ã¯ãèµ·åããã*/ 963 /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/ 1001 964 if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) { 1002 965 sig_sem(SEM_TCP_POST_OUTPUT); … … 1007 970 1008 971 /* 1009 * TCP åºåã¿ã¹ã¯972 * TCP 出力タスク 1010 973 */ 1011 974 … … 1026 989 #ifdef _IP6_CFG 1027 990 1028 /* IPv6 ã®ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ãå®è¡ããã*/991 /* IPv6 のステートレス・アドレス自動設定を実行する。*/ 1029 992 in6_if_up(IF_GET_IFNET()); 1030 993 … … 1033 996 while (true) { 1034 997 1035 /* åºåããã¹ããããã¾ã§å¾ 1036 ã¤ã*/ 998 /* 出力がポストされるまで待つ。*/ 1037 999 syscall(wai_sem(SEM_TCP_POST_OUTPUT)); 1038 1000 … … 1059 1021 1060 1022 /* 1061 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµãã£ã¦ããªãã¨ãã¯ã1062 * éä¿¡ãäºç´ããã1023 * ネットワークインタフェースから送信が終わっていないときは、 1024 * 送信を予約する。 1063 1025 */ 1064 1026 if (cep->flags & TCP_CEP_FLG_POST_OUTPUT && … … 1075 1037 1076 1038 /* 1077 * éä¿¡äºç´ä¸ã«ããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµäºãããã 1078 * éä¿¡ãéå§ããããã ããå®å 1079 ¨ã«éä¿¡ãçµäºããã¨ãã¯ä½ãããªãã 1039 * 送信予約中に、ネットワークインタフェースから送信が終了したら、 1040 * 送信を開始する。ただし、完全に送信が終了したときは何もしない。 1080 1041 */ 1081 1042 if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) { … … 1100 1061 1101 1062 /* 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 なら、自動で割り当てる。 1106 1067 */ 1107 1068 if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY) … … 1118 1079 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 1119 1080 1120 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/1081 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 1121 1082 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; 1122 1083 cep->snd_tskid = TA_NULL; … … 1130 1091 1131 1092 if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) { 1132 /* ã³ãã¯ã·ã§ã³ãéããã*/1093 /* コネクションを閉じる。*/ 1133 1094 tcp_close(cep); 1134 1095 cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT; … … 1136 1097 1137 1098 if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) { 1138 /* snd_nxt ãå 1139 ã«æ»ãã*/ 1099 /* snd_nxt を元に戻す。*/ 1140 1100 if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt)) 1141 1101 cep->snd_nxt = cep->snd_old_nxt; … … 1150 1110 } while (ix != last_ix); 1151 1111 1152 /* 次åã¯ãå¦çããé信端ç¹ãå¾åãã«ããã*/1112 /* 次回は、処理した通信端点を後回しにする。*/ 1153 1113 last_ix = sel_ix; 1154 1114 }
Note:
See TracChangeset
for help on using the changeset viewer.