Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet/tcp_output.c
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- 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
totext/x-csrc;charset=UTF-8
r388 r389 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)) { … … 404 377 405 378 /* 406 * ãã§ãã¯ãµã ãè¨å®ããã379 * チェックサムを設定する。 407 380 */ 408 381 tcph->sum = 0; 409 382 tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset, GET_TCP_HDR_SIZE(output, hdr_offset) + len); 410 383 411 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/384 /* ネットワークバッファ長を調整する。*/ 412 385 output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, 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_NOT_CLEAR; … … 526 496 527 497 /* 528 * tcp_output -- TCP åºåå¦ç498 * tcp_output -- TCP 出力処理 529 499 */ 530 500 … … 539 509 540 510 /* 541 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQ ã¾ãã¯ã確èªãããæ大éä¿¡SEQ542 * snd_max: éä¿¡ããæ大SEQ511 * snd_una: 未確認の最小送信 SEQ または、確認された最大送信 SEQ 512 * snd_max: 送信した最大 SEQ 543 513 */ 544 514 idle = (cep->snd_max == cep->snd_una); 545 515 546 516 /* 547 * idle: ã¢ã¤ãã«æé548 * rxtcur: ç¾å¨ã®åéã¿ã¤ã ã¢ã¦ã517 * idle: アイドル時間 518 * rxtcur: 現在の再送タイムアウト 549 519 */ 550 520 if (idle && cep->idle >= cep->rxtcur) 551 521 552 522 /* 553 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº554 * maxseg : ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº523 * snd_cwnd: 輻輳ウィンドサイズ 524 * maxseg : 相手の最大受信セグメントサイズ 555 525 * 556 * é·æéã¢ã¤ãã«ã ã£ãã®ã§ã¹ãã¼ã¹ã¿ã¼ãå¶å¾¡ã«è¨å®ããã526 * 長時間アイドルだったのでスロースタート制御に設定する。 557 527 */ 558 528 cep->snd_cwnd = cep->maxseg; … … 562 532 563 533 /* 564 * snd_nxt: 次ã«éä¿¡ãã SEQããã®æç¹ã§ã¯ãååéä¿¡ããSEQ565 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ534 * snd_nxt: 次に送信する SEQ、この時点では、前回送信した SEQ 535 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 566 536 * 567 * doff: éä¿¡ãéå§ãããªãã»ããã568 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)537 * doff: 送信を開始するオフセット。 538 * swbuf_count (送信バッファにあるオクテット数) 569 539 * 0 V 570 540 * +-------------------------------------------+ … … 572 542 * +-------------------------------------------+ 573 543 * ^ ^ 574 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)544 * |<------------->snd_nxt (前回送信した SEQ) 575 545 * | doff 576 * snd_una ( ã¾ã 確èªããã¦ããªã)546 * snd_una (まだ確認されていない) 577 547 */ 578 548 doff = (uint_t)(cep->snd_nxt - cep->snd_una); 579 549 580 550 /* 581 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº582 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº551 * snd_wnd: 相手の受信可能ウィンドサイズ 552 * snd_cwnd: 輻輳ウィンドサイズ 583 553 * 584 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã554 * win: どちらか小さいウィンドサイズに設定する。 585 555 */ 586 556 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 587 557 588 /* åºåãã©ã°ã®è¨å®*/558 /* 出力フラグの設定 */ 589 559 flags = tcp_outflags[cep->fsm_state]; 590 560 if (cep->flags & TCP_CEP_FLG_NEED_FIN) … … 595 565 596 566 /* 597 * ãããéä¿¡ã¦ã¤ã³ããµã¤ãº (win) ã 0 ãªã 1 ãªã¯ãããéä¿¡ããã598 * ããã§ãªããã°ãæç¶ã¿ã¤ã ã¢ã¦ãããã£ã³ã»ã«ãã599 * åéä¿¡åæ° (rxtshift) ã 0 ã«ããã567 * もし、送信ウインドサイズ (win) が 0 なら 1 オクテット送信する。 568 * そうでなければ、持続タイムアウトをキャンセルし、 569 * 再送信回数 (rxtshift) を 0 にする。 600 570 */ 601 571 if (win == 0) { 602 572 603 573 /* 604 * doff: éä¿¡ãããªã¯ãããæ°ã605 * swbuf_count: éä¿¡ãããã¡ã®ä½¿ç¨ä¸ãµã¤ãº574 * doff: 送信するオクテット数。 575 * swbuf_count: 送信バッファの使用中サイズ 606 576 * 607 * éä¿¡ãããã¡ã«æ®ã£ã¦ãããªã¯ããããããããã608 * éä¿¡ãããã¨ãã¦ãããªã¯ãããæ°ããå¤ããã°609 * FIN ãã©ã°ãã¯ãªã¢ããã577 * 送信バッファに残っているオクテットが、これから 578 * 送信しようとしているオクテット数より多ければ 579 * FIN フラグをクリアする。 610 580 */ 611 581 if (doff < cep->swbuf_count) … … 615 585 else { 616 586 /* 617 * TCP_TIM_PERSIST: æç¶ã¿ã¤ã618 * rxtshift: åéä¿¡åæ°ã®log(2)587 * TCP_TIM_PERSIST: 持続タイマ 588 * rxtshift: 再送信回数の log(2) 619 589 */ 620 590 cep->timer[TCP_TIM_PERSIST] = 0; … … 624 594 625 595 /* 626 * len: ä»åéä¿¡ãããªã¯ãããæ°627 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)596 * len: 今回送信するオクテット数 597 * swbuf_count (送信バッファにあるオクテット数) 628 598 * | 629 599 * 0 V … … 633 603 * ^ ^<-------------> 634 604 * | | len 635 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)605 * |<------------->snd_nxt (前回送信した SEQ) 636 606 * | doff 637 * snd_una ( ã¾ã 確èªããã¦ããªã)607 * snd_una (まだ確認されていない) 638 608 */ 639 609 if (cep->swbuf_count < win) … … 643 613 644 614 /* 645 * ãã§ã«éä¿¡ããã¦ããã°ãSYN ãããããªãããã646 * ãããã以ä¸ã®æ¡ä»¶ã§ã¯éä¿¡ãæ§ããã615 * すでに送信されていれば、SYN ビットをオフする。 616 * しかし、以下の条件では送信を控える。 647 617 * 648 * ã»ç¶æ 649 ã SYN éä¿¡ã 650 * ã»ã»ã°ã¡ã³ãããã¼ã¿ãå«ãã§ããã 618 * ・状態が SYN 送信。 619 * ・セグメントがデータを含んでいる。 651 620 */ 652 621 if ((flags & TCP_FLG_SYN) && SEQ_GT(cep->snd_nxt, cep->snd_una)) { 653 622 flags &= ~TCP_FLG_SYN; 654 doff --; /* -1 㯠SYN ãã©ã°å*/655 len ++; /* +1 㯠SYN ãã©ã°å*/623 doff --; /* -1 は SYN フラグ分 */ 624 len ++; /* +1 は SYN フラグ分 */ 656 625 if (len > 0 && cep->fsm_state == TCP_FSM_SYN_SENT) 657 626 break; … … 666 635 667 636 /* 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 * そして、持続タイマーが止まっていれば、再設定する。 674 643 */ 675 644 len = 0; … … 685 654 686 655 /* 687 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã¯ã 688 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ãè¶ 689 ããªãããã«ããã 656 * 今回送信するオクテット数 (len) は、 657 * 相手の最大受信セグメントサイズ (maxseg) を超えないようにする。 690 658 */ 691 659 if (len > cep->maxseg) { … … 695 663 696 664 /* 697 * swbuf_count ( éä¿¡ãããã¡ã«ãããªã¯ãããæ°)665 * swbuf_count (送信バッファにあるオクテット数) 698 666 * | 699 667 * 0 V … … 703 671 * ^ ^<-------------> 704 672 * | | len 705 * |<------------->snd_nxt ( ååéä¿¡ããSEQ)673 * |<------------->snd_nxt (前回送信した SEQ) 706 674 * | doff 707 * snd_una ( ã¾ã 確èªããã¦ããªã)675 * snd_una (まだ確認されていない) 708 676 * 709 * ä»åéä¿¡å¾ããéä¿¡ãããã¡ã«ãã¼ã¿ãæ®ã£ã¦ããã°710 * FIN ãã©ã°ãã¯ãªã¢ããã677 * 今回送信後も、送信バッファにデータが残っていれば 678 * FIN フラグをクリアする。 711 679 */ 712 680 if (SEQ_LT(cep->snd_nxt + len, cep->snd_una + cep->swbuf_count)) … … 714 682 715 683 /* 716 * ãããã win ã¯ãåä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã717 * åä¿¡ãããã¡ã®ç©ºã容é684 * ここから win は、受信ウィンドウサイズ。 685 * 受信バッファの空き容量 718 686 */ 719 687 win = cep->rbufsz - cep->rwbuf_count; 720 688 721 689 /* 722 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (éä¿¡å´)690 * 愚かなウィンドウ・シンドロームの回避処理 (送信側) 723 691 * 724 * 以ä¸ã®æ¡ä»¶ã§ãéä¿¡ãè¡ãã692 * 以下の条件で、送信を行う。 725 693 * 726 * ã»ãã«ãµã¤ãº (maxseg) ã®ã»ã°ã¡ã³ããéããã¨ãã§ããã 727 * ã»ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 ã®ãã¼ã¿ã 728 * éããã¨ãã§ããã 729 * ã»éä¿¡ãããã¡ã空ã«ã§ããã¢ã¤ãã«ãéé 730 延ãªãã·ã§ã³ãæå¹ãªã¨ãã 694 * ・フルサイズ (maxseg) のセグメントを送ることができる。 695 * ・相手の最大の受信ウィンドウサイズの 1/2 のデータを 696 * 送ることができる。 697 * ・送信バッファを空にでき、アイドルか非遅延オプションが有効なとき。 731 698 */ 732 699 if (len) { 733 700 734 701 /* 735 * ä»åéä¿¡ãããªã¯ãããæ° (len) ã736 * ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ã«737 * ä¸è´ããã¨ãã¯éä¿¡ããã702 * 今回送信するオクテット数 (len) が 703 * 相手の最大受信セグメントサイズ (maxseg) に 704 * 一致するときは送信する。 738 705 */ 739 706 if (len == cep->maxseg) { … … 743 710 744 711 /* 745 * ä»åã®éä¿¡ã§ãéä¿¡ãããã¡ã空ã«ã§ãã746 * ã¢ã¤ãã«ãé PUSH ãªãã·ã§ã³ãæå¹ãªã¨ãã712 * 今回の送信で、送信バッファを空にでき、 713 * アイドルか非 PUSH オプションが有効なとき。 747 714 */ 748 715 if ((idle || (cep->flags & TCP_CEP_FLG_NO_DELAY)) && … … 754 721 755 722 /* 756 * max_sndwnd: ä»ã¾ã§ã®æ大éä¿¡ã¦ã£ã³ããµã¤ãº757 * snd_nxt: 次ã«éä¿¡ããSEQ758 * snd_max: éä¿¡ããæ大SEQ723 * max_sndwnd: 今までの最大送信ウィンドサイズ 724 * snd_nxt: 次に送信する SEQ 725 * snd_max: 送信した最大 SEQ 759 726 * 760 * 次ã®æ¡ä»¶ã§ã¯éä¿¡ãè¡ãã727 * 次の条件では送信を行う。 761 728 * 762 * ã»å¼·å¶éä¿¡ãã©ã°ãã»ããããã¦ããã763 * ã»ãã¼ã¿é·ãç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã® 1/2 以ä¸ã§ã764 * ç¸æã®æ大ã®åä¿¡ã¦ã£ã³ãã¦ãµã¤ãºã 0 ãã大ããã765 * ã»æ¬¡ã«éä¿¡ãã SEQ ãéä¿¡ããæ大 SEQ ããå°ããã766 * ã¤ã¾ããåéããã¨ãã729 * ・強制送信フラグがセットされている。 730 * ・データ長が相手の最大の受信ウィンドウサイズの 1/2 以上で、 731 * 相手の最大の受信ウィンドウサイズが 0 より大きい。 732 * ・次に送信する SEQ が送信した最大 SEQ より小さい、 733 * つまり、再送するとき。 767 734 */ 768 735 if ((cep->flags & TCP_CEP_FLG_FORCE) || … … 776 743 777 744 /* 778 * æããªã¦ã£ã³ãã¦ã»ã·ã³ããã¼ã ã®åé¿å¦ç (åä¿¡å´)745 * 愚かなウィンドウ・シンドロームの回避処理 (受信側) 779 746 * 780 * ã¦ã£ã³ãã¦ãµã¤ãºããã«ãµã¤ãºã® 2 åã®ã»ã°ã¡ã³ãããããã¯781 * åä¿¡ãããã¡å®¹éã® 1/2 ã®ãããããå°ããã»ãã®782 * ãµã¤ãºã§å¢å ãããå ´åã¯ãã¦ã£ã³ãã¦ãµã¤ãºã®æ´æ°ãè¡ãã747 * ウィンドウサイズがフルサイズの 2 倍のセグメント、あるいは 748 * 受信バッファ容量の 1/2 の、いずれか小さいほうの 749 * サイズで増加される場合は、ウィンドウサイズの更新を行う。 783 750 */ 784 751 if (win > 0) { … … 786 753 787 754 /* 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 794 759 */ 795 760 if (win < MAX_TCP_WIN_SIZE) … … 806 771 807 772 /* 808 * ACK ãéä¿¡ããã773 * ACK を送信する。 809 774 */ 810 775 if (cep->flags & TCP_CEP_FLG_ACK_NOW) { … … 829 794 830 795 /* 831 * snd_nxt: 次ã«éä¿¡ããSEQ832 * snd_una: æªç¢ºèªã®æå°éä¿¡ SEQãã¾ãã¯ç¢ºèªãããæ大éä¿¡SEQ796 * snd_nxt: 次に送信する SEQ 797 * snd_una: 未確認の最小送信 SEQ、または確認された最大送信 SEQ 833 798 * 834 * ç¸æãã FIN ãåä¿¡ããã¾ã FIN ãéä¿¡ãã¦ããªããã835 * éããã¼ã¿ããªãã¨ãã¯ãFIN ãç¸æã«å±ããããã836 * ã»ã°ã¡ã³ããéä¿¡ããã799 * 相手から FIN を受信し、まだ FIN を送信していないか、 800 * 送るデータがないときは、FIN を相手に届けるため、 801 * セグメントを送信する。 837 802 */ 838 803 if ((flags & TCP_FLG_FIN) && … … 843 808 844 809 /* 845 * éä¿¡ãã¹ããã¼ã¿ããããåéã¿ã¤ãã¨æç¶ã¿ã¤ããåãã¦ããã¨ãã¯846 * æç¶ã¿ã¤ããè¨å®ããã810 * 送信すべきデータがあり、再送タイマと持続タイマが切れているときは 811 * 持続タイマを設定する。 847 812 */ 848 813 if (cep->swbuf_count && cep->timer[TCP_TIM_REXMT ] == 0 && … … 859 824 860 825 /* 861 * tcptsk_alloc_swbufq -- éä¿¡ã¦ã£ã³ããããã¡å²ãå½ã¦826 * tcptsk_alloc_swbufq -- 送信ウィンドバッファ割り当て 862 827 */ 863 828 … … 869 834 870 835 /* 871 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº872 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº836 * snd_wnd: 相手の受信可能ウィンドサイズ 837 * snd_cwnd: 輻輳ウィンドサイズ 873 838 * 874 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã839 * win: どちらか小さいウィンドサイズに設定する。 875 840 */ 876 841 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; 877 842 878 843 /* 879 * ç¸æã®åä¿¡ã¦ã£ã³ããéãã¦ããå ´åã¯ãéãã¾ã§å¾ 880 æ©ããã 844 * 相手の受信ウィンドが閉じている場合は、開くまで待機する。 881 845 */ 882 846 if (win == 0) { … … 887 851 #ifdef TCP_CFG_NON_BLOCKING 888 852 889 /* ãã³ããããã³ã°ã³ã¼ã«*/853 /* ノンブロッキングコール */ 890 854 if (!IS_PTR_DEFINED(cep->callback)) { 891 855 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 892 856 893 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/857 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 894 858 cep->snd_tskid = TA_NULL; 895 859 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 906 870 (GET_TCP_CEPID(cep) & NBA_ID_MASK)), TMO_POL)) != E_OK) { 907 871 908 /* ãããã¯ã¼ã¯ãããã¡ãäºç´ããã*/872 /* ネットワークバッファを予約する。*/ 909 873 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_PEND; 910 874 } 911 875 else { 912 876 913 /* éä¿¡ã¦ã£ã³ããããã¡ãåæåããã*/877 /* 送信ウィンドバッファを初期化する。*/ 914 878 tcp_init_swbuf(cep); 915 879 … … 920 884 uint_t len; 921 885 922 /* éä¿¡ã¦ã£ã³ããããã¡ã®æ¸ãè¾¼ã¿ã¢ãã¬ã¹ãè¨å®ããã*/886 /* 送信ウィンドバッファの書き込みアドレスを設定する。*/ 923 887 len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf); 924 888 925 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/889 /* コールバック関数を呼び出す。*/ 926 890 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 927 891 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); … … 931 895 932 896 933 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/897 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 934 898 cep->snd_tskid = TA_NULL; 935 899 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 941 905 uint_t len; 942 906 943 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/907 /* 送信ウィンドバッファにデータを書き込む。*/ 944 908 len = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len); 945 909 946 910 #ifdef TCP_CFG_EXTENTIONS 947 911 948 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/912 /* 送信緊急ポインタを設定する。*/ 949 913 if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB) 950 914 cep->snd_up = cep->snd_una + len; … … 952 916 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 953 917 954 /* ãã©ã°ããéä¿¡å¯è½ã«è¨å®ããå¼·å¶çã«éä¿¡ããã*/918 /* フラグを、送信可能に設定し、強制的に送信する。*/ 955 919 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT; 956 920 957 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/921 /* コールバック関数を呼び出す。*/ 958 922 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 959 923 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len); … … 963 927 964 928 965 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/929 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 966 930 cep->snd_tskid = TA_NULL; 967 931 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 975 939 976 940 /* 977 * tcptsk_free_swbufq -- éä¿¡ã¦ã£ã³ããããã¡éæ¾941 * tcptsk_free_swbufq -- 送信ウィンドバッファ開放 978 942 */ 979 943 … … 982 946 { 983 947 /* 984 * å信確èªãå®äºãããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããã®985 * åºåãå®äºããã¨ãã¯ãéä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã解æ¾ããã986 */ 987 988 /* éä¿¡ã¦ã£ã³ããããã¡ã®ä½¿ç¨ä¸ãµã¤ãºããªã»ããããã*/948 * 受信確認が完了し、ネットワークインタフェースからの 949 * 出力も完了したときは、送信ウィンドバッファキューを解放する。 950 */ 951 952 /* 送信ウィンドバッファの使用中サイズをリセットする。*/ 989 953 cep->swbuf_count = 0; 990 954 991 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/955 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 992 956 syscall(rel_net_buf(cep->swbufq)); 993 957 cep->swbufq = NULL; 994 958 995 /* ãã©ã°ã空ãã«è¨å®ããã*/959 /* フラグを空きに設定する。*/ 996 960 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_FREE; 997 961 998 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããã§ãããã¨ãç¥ãããã*/962 /* 送信ウィンドバッファに空きができたことを知らせる。*/ 999 963 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); 1000 964 1001 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãå¾ 1002 ã¡ã®ã¨ãã¯ãTCP åºåã¿ã¹ã¯ãèµ·åããã*/ 965 /* 送信ウィンドバッファの空き待ちのときは、TCP 出力タスクを起動する。*/ 1003 966 if ((cep->flags & TCP_CEP_FLG_WBCS_NBUF_REQ) != 0) { 1004 967 sig_sem(SEM_TCP_POST_OUTPUT); … … 1009 972 1010 973 /* 1011 * TCP åºåã¿ã¹ã¯974 * TCP 出力タスク 1012 975 */ 1013 976 … … 1028 991 #ifdef _IP6_CFG 1029 992 1030 /* IPv6 ã®ã¹ãã¼ãã¬ã¹ã»ã¢ãã¬ã¹èªåè¨å®ãå®è¡ããã*/993 /* IPv6 のステートレス・アドレス自動設定を実行する。*/ 1031 994 in6_if_up(IF_GET_IFNET()); 1032 995 … … 1035 998 while (true) { 1036 999 1037 /* åºåããã¹ããããã¾ã§å¾ 1038 ã¤ã*/ 1000 /* 出力がポストされるまで待つ。*/ 1039 1001 syscall(wai_sem(SEM_TCP_POST_OUTPUT)); 1040 1002 … … 1061 1023 1062 1024 /* 1063 * ãããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµãã£ã¦ããªãã¨ãã¯ã1064 * éä¿¡ãäºç´ããã1025 * ネットワークインタフェースから送信が終わっていないときは、 1026 * 送信を予約する。 1065 1027 */ 1066 1028 if (cep->flags & TCP_CEP_FLG_POST_OUTPUT && … … 1077 1039 1078 1040 /* 1079 * éä¿¡äºç´ä¸ã«ããããã¯ã¼ã¯ã¤ã³ã¿ãã§ã¼ã¹ããéä¿¡ãçµäºãããã 1080 * éä¿¡ãéå§ããããã ããå®å 1081 ¨ã«éä¿¡ãçµäºããã¨ãã¯ä½ãããªãã 1041 * 送信予約中に、ネットワークインタフェースから送信が終了したら、 1042 * 送信を開始する。ただし、完全に送信が終了したときは何もしない。 1082 1043 */ 1083 1044 if (cep->flags & TCP_CEP_FLG_RESERVE_OUTPUT) { … … 1102 1063 1103 1064 /* 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 なら、自動で割り当てる。 1108 1069 */ 1109 1070 if (cep->p_myaddr == NADR || cep->p_myaddr->portno == TCP_PORTANY) … … 1120 1081 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 1121 1082 1122 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/1083 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 1123 1084 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; 1124 1085 cep->snd_tskid = TA_NULL; … … 1132 1093 1133 1094 if (cep->flags & TCP_CEP_FLG_CLOSE_AFTER_OUTPUT) { 1134 /* ã³ãã¯ã·ã§ã³ãéããã*/1095 /* コネクションを閉じる。*/ 1135 1096 tcp_close(cep); 1136 1097 cep->flags &= ~TCP_CEP_FLG_CLOSE_AFTER_OUTPUT; … … 1138 1099 1139 1100 if (cep->flags & TCP_CEP_FLG_RESTORE_NEXT_OUTPUT) { 1140 /* snd_nxt ãå 1141 ã«æ»ãã*/ 1101 /* snd_nxt を元に戻す。*/ 1142 1102 if (SEQ_GT(cep->snd_old_nxt, cep->snd_nxt)) 1143 1103 cep->snd_nxt = cep->snd_old_nxt; … … 1152 1112 } while (ix != last_ix); 1153 1113 1154 /* 次åã¯ãå¦çããé信端ç¹ãå¾åãã«ããã*/1114 /* 次回は、処理した通信端点を後回しにする。*/ 1155 1115 last_ix = sel_ix; 1156 1116 }
Note:
See TracChangeset
for help on using the changeset viewer.