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