- 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_ncs.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$ … … 135 123 136 124 /* 137 * TCP é信端ç¹ã®éä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãç¡å¹138 */ 139 140 /* 141 * tcp_read_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãèªã¿åºãã125 * TCP 通信端点の送信ウィンドバッファの省コピー機能が無効 126 */ 127 128 /* 129 * tcp_read_swbuf -- 送信ウィンドバッファからデータを読み出す。 142 130 */ 143 131 … … 147 135 uint8_t *wptr, *rptr; 148 136 149 /* SDU ã®å¤§ããããã§ãã¯ããã*/137 /* SDU の大きさをチェックする。*/ 150 138 if (GET_IP_SDU_SIZE(GET_IP_HDR(output)) < GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len) { 151 139 syslog(LOG_INFO, "[TCP] shrink SUD len: %d -> %d", … … 156 144 wptr = GET_TCP_SDU(output, IF_IP_TCP_HDR_OFFSET); 157 145 158 /* é信端ç¹ãããã¯ããã*/146 /* 通信端点をロックする。*/ 159 147 syscall(wai_sem(cep->semid_lock)); 160 148 … … 162 150 if (rptr - (uint8_t*)cep->sbuf > cep->sbufsz) { 163 151 164 /* 転ééå§ãéä¿¡ã¦ã£ã³ããããã¡ã®çµãããè¶ 165 ããã¨ãã®å¦çã*/ 152 /* 転送開始が送信ウィンドバッファの終わりを超えるときの処理 */ 166 153 rptr = (uint8_t*)cep->sbuf_rptr - (cep->sbufsz - doff); 167 154 } … … 169 156 uint_t sub; 170 157 171 /* 転éç¯å²ãã©ã¦ã³ãããã¨ãã®å¦ç*/158 /* 転送範囲がラウンドするときの処理 */ 172 159 sub = (uint_t)(cep->sbufsz - (rptr - (uint8_t*)cep->sbuf)); 173 160 memcpy((void*)wptr, rptr, (size_t)sub); … … 181 168 NET_COUNT_TCP(net_count_tcp[NC_TCP_SEND_DATA_OCTETS], len); 182 169 183 /* é信端ç¹ã®ããã¯ã解é¤ããã*/170 /* 通信端点のロックを解除する。*/ 184 171 syscall(sig_sem(cep->semid_lock)); 185 172 } 186 173 187 174 /* 188 * tcp_drop_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããååé¤ããã175 * tcp_drop_swbuf -- 送信ウィンドバッファから指定されたオクテット分削除する。 189 176 */ 190 177 … … 194 181 uint_t last; 195 182 196 /* é信端ç¹ãããã¯ããã*/183 /* 通信端点をロックする。*/ 197 184 syscall(wai_sem(cep->semid_lock)); 198 185 … … 200 187 201 188 if (cep->sbuf_rptr + len > (uint8_t*)cep->sbuf + cep->sbufsz) 202 /* ã©ã¦ã³ãããã¨ãã®è¨ç®*/189 /* ラウンドするときの計算 */ 203 190 cep->sbuf_rptr -= cep->sbufsz - len; 204 191 else … … 206 193 cep->swbuf_count -= (uint16_t)len; 207 194 208 /* é信端ç¹ã®ããã¯ã解é¤ããã*/195 /* 通信端点のロックを解除する。*/ 209 196 syscall(sig_sem(cep->semid_lock)); 210 197 211 198 #ifdef TCP_CFG_NON_BLOCKING 212 199 213 if (cep->snd_nblk_tfn == TFN_TCP_GET_BUF) { /* ãã³ããããã³ã°ã³ã¼ã«*/214 215 /* é信端ç¹ãããã¯ããã*/200 if (cep->snd_nblk_tfn == TFN_TCP_GET_BUF) { /* ノンブロッキングコール */ 201 202 /* 通信端点をロックする。*/ 216 203 syscall(wai_sem(cep->semid_lock)); 217 204 218 /* éä¿¡ãã¼ã¿é·ãè¨ç®ããã*/205 /* 送信データ長を計算する。*/ 219 206 if (cep->sbufsz - cep->swbuf_count > cep->sbufsz - (cep->sbuf_wptr - (uint8_t*)cep->sbuf)) 220 /* æ¸è¾¼ã¿ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã¯ãæ¸è¾¼ã¿ãã¤ã³ã¿ããéä¿¡ã¦ã£ã³ããããã¡ã®çµããã¾ã§*/207 /* 書込みポインタがラウンドするときは、書込みポインタから送信ウィンドバッファの終わりまで */ 221 208 len = (uint_t)(cep->sbufsz - (cep->sbuf_wptr - (uint8_t*)cep->sbuf)); 222 209 else 223 210 len = cep->sbufsz - cep->swbuf_count; 224 211 225 /* é信端ç¹ã®ããã¯ã解é¤ããã*/212 /* 通信端点のロックを解除する。*/ 226 213 syscall(sig_sem(cep->semid_lock)); 227 214 228 215 if (len > 0) { 229 216 230 /* tcp_get_buf ã®å²å½ã¦é·ãè¨å®ããã*/217 /* tcp_get_buf の割当て長を設定する。*/ 231 218 cep->get_buf_len = len; 232 219 233 /* éä¿¡ã¦ã£ã³ããããã¡ã®ã¢ãã¬ã¹ãè¿ãã*/220 /* 送信ウィンドバッファのアドレスを返す。*/ 234 221 *cep->snd_p_buf = cep->sbuf_wptr; 235 222 … … 248 235 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 249 236 250 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/237 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 251 238 cep->snd_tskid = TA_NULL; 252 239 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 257 244 258 245 else if (cep->snd_nblk_tfn == TFN_TCP_SND_DAT || 259 cep->snd_nblk_tfn == TFN_TCP_SND_OOB) { /* ãã³ããããã³ã°ã³ã¼ã«*/246 cep->snd_nblk_tfn == TFN_TCP_SND_OOB) { /* ノンブロッキングコール */ 260 247 261 248 #else /* of #ifdef TCP_CFG_EXTENTIONS */ 262 249 263 else if (cep->snd_nblk_tfn == TFN_TCP_SND_DAT) { /* ãã³ããããã³ã°ã³ã¼ã«*/250 else if (cep->snd_nblk_tfn == TFN_TCP_SND_DAT) { /* ノンブロッキングコール */ 264 251 265 252 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ … … 267 254 ER_UINT error; 268 255 269 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/256 /* 送信ウィンドバッファにデータを書き込む。*/ 270 257 error = TCP_WRITE_SWBUF(cep, cep->snd_data, (uint_t)cep->snd_len); 271 258 272 259 #ifdef TCP_CFG_EXTENTIONS 273 260 274 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/261 /* 送信緊急ポインタを設定する。*/ 275 262 if (cep->snd_nblk_tfn == TFN_TCP_SND_OOB) 276 263 cep->snd_up = cep->snd_una + error; … … 293 280 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); 294 281 295 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/282 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 296 283 cep->snd_tskid = TA_NULL; 297 284 cep->snd_tfn = cep->snd_nblk_tfn = TFN_TCP_UNDEF; … … 301 288 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 302 289 303 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããåºæ¥ããåºåã¿ã¹ã¯ãèµ·åºããã*/290 /* 送信ウィンドバッファに空きが出来たら出力タスクを起床する。*/ 304 291 if (last == cep->sbufsz && cep->swbuf_count < cep->sbufsz) 305 292 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_SWBUF_READY)); … … 312 299 313 300 if (cep->swbuf_count > 0) { 314 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãããã°åºåããã¹ãããã*/301 /* 送信ウィンドバッファにデータがあれば出力をポストする。*/ 315 302 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 316 303 sig_sem(SEM_TCP_POST_OUTPUT); … … 319 306 320 307 /* 321 * tcp_write_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã308 * tcp_write_swbuf -- 送信ウィンドバッファにデータを書き込む。 322 309 */ 323 310 … … 327 314 uint_t offset; 328 315 329 /* é信端ç¹ãããã¯ããã*/316 /* 通信端点をロックする。*/ 330 317 syscall(wai_sem(cep->semid_lock)); 331 318 332 /* len ã¨éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã®å°ããæ¹ã移ããã¼ã¿æ°ã«ããã*/319 /* len と送信ウィンドバッファの空きの小さい方を移すデータ数にする。*/ 333 320 if (len > (cep->sbufsz - cep->swbuf_count)) 334 321 len = cep->sbufsz - cep->swbuf_count; 335 322 336 /* æ¸ãè¾¼ã¿ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã®å¦ç*/323 /* 書き込みポインタがラウンドするときの処理 */ 337 324 if (len > cep->sbufsz - (cep->sbuf_wptr - (uint8_t*)cep->sbuf)) { 338 325 offset = (uint_t)(cep->sbufsz - (cep->sbuf_wptr -(uint8_t*)cep->sbuf)); … … 348 335 cep->swbuf_count += len - offset; 349 336 350 /* é信端ç¹ã®ããã¯ã解é¤ããã*/337 /* 通信端点のロックを解除する。*/ 351 338 syscall(sig_sem(cep->semid_lock)); 352 339 … … 355 342 356 343 /* 357 * tcp_wait_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 358 ã¤ã 344 * tcp_wait_swbuf -- 送信ウィンドバッファが空くのを待つ。 359 345 */ 360 346 … … 367 353 while (cep->swbuf_count >= cep->sbufsz) { 368 354 /* 369 * éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãããªããã°ãåºåããã¹ããã¦ã 370 * éä¿¡ã¦ã£ã³ããããã¡ã空ãã¾ã§å¾ 371 ã¤ã 355 * 送信ウィンドバッファの空きがなければ、出力をポストして、 356 * 送信ウィンドバッファが空くまで待つ。 372 357 */ 373 358 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; … … 380 365 381 366 /* 382 * éä¿¡ã§ããããCEP ã® FSM ç¶æ 383 ãè¦ãã 384 * éä¿¡ã¦ã£ã³ããããã¡ã空ãã¾ã§å¾ 385 ã¤éã«ãéä¿¡ä¸è½ã«ãªã£ãå ´åã¯ã 386 * ã³ãã¯ã·ã§ã³ãåæããããã¨ãæå³ãã¦ããã 367 * 送信できるか、CEP の FSM 状態を見る。 368 * 送信ウィンドバッファが空くまで待つ間に、送信不能になった場合は、 369 * コネクションが切断されたことを意味している。 387 370 */ 388 371 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) { … … 394 377 } 395 378 /* 396 * tcp_get_swbuf_addr -- éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããã379 * tcp_get_swbuf_addr -- 送信ウィンドバッファの空きアドレスを獲得する。 397 380 */ 398 381 … … 402 385 uint_t len; 403 386 404 /* é信端ç¹ãããã¯ããã*/387 /* 通信端点をロックする。*/ 405 388 syscall(wai_sem(cep->semid_lock)); 406 389 407 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ã®å 408 é ãè¨å®ããã*/ 390 /* 送信ウィンドバッファの空きアドレスの先頭を設定する。*/ 409 391 *p_buf = cep->sbuf_wptr; 410 392 411 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºããµã¤ãºãè¨ç®ããã*/393 /* 送信ウィンドバッファの空きサイズを計算する。*/ 412 394 if (cep->sbufsz - cep->swbuf_count > cep->sbufsz - (cep->sbuf_wptr - (uint8_t*)cep->sbuf)) 413 /* æ¸è¾¼ã¿ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã¯ãæ¸è¾¼ã¿ãã¤ã³ã¿ããéä¿¡ã¦ã£ã³ããããã¡ã®çµããã¾ã§*/395 /* 書込みポインタがラウンドするときは、書込みポインタから送信ウィンドバッファの終わりまで */ 414 396 len = (uint_t)(cep->sbufsz - (cep->sbuf_wptr - (uint8_t*)cep->sbuf)); 415 397 else 416 398 len = cep->sbufsz - cep->swbuf_count; 417 399 418 /* é信端ç¹ã®ããã¯ã解é¤ããã*/400 /* 通信端点のロックを解除する。*/ 419 401 syscall(sig_sem(cep->semid_lock)); 420 402 421 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºããã¼ã¿é·ãè¨å®ãããã®å¤ãè¿ãã*/403 /* 送信ウィンドバッファの空きデータ長を設定し、その値を返す。*/ 422 404 cep->get_buf_len = len; 423 405 return (ER_UINT)len; … … 425 407 426 408 /* 427 * tcp_send_swbuf -- éä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ãéä¿¡å¯è½ã«ããã409 * tcp_send_swbuf -- 送信ウィンドバッファのデータを送信可能にする。 428 410 */ 429 411 … … 431 413 tcp_send_swbuf_ncs (T_TCP_CEP *cep, uint_t len) 432 414 { 433 /* é信端ç¹ãããã¯ããã*/415 /* 通信端点をロックする。*/ 434 416 syscall(wai_sem(cep->semid_lock)); 435 417 … … 437 419 cep->swbuf_count += len; 438 420 439 /* æ¸è¾¼ã¿ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã®å¦ç*/421 /* 書込みポインタがラウンドするときの処理 */ 440 422 if (cep->sbuf_wptr >= (uint8_t*)cep->sbuf + cep->sbufsz) 441 423 cep->sbuf_wptr = (uint8_t*)cep->sbuf; 442 424 443 /* tcp_get_buf ã®å²å½ã¦é·ããªã»ããããã*/425 /* tcp_get_buf の割当て長をリセットする。*/ 444 426 cep->get_buf_len = 0; 445 427 446 /* é信端ç¹ã®ããã¯ã解é¤ããã*/428 /* 通信端点のロックを解除する。*/ 447 429 syscall(sig_sem(cep->semid_lock)); 448 430 449 /* éä¿¡ã¦ã£ã³ããããã¡ããã«ã®ã¨ãã¯å¼·å¶çã«éä¿¡ããã*/431 /* 送信ウィンドバッファがフルのときは強制的に送信する。*/ 450 432 if (cep->swbuf_count >= cep->sbufsz) 451 433 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; … … 453 435 454 436 /* 455 * tcp_is_swbuf_full -- éä¿¡ã¦ã£ã³ããããã¡ãæºæ¯ããã§ãã¯ããã437 * tcp_is_swbuf_full -- 送信ウィンドバッファが満杯かチェックする。 456 438 */ 457 439 … … 467 449 468 450 /* 469 * TCP é信端ç¹ã®åä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½ãç¡å¹470 */ 471 472 /* 473 * tcp_drop_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããååé¤ããã451 * TCP 通信端点の受信ウィンドバッファの省コピー機能が無効 452 */ 453 454 /* 455 * tcp_drop_rwbuf -- 受信ウィンドバッファから指定されたオクテット分削除する。 474 456 */ 475 457 … … 480 462 cep->rbuf_rptr += len; 481 463 482 /* èªã¿åºããã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã®å¦ç*/464 /* 読み出しポインタがラウンドするときの処理 */ 483 465 if (cep->rbuf_rptr >= (uint8_t*)cep->rbuf + cep->rbufsz) 484 466 cep->rbuf_rptr = (uint8_t*)cep->rbuf; … … 486 468 487 469 /* 488 * tcp_read_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ããæå®ããããªã¯ãããåèªã¿åºãã470 * tcp_read_rwbuf -- 受信ウィンドバッファから指定されたオクテット分読み出す。 489 471 */ 490 472 … … 494 476 uint_t offset; 495 477 496 /* é信端ç¹ãããã¯ããã*/478 /* 通信端点をロックする。*/ 497 479 syscall(wai_sem(cep->semid_lock)); 498 480 499 /* len ã¨åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿æ°ã®å°ããæ¹ãåãåºããã¼ã¿æ°ã«ããã*/481 /* len と受信ウィンドバッファのデータ数の小さい方を取り出すデータ数にする。*/ 500 482 if (len > cep->rwbuf_count) 501 483 len = cep->rwbuf_count; 502 484 503 /* èªã¿åºããã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã®å¦ç*/485 /* 読み出しポインタがラウンドするときの処理 */ 504 486 if (len > cep->rbufsz - (cep->rbuf_rptr - (uint8_t*)cep->rbuf)) { 505 487 offset = (uint_t)(cep->rbufsz - (cep->rbuf_rptr -(uint8_t*)cep->rbuf)); … … 515 497 cep->rbuf_rptr += len - offset; 516 498 517 /* é信端ç¹ã®ããã¯ã解é¤ããã*/499 /* 通信端点のロックを解除する。*/ 518 500 syscall(sig_sem(cep->semid_lock)); 519 501 … … 522 504 523 505 /* 524 * tcp_get_rwbuf_addr -- åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºãã¢ãã¬ã¹ãç²å¾ããã506 * tcp_get_rwbuf_addr -- 受信ウィンドバッファの空きアドレスを獲得する。 525 507 */ 526 508 … … 530 512 uint_t len; 531 513 532 /* é信端ç¹ãããã¯ããã*/514 /* 通信端点をロックする。*/ 533 515 syscall(wai_sem(cep->semid_lock)); 534 516 535 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿é·ãè¨ç®ããã*/517 /* 受信ウィンドバッファのデータ長を計算する。*/ 536 518 if (cep->rwbuf_count > cep->rbufsz - (cep->rbuf_rptr - (uint8_t*)cep->rbuf)) 537 /* ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã¯åä¿¡ã¦ã£ã³ããããã¡ã®çµããã¾ã§*/519 /* ポインタがラウンドするときは受信ウィンドバッファの終わりまで */ 538 520 len = (uint_t)(cep->rbufsz - (cep->rbuf_rptr - (uint8_t*)cep->rbuf)); 539 521 else 540 522 len = cep->rwbuf_count; 541 523 542 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ã®ã¢ãã¬ã¹ã®å 543 é ãè¨å®ããã*/ 524 /* 受信ウィンドバッファのデータのアドレスの先頭を設定する。*/ 544 525 *p_buf = cep->rbuf_rptr; 545 526 546 /* é信端ç¹ã®ããã¯ã解é¤ããã*/527 /* 通信端点のロックを解除する。*/ 547 528 syscall(sig_sem(cep->semid_lock)); 548 529 549 /* åä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿é·ãè¨å®ãããã®å¤ãè¿ãã*/530 /* 受信ウィンドバッファのデータ長を設定し、その値を返す。*/ 550 531 cep->rcv_buf_len = len; 551 532 return len; … … 553 534 554 535 /* 555 * tcp_write_rwbuf -- åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã536 * tcp_write_rwbuf -- 受信ウィンドバッファにデータを書き込む。 556 537 * 557 * 注æ: 558 * å 559 ¥å input ã¯ãT_TCP_Q_HDR ã«ãããªã³ã¯ããã 560 * 並ã¹æ¿ããçµäºãã¦ããªããã°ãªããªããã¾ãã 561 * 追å ãããã¼ã¿ã¯ãåä¿¡ã¦ã£ã³ããããã¡ã«åã¾ããã¨ã 538 * 注意: 539 * 入力 input は、T_TCP_Q_HDR によりリンクされ、 540 * 並べ替えが終了していなければならない。また、 541 * 追加するデータは、受信ウィンドバッファに収まること。 562 542 */ 563 543 … … 568 548 uint_t offset, inlen, last; 569 549 570 /* é信端ç¹ãããã¯ããã*/550 /* 通信端点をロックする。*/ 571 551 syscall(wai_sem(cep->semid_lock)); 572 552 573 553 qhdr = (T_TCP_Q_HDR*)GET_TCP_HDR(input, thoff); 574 554 575 /* åä¿¡æ¸ã¿ã·ã¼ã±ã³ã¹çªå·ãæ´æ°ããã*/555 /* 受信済みシーケンス番号を更新する。*/ 576 556 cep->rcv_nxt += qhdr->slen; 577 557 … … 579 559 inlen = qhdr->slen; 580 560 581 /* ç·æ¥ãã¼ã¿ã® SDU è£æ£ãè¡ãã*/561 /* 緊急データの SDU 補正を行う。*/ 582 562 if (qhdr->urp > 0 && inlen > 0) { 583 563 inlen -= qhdr->urp; … … 587 567 588 568 /* 589 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã590 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦591 * ããªããã¨ãç¥ãããããã§ããã569 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 570 * これは、アプリケーションに、相手からこれ以上データが送られて 571 * こないことを知らせるためである。 592 572 */ 593 573 if (inlen > 0) { 594 574 595 /* æ¸ãè¾¼ã¿ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã®å¦ç*/575 /* 書き込みポインタがラウンドするときの処理 */ 596 576 if (inlen > cep->rbufsz - (cep->rbuf_wptr - (uint8_t*)cep->rbuf)) { 597 577 offset = (uint_t)(cep->rbufsz - (cep->rbuf_wptr - (uint8_t*)cep->rbuf)); … … 616 596 #ifdef TCP_CFG_NON_BLOCKING 617 597 618 if (cep->rcv_nblk_tfn == TFN_TCP_RCV_BUF) { /* ãã³ããããã³ã°ã³ã¼ã«*/598 if (cep->rcv_nblk_tfn == TFN_TCP_RCV_BUF) { /* ノンブロッキングコール */ 619 599 620 600 int_t len; 621 601 622 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºããã¼ã¿é·ãè¨ç®ããã*/602 /* 受信ウィンドバッファの空きデータ長を計算する。*/ 623 603 if (cep->rwbuf_count > cep->rbufsz - (cep->rbuf_rptr - (uint8_t*)cep->rbuf)) { 624 /* ãã¤ã³ã¿ãã©ã¦ã³ãããã¨ãã¯åä¿¡ã¦ã£ã³ããããã¡ã®çµããã¾ã§*/604 /* ポインタがラウンドするときは受信ウィンドバッファの終わりまで */ 625 605 len = (uint_t)(cep->rbufsz - (cep->rbuf_rptr - (uint8_t*)cep->rbuf)); 626 606 } … … 628 608 len = cep->rwbuf_count; 629 609 630 /* é信端ç¹ã®ããã¯ã解é¤ããã*/610 /* 通信端点のロックを解除する。*/ 631 611 syscall(sig_sem(cep->semid_lock)); 632 612 633 613 /* 634 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã635 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦636 * ããªããã¨ãç¥ãããããã§ããã614 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 615 * これは、アプリケーションに、相手からこれ以上データが送られて 616 * こないことを知らせるためである。 637 617 */ 638 618 if (len > 0 || inlen == 0) { 639 619 640 /* tcp_rcv_buf ã®å²å½ã¦é·ãè¨å®ããã*/620 /* tcp_rcv_buf の割当て長を設定する。*/ 641 621 cep->rcv_buf_len = len; 642 622 643 /* åä¿¡ã¦ã£ã³ããããã¡ã®ã¢ãã¬ã¹ãè¿ãã*/623 /* 受信ウィンドバッファのアドレスを返す。*/ 644 624 *cep->rcv_p_buf = cep->rbuf_rptr; 645 625 … … 663 643 664 644 /* 665 * é信端ç¹ãããã¯ãã¦ã666 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã645 * 通信端点をロックして、 646 * 受信ウィンドバッファキューのネットワークバッファを解放する。 667 647 */ 668 648 syscall(wai_sem(cep->semid_lock)); … … 672 652 } 673 653 674 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/654 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 675 655 cep->rcv_tskid = TA_NULL; 676 656 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; 677 657 } 678 658 679 else if (cep->rcv_nblk_tfn == TFN_TCP_RCV_DAT) { /* ãã³ããããã³ã°ã³ã¼ã«*/659 else if (cep->rcv_nblk_tfn == TFN_TCP_RCV_DAT) { /* ノンブロッキングコール */ 680 660 ER_UINT len; 681 661 682 /* é信端ç¹ã®ããã¯ã解é¤ããã*/662 /* 通信端点のロックを解除する。*/ 683 663 syscall(sig_sem(cep->semid_lock)); 684 664 685 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/665 /* 受信ウィンドバッファからデータを取り出す。*/ 686 666 if ((len = TCP_READ_RWBUF(cep, cep->rcv_data, (uint_t)cep->rcv_len)) > 0) { 687 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/667 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 688 668 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 689 669 sig_sem(SEM_TCP_POST_OUTPUT); … … 691 671 692 672 /* 693 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã694 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéããã¦695 * ããªããã¨ãç¥ãããããã§ããã673 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 674 * これは、アプリケーションに、相手からこれ以上データが送られて 675 * こないことを知らせるためである。 696 676 */ 697 677 if (len > 0 || inlen == 0) { … … 713 693 } 714 694 715 /* è¨æ¶ããã¦ããã¿ã¹ã¯ ID 㨠API æ©è½ã³ã¼ããã¯ãªã¢ã¼ããã*/695 /* 記憶されているタスク ID と API 機能コードをクリアーする。*/ 716 696 cep->rcv_tskid = TA_NULL; 717 697 cep->rcv_tfn = cep->rcv_nblk_tfn = TFN_TCP_UNDEF; … … 722 702 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 723 703 724 /* é信端ç¹ã®ããã¯ã解é¤ããã*/704 /* 通信端点のロックを解除する。*/ 725 705 syscall(sig_sem(cep->semid_lock)); 726 706 727 707 if (inlen == 0 && cep->rwbuf_count == 0) { 728 708 /* 729 * åä¿¡ã¦ã£ã³ããããã¡å 730 ã®ãã¼ã¿æ°ã 0 ã§ã 731 * ç¸æãã FIN ãã©ã°ãä»ããã»ã°ã¡ã³ããåä¿¡ããã¨ãã¯ã 732 * é信端ç¹ãããã¯ãã¦ã 733 * åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã 709 * 受信ウィンドバッファ内のデータ数が 0 で、 710 * 相手から FIN フラグが付いたセグメントを受信したときは、 711 * 通信端点をロックして、 712 * 受信ウィンドバッファキューのネットワークバッファを解放する。 734 713 */ 735 714 syscall(wai_sem(cep->semid_lock)); … … 739 718 740 719 /* 741 * åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãå 742 ¥ããã inlen == 0 ã®æãå 743 ¥åã¿ã¹ã¯ãèµ·åºããã 744 * FIN ãã©ã°ãä»ããã»ã°ã¡ã³ã㯠inlen == 0 ã«ãªããã¨ãããã 745 * ããã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ãç¸æãããã以ä¸ãã¼ã¿ãéãã㦠746 * ããªããã¨ãç¥ãããããã§ããã 720 * 受信ウィンドバッファにデータが入るか、 inlen == 0 の時、入力タスクを起床する。 721 * FIN フラグが付いたセグメントは inlen == 0 になることもある。 722 * これは、アプリケーションに、相手からこれ以上データが送られて 723 * こないことを知らせるためである。 747 724 */ 748 725 if ((last == 0 && cep->rwbuf_count > 0) || inlen == 0)
Note:
See TracChangeset
for help on using the changeset viewer.