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