Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.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_usrreq.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 * TINET ãã©ã¤ãã©ãªåããªãå ´åã¯ãå 133 ¨ã¦ã®æ©è½ã 134 * ãªãã¸ã§ã¯ããã¡ã¤ã«ã«åºåããããããã¯ããæå¹ã«ããã 120 * TINET をライブラリ化しない場合は、全ての機能を 121 * オブジェクトファイルに出力するため、マクロを有効にする。 135 122 */ 136 123 … … 160 147 161 148 /* 162 * IPv6 㨠IPv4 ã§å¼æ°ãç°ãªãé¢æ°ã®ã³ã³ãã¤ã«149 * IPv6 と IPv4 で引数が異なる関数のコンパイル 163 150 */ 164 151 … … 228 215 229 216 /* 230 * tcp_user_closed -- ã¦ã¼ã¶ããã®ã³ãã¯ã·ã§ã³ã®éæ¾217 * tcp_user_closed -- ユーザからのコネクションの開放 231 218 */ 232 219 … … 236 223 switch (cep->fsm_state) { 237 224 238 case TCP_FSM_CLOSED: /* ã¯ãã¼ãº*/239 case TCP_FSM_LISTEN: /* ååãªã¼ãã³*/225 case TCP_FSM_CLOSED: /* クローズ */ 226 case TCP_FSM_LISTEN: /* 受動オープン */ 240 227 cep->fsm_state = TCP_FSM_CLOSED; 241 228 cep = tcp_close(cep); 242 229 break; 243 230 244 case TCP_FSM_SYN_SENT: /* è½åãªã¼ãã³ãSYN éä¿¡æ¸ã¿*/245 case TCP_FSM_SYN_RECVD: /* SYN ãåä¿¡ããSYN éä¿¡æ¸ã¿*/231 case TCP_FSM_SYN_SENT: /* 能動オープン、SYN 送信済み */ 232 case TCP_FSM_SYN_RECVD: /* SYN を受信し、SYN 送信済み */ 246 233 cep->flags |= TCP_CEP_FLG_NEED_FIN; 247 234 break; 248 235 249 case TCP_FSM_ESTABLISHED: /* ã³ãã¯ã·ã§ã³éè¨å®äº*/236 case TCP_FSM_ESTABLISHED: /* コネクション開設完了 */ 250 237 cep->fsm_state = TCP_FSM_FIN_WAIT_1; 251 238 break; 252 239 253 case TCP_FSM_CLOSE_WAIT: /* ç¸æãã FIN åä¿¡ãAPP ã®çµäºå¾ 254 ã¡ */ 240 case TCP_FSM_CLOSE_WAIT: /* 相手から FIN 受信、APP の終了待ち */ 255 241 cep->fsm_state = TCP_FSM_LAST_ACK; 256 242 break; … … 263 249 264 250 /* 265 * tcp_cls_cep -- é信端ç¹ã®ã¯ãã¼ãºãæ¨æºæ©è½ã251 * tcp_cls_cep -- 通信端点のクローズ【標準機能】 266 252 */ 267 253 … … 275 261 #ifndef TCP_CFG_NON_BLOCKING 276 262 277 /* tmout ã TMO_NBLK ãªãã¨ã©ã¼*/263 /* tmout が TMO_NBLK ならエラー */ 278 264 if (tmout == TMO_NBLK) 279 265 return E_PAR; … … 282 268 283 269 /* 284 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã285 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼270 * CEP をロックし、API 機能コードとタスク識別子を記録する。 271 * すでに記録されていれば、ペンディング中なのでエラー 286 272 */ 287 273 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_CLS_CEP)) != E_OK) … … 290 276 #ifdef TCP_CFG_NON_BLOCKING 291 277 292 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/293 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/278 /* タイムアウトをチェックする。*/ 279 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 294 280 295 281 if (!IS_PTR_DEFINED(cep->callback)) 296 282 error = E_OBJ; 297 else if (cep->fsm_state == TCP_FSM_CLOSED) { /* ãã§ã«ã¯ãã¼ãºããã¦ããã¨ã*/283 else if (cep->fsm_state == TCP_FSM_CLOSED) { /* すでにクローズされているとき */ 298 284 299 285 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 … … 313 299 } 314 300 else { 315 /* NBLK ã®API æ©è½ã³ã¼ããè¨å®ããã*/301 /* NBLK のAPI 機能コードを設定する。*/ 316 302 cep->rcv_nblk_tfn = TFN_TCP_CLS_CEP; 317 303 318 if ((cep = tcp_user_closed(cep)) != NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/319 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/304 if ((cep = tcp_user_closed(cep)) != NULL) { /* コネクションを切断する。*/ 305 /* 切断セグメント出力をポストする。*/ 320 306 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 321 307 sig_sem(SEM_TCP_POST_OUTPUT); 322 308 } 323 309 324 /* cep ã NULL ã§æ»ã£ã¦ããå ´åã¯ã325 * æ¢ã«ã³ãã¯ã·ã§ã³ãåæããã¦ãããã¨ãæå³ãã¦ããã326 * ã¾ãããã®å ´åã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºããã¦ããã310 /* cep が NULL で戻ってきた場合は、 311 * 既にコネクションが切断されていることを意味している。 312 * また、この場合コールバック関数が呼び出されている。 327 313 */ 328 314 return E_WBLK; 329 315 } 330 316 } 331 else { /* éãã³ããããã³ã°ã³ã¼ã«*/332 333 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 334 335 if ((cep = tcp_user_closed(cep)) == NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/336 337 /* cep ã NULL ã§æ»ã£ã¦ããå ´åã¯ã338 * æ¢ã«ã³ãã¯ã·ã§ã³ãåæããã¦ãããã¨ãæå³ãã¦ããã317 else { /* 非ノンブロッキングコール */ 318 319 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 320 321 if ((cep = tcp_user_closed(cep)) == NULL) { /* コネクションを切断する。*/ 322 323 /* cep が NULL で戻ってきた場合は、 324 * 既にコネクションが切断されていることを意味している。 339 325 */ 340 326 return error; 341 327 } 342 328 else { 343 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/329 /* 切断セグメント出力をポストする。*/ 344 330 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 345 331 sig_sem(SEM_TCP_POST_OUTPUT); 346 332 347 /* ã¤ãã³ããã©ã°ã CLOSED ã«ãªãã¾ã§å¾ 348 ã¤ã*/ 333 /* イベントフラグが CLOSED になるまで待つ。*/ 349 334 error = twai_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED, TWF_ORW, &flag, tmout); 350 335 if (error == E_OK && cep->error != E_OK) … … 353 338 if (error != E_OK) { 354 339 if (error == E_RLWAI) { 355 /* tcp_cls_cep ããã£ã³ã»ã«ãããã¨ãã¯ãRST ãéä¿¡ããã*/340 /* tcp_cls_cep がキャンセルされたときは、RST を送信する。*/ 356 341 tcp_respond(NULL, cep, cep->rcv_nxt, cep->snd_una - 1, 357 342 cep->rbufsz - cep->rwbuf_count, TCP_FLG_RST); 358 343 } 359 344 360 /* ã¿ã¤ãã¼ãåæ¢ããã*/345 /* タイマーを停止する。*/ 361 346 tcp_cancel_timers(cep); 362 347 363 348 /* 364 * é信端ç¹ãããã¯ãã365 * åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã349 * 通信端点をロックし、 350 * 受信再構成キューのネットワークバッファを解放する。 366 351 */ 367 352 syscall(wai_sem(cep->semid_lock)); … … 369 354 syscall(sig_sem(cep->semid_lock)); 370 355 371 /* ç¶æ 372 ãæªä½¿ç¨ã«ããã*/ 356 /* 状態を未使用にする。*/ 373 357 cep->fsm_state = TCP_FSM_CLOSED; 374 358 375 359 /* 376 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã377 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½378 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½360 * 以下に関係しないフラグをクリアーする。 361 * ・送受信ウィンドバッファの省コピー機能 362 * ・動的な通信端点の生成・削除機能 379 363 */ 380 364 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; 381 365 382 366 /* 383 * é信端ç¹ãããã¯ãã384 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã367 * 通信端点をロックし、 368 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 385 369 */ 386 370 cep->rwbuf_count = 0; … … 410 394 411 395 /* 412 * tcp_sht_cep -- ãã¼ã¿éä¿¡ã®çµäºãæ¨æºæ©è½ã396 * tcp_sht_cep -- データ送信の終了【標準機能】 413 397 */ 414 398 … … 420 404 421 405 /* 422 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã423 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼406 * CEP をロックし、API 機能コードとタスク識別子を記録する。 407 * すでに記録されていれば、ペンディング中なのでエラー 424 408 */ 425 409 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SHT_CEP)) != E_OK) 426 410 return error; 427 411 428 /* TCP é信端ç¹ã®ã³ãã¯ã·ã§ã³ã確ç«ç¶æ 429 ã§ãªããã°ã¨ã©ã¼ */ 412 /* TCP 通信端点のコネクションが確立状態でなければエラー */ 430 413 if (!TCP_FSM_HAVE_ESTABLISHED(cep->fsm_state)) { 431 414 if ((error = cep->error) == E_OK) … … 433 416 } 434 417 435 else if ((cep = tcp_user_closed(cep)) != NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/436 437 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/418 else if ((cep = tcp_user_closed(cep)) != NULL) { /* コネクションを切断する。*/ 419 420 /* 切断セグメント出力をポストする。*/ 438 421 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 439 422 sig_sem(SEM_TCP_POST_OUTPUT); … … 450 433 451 434 /* 452 * tcp_snd_dat -- ãã±ããã®éä¿¡ãæ¨æºæ©è½ã435 * tcp_snd_dat -- パケットの送信【標準機能】 453 436 */ 454 437 … … 461 444 #ifdef TCP_CFG_NON_BLOCKING 462 445 463 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/446 /* data が NULL か、len < 0 ならエラー */ 464 447 if (data == NULL || len < 0) 465 448 return E_PAR; … … 467 450 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 468 451 469 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/452 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 470 453 if (data == NULL || len < 0 || tmout == TMO_NBLK) 471 454 return E_PAR; … … 474 457 475 458 /* 476 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã477 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼459 * CEP をロックし、API 機能コードとタスク識別子を記録する。 460 * すでに記録されていれば、ペンディング中なのでエラー 478 461 */ 479 462 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_DAT)) != E_OK) 480 463 return error; 481 464 482 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 483 ãè¦ãã*/ 465 /* 送信できるか、通信端点の状態を見る。*/ 484 466 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_DAT, tmout)) != E_OK) 485 467 goto err_ret; … … 487 469 #ifdef TCP_CFG_NON_BLOCKING 488 470 489 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/490 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/491 492 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/471 /* タイムアウトをチェックする。*/ 472 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 473 474 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 493 475 if (!TCP_IS_SWBUF_FULL(cep)) { 494 476 495 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/477 /* 送信ウィンドバッファにデータを書き込む。*/ 496 478 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 497 479 498 /* åºåããã¹ãããã*/480 /* 出力をポストする。*/ 499 481 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 500 482 sig_sem(SEM_TCP_POST_OUTPUT); 501 483 502 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/484 /* コールバック関数を呼び出す。*/ 503 485 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 504 486 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)error); … … 518 500 } 519 501 } 520 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 521 522 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 523 524 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 525 ã¤ã*/ 502 else { /* 非ノンブロッキングコール */ 503 504 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 505 506 /* 送信ウィンドバッファが空くのを待つ。*/ 526 507 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 527 508 goto err_ret; 528 509 529 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/510 /* 送信ウィンドバッファにデータを書き込む。*/ 530 511 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 531 512 532 /* ãã¼ã¿ãéä¿¡ãããéä¿¡ã¦ã£ã³ããããã¡ããã«ã®ã¨ãã¯å¼·å¶çã«éä¿¡ããã*/513 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 533 514 if (TCP_IS_SWBUF_FULL(cep)) 534 515 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 535 516 536 /* åºåããã¹ãããã*/517 /* 出力をポストする。*/ 537 518 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 538 519 sig_sem(SEM_TCP_POST_OUTPUT); … … 556 537 557 538 /* 558 * tcp_get_buf -- éä¿¡ç¨ãããã¡ã®ç²å¾ãæ¨æºæ©è½ã539 * tcp_get_buf -- 送信用バッファの獲得【標準機能】 559 540 */ 560 541 … … 567 548 #ifdef TCP_CFG_NON_BLOCKING 568 549 569 /* p_buf ã NULL ãªãã¨ã©ã¼*/550 /* p_buf が NULL ならエラー */ 570 551 if (p_buf == NULL) 571 552 return E_PAR; … … 573 554 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 574 555 575 /* p_buf ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/556 /* p_buf が NULL か、tmout が TMO_NBLK ならエラー */ 576 557 if (p_buf == NULL || tmout == TMO_NBLK) 577 558 return E_PAR; … … 580 561 581 562 /* 582 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã583 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼563 * CEP をロックし、API 機能コードとタスク識別子を記録する。 564 * すでに記録されていれば、ペンディング中なのでエラー 584 565 */ 585 566 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_GET_BUF)) != E_OK) 586 567 return error; 587 568 588 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 589 ãè¦ãã*/ 569 /* 送信できるか、通信端点の状態を見る。*/ 590 570 if ((error = tcp_can_send_more(cep, TFN_TCP_GET_BUF, tmout)) != E_OK) 591 571 goto err_ret; … … 593 573 #ifdef TCP_CFG_NON_BLOCKING 594 574 595 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/596 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/575 /* タイムアウトをチェックする。*/ 576 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 597 577 598 578 if (!TCP_IS_SWBUF_FULL(cep)) { 599 579 600 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/580 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 601 581 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 602 582 603 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/583 /* コールバック関数を呼び出す。*/ 604 584 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 605 585 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)error); … … 618 598 } 619 599 620 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 621 622 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 623 624 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 625 ã¤ã*/ 600 else { /* 非ノンブロッキングコール */ 601 602 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 603 604 /* 送信ウィンドバッファが空くのを待つ。*/ 626 605 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 627 606 goto err_ret; 628 607 629 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/608 /* 送信ウィンドバッファの空アドレスを獲得する。*/ 630 609 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 631 610 … … 647 626 648 627 /* 649 * tcp_snd_buf -- ãããã¡å 650 ã®ãã¼ã¿ã®éä¿¡ãæ¨æºæ©è½ã 628 * tcp_snd_buf -- バッファ内のデータの送信【標準機能】 651 629 */ 652 630 … … 657 635 ER error; 658 636 659 /* éä¿¡ããé·ã len ããã§ãã¯ããã*/637 /* 送信する長さ len をチェックする。*/ 660 638 if (len < 0) 661 639 return E_PAR; 662 640 663 /* éä¿¡ããé·ãlen ã 0 ã§ããã°ãä½ãããªãã§æ»ãã*/641 /* 送信する長さlen が 0 であれば、何もしないで戻る。*/ 664 642 if (len == 0) 665 643 return E_OK; 666 644 667 645 /* 668 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã669 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼646 * CEP をロックし、API 機能コードとタスク識別子を記録する。 647 * すでに記録されていれば、ペンディング中なのでエラー 670 648 */ 671 649 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_BUF)) != E_OK) 672 650 return error; 673 651 674 /* éä¿¡ããé·ã len ããã§ãã¯ããã*/652 /* 送信する長さ len をチェックする。*/ 675 653 if (len > cep->get_buf_len) { 676 654 error = E_OBJ; … … 678 656 } 679 657 680 /* éä¿¡ã§ããããCEP ã® FSM ç¶æ 681 ãè¦ãã*/ 658 /* 送信できるか、CEP の FSM 状態を見る。*/ 682 659 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) { 683 660 if ((error = cep->error) == E_OK) … … 686 663 } 687 664 688 /* éä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ãéä¿¡å¯è½ã«ããã*/665 /* 送信ウィンドバッファのデータを送信可能にする。*/ 689 666 TCP_SEND_SWBUF(cep, (uint_t)len); 690 667 691 /* åºåããã¹ãããã*/668 /* 出力をポストする。*/ 692 669 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 693 670 sig_sem(SEM_TCP_POST_OUTPUT); … … 704 681 705 682 /* 706 * tcp_rcv_dat -- ãã±ããã®åä¿¡ãæ¨æºæ©è½ã683 * tcp_rcv_dat -- パケットの受信【標準機能】 707 684 */ 708 685 … … 715 692 #ifdef TCP_CFG_NON_BLOCKING 716 693 717 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/694 /* data が NULL か、len < 0 ならエラー */ 718 695 if (data == NULL || len < 0) 719 696 return E_PAR; … … 721 698 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 722 699 723 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/700 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 724 701 if (data == NULL || len < 0 || tmout == TMO_NBLK) 725 702 return E_PAR; … … 728 705 729 706 /* 730 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã731 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼707 * CEP をロックし、API 機能コードとタスク識別子を記録する。 708 * すでに記録されていれば、ペンディング中なのでエラー 732 709 */ 733 710 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_RCV_DAT)) != E_OK) 734 711 return error; 735 712 736 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 737 ãè¦ãã*/ 713 /* 受信できるか、通信端点の状態を見る。*/ 738 714 if (tcp_can_recv_more(&error, cep, TFN_TCP_RCV_DAT, tmout) != E_OK) 739 715 goto err_ret; … … 741 717 #ifdef TCP_CFG_NON_BLOCKING 742 718 743 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/744 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/745 746 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/719 /* タイムアウトをチェックする。*/ 720 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 721 722 /* 受信ウィンドバッファにデータがあればコールバック関数を呼び出す。*/ 747 723 if (cep->rwbuf_count > 0) { 748 724 749 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/725 /* 受信ウィンドバッファからデータを取り出す。*/ 750 726 len = TCP_READ_RWBUF(cep, data, (uint_t)len); 751 727 752 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/728 /* コールバック関数を呼び出す。*/ 753 729 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 754 730 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_DAT, (void*)(uint32_t)len); … … 766 742 } 767 743 } 768 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 769 770 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 771 772 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 773 ¥åãããã¾ã§å¾ 774 ã¤ã*/ 744 else { /* 非ノンブロッキングコール */ 745 746 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 747 748 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 775 749 if ((error = tcp_wait_rwbuf(cep, tmout)) != E_OK) 776 750 goto err_ret; 777 751 778 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/752 /* 受信ウィンドバッファからデータを取り出す。*/ 779 753 error = TCP_READ_RWBUF(cep, data, (uint_t)len); 780 754 781 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/755 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 782 756 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 783 757 sig_sem(SEM_TCP_POST_OUTPUT); … … 800 774 801 775 /* 802 * tcp_rcv_buf -- åä¿¡ãããã¼ã¿ã®å 803 ¥ã£ããããã¡ã®ç²å¾ãæ¨æºæ©è½ã 776 * tcp_rcv_buf -- 受信したデータの入ったバッファの獲得【標準機能】 804 777 */ 805 778 … … 812 785 #ifdef TCP_CFG_NON_BLOCKING 813 786 814 /* p_buf ã NULL ãªãã¨ã©ã¼*/787 /* p_buf が NULL ならエラー */ 815 788 if (p_buf == NULL) 816 789 return E_PAR; … … 818 791 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 819 792 820 /* p_buf ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/793 /* p_buf が NULL か、tmout が TMO_NBLK ならエラー */ 821 794 if (p_buf == NULL || tmout == TMO_NBLK) 822 795 return E_PAR; … … 825 798 826 799 /* 827 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã828 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼800 * CEP をロックし、API 機能コードとタスク識別子を記録する。 801 * すでに記録されていれば、ペンディング中なのでエラー 829 802 */ 830 803 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_RCV_BUF)) != E_OK) 831 804 return error; 832 805 833 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 834 ãè¦ãã*/ 806 /* 受信できるか、通信端点の状態を見る。*/ 835 807 if (tcp_can_recv_more(&error, cep, TFN_TCP_RCV_DAT, tmout) != E_OK) 836 808 goto err_ret; … … 838 810 #ifdef TCP_CFG_NON_BLOCKING 839 811 840 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/841 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/842 843 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/812 /* タイムアウトをチェックする。*/ 813 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 814 815 /* 受信ウィンドバッファにデータがあればコールバック関数を呼び出す。*/ 844 816 if (cep->rwbuf_count > 0) { 845 817 846 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/818 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 847 819 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 848 820 849 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/821 /* コールバック関数を呼び出す。*/ 850 822 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 851 823 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)error); … … 862 834 } 863 835 } 864 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 865 866 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 867 868 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 869 ¥åãããã¾ã§å¾ 870 ã¤ã*/ 836 else { /* 非ノンブロッキングコール */ 837 838 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 839 840 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 871 841 if ((error = tcp_wait_rwbuf(cep, tmout)) != E_OK) { 872 842 cep->rwbuf_count = 0; … … 874 844 } 875 845 876 /* åä¿¡ã¦ã£ã³ããããã¡ã®ã¢ãã¬ã¹ãç²å¾ããã*/846 /* 受信ウィンドバッファのアドレスを獲得する。*/ 877 847 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 878 848 … … 894 864 895 865 /* 896 * tcp_rel_buf -- åä¿¡ç¨ãããã¡ã®è§£æ¾ãæ¨æºæ©è½ã866 * tcp_rel_buf -- 受信用バッファの解放【標準機能】 897 867 */ 898 868 … … 903 873 ER error; 904 874 905 /* 解æ¾ããé·ã len ããã§ãã¯ããã*/875 /* 解放する長さ len をチェックする。*/ 906 876 if (len < 0) 907 877 return E_PAR; 908 878 909 879 /* 910 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã911 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼880 * CEP をロックし、API 機能コードとタスク識別子を記録する。 881 * すでに記録されていれば、ペンディング中なのでエラー 912 882 */ 913 883 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_REL_BUF)) != E_OK) 914 884 return error; 915 885 916 /* 解æ¾ããé·ã len ããã§ãã¯ããã*/886 /* 解放する長さ len をチェックする。*/ 917 887 if (len > cep->rcv_buf_len) { 918 888 error = E_OBJ; … … 920 890 } 921 891 922 /* é信端ç¹ãããã¯ããã*/892 /* 通信端点をロックする。*/ 923 893 syscall(wai_sem(cep->semid_lock)); 924 894 925 /* åä¿¡ã¦ã£ã³ããããã¡ããåä¿¡ãããªã¯ããããåé¤ããã*/895 /* 受信ウィンドバッファから受信したオクテットを削除する。*/ 926 896 TCP_DROP_RWBUF(cep, (uint_t)len); 927 897 928 /* tcp_rcv_buf ã®å²å½ã¦é·ããªã»ããããã*/898 /* tcp_rcv_buf の割当て長をリセットする。*/ 929 899 cep->rcv_buf_len -= len; 930 900 931 /* é信端ç¹ã®ããã¯ã解é¤ããã*/901 /* 通信端点のロックを解除する。*/ 932 902 syscall(sig_sem(cep->semid_lock)); 933 903 934 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/904 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 935 905 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 936 906 sig_sem(SEM_TCP_POST_OUTPUT); … … 947 917 948 918 /* 949 * tcp_can_snd -- ãã³ãã£ã³ã°ãã¦ããéä¿¡ã®ãã£ã³ã»ã«919 * tcp_can_snd -- ペンディングしている送信のキャンセル 950 920 */ 951 921 … … 955 925 ER error = E_OK; 956 926 957 /* é信端ç¹ãããã¯ããã*/927 /* 通信端点をロックする。*/ 958 928 syscall(wai_sem(cep->semid_lock)); 959 929 960 930 /* 961 * snd_tskid ã TA_NULL ãªãã962 * ãã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼931 * snd_tskid が TA_NULL なら、 932 * ペンディングしていないのでエラー 963 933 */ 964 934 if (cep->snd_tskid == TA_NULL) 965 935 error = EV_NOPND; 966 936 967 /* ãã³ãã£ã³ã°ä¸ã® API æ©è½ã³ã¼ãã¨ä¸è´ããªããã°ã¨ã©ã¼*/937 /* ペンディング中の API 機能コードと一致しなければエラー */ 968 938 else if (fncd != TFN_TCP_ALL && fncd != cep->snd_tfn) 969 939 error = E_OBJ; 970 940 971 /* å¦çããã£ã³ã»ã«ããã*/941 /* 処理をキャンセルする。*/ 972 942 else { 973 943 974 /* åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/944 /* 受信再構成キューのネットワークバッファを解放する。*/ 975 945 tcp_free_reassq(cep); 976 946 977 /* åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/947 /* 受信ウィンドバッファキューのネットワークバッファを解放する。*/ 978 948 cep->rwbuf_count = 0; 979 949 TCP_FREE_RWBUFQ(cep); 980 950 981 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/951 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 982 952 TCP_FREE_SWBUFQ(cep); 983 953 984 954 #ifdef TCP_CFG_NON_BLOCKING 985 955 986 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF) { /* ãã³ããããã³ã°ã³ã¼ã«*/956 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF) { /* ノンブロッキングコール */ 987 957 988 958 switch (cep->snd_nblk_tfn) { … … 990 960 case TFN_TCP_CON_CEP: 991 961 /* 992 * é信端ç¹ããåä»å£ã解æ¾ãã993 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã962 * 通信端点から受付口を解放し、 963 * イベントフラグをクローズに設定する。 994 964 */ 995 965 cep->rep = NULL; … … 1038 1008 } 1039 1009 1040 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1010 /* 通信端点のロックを解除する。*/ 1041 1011 syscall(sig_sem(cep->semid_lock)); 1042 1012 … … 1045 1015 1046 1016 /* 1047 * tcp_can_rcv -- ãã³ãã£ã³ã°ãã¦ããåä¿¡ã®ãã£ã³ã»ã«1017 * tcp_can_rcv -- ペンディングしている受信のキャンセル 1048 1018 */ 1049 1019 … … 1053 1023 ER error = E_OK; 1054 1024 1055 /* é信端ç¹ãããã¯ããã*/1025 /* 通信端点をロックする。*/ 1056 1026 syscall(wai_sem(cep->semid_lock)); 1057 1027 1058 1028 /* 1059 * rcv_tskid ã TA_NULL ãªãã1060 * ãã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼1029 * rcv_tskid が TA_NULL なら、 1030 * ペンディングしていないのでエラー 1061 1031 */ 1062 1032 if (cep->rcv_tskid == TA_NULL) 1063 1033 error = EV_NOPND; 1064 1034 1065 /* ãã³ãã£ã³ã°ä¸ã® API æ©è½ã³ã¼ãã¨ä¸è´ããªããã°ã¨ã©ã¼*/1035 /* ペンディング中の API 機能コードと一致しなければエラー */ 1066 1036 else if (fncd != TFN_TCP_ALL && fncd != cep->rcv_tfn) 1067 1037 error = E_OBJ; 1068 1038 1069 /* å¦çããã£ã³ã»ã«ããã*/1039 /* 処理をキャンセルする。*/ 1070 1040 else { 1071 1041 1072 /* åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1042 /* 受信再構成キューのネットワークバッファを解放する。*/ 1073 1043 tcp_free_reassq(cep); 1074 1044 1075 /* åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1045 /* 受信ウィンドバッファキューのネットワークバッファを解放する。*/ 1076 1046 cep->rwbuf_count = 0; 1077 1047 TCP_FREE_RWBUFQ(cep); 1078 1048 1079 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1049 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 1080 1050 TCP_FREE_SWBUFQ(cep); 1081 1051 1082 1052 #ifdef TCP_CFG_NON_BLOCKING 1083 1053 1084 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { /* ãã³ããããã³ã°ã³ã¼ã«*/1054 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { /* ノンブロッキングコール */ 1085 1055 1086 1056 switch (cep->rcv_nblk_tfn) { … … 1088 1058 case TFN_TCP_ACP_CEP: 1089 1059 /* 1090 * é信端ç¹ããåä»å£ã解æ¾ãã1091 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã1060 * 通信端点から受付口を解放し、 1061 * イベントフラグをクローズに設定する。 1092 1062 */ 1093 1063 cep->rep = NULL; … … 1142 1112 } 1143 1113 1144 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1114 /* 通信端点のロックを解除する。*/ 1145 1115 syscall(sig_sem(cep->semid_lock)); 1146 1116 … … 1149 1119 1150 1120 /* 1151 * tcp_can_cep -- ãã³ãã£ã³ã°ãã¦ããå¦çã®ãã£ã³ã»ã«ãæ¨æºæ©è½ã1121 * tcp_can_cep -- ペンディングしている処理のキャンセル【標準機能】 1152 1122 */ 1153 1123 … … 1158 1128 ER error = E_OK, snd_err, rcv_err; 1159 1129 1160 /* API æ©è½ã³ã¼ãããã§ãã¯ããã*/1130 /* API 機能コードをチェックする。*/ 1161 1131 if (!VALID_TFN_TCP_CAN(fncd)) 1162 1132 return E_PAR; 1163 1133 1164 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1134 /* TCP 通信端点 ID をチェックする。*/ 1165 1135 if (!VALID_TCP_CEPID(cepid)) 1166 1136 return E_ID; 1167 1137 1168 /* TCP é信端ç¹ãå¾ãã*/1138 /* TCP 通信端点を得る。*/ 1169 1139 cep = GET_TCP_CEP(cepid); 1170 1140 1171 /* TCP é信端ç¹ããã§ãã¯ããã*/1141 /* TCP 通信端点をチェックする。*/ 1172 1142 if (!VALID_TCP_CEP(cep)) 1173 1143 return E_NOEXS; 1174 1144 1175 if (fncd == TFN_TCP_ALL) { /* TFN_TCP_ALL ã®å¦ç*/1145 if (fncd == TFN_TCP_ALL) { /* TFN_TCP_ALL の処理 */ 1176 1146 snd_err = tcp_can_snd(cep, fncd); 1177 1147 rcv_err = tcp_can_rcv(cep, fncd); 1178 1148 1179 1149 /* 1180 * snd_err 㨠rcv_err ã®ã©ã¡ããEV_NOPND1181 * ãªãããã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼1150 * snd_err と rcv_err のどちらも EV_NOPND 1151 * なら、ペンディングしていないのでエラー 1182 1152 */ 1183 1153 if (snd_err == EV_NOPND && rcv_err == EV_NOPND) … … 1196 1166 } 1197 1167 1198 else if (IS_TFN_TCP_RCV(fncd)) { /* åä¿¡å¦çã®ãã£ã³ã»ã«*/1168 else if (IS_TFN_TCP_RCV(fncd)) { /* 受信処理のキャンセル */ 1199 1169 if ((error = tcp_can_rcv(cep, fncd)) == EV_NOPND) 1200 1170 error = E_OBJ; 1201 1171 } 1202 1172 1203 else { /* éä¿¡å¦çã®ãã£ã³ã»ã«*/1173 else { /* 送信処理のキャンセル */ 1204 1174 if ((error = tcp_can_snd(cep, fncd)) == EV_NOPND) 1205 1175 error = E_OBJ; … … 1216 1186 1217 1187 /* 1218 * tcp_cre_cep -- TCP é信端ç¹ã®çæãæ¡å¼µæ©è½ã1188 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 1219 1189 */ 1220 1190 … … 1225 1195 ER error; 1226 1196 1227 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1197 /* TCP 通信端点 ID をチェックする。*/ 1228 1198 if (!VALID_TCP_CEPID(cepid)) 1229 1199 return E_ID; 1230 1200 1231 /* pk_ccep ã NULL ãªãã¨ã©ã¼*/1201 /* pk_ccep が NULL ならエラー */ 1232 1202 if (pk_ccep == NULL) 1233 1203 return E_PAR; 1234 1204 1235 /* TCP é信端ç¹ãå¾ãã*/1205 /* TCP 通信端点を得る。*/ 1236 1206 cep = GET_TCP_CEP(cepid); 1237 1207 1238 /* TCP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/1208 /* TCP 通信端点が、動的生成用でなければエラー */ 1239 1209 if (!DYNAMIC_TCP_CEP(cep)) 1240 1210 return E_ID; 1241 1211 1242 /* é信端ç¹ãããã¯ããã*/1212 /* 通信端点をロックする。*/ 1243 1213 syscall(wai_sem(cep->semid_lock)); 1244 1214 1245 1215 /* 1246 * TCP é信端ç¹ããã§ãã¯ãããçææ¸ã¿ã§ããã°ã¨ã©ã¼1216 * TCP 通信端点をチェックする。生成済みであればエラー 1247 1217 */ 1248 1218 if (VALID_TCP_CEP(cep)) … … 1250 1220 else { 1251 1221 1252 /* TCP é信端ç¹çææ 1253 å ±ãã³ãã¼ããã*/ 1254 cep->cepatr = pk_ccep->cepatr; /* é信端ç¹å±æ§ */ 1255 cep->sbuf = pk_ccep->sbuf; /* éä¿¡ç¨ã¦ã£ã³ããããã¡ */ 1256 cep->sbufsz = pk_ccep->sbufsz; /* éä¿¡ç¨ã¦ã£ã³ããããã¡ãµã¤ãº */ 1257 cep->rbuf = pk_ccep->rbuf; /* åä¿¡ç¨ã¦ã£ã³ããããã¡ */ 1258 cep->rbufsz = pk_ccep->rbufsz; /* åä¿¡ç¨ã¦ã£ã³ããããã¡ãµã¤ãº */ 1259 cep->callback = (void*)pk_ccep->callback; /* ã³ã¼ã«ãã㯠*/ 1260 1261 /* TCP é信端ç¹ãçææ¸ã¿ã«ããã*/ 1222 /* TCP 通信端点生成情報をコピーする。*/ 1223 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 1224 cep->sbuf = pk_ccep->sbuf; /* 送信用ウィンドバッファ */ 1225 cep->sbufsz = pk_ccep->sbufsz; /* 送信用ウィンドバッファサイズ */ 1226 cep->rbuf = pk_ccep->rbuf; /* 受信用ウィンドバッファ */ 1227 cep->rbufsz = pk_ccep->rbufsz; /* 受信用ウィンドバッファサイズ */ 1228 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 1229 1230 /* TCP 通信端点を生成済みにする。*/ 1262 1231 cep->flags |= TCP_CEP_FLG_VALID; 1263 1232 error = E_OK; 1264 1233 } 1265 1234 1266 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1235 /* 通信端点のロックを解除する。*/ 1267 1236 syscall(sig_sem(cep->semid_lock)); 1268 1237 … … 1273 1242 1274 1243 /* 1275 * tcp_del_cep -- TCP é信端ç¹ã®åé¤ãæ¡å¼µæ©è½ã1244 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 1276 1245 */ 1277 1246 … … 1284 1253 ER error; 1285 1254 1286 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1255 /* TCP 通信端点 ID をチェックする。*/ 1287 1256 if (!VALID_TCP_CEPID(cepid)) 1288 1257 return E_ID; 1289 1258 1290 /* TCP é信端ç¹ãå¾ãã*/1259 /* TCP 通信端点を得る。*/ 1291 1260 cep = GET_TCP_CEP(cepid); 1292 1261 1293 /* TCP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/1262 /* TCP 通信端点が、動的生成用でなければエラー */ 1294 1263 if (!DYNAMIC_TCP_CEP(cep)) 1295 1264 return E_ID; 1296 1265 1297 /* é信端ç¹ãããã¯ããã*/1266 /* 通信端点をロックする。*/ 1298 1267 syscall(wai_sem(cep->semid_lock)); 1299 1268 1300 1269 /* 1301 * TCP é信端ç¹ããã§ãã¯ããã以ä¸ã®å ´åã¯ã¨ã©ã¼1302 * ã»æªçæã1303 * ã»ä½¿ç¨ä¸ã1270 * TCP 通信端点をチェックする。以下の場合はエラー 1271 * ・未生成。 1272 * ・使用中。 1304 1273 */ 1305 1274 if (!VALID_TCP_CEP(cep)) … … 1309 1278 else { 1310 1279 1311 /* TCP é信端ç¹ãæªçæã«ããã*/1280 /* TCP 通信端点を未生成にする。*/ 1312 1281 cep->flags &= ~TCP_CEP_FLG_VALID; 1313 1282 error = E_OK; 1314 1283 } 1315 1284 1316 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1285 /* 通信端点のロックを解除する。*/ 1317 1286 syscall(sig_sem(cep->semid_lock)); 1318 1287 … … 1325 1294 1326 1295 /* 1327 * tcp_snd_oob -- ç·æ¥ãã¼ã¿ã®éä¿¡ãæ¡å¼µæ©è½ã1296 * tcp_snd_oob -- 緊急データの送信【拡張機能】 1328 1297 */ 1329 1298 … … 1336 1305 #ifdef TCP_CFG_NON_BLOCKING 1337 1306 1338 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/1307 /* data が NULL か、len < 0 ならエラー */ 1339 1308 if (data == NULL || len < 0) 1340 1309 return E_PAR; … … 1342 1311 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1343 1312 1344 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/1313 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1345 1314 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1346 1315 return E_PAR; … … 1349 1318 1350 1319 /* 1351 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1352 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1320 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1321 * すでに記録されていれば、ペンディング中なのでエラー 1353 1322 */ 1354 1323 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK) 1355 1324 return error; 1356 1325 1357 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 1358 ãè¦ãã*/ 1326 /* 送信できるか、通信端点の状態を見る。*/ 1359 1327 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK) 1360 1328 goto err_ret; … … 1362 1330 #ifdef TCP_CFG_NON_BLOCKING 1363 1331 1364 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1365 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1366 1367 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1332 /* タイムアウトをチェックする。*/ 1333 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1334 1335 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1368 1336 if (!TCP_IS_SWBUF_FULL(cep)) { 1369 1337 1370 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1338 /* 送信ウィンドバッファにデータを書き込む。*/ 1371 1339 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 1372 1340 1373 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/1341 /* 送信緊急ポインタを設定する。*/ 1374 1342 cep->snd_up = cep->snd_una + cep->swbuf_count; 1375 1343 1376 /* åºåããã¹ãããã*/1344 /* 出力をポストする。*/ 1377 1345 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1378 1346 sig_sem(SEM_TCP_POST_OUTPUT); 1379 1347 1380 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1348 /* コールバック関数を呼び出す。*/ 1381 1349 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1382 1350 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error); … … 1396 1364 } 1397 1365 } 1398 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1399 1400 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1401 1402 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 1403 ã¤ã*/ 1366 else { /* 非ノンブロッキングコール */ 1367 1368 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1369 1370 /* 送信ウィンドバッファが空くのを待つ。*/ 1404 1371 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1405 1372 goto err_ret; 1406 1373 1407 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1374 /* 送信ウィンドバッファにデータを書き込む。*/ 1408 1375 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 1409 1376 1410 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/1377 /* 送信緊急ポインタを設定する。*/ 1411 1378 cep->snd_up = cep->snd_una + cep->swbuf_count; 1412 1379 1413 /* ãã¼ã¿ãéä¿¡ãããéä¿¡ã¦ã£ã³ããããã¡ããã«ã®ã¨ãã¯å¼·å¶çã«éä¿¡ããã*/1380 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 1414 1381 if (TCP_IS_SWBUF_FULL(cep)) 1415 1382 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 1416 1383 1417 /* åºåããã¹ãããã*/1384 /* 出力をポストする。*/ 1418 1385 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1419 1386 sig_sem(SEM_TCP_POST_OUTPUT); … … 1437 1404 1438 1405 /* 1439 * tcp_rcv_oob -- ç·æ¥ãã¼ã¿ã®åä¿¡ãæ¡å¼µæ©è½ã1406 * tcp_rcv_oob -- 緊急データの受信【拡張機能】 1440 1407 * 1441 * 注æ: éä¿¡å´ãè¤æ°ãªã¯ãããã®ãã¼ã¿ãéä¿¡ãã¦ãã1442 * ç·æ¥ãã¤ã³ã¿ãæã 1 ãªã¯ãããã®ãã¼ã¿ã®ã¿åä¿¡ããã1408 * 注意: 送信側が複数オクテットのデータを送信しても、 1409 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。 1443 1410 */ 1444 1411 … … 1449 1416 uint8_t *urg; 1450 1417 1451 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1418 /* TCP 通信端点 ID をチェックする。*/ 1452 1419 if (!VALID_TCP_CEPID(cepid)) 1453 1420 return E_ID; 1454 1421 1455 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/1422 /* data が NULL か、len < 0 ならエラー */ 1456 1423 if (data == NULL || len < 0) 1457 1424 return E_PAR; 1458 1425 1459 /* TCP é信端ç¹ãå¾ãã*/1426 /* TCP 通信端点を得る。*/ 1460 1427 cep = GET_TCP_CEP(cepid); 1461 1428 1462 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 1463 ãè¦ãã*/ 1464 /* åä¿¡ã§ããããfsm_state ãè¦ãã*/ 1429 /* 受信できるか、通信端点の状態を見る。*/ 1430 /* 受信できるか、fsm_state を見る。*/ 1465 1431 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state)) 1466 1432 return E_OBJ; 1467 1433 1468 1434 /* 1469 * ç·æ¥ãã¼ã¿å 1470 ¥ãã®ã»ã°ã¡ã³ãã® TCP ãããã 1471 * è¨å®ããã¦ããªããã°ãç·æ¥ãã¼ã¿ãåä¿¡ãã¦ããªãã 1435 * 緊急データ入りのセグメントの TCP ヘッダが 1436 * 設定されていなければ、緊急データを受信していない。 1472 1437 */ 1473 1438 if (cep->urg_tcph == NULL) 1474 1439 return E_OBJ; 1475 1440 1476 /* len == 0 ãªããããã¡ãªã¼ãã¼ããã¼*/1441 /* len == 0 ならバッファオーバーフロー */ 1477 1442 if (len == 0) 1478 1443 return E_BOVR; 1479 1444 1480 /* ç·æ¥ãã¤ã³ã¿ãæã 1 ãªã¯ãããã®ãã¼ã¿ãèªã¿åãã*/1445 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/ 1481 1446 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET; 1482 1447 *(uint8_t*)data = *urg; 1483 1448 1484 /* èªã¿åã£ããã¼ã¿ããå¾ãã® SDU ãåã«è©°ããã*/1449 /* 読み取ったデータから後ろの SDU を前に詰める。*/ 1485 1450 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1); 1486 1451 1487 /* tcp_rcv_oob() ãå¼åºããããã¨ç¥ãããããã«ãNULL ãè¨å®ããã*/1452 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/ 1488 1453 cep->urg_tcph = NULL; 1489 1454 … … 1500 1465 1501 1466 /* 1502 * tcp_del_rep -- TCP åä»å£ã®åé¤ãæ¡å¼µæ©è½ã1467 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 1503 1468 */ 1504 1469 … … 1512 1477 1513 1478 /* 1514 * TCP åä»å£ ID ããã§ãã¯ããã1515 * IPv6 ç¨ TCP åä»å£ã§ããã°ã1516 * IPv6 ç¨ã®ãTCP åä»å£ã®åé¤é¢æ°ï¼æ¬ä½ï¼ããå¼åºãã1479 * TCP 受付口 ID をチェックする。 1480 * IPv6 用 TCP 受付口であれば、 1481 * IPv6 用の「TCP 受付口の削除関数(本体)」を呼出す。 1517 1482 */ 1518 1483 //NET_DEBUG_TCP3("tcp_del_rep1[r=%d,n=%d,x=%d]\n", … … 1524 1489 1525 1490 /* 1526 * TCP åä»å£ ID ããã§ãã¯ããã1527 * IPv4 ç¨ TCP åä»å£ã§ããã°ã1528 * IPv4 ç¨ã®ãTCP åä»å£ã®åé¤é¢æ°ï¼æ¬ä½ï¼ããå¼åºãã1491 * TCP 受付口 ID をチェックする。 1492 * IPv4 用 TCP 受付口であれば、 1493 * IPv4 用の「TCP 受付口の削除関数(本体)」を呼出す。 1529 1494 */ 1530 1495 else if (VALID_TCP4_REPID(repid)) … … 1541 1506 { 1542 1507 1543 /* TCP åä»å£ ID ããã§ãã¯ããã*/1508 /* TCP 受付口 ID をチェックする。*/ 1544 1509 if (VALID_TCP6_REPID(repid)) 1545 1510 return tcp6_del_rep_body(repid); … … 1557 1522 { 1558 1523 1559 /* TCP åä»å£ ID ããã§ãã¯ããã*/1524 /* TCP 受付口 ID をチェックする。*/ 1560 1525 if (VALID_TCP4_REPID(repid)) 1561 1526 return tcp4_del_rep_body(repid); … … 1570 1535 1571 1536 /* 1572 * tcp_set_opt -- TCP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã1537 * tcp_set_opt -- TCP 通信端点オプションの設定【拡張機能】 1573 1538 * 1574 * 注æ: è¨å®å¯è½ãª TCP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã1539 * 注意: 設定可能な TCP 通信端点オプションは無いため、E_PAR が返される。 1575 1540 */ 1576 1541 … … 1582 1547 T_TCP_CEP *cep; 1583 1548 1584 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1549 /* TCP 通信端点 ID をチェックする。*/ 1585 1550 if (!VALID_TCP_CEPID(cepid)) 1586 1551 return E_ID; 1587 1552 1588 /* TCP é信端ç¹ãå¾ãã*/1553 /* TCP 通信端点を得る。*/ 1589 1554 cep = GET_TCP_CEP(cepid); 1590 1555 1591 /* TCP é信端ç¹ããã§ãã¯ããã*/1556 /* TCP 通信端点をチェックする。*/ 1592 1557 if (!VALID_TCP_CEP(cep)) 1593 1558 return E_NOEXS; … … 1599 1564 1600 1565 /* 1601 * tcp_get_opt -- TCP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã1566 * tcp_get_opt -- TCP 通信端点オプションの設定【拡張機能】 1602 1567 * 1603 * 注æ: è¨å®å¯è½ãª TCP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã1568 * 注意: 設定可能な TCP 通信端点オプションは無いため、E_PAR が返される。 1604 1569 */ 1605 1570 … … 1611 1576 T_TCP_CEP *cep; 1612 1577 1613 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1578 /* TCP 通信端点 ID をチェックする。*/ 1614 1579 if (!VALID_TCP_CEPID(cepid)) 1615 1580 return E_ID; 1616 1581 1617 /* TCP é信端ç¹ãå¾ãã*/1582 /* TCP 通信端点を得る。*/ 1618 1583 cep = GET_TCP_CEP(cepid); 1619 1584 1620 /* TCP é信端ç¹ããã§ãã¯ããã*/1585 /* TCP 通信端点をチェックする。*/ 1621 1586 if (!VALID_TCP_CEP(cep)) 1622 1587 return E_NOEXS;
Note:
See TracChangeset
for help on using the changeset viewer.