Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet/tcp_subr_cs.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_subr_cs.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$ … … 134 122 135 123 /* 136 * TCP é信端ç¹ã®éä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãæå¹ãªå ´å137 * ãã ããé信端ç¹ã®éä¿¡ã¦ã£ã³ããããã¡ï¼cep->sbufï¼ã®å¤ã«ããã138 * TCP é信端ç¹æ¯ã«éä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ã使ç¨ãããã139 * 使ç¨ããªãããåãæ¿ããã140 */ 141 142 /* 143 * tcp_drop_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããååé¤ããï¼é¸æï¼ã124 * TCP 通信端点の送信ウィンドバッファの省コピー機能が有効な場合 125 * ただし、通信端点の送信ウィンドバッファ(cep->sbuf)の値により、 126 * TCP 通信端点毎に送信ウィンドバッファの省コピー機能を使用するか、 127 * 使用しないかを切り替える。 128 */ 129 130 /* 131 * tcp_drop_swbuf -- 送信ウィンドバッファから指定されたオクテット分削除する(選択)。 144 132 */ 145 133 … … 154 142 155 143 /* 156 * tcp_write_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãï¼é¸æï¼ã144 * tcp_write_swbuf -- 送信ウィンドバッファにデータを書き込む(選択)。 157 145 */ 158 146 … … 167 155 168 156 /* 169 * tcp_read_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãèªã¿åºãï¼é¸æï¼ã157 * tcp_read_swbuf -- 送信ウィンドバッファからデータを読み出す(選択)。 170 158 */ 171 159 … … 178 166 179 167 /* 180 * tcp_wait_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã¨ç¸æã®åä¿¡ã¦ã£ã³ããéãã®ãå¾ 181 ã¤ï¼é¸æï¼ã 168 * tcp_wait_swbuf -- 送信ウィンドバッファと相手の受信ウィンドが開くのを待つ(選択)。 182 169 */ 183 170 … … 192 179 193 180 /* 194 * tcp_get_swbuf_addr -- éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããï¼é¸æï¼ã181 * tcp_get_swbuf_addr -- 送信ウィンドバッファの空きアドレスを獲得する(選択)。 195 182 */ 196 183 … … 205 192 206 193 /* 207 * tcp_send_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ãéä¿¡å¯è½ã«ããï¼é¸æï¼ã194 * tcp_send_swbuf -- 送信ウィンドバッファのデータを送信可能にする(選択)。 208 195 */ 209 196 … … 218 205 219 206 /* 220 * tcp_free_swbufq -- éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®è§£æ¾ãæ示ããï¼é¸æï¼ã207 * tcp_free_swbufq -- 送信ウィンドバッファキューの解放を指示する(選択)。 221 208 */ 222 209 … … 229 216 230 217 /* 231 * tcp_alloc_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ç¨ã®ãããã¯ã¼ã¯ãããã¡ã®å²ãå½ã¦ãæ示ããï¼é¸æï¼ã218 * tcp_alloc_swbuf -- 送信ウィンドバッファ用のネットワークバッファの割り当てを指示する(選択)。 232 219 */ 233 220 … … 240 227 241 228 /* 242 * tcp_is_swbuf_full -- éä¿¡ã¦ã£ã³ããããã¡ãæºæ¯ããã§ãã¯ããï¼é¸æï¼ã229 * tcp_is_swbuf_full -- 送信ウィンドバッファが満杯かチェックする(選択)。 243 230 */ 244 231 … … 255 242 256 243 /* 257 * tcp_drop_swbuf_cs -- éä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããååé¤ããï¼å°ç¨ï¼ã244 * tcp_drop_swbuf_cs -- 送信ウィンドバッファから指定されたオクテット分削除する(専用)。 258 245 */ 259 246 … … 262 249 { 263 250 264 /* éä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããååé¤ããã*/251 /*送信ウィンドバッファから指定されたオクテット分削除する。*/ 265 252 cep->swbuf_count -= (uint16_t)len; 266 253 267 /* éä¿¡æ¸ã¿ã§ãACKå¾ 268 ã¡ã®æã¯ãACKå®äºã«å¤æ´ããã*/ 254 /* 送信済みで、ACK待ちの時は、ACK完了に変更する。*/ 269 255 if (len > 0 && (cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_SENT) { 270 256 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_ACKED; … … 274 260 275 261 /* 276 * tcp_write_swbuf_cs -- éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãï¼å°ç¨ï¼ã262 * tcp_write_swbuf_cs -- 送信ウィンドバッファにデータを書き込む(専用)。 277 263 */ 278 264 … … 283 269 uint_t hdr_size = IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr); 284 270 285 /* é信端ç¹ãããã¯ããã*/271 /* 通信端点をロックする。*/ 286 272 syscall(wai_sem(cep->semid_lock)); 287 273 … … 295 281 * <---------------- error ---------------> 296 282 * ^ 297 * net_buf 㧠4 ãªã¯ãããå¢çã«ã¢ã©ã¤ã³ããã¦ããã283 * net_buf で 4 オクテット境界にアラインされている。 298 284 * 299 * tcp_output 㨠ip_output ã§ããã§ãã¯ãµã ãè¨ç®ããã¨ãã 300 * n ã 4 ãªã¯ãããå¢çã«ãªãããã« SDU ã®å¾ãã« 0 ã 301 * ãããã£ã³ã°ããããã®åãèæ 302 ®ãã¦éä¿¡ã¦ã£ã³ããããã¡ã® 303 * 空ããµã¤ãºã 4 ãªã¯ãããå¢çã«èª¿æ´ããã 285 * tcp_output と ip_output で、チェックサムを計算するとき、 286 * n が 4 オクテット境界になるように SDU の後ろに 0 を 287 * パッディングする。その分を考慮して送信ウィンドバッファの 288 * 空きサイズを 4 オクテット境界に調整する。 304 289 */ 305 290 error = (uint_t)(((error - hdr_size) >> 2 << 2) + hdr_size); … … 310 295 len = (uint_t)(error - hdr_size); 311 296 312 /* éä¿¡ã¦ã¤ã³ããµã¤ãºã«ãããµã¤ãºã調æ´ããã*/297 /* 送信ウインドサイズによりサイズを調整する。*/ 313 298 if (len > cep->snd_wnd) 314 299 len = cep->snd_wnd; … … 316 301 len = cep->snd_cwnd; 317 302 318 /* ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ãè¶ 319 ããªãããã«ããã*/ 303 /* 相手の最大受信セグメントサイズ (maxseg) を超えないようにする。*/ 320 304 if (len > cep->maxseg) 321 305 len = cep->maxseg; 322 306 323 /* ãã¼ã¿ã移ãã*/307 /* データを移す。*/ 324 308 memcpy(cep->sbuf_wptr, (void*)((uint8_t*)data), (size_t)len); 325 309 cep->sbuf_wptr += len; … … 327 311 error = len; 328 312 329 /* ãããã¯ã¼ã¯ãããã¡é·ã¨ IP ãã¼ã¿ã°ã©ã é·ãè¨å®ããã*/313 /* ネットワークバッファ長と IP データグラム長を設定する。*/ 330 314 cep->swbufq->len = (uint16_t)(cep->swbuf_count + hdr_size); 331 315 SET_IP_SDU_SIZE(cep->swbufq, cep->swbuf_count + TCP_HDR_SIZE); 332 316 333 /* ãã©ã°ããéä¿¡å¯è½ã«è¨å®ããã*/317 /* フラグを、送信可能に設定する。*/ 334 318 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_SEND_READY; 335 319 } 336 320 337 else { /* éä¿¡ã¦ã¤ã³ããããã¡ãä¸æ£*/321 else { /* 送信ウインドバッファが不正 */ 338 322 syslog(LOG_WARNING, "[TCP] illegal window buff for send, CEP: %d, %4d < %4d.", 339 323 GET_TCP_CEPID(cep), error, hdr_size); 340 324 341 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/325 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 342 326 tcp_free_swbufq_cs(cep); 343 327 } 344 328 345 /* é信端ç¹ã®ããã¯ã解é¤ããã*/329 /* 通信端点のロックを解除する。*/ 346 330 syscall(sig_sem(cep->semid_lock)); 347 331 … … 350 334 351 335 /* 352 * tcp_wait_swbuf_cs -- éä¿¡ã¦ã£ã³ããããã¡ã¨ç¸æã®åä¿¡ã¦ã£ã³ããéãã®ãå¾ 353 ã¤ï¼å°ç¨ï¼ã 336 * tcp_wait_swbuf_cs -- 送信ウィンドバッファと相手の受信ウィンドが開くのを待つ(専用)。 354 337 */ 355 338 … … 362 345 int_t win; 363 346 364 /* éä¿¡ã¦ã£ã³ããããã¡ãå²å½ã¦æ¸ã¿ã§ã空ããããã°çµäºããã*/347 /* 送信ウィンドバッファが割当て済みで、空きがあれば終了する。*/ 365 348 if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_NBUF_READY && 366 349 (cep->swbuf_count + IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)) < net_buf_siz(cep->swbufq)) 367 350 return E_OK; 368 351 369 /* éä¿¡ä¸ã§ããã°ãçµäºããã¾ã§å¾ 370 æ©ããã*/ 352 /* 送信中であれば、終了するまで待機する。*/ 371 353 while ((cep->flags & TCP_CEP_FLG_WBCS_MASK) != TCP_CEP_FLG_WBCS_FREE) { 372 354 373 /* éä¿¡å¾ 374 ã¡ã®æéã tmout ããæ¸ããã*/ 355 /* 送信待ちの時間を tmout から減ずる。*/ 375 356 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) 376 357 syscall(get_tim(&before)); … … 381 362 syscall(clr_flg(cep->snd_flgid, (FLGPTN)(~TCP_CEP_EVT_SWBUF_READY))); 382 363 383 /* éä¿¡å¾ 384 ã¡ã®æéã tmout ããæ¸ããã*/ 364 /* 送信待ちの時間を tmout から減ずる。*/ 385 365 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) { 386 366 syscall(get_tim(&after)); … … 391 371 392 372 /* 393 * éä¿¡ã§ããããCEP ã® FSM ç¶æ 394 ãè¦ãã 395 * éä¿¡ã¦ã¤ã³ããããã¡ã空ãã¾ã§å¾ 396 ã¤éã«ãéä¿¡ä¸è½ã«ãªã£ãå ´åã¯ã 397 * ã³ãã¯ã·ã§ã³ãåæããããã¨ãæå³ãã¦ããã 373 * 送信できるか、CEP の FSM 状態を見る。 374 * 送信ウインドバッファが空くまで待つ間に、送信不能になった場合は、 375 * コネクションが切断されたことを意味している。 398 376 */ 399 377 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) … … 401 379 } 402 380 403 /* ç¸æã®åä¿¡ã¦ã£ã³ããéãã¦ããå ´åã¯ãéãã¾ã§å¾ 404 æ©ããã*/ 381 /* 相手の受信ウィンドが閉じている場合は、開くまで待機する。*/ 405 382 while (true) { 406 383 407 384 /* 408 * snd_wnd: ç¸æã®åä¿¡å¯è½ã¦ã£ã³ããµã¤ãº409 * snd_cwnd: 輻輳ã¦ã£ã³ããµã¤ãº385 * snd_wnd: 相手の受信可能ウィンドサイズ 386 * snd_cwnd: 輻輳ウィンドサイズ 410 387 * 411 * win: ã©ã¡ããå°ããã¦ã£ã³ããµã¤ãºã«è¨å®ããã388 * win: どちらか小さいウィンドサイズに設定する。 412 389 */ 413 390 win = cep->snd_wnd < cep->snd_cwnd ? cep->snd_wnd : cep->snd_cwnd; … … 415 392 break; 416 393 417 /* éãå¾ 418 ã¡ã®æéã tmout ããæ¸ããã*/ 394 /* 開き待ちの時間を tmout から減ずる。*/ 419 395 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) 420 396 syscall(get_tim(&before)); … … 425 401 syscall(clr_flg(cep->snd_flgid, (FLGPTN)(~TCP_CEP_EVT_SWBUF_READY))); 426 402 427 /* éãå¾ 428 ã¡ã®æéã tmout ããæ¸ããã*/ 403 /* 開き待ちの時間を tmout から減ずる。*/ 429 404 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) { 430 405 syscall(get_tim(&after)); … … 435 410 436 411 /* 437 * éä¿¡ã§ããããCEP ã® FSM ç¶æ 438 ãè¦ãã 439 * éä¿¡ã¦ã¤ã³ããããã¡ã空ãã¾ã§å¾ 440 ã¤éã«ãéä¿¡ä¸è½ã«ãªã£ãå ´åã¯ã 441 * ã³ãã¯ã·ã§ã³ãåæããããã¨ãæå³ãã¦ããã 412 * 送信できるか、CEP の FSM 状態を見る。 413 * 送信ウインドバッファが空くまで待つ間に、送信不能になった場合は、 414 * コネクションが切断されたことを意味している。 442 415 */ 443 416 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) … … 445 418 } 446 419 447 /* ãããã¯ã¼ã¯ãããã¡ãç²å¾ããã*/420 /* ネットワークバッファを獲得する。*/ 448 421 if ((error = tcpn_get_segment(&cep->swbufq, cep, 0, 449 422 TCP_CFG_SWBUF_CSAVE_MIN_SIZE, … … 452 425 return error; 453 426 454 /* éä¿¡ã¦ã£ã³ããããã¡ãåæåããã*/427 /* 送信ウィンドバッファを初期化する。*/ 455 428 tcp_init_swbuf(cep); 456 429 … … 459 432 460 433 /* 461 * tcp_get_swbuf_addr_cs -- éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããï¼å°ç¨ï¼ã434 * tcp_get_swbuf_addr_cs -- 送信ウィンドバッファの空きアドレスを獲得する(専用)。 462 435 */ 463 436 … … 467 440 ER_UINT error; 468 441 469 /* é信端ç¹ãããã¯ããã*/442 /* 通信端点をロックする。*/ 470 443 syscall(wai_sem(cep->semid_lock)); 471 444 … … 479 452 * <---------------- error ---------------> 480 453 * ^ 481 * net_buf 㧠4 ãªã¯ãããå¢çã«ã¢ã©ã¤ã³ããã¦ããã454 * net_buf で 4 オクテット境界にアラインされている。 482 455 * 483 * tcp_output 㨠ip_output ã§ããã§ãã¯ãµã ãè¨ç®ããã¨ãã 484 * n ã 4 ãªã¯ãããå¢çã«ãªãããã« SDU ã®å¾ãã« 0 ã 485 * ãããã£ã³ã°ããããã®åãèæ 486 ®ãã¦éä¿¡ã¦ã£ã³ããããã¡ã® 487 * 空ããµã¤ãºã 4 ãªã¯ãããå¢çã«èª¿æ´ããã 456 * tcp_output と ip_output で、チェックサムを計算するとき、 457 * n が 4 オクテット境界になるように SDU の後ろに 0 を 458 * パッディングする。その分を考慮して送信ウィンドバッファの 459 * 空きサイズを 4 オクテット境界に調整する。 488 460 */ 489 461 error = (uint_t)(((error - IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)) >> 2 << 2) - cep->swbuf_count); 490 462 491 /* éä¿¡ã¦ã¤ã³ããµã¤ãºã«ãããµã¤ãºã調æ´ããã*/463 /* 送信ウインドサイズによりサイズを調整する。*/ 492 464 if (error > cep->snd_wnd) 493 465 error = cep->snd_wnd; … … 495 467 error = cep->snd_cwnd; 496 468 497 /* ç¸æã®æ大åä¿¡ã»ã°ã¡ã³ããµã¤ãº (maxseg) ãè¶ 498 ããªãããã«ããã*/ 469 /* 相手の最大受信セグメントサイズ (maxseg) を超えないようにする。*/ 499 470 if (error > cep->maxseg) 500 471 error = cep->maxseg; 501 472 502 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºããã¼ã¿é·ãè¨å®ãããã®å¤ãè¿ãã*/473 /* 送信ウィンドバッファの空きデータ長を設定し、その値を返す。*/ 503 474 cep->get_buf_len = error; 504 475 505 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ã®å 506 é ãè¨å®ããã*/ 476 /* 送信ウィンドバッファの空きアドレスの先頭を設定する。*/ 507 477 *p_buf = cep->sbuf_wptr; 508 478 } 509 479 510 else { /* ãããã¯ã¼ã¯ãããã¡ãä¸æ£*/511 512 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/480 else { /* ネットワークバッファが不正 */ 481 482 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 513 483 tcp_free_swbufq_cs(cep); 514 484 } 515 485 516 /* é信端ç¹ã®ããã¯ã解é¤ããã*/486 /* 通信端点のロックを解除する。*/ 517 487 syscall(sig_sem(cep->semid_lock)); 518 488 … … 521 491 522 492 /* 523 * tcp_send_swbuf_cs -- éä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ãéä¿¡å¯è½ã«ããï¼å°ç¨ï¼ã493 * tcp_send_swbuf_cs -- 送信ウィンドバッファのデータを送信可能にする(専用)。 524 494 */ 525 495 … … 527 497 tcp_send_swbuf_cs (T_TCP_CEP *cep, uint_t len) 528 498 { 529 /* é信端ç¹ãããã¯ããã*/499 /* 通信端点をロックする。*/ 530 500 syscall(wai_sem(cep->semid_lock)); 531 501 … … 533 503 cep->swbuf_count += len; 534 504 535 /* ãããã¯ã¼ã¯ãããã¡é·ã¨ IP ãã¼ã¿ã°ã©ã é·ãè¨å®ããã*/505 /* ネットワークバッファ長と IP データグラム長を設定する。*/ 536 506 cep->swbufq->len = (uint16_t)(cep->swbuf_count + IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)); 537 507 SET_IP_SDU_SIZE(cep->swbufq, len + TCP_HDR_SIZE); 538 508 539 /* tcp_get_buf ã®å²å½ã¦é·ããªã»ããããã*/509 /* tcp_get_buf の割当て長をリセットする。*/ 540 510 cep->get_buf_len = 0; 541 511 542 /* é信端ç¹ã®ããã¯ã解é¤ããã*/512 /* 通信端点のロックを解除する。*/ 543 513 syscall(sig_sem(cep->semid_lock)); 544 514 545 /* ãã©ã°ããéä¿¡å¯è½ã«è¨å®ããå¼·å¶çã«éä¿¡ããã*/515 /* フラグを、送信可能に設定し、強制的に送信する。*/ 546 516 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_SEND_READY 547 517 | TCP_CEP_FLG_FORCE … … 551 521 552 522 /* 553 * tcp_free_swbufq_cs -- éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®è§£æ¾ãæ示ããï¼å°ç¨ï¼ã523 * tcp_free_swbufq_cs -- 送信ウィンドバッファキューの解放を指示する(専用)。 554 524 * 555 * 注æ: 556 * å¿ 557 è¦ã§ããã°ããã®é¢æ°ãå¼ã³åºãåã«ãé信端ç¹ãããã¯ãã 558 * æ»ã£ãå¾ã解é¤ããå¿ 559 è¦ãããã 525 * 注意: 526 * 必要であれば、この関数を呼び出す前に、通信端点をロックし、 527 * 戻った後、解除する必要がある。 560 528 */ 561 529 … … 563 531 tcp_free_swbufq_cs (T_TCP_CEP *cep) 564 532 { 565 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãå¾ 566 ã¡ãåãæ¶ãã*/ 533 /* 送信ウィンドバッファの空き待ちを取り消す。*/ 567 534 cep->flags &= ~TCP_CEP_FLG_WBCS_NBUF_REQ; 568 535 569 536 if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) != TCP_CEP_FLG_WBCS_FREE) { 570 537 /* 571 * éä¿¡ã¦ã£ã³ããããã¡ãåé¤ããããã«ããã©ã°ã ACK å®äºã«è¨å®ãã572 * TCP åºåã¿ã¹ã¯ãèµ·åããã538 * 送信ウィンドバッファを削除するために、フラグを ACK 完了に設定し、 539 * TCP 出力タスクを起動する。 573 540 */ 574 541 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_ACKED; … … 578 545 579 546 /* 580 * tcp_alloc_swbuf_cs -- éä¿¡ã¦ã£ã³ããããã¡ç¨ã®ãããã¯ã¼ã¯ãããã¡ã®å²ãå½ã¦ãæ示ããï¼å°ç¨ï¼ã547 * tcp_alloc_swbuf_cs -- 送信ウィンドバッファ用のネットワークバッファの割り当てを指示する(専用)。 581 548 */ 582 549 … … 587 554 588 555 /* 589 * éä¿¡ã¦ã£ã³ããããã¡ãæªä½¿ç¨ã®å ´åã®ã¿ã590 * éä¿¡ã¦ã£ã³ããããã¡ç¨ã®ãããã¯ã¼ã¯ãããã¡ã®å²ãå½ã¦ãæ示ããã556 * 送信ウィンドバッファが未使用の場合のみ、 557 * 送信ウィンドバッファ用のネットワークバッファの割り当てを指示する。 591 558 */ 592 559 if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_FREE) … … 595 562 596 563 /* 597 * tcp_is_swbuf_full_cs -- éä¿¡ã¦ã£ã³ããããã¡ãæºæ¯ããã§ãã¯ããï¼å°ç¨ï¼ã564 * tcp_is_swbuf_full_cs -- 送信ウィンドバッファが満杯かチェックする(専用)。 598 565 */ 599 566 … … 606 573 607 574 /* 608 * tcp_init_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ãåæåããï¼å°ç¨ï¼ã575 * tcp_init_swbuf -- 送信ウィンドバッファを初期化する(専用)。 609 576 * 610 * 注æ: tcp_get_segment ã§ãããã¯ã¼ã¯ãããã¡ãç²å¾ãã611 * ç´å¾ã«å¼ã³åºããã¨ã577 * 注意: tcp_get_segment でネットワークバッファを獲得した 578 * 直後に呼び出すこと。 612 579 */ 613 580 … … 615 582 tcp_init_swbuf (T_TCP_CEP *cep) 616 583 { 617 /* éä¿¡ã¦ã¤ã³ããããã¡ã®ä½¿ç¨ä¸ãµã¤ãºããªã»ããããã*/584 /* 送信ウインドバッファの使用中サイズをリセットする。*/ 618 585 cep->swbuf_count = 0; 619 586 620 /* éä¿¡ã¦ã¤ã³ããããã¡ã®ã¢ãã¬ã¹ãè¨å®ããã*/587 /* 送信ウインドバッファのアドレスを設定する。*/ 621 588 cep->sbuf_wptr = cep->sbuf_rptr = GET_TCP_SDU(cep->swbufq, IF_IP_TCP_NET_HDR_OFFSET(&cep->dstaddr.ipaddr)); 622 589 623 /* ãã©ã°ãããããã¯ã¼ã¯ãããã¡å²å½ã¦æ¸ã¿ã«è¨å®ããã*/590 /* フラグを、ネットワークバッファ割当て済みに設定する。*/ 624 591 cep->flags = (cep->flags & ~(TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK)) 625 592 | TCP_CEP_FLG_WBCS_NBUF_READY; … … 627 594 628 595 /* 629 * tcp_push_res_nbuf -- ãããã¯ã¼ã¯ãããã¡ãäºç´ããï¼å°ç¨ï¼ã596 * tcp_push_res_nbuf -- ネットワークバッファを予約する(専用)。 630 597 */ 631 598 … … 645 612 if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_NBUF_PEND) { 646 613 647 /* ãããã¯ã¼ã¯ãããã¡ãäºç´ããã*/614 /* ネットワークバッファを予約する。*/ 648 615 cep->swbufq = nbuf; 649 616 nbuf = NULL; 650 617 651 /* ãã©ã°ãäºç´ã«è¨å®ããã*/618 /* フラグを予約に設定する。*/ 652 619 cep->flags = (cep->flags & ~TCP_CEP_FLG_WBCS_MASK) | TCP_CEP_FLG_WBCS_NBUF_RSVD; 653 620 sel_ix = ix; … … 664 631 665 632 /* 666 * tcp_pull_res_nbuf -- äºç´ãã¦ãããããã¯ã¼ã¯ãããã¡è¿ãï¼å°ç¨ï¼ã633 * tcp_pull_res_nbuf -- 予約してあるネットワークバッファ返す(専用)。 667 634 */ 668 635 … … 676 643 if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_NBUF_RSVD) { 677 644 678 /* äºç´ãã¦ãããããã¯ã¼ã¯ãããã¡ãè¿ãã*/645 /* 予約してあるネットワークバッファを返す。*/ 679 646 nbuf = cep->swbufq; 680 647 cep->swbufq = NULL; 681 648 682 /* TCP åºåã¿ã¹ã¯ãèµ·åããã*/649 /* TCP 出力タスクを起動する。*/ 683 650 sig_sem(SEM_TCP_POST_OUTPUT); 684 651 } … … 698 665 699 666 /* 700 * TCP é信端ç¹ã®åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãæå¹ãªå ´å701 * ãã ããé信端ç¹ã®åä¿¡ã¦ã£ã³ããããã¡ï¼cep->rbufï¼ã®å¤ã«ããã702 * TCP é信端ç¹æ¯ã«åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ã使ç¨ãããã703 * 使ç¨ããªãããåãæ¿ããã704 */ 705 706 /* 707 * tcp_drop_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®æåã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã667 * TCP 通信端点の受信ウィンドバッファの省コピー機能が有効な場合 668 * ただし、通信端点の受信ウィンドバッファ(cep->rbuf)の値により、 669 * TCP 通信端点毎に受信ウィンドバッファの省コピー機能を使用するか、 670 * 使用しないかを切り替える。 671 */ 672 673 /* 674 * tcp_drop_rwbuf -- 受信ウィンドバッファキューの最初のネットワークバッファを解放する。 708 675 */ 709 676 … … 718 685 719 686 /* 720 * tcp_read_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããåèªã¿åºãã687 * tcp_read_rwbuf -- 受信ウィンドバッファから指定されたオクテット分読み出す。 721 688 */ 722 689 … … 731 698 732 699 /* 733 * tcp_get_rwbuf_addr -- åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããã700 * tcp_get_rwbuf_addr -- 受信ウィンドバッファの空きアドレスを獲得する。 734 701 */ 735 702 … … 744 711 745 712 /* 746 * tcp_free_rwbufq -- åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã解æ¾ããã713 * tcp_free_rwbufq -- 受信ウィンドバッファキューを解放する。 747 714 */ 748 715 … … 755 722 756 723 /* 757 * tcp_write_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã724 * tcp_write_rwbuf -- 受信ウィンドバッファにデータを書き込む。 758 725 */ 759 726 … … 770 737 771 738 /* 772 * TCP é信端ç¹ã®åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãæå¹773 */ 774 775 /* 776 * tcp_drop_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®æåã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã739 * TCP 通信端点の受信ウィンドバッファの省コピー機能が有効 740 */ 741 742 /* 743 * tcp_drop_rwbuf -- 受信ウィンドバッファキューの最初のネットワークバッファを解放する。 777 744 */ 778 745 … … 787 754 cep->rwbuf_count -= len; 788 755 789 /* ãããã¯ã¼ã¯ãããã¡ã«ãã¼ã¿ãç¡ããªã£ãã解æ¾ããã*/756 /* ネットワークバッファにデータが無くなったら解放する。*/ 790 757 if (len == qhdr->slen) { 791 758 T_NET_BUF *next; … … 809 776 810 777 /* 811 * tcp_read_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããåèªã¿åºãã778 * tcp_read_rwbuf -- 受信ウィンドバッファから指定されたオクテット分読み出す。 812 779 */ 813 780 … … 819 786 uint8_t *buf = (uint8_t*)data; 820 787 821 /* é信端ç¹ãããã¯ããã*/788 /* 通信端点をロックする。*/ 822 789 syscall(wai_sem(cep->semid_lock)); 823 790 824 791 /* 825 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã«ãããã¯ã¼ã¯ãããã¡ãç¡ããªãã826 * len ã 0 ã«ãªãã¾ã§ç¶ããã792 * 受信ウィンドバッファキューにネットワークバッファが無くなるか 793 * len が 0 になるまで続ける。 827 794 */ 828 795 while (cep->rwbufq != NULL && len > 0) { … … 830 797 831 798 /* 832 * len ã¨åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®å 833 é ãããã¯ã¼ã¯ãããã¡ã® 834 * ãã¼ã¿æ°ã®å°ããæ¹ã移ããã¼ã¿æ°ã«ããã 799 * len と受信ウィンドバッファキューの先頭ネットワークバッファの 800 * データ数の小さい方を移すデータ数にする。 835 801 */ 836 802 if (len > qhdr->slen) … … 844 810 845 811 /* 846 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã«847 * ãã¼ã¿ãç¡ããªã£ãã解æ¾ããã812 * 受信ウィンドバッファキューのネットワークバッファに 813 * データが無くなったら解放する。 848 814 */ 849 815 tcp_drop_rwbuf_cs(cep, blen); … … 854 820 } 855 821 856 /* é信端ç¹ã®ããã¯ã解é¤ããã*/822 /* 通信端点のロックを解除する。*/ 857 823 syscall(sig_sem(cep->semid_lock)); 858 824 … … 861 827 862 828 /* 863 * tcp_get_rwbuf_addr -- åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããã829 * tcp_get_rwbuf_addr -- 受信ウィンドバッファの空きアドレスを獲得する。 864 830 */ 865 831 … … 870 836 uint_t len; 871 837 872 /* é信端ç¹ãããã¯ããã*/838 /* 通信端点をロックする。*/ 873 839 syscall(wai_sem(cep->semid_lock)); 874 840 875 841 if (cep->rwbufq == NULL) { 876 842 877 /* åä¿¡ã¦ã£ã³ããããã¡ãå 878 ¨ã¦éæ¾ããã¦ããã¨ãã*/ 843 /* 受信ウィンドバッファが全て開放されているとき。*/ 879 844 *p_buf = NULL; 880 845 len = 0; … … 882 847 else { 883 848 884 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ã®ã¢ãã¬ã¹ã®å 885 é ãè¨å®ããã*/ 849 /* 受信ウィンドバッファのデータのアドレスの先頭を設定する。*/ 886 850 qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)); 887 851 *p_buf = GET_TCP_SDU(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)) + qhdr->soff; 888 852 889 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿é·ãè¨ç®ããã*/853 /* 受信ウィンドバッファのデータ長を計算する。*/ 890 854 len = qhdr->slen; 891 855 } 892 856 893 /* é信端ç¹ã®ããã¯ã解é¤ããã*/857 /* 通信端点のロックを解除する。*/ 894 858 syscall(sig_sem(cep->semid_lock)); 895 859 896 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿é·ãè¨å®ãããã®å¤ãè¿ãã*/860 /* 受信ウィンドバッファのデータ長を設定し、その値を返す。*/ 897 861 cep->rcv_buf_len = len; 898 862 return len; … … 900 864 901 865 /* 902 * tcp_free_rwbufq -- åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã解æ¾ããã866 * tcp_free_rwbufq -- 受信ウィンドバッファキューを解放する。 903 867 * 904 * 注æ: 905 * å¿ 906 è¦ã§ããã°ããã®é¢æ°ãå¼ã³åºãåã«ãé信端ç¹ãããã¯ãã 907 * æ»ã£ãå¾ã解é¤ããå¿ 908 è¦ãããã 868 * 注意: 869 * 必要であれば、この関数を呼び出す前に、通信端点をロックし、 870 * 戻った後、解除する必要がある。 909 871 */ 910 872 … … 928 890 } 929 891 930 /* åä¿¡ã¦ã£ã³ããããã¡ã®ä½¿ç¨ä¸ãµã¤ãºããªã»ããããã*/892 /* 受信ウィンドバッファの使用中サイズをリセットする。*/ 931 893 cep->rwbuf_count = 0; 932 894 } … … 934 896 935 897 /* 936 * tcp_write_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã898 * tcp_write_rwbuf -- 受信ウィンドバッファにデータを書き込む。 937 899 * 938 * 注æ: 939 * å 940 ¥å input ã¯ãT_TCP_Q_HDR ã«ãããªã³ã¯ããã 941 * 並ã¹æ¿ããçµäºãã¦ããªããã°ãªããªããã¾ãã 942 * 追å ãããã¼ã¿ã¯ãåä¿¡ã¦ã£ã³ããããã¡ã«åã¾ããã¨ã 900 * 注意: 901 * 入力 input は、T_TCP_Q_HDR によりリンクされ、 902 * 並べ替えが終了していなければならない。また、 903 * 追加するデータは、受信ウィンドバッファに収まること。 943 904 */ 944 905 … … 950 911 uint_t inlen, last; 951 912 952 /* é信端ç¹ãããã¯ããã*/913 /* 通信端点をロックする。*/ 953 914 syscall(wai_sem(cep->semid_lock)); 954 915 … … 963 924 964 925 /* 965 * TCP é信端ç¹ã®åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ã®ã 966 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®æ大ã¨ã³ããªæ°ãè¶ 967 ããã¨ãã¯ã 968 * åä¿¡ããã»ã°ã¡ã³ããç ´æ£ããã 969 * ãã ããSDU é·ã 0 ã®ã»ã°ã¡ã³ã㨠FIN ã»ã°ã¡ã³ãã¯ç ´æ£ããªãã 970 * ãªããæ£å¸¸ã«åä¿¡ããã»ã°ã¡ã³ããç ´æ£ãããããåéåæ°ãå¢å ããã 926 * TCP 通信端点の受信ウィンドバッファの省コピー機能の、 927 * 受信ウィンドバッファキューの最大エントリ数を超えるときは、 928 * 受信したセグメントを破棄する。 929 * ただし、SDU 長が 0 のセグメントと FIN セグメントは破棄しない。 930 * なお、正常に受信したセグメントも破棄するため、再送回数が増加する。 971 931 */ 972 932 syscall(rel_net_buf(input)); 973 933 974 /* é信端ç¹ã®ããã¯ã解é¤ããã*/934 /* 通信端点のロックを解除する。*/ 975 935 syscall(sig_sem(cep->semid_lock)); 976 936 return; … … 983 943 qhdr = (T_TCP_Q_HDR*)GET_TCP_HDR(input, thoff); 984 944 985 /* åä¿¡æ¸ã¿ã·ã¼ã±ã³ã¹çªå·ãæ´æ°ããã*/945 /* 受信済みシーケンス番号を更新する。*/ 986 946 cep->rcv_nxt += inlen; 987 947 988 /* ç·æ¥ãã¼ã¿ã® SDU è£æ£ãè¡ãã*/948 /* 緊急データの SDU 補正を行う。*/ 989 949 if (qhdr->urp > 0 && inlen > 0) { 990 950 inlen -= qhdr->urp; … … 995 955 last = cep->rwbuf_count; 996 956 997 /* ãããã¯ã¼ã¯ãããã¡ãåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®æå¾ã«é£çµããã*/957 /* ネットワークバッファを受信ウィンドバッファキューの最後に連結する。*/ 998 958 qhdr->next = NULL; 999 959 nextp = &cep->rwbufq; … … 1003 963 1004 964 /* 1005 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã1006 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦1007 * ããªããã¨ãç¥ãããããã§ããã965 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 966 * これは、アプリケーションに、相手からこれ以上データが送られて 967 * こないことを知らせるためである。 1008 968 */ 1009 969 if (inlen > 0) { … … 1013 973 } 1014 974 1015 /* é信端ç¹ã®ããã¯ã解é¤ããã*/975 /* 通信端点のロックを解除する。*/ 1016 976 syscall(sig_sem(cep->semid_lock)); 1017 977 1018 978 #ifdef TCP_CFG_NON_BLOCKING 1019 979 1020 if (cep->rcv_nblk_tfn == TFN_TCP_RCV_BUF) { /* ãã³ããããã³ã°ã³ã¼ã«*/980 if (cep->rcv_nblk_tfn == TFN_TCP_RCV_BUF) { /* ノンブロッキングコール */ 1021 981 1022 982 int_t len; … … 1026 986 1027 987 /* 1028 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã1029 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦1030 * ããªããã¨ãç¥ãããããã§ããã988 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 989 * これは、アプリケーションに、相手からこれ以上データが送られて 990 * こないことを知らせるためである。 1031 991 */ 1032 992 if (len > 0 || inlen == 0) { 1033 993 1034 /* tcp_rcv_buf ã®å²å½ã¦é·ãè¨å®ããã*/994 /* tcp_rcv_buf の割当て長を設定する。*/ 1035 995 cep->rcv_buf_len = len; 1036 996 1037 /* åä¿¡ã¦ã£ã³ããããã¡ã®ã¢ãã¬ã¹ãè¿ãã*/997 /* 受信ウィンドバッファのアドレスを返す。*/ 1038 998 *cep->rcv_p_buf = GET_TCP_SDU(cep->rwbufq, 1039 999 GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)) + qhdr->soff; … … 1052 1012 1053 1013 /* 1054 * é信端ç¹ãããã¯ãã¦ã1055 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã1014 * 通信端点をロックして、 1015 * 受信ウィンドバッファキューのネットワークバッファを解放する。 1056 1016 */ 1057 1017 syscall(wai_sem(cep->semid_lock)); … … 1061 1021 } 1062 1022 1063 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/1023 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 1064 1024 cep->rcv_tskid = TA_NULL; 1065 1025 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; 1066 1026 } 1067 1027 1068 else if (cep->rcv_nblk_tfn == TFN_TCP_RCV_DAT) { /* ãã³ããããã³ã°ã³ã¼ã«*/1028 else if (cep->rcv_nblk_tfn == TFN_TCP_RCV_DAT) { /* ノンブロッキングコール */ 1069 1029 int_t len; 1070 1030 1071 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/1031 /* 受信ウィンドバッファからデータを取り出す。*/ 1072 1032 if ((len = tcp_read_rwbuf_cs(cep, cep->rcv_data, (uint_t)cep->rcv_len)) > 0) { 1073 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/1033 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 1074 1034 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1075 1035 sig_sem(SEM_TCP_POST_OUTPUT); … … 1077 1037 1078 1038 /* 1079 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã1080 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦1081 * ããªããã¨ãç¥ãããããã§ããã1039 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 1040 * これは、アプリケーションに、相手からこれ以上データが送られて 1041 * こないことを知らせるためである。 1082 1042 */ 1083 1043 if (len > 0 || inlen == 0) { … … 1094 1054 } 1095 1055 1096 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/1056 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 1097 1057 cep->rcv_tskid = TA_NULL; 1098 1058 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 1104 1064 if (inlen == 0 && cep->rwbuf_count == 0) { 1105 1065 /* 1106 * åä¿¡ã¦ã£ã³ããããã¡å 1107 ã®ãã¼ã¿æ°ã 0 ã§ã 1108 * ç¸æãã FIN ãã©ã°ãä»ããã»ã°ã¡ã³ããåä¿¡ããã¨ãã¯ã 1109 * é信端ç¹ãããã¯ãã¦ã 1110 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã 1066 * 受信ウィンドバッファ内のデータ数が 0 で、 1067 * 相手から FIN フラグが付いたセグメントを受信したときは、 1068 * 通信端点をロックして、 1069 * 受信ウィンドバッファキューのネットワークバッファを解放する。 1111 1070 */ 1112 1071 syscall(wai_sem(cep->semid_lock)); … … 1116 1075 1117 1076 /* 1118 * åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãå 1119 ¥ããã inlen == 0 ã®æãå 1120 ¥åã¿ã¹ã¯ãèµ·åºããã 1121 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã 1122 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéãã㦠1123 * ããªããã¨ãç¥ãããããã§ããã 1077 * 受信ウィンドバッファにデータが入るか、 inlen == 0 の時、入力タスクを起床する。 1078 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 1079 * これは、アプリケーションに、相手からこれ以上データが送られて 1080 * こないことを知らせるためである。 1124 1081 */ 1125 1082 if ((last == 0 && cep->rwbuf_count > 0) || inlen == 0) {
Note:
See TracChangeset
for help on using the changeset viewer.