Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.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_usrreq.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$ … … 132 120 133 121 /* 134 * IPv4 㨠IPv6 ã®åãæ¿ããã¯ã122 * IPv4 と IPv6 の切り替えマクロ 135 123 */ 136 124 … … 152 140 153 141 /* 154 * TINET ãã©ã¤ãã©ãªåããªãå ´åã¯ãå 155 ¨ã¦ã®æ©è½ã 156 * ãªãã¸ã§ã¯ããã¡ã¤ã«ã«åºåããããããã¯ããæå¹ã«ããã 142 * TINET をライブラリ化しない場合は、全ての機能を 143 * オブジェクトファイルに出力するため、マクロを有効にする。 157 144 */ 158 145 … … 182 169 183 170 /* 184 * tcp_cre_rep -- TCP åä»å£ã®çæãæ¡å¼µæ©è½ã171 * tcp_cre_rep -- TCP 受付口の生成【拡張機能】 185 172 */ 186 173 … … 195 182 ER error; 196 183 197 /* TCP åä»å£ ID ããã§ãã¯ããã*/184 /* TCP 受付口 ID をチェックする。*/ 198 185 if (!VAID_TCP_REPID(repid)) 199 186 return E_ID; 200 187 201 /* pk_crep ã NULL ãªãã¨ã©ã¼*/188 /* pk_crep が NULL ならエラー */ 202 189 if (pk_crep == NULL) 203 190 return E_PAR; 204 191 205 /* TCP åä»å£ãå¾ãã*/192 /* TCP 受付口を得る。*/ 206 193 rep = GET_TCP_REP(repid); 207 194 208 /* TCP åä»å£ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/195 /* TCP 受付口が、動的生成用でなければエラー */ 209 196 if (!DYNAMIC_TCP_REP(rep)) 210 197 return E_ID; 211 198 212 /* åä»å£ãããã¯ããã*/199 /* 受付口をロックする。*/ 213 200 syscall(wai_sem(rep->semid_lock)); 214 201 215 202 /* 216 * TCP åä»å£ããã§ãã¯ãããçææ¸ã¿ã§ããã°ã¨ã©ã¼203 * TCP 受付口をチェックする。生成済みであればエラー 217 204 */ 218 205 if (VALID_TCP_REP(rep)) … … 220 207 else { 221 208 222 /* TCP åä»å£çææ 223 å ±ãã³ãã¼ããã*/ 224 rep->repatr = pk_crep->repatr; /* åä»å£å±æ§ */ 225 rep->myaddr = pk_crep->myaddr; /* èªåã®ã¢ãã¬ã¹ */ 226 227 /* TCP åä»å£ãçææ¸ã¿ã«ããã*/ 209 /* TCP 受付口生成情報をコピーする。*/ 210 rep->repatr = pk_crep->repatr; /* 受付口属性 */ 211 rep->myaddr = pk_crep->myaddr; /* 自分のアドレス */ 212 213 /* TCP 受付口を生成済みにする。*/ 228 214 rep->flags |= TCP_REP_FLG_VALID; 229 215 error = E_OK; 230 216 } 231 217 232 /* åä»å£ã®ããã¯ã解é¤ããã*/218 /* 受付口のロックを解除する。*/ 233 219 syscall(sig_sem(rep->semid_lock)); 234 220 … … 245 231 246 232 /* 247 * tcp_find_cep_rep -- TCP åä»å£ããªã³ã¯ãã¦ãã TCP é信端ç¹ãå¾ãã233 * tcp_find_cep_rep -- TCP 受付口をリンクしている TCP 通信端点を得る。 248 234 */ 249 235 … … 262 248 263 249 /* 264 * tcp_del_rep -- TCP åä»å£ã®åé¤ãæ¡å¼µæ©è½ã250 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 265 251 */ 266 252 … … 273 259 ER error = E_OK; 274 260 275 /* TCP åä»å£ ID ããã§ãã¯ããã*/261 /* TCP 受付口 ID をチェックする。*/ 276 262 if (!VAID_TCP_REPID(repid)) 277 263 return E_ID; 278 264 279 /* TCP åä»å£ãå¾ãã*/265 /* TCP 受付口を得る。*/ 280 266 rep = GET_TCP_REP(repid); 281 267 282 /* TCP åä»å£ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/268 /* TCP 受付口が、動的生成用でなければエラー */ 283 269 if (!DYNAMIC_TCP_REP(rep)) 284 270 return E_ID; 285 271 286 /* åä»å£ãããã¯ããã*/272 /* 受付口をロックする。*/ 287 273 syscall(wai_sem(rep->semid_lock)); 288 274 289 /* TCP åä»å£ããã§ãã¯ãããæªçæã®å ´åã¯ã¨ã©ã¼*/275 /* TCP 受付口をチェックする。未生成の場合はエラー */ 290 276 if (!VALID_TCP_REP(rep)) 291 277 error = E_NOEXS; … … 293 279 if ((cep = tcp_find_cep_rep(rep)) != NULL) { 294 280 /* 295 * ãã§ã«ååãªã¼ãã³ãã¦ããã¨ã296 * ï¼tcp_acp_cep ãå¼ã°ãã¦ããã¨ãï¼ã¯ã297 * tcp_acp_cep ãçµäºãããã281 * すでに受動オープンしているとき 282 *(tcp_acp_cep が呼ばれているとき)は、 283 * tcp_acp_cep を終了させる。 298 284 */ 299 285 300 /* é信端ç¹ãããã¯ããã*/286 /* 通信端点をロックする。*/ 301 287 syscall(wai_sem(cep->semid_lock)); 302 288 303 289 /* 304 * é信端ç¹ããåä»å£ã解æ¾ãã305 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã290 * 通信端点から受付口を解放し、 291 * イベントフラグをクローズに設定する。 306 292 */ 307 293 cep->rep = NULL; … … 338 324 cep->rcv_tfn = TFN_TCP_UNDEF; 339 325 340 /* é信端ç¹ã®ããã¯ã解é¤ããã*/326 /* 通信端点のロックを解除する。*/ 341 327 syscall(sig_sem(cep->semid_lock)); 342 328 … … 345 331 error = E_OK; 346 332 347 /* TCP åä»å£ãæªçæã«ããã*/333 /* TCP 受付口を未生成にする。*/ 348 334 rep->flags &= ~TCP_REP_FLG_VALID; 349 335 } 350 336 351 /* åä»å£ã®ããã¯ã解é¤ããã*/337 /* 受付口のロックを解除する。*/ 352 338 syscall(sig_sem(rep->semid_lock)); 353 339 … … 360 346 361 347 /* 362 * tcp_cre_cep -- TCP é信端ç¹ã®çæãæ¡å¼µæ©è½ã348 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 363 349 */ 364 350 … … 373 359 ER error; 374 360 375 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/361 /* TCP 通信端点 ID をチェックする。*/ 376 362 if (!VAID_TCP_CEPID(cepid)) 377 363 return E_ID; 378 364 379 /* pk_ccep ã NULL ãªãã¨ã©ã¼*/365 /* pk_ccep が NULL ならエラー */ 380 366 if (pk_ccep == NULL) 381 367 return E_PAR; 382 368 383 /* TCP é信端ç¹ãå¾ãã*/369 /* TCP 通信端点を得る。*/ 384 370 cep = GET_TCP_CEP(cepid); 385 371 386 /* TCP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/372 /* TCP 通信端点が、動的生成用でなければエラー */ 387 373 if (!DYNAMIC_TCP_CEP(cep)) 388 374 return E_ID; 389 375 390 /* é信端ç¹ãããã¯ããã*/376 /* 通信端点をロックする。*/ 391 377 syscall(wai_sem(cep->semid_lock)); 392 378 393 379 /* 394 * TCP é信端ç¹ããã§ãã¯ãããçææ¸ã¿ã§ããã°ã¨ã©ã¼380 * TCP 通信端点をチェックする。生成済みであればエラー 395 381 */ 396 382 if (VALID_TCP_CEP(cep)) … … 398 384 else { 399 385 400 /* TCP é信端ç¹çææ 401 å ±ãã³ãã¼ããã*/ 402 cep->cepatr = pk_ccep->cepatr; /* é信端ç¹å±æ§ */ 403 cep->sbuf = pk_ccep->sbuf; /* éä¿¡ç¨ã¦ã£ã³ããããã¡ */ 404 cep->sbufsz = pk_ccep->sbufsz; /* éä¿¡ç¨ã¦ã£ã³ããããã¡ãµã¤ãº */ 405 cep->rbuf = pk_ccep->rbuf; /* åä¿¡ç¨ã¦ã£ã³ããããã¡ */ 406 cep->rbufsz = pk_ccep->rbufsz; /* åä¿¡ç¨ã¦ã£ã³ããããã¡ãµã¤ãº */ 407 cep->callback = (void*)pk_ccep->callback; /* ã³ã¼ã«ãã㯠*/ 408 409 /* TCP é信端ç¹ãçææ¸ã¿ã«ããã*/ 386 /* TCP 通信端点生成情報をコピーする。*/ 387 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 388 cep->sbuf = pk_ccep->sbuf; /* 送信用ウィンドバッファ */ 389 cep->sbufsz = pk_ccep->sbufsz; /* 送信用ウィンドバッファサイズ */ 390 cep->rbuf = pk_ccep->rbuf; /* 受信用ウィンドバッファ */ 391 cep->rbufsz = pk_ccep->rbufsz; /* 受信用ウィンドバッファサイズ */ 392 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 393 394 /* TCP 通信端点を生成済みにする。*/ 410 395 cep->flags |= TCP_CEP_FLG_VALID; 411 396 error = E_OK; 412 397 } 413 398 414 /* é信端ç¹ã®ããã¯ã解é¤ããã*/399 /* 通信端点のロックを解除する。*/ 415 400 syscall(sig_sem(cep->semid_lock)); 416 401 … … 423 408 424 409 /* 425 * tcp_del_cep -- TCP é信端ç¹ã®åé¤ãæ¡å¼µæ©è½ã410 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 426 411 */ 427 412 … … 436 421 ER error; 437 422 438 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/423 /* TCP 通信端点 ID をチェックする。*/ 439 424 if (!VAID_TCP_CEPID(cepid)) 440 425 return E_ID; 441 426 442 /* TCP é信端ç¹ãå¾ãã*/427 /* TCP 通信端点を得る。*/ 443 428 cep = GET_TCP_CEP(cepid); 444 429 445 /* TCP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/430 /* TCP 通信端点が、動的生成用でなければエラー */ 446 431 if (!DYNAMIC_TCP_CEP(cep)) 447 432 return E_ID; 448 433 449 /* é信端ç¹ãããã¯ããã*/434 /* 通信端点をロックする。*/ 450 435 syscall(wai_sem(cep->semid_lock)); 451 436 452 437 /* 453 * TCP é信端ç¹ããã§ãã¯ããã以ä¸ã®å ´åã¯ã¨ã©ã¼454 * ã»æªçæã455 * ã»ä½¿ç¨ä¸ã438 * TCP 通信端点をチェックする。以下の場合はエラー 439 * ・未生成。 440 * ・使用中。 456 441 */ 457 442 if (!VALID_TCP_CEP(cep)) … … 461 446 else { 462 447 463 /* TCP é信端ç¹ãæªçæã«ããã*/448 /* TCP 通信端点を未生成にする。*/ 464 449 cep->flags &= ~TCP_CEP_FLG_VALID; 465 450 error = E_OK; 466 451 } 467 452 468 /* é信端ç¹ã®ããã¯ã解é¤ããã*/453 /* 通信端点のロックを解除する。*/ 469 454 syscall(sig_sem(cep->semid_lock)); 470 455 … … 479 464 480 465 /* 481 * tcp_acp_cep -- æ¥ç¶è¦æ±å¾ 482 ã¡ (ååãªã¼ãã³)ãæ¨æºæ©è½ã 466 * tcp_acp_cep -- 接続要求待ち (受動オープン)【標準機能】 483 467 */ 484 468 … … 493 477 FLGPTN flag; 494 478 495 /* TCP åä»å£ããã§ãã¯ããã*/479 /* TCP 受付口をチェックする。*/ 496 480 if (!VAID_TCP_REPID(repid)) 497 481 return E_ID; … … 499 483 #ifdef TCP_CFG_NON_BLOCKING 500 484 501 /* p_dstaddr ã NULL ãªãã¨ã©ã¼*/485 /* p_dstaddr が NULL ならエラー */ 502 486 if (p_dstaddr == NULL) 503 487 return E_PAR; … … 505 489 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 506 490 507 /* p_dstaddr ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/491 /* p_dstaddr が NULL か、tmout が TMO_NBLK ならエラー */ 508 492 if (p_dstaddr == NULL || tmout == TMO_NBLK) 509 493 return E_PAR; … … 512 496 513 497 /* 514 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã515 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼498 * CEP をロックし、API 機能コードとタスク識別子を記録する。 499 * すでに記録されていれば、ペンディング中なのでエラー 516 500 */ 517 501 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_ACP_CEP)) != E_OK) 518 502 return error; 519 503 520 /* CEP ã® FSM ãã¯ãã¼ãºç¶æ 521 ã§ãªããã°ã¨ã©ã¼ã*/ 504 /* CEP の FSM がクローズ状態でなければエラー。*/ 522 505 if (cep->fsm_state != TCP_FSM_CLOSED) { 523 506 error = E_OBJ; … … 526 509 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 527 510 528 /* TCP é信端ç¹ãåæåããã*/511 /* TCP 通信端点を初期化する。*/ 529 512 tcp_init_cep(cep); 530 513 531 /* TCP åä»å£ãå¾ãã*/514 /* TCP 受付口を得る。*/ 532 515 rep = GET_TCP_REP(repid); 533 516 534 517 #ifdef TCP_CFG_EXTENTIONS 535 518 536 /* TCP åä»å£ãããã¯ããã*/519 /* TCP 受付口をロックする。*/ 537 520 syscall(wai_sem(rep->semid_lock)); 538 521 539 /* TCP åä»å£ããã§ãã¯ããã*/522 /* TCP 受付口をチェックする。*/ 540 523 if (!VALID_TCP_REP(rep)) { 541 524 syscall(sig_sem(rep->semid_lock)); … … 546 529 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 547 530 548 /* TCP é信端ç¹ã«TCPåä»å£ãè¨é²ããã*/531 /* TCP 通信端点にTCP受付口を記録する。*/ 549 532 cep->rep = rep; 550 533 551 534 #ifdef TCP_CFG_EXTENTIONS 552 535 553 /* TCP åä»å£ã®ããã¯ã解é¤ããã*/536 /* TCP 受付口のロックを解除する。*/ 554 537 syscall(sig_sem(rep->semid_lock)); 555 538 556 539 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 557 540 558 /* TCP åä»å£ã®ã¢ãã¬ã¹ãã³ãã¼ããã*/541 /* TCP 受付口のアドレスをコピーする。*/ 559 542 cep->myaddr = rep->myaddr; 560 543 561 /* é信端ç¹ãè¨å®ããã*/544 /* 通信端点を設定する。*/ 562 545 cep->fsm_state = TCP_FSM_LISTEN; 563 546 564 547 #ifdef TCP_CFG_NON_BLOCKING 565 548 566 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/549 /* タイムアウトをチェックする。*/ 567 550 if (tmout == TMO_NBLK) { 568 /* ãã³ããããã³ã°ã³ã¼ã«*/551 /* ノンブロッキングコール */ 569 552 cep->p_dstaddr = p_dstaddr; 570 553 cep->rcv_nblk_tfn = TFN_TCP_ACP_CEP; … … 576 559 577 560 /* 578 * FSM ã ESTABLISHED ã«ãªãã¾ã§å¾ 579 ã¤ã 580 * FSM ã CLOSED ã«ãªã£ãå ´åã¯ãã¨ã©ã¼ãçºçãããã¨ãæå³ãã¦ããã 561 * FSM が ESTABLISHED になるまで待つ。 562 * FSM が CLOSED になった場合は、エラーが発生したことを意味している。 581 563 */ 582 564 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | … … 592 574 593 575 if (error == E_OK) { 594 /* ç¸æã®ã¢ãã¬ã¹ãã³ãã¼ããã*/576 /* 相手のアドレスをコピーする。*/ 595 577 *p_dstaddr = cep->dstaddr; 596 578 } 597 579 else { 598 580 /* 599 * é信端ç¹ããåä»å£ã解æ¾ãã600 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã581 * 通信端点から受付口を解放し、 582 * イベントフラグをクローズに設定する。 601 583 */ 602 584 cep->rep = NULL; … … 622 604 623 605 /* 624 * tcp_con_cep -- æ¥ç¶è¦æ± (è½åãªã¼ãã³)ãæ¨æºæ©è½ã606 * tcp_con_cep -- 接続要求 (能動オープン)【標準機能】 625 607 */ 626 608 … … 637 619 638 620 /* 639 * p_dstaddr ã¾ã㯠p_myaddr ã NULL ãã 640 * ãã¦å 641 ããã«ããã£ã¹ãã¢ãã¬ã¹ãªãã¨ã©ã¼ 621 * p_dstaddr または p_myaddr が NULL か、 622 * あて先がマルチキャストアドレスならエラー 642 623 */ 643 624 if (p_myaddr == NULL || p_dstaddr == NULL || IN_IS_ADDR_MULTICAST(&p_dstaddr->ipaddr)) … … 647 628 648 629 /* 649 * p_dstaddr ã¾ã㯠p_myaddr ã NULL ã 650 * ãã¦å 651 ããã«ããã£ã¹ãã¢ãã¬ã¹ãã 652 * tmout ã TMO_NBLK ãªãã¨ã©ã¼ 630 * p_dstaddr または p_myaddr が NULL 、 631 * あて先がマルチキャストアドレスか、 632 * tmout が TMO_NBLK ならエラー 653 633 */ 654 634 if (p_myaddr == NULL || p_dstaddr == NULL || … … 659 639 660 640 /* 661 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã662 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼641 * CEP をロックし、API 機能コードとタスク識別子を記録する。 642 * すでに記録されていれば、ペンディング中なのでエラー 663 643 */ 664 644 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_CON_CEP)) != E_OK) 665 645 return error; 666 646 667 /* CEP ã® FSM ãã¯ãã¼ãºç¶æ 668 ã§ãªããã°ã¨ã©ã¼ã*/ 647 /* CEP の FSM がクローズ状態でなければエラー。*/ 669 648 if (cep->fsm_state != TCP_FSM_CLOSED) { 670 649 error = E_OBJ; … … 673 652 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 674 653 675 /* ã·ã¼ã±ã³ã¹çªå·ãåæåããã*/654 /* シーケンス番号を初期化する。*/ 676 655 if (tcp_iss == 0) 677 656 tcp_init_iss(); 678 657 679 /* é信端ç¹ãåæåããã*/658 /* 通信端点を初期化する。*/ 680 659 tcp_init_cep(cep); 681 660 682 661 /* 683 * p_myaddr ã NADR (-1) ã§ã¯ãªããèª IP ã¢ãã¬ã¹ã ANY ã§ãªããã°ã684 * æå®ããã IP ã¢ãã¬ã¹ãå²ãå½ã¦ãã662 * p_myaddr が NADR (-1) ではなく、自 IP アドレスが ANY でなければ、 663 * 指定された IP アドレスを割り当てる。 685 664 */ 686 665 if (p_myaddr != NADR && !IN_IS_ADDR_ANY(&p_myaddr->ipaddr)) … … 696 675 } 697 676 698 /* é信端ç¹ãè¨å®ããã*/677 /* 通信端点を設定する。*/ 699 678 cep->fsm_state = TCP_FSM_SYN_SENT; 700 679 cep->dstaddr = *p_dstaddr; … … 706 685 #ifdef TCP_CFG_NON_BLOCKING 707 686 708 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/687 /* タイムアウトをチェックする。*/ 709 688 if (tmout == TMO_NBLK) { 710 /* ãã³ããããã³ã°ã³ã¼ã«*/689 /* ノンブロッキングコール */ 711 690 cep->p_dstaddr = p_dstaddr; 712 691 cep->p_myaddr = p_myaddr; 713 692 cep->snd_nblk_tfn = TFN_TCP_CON_CEP; 714 693 715 /* ã³ãã¯ã·ã§ã³ã®éè¨ããã¹ãããã*/694 /* コネクションの開設をポストする。*/ 716 695 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 717 696 sig_sem(SEM_TCP_POST_OUTPUT); … … 723 702 724 703 /* 725 * p_myaddr ã NADR (-1) ãã726 * èªãã¼ãçªå·ã TCP_PORTANY ãªããèªåã§å²ãå½ã¦ãã704 * p_myaddr が NADR (-1) か、 705 * 自ポート番号が TCP_PORTANY なら、自動で割り当てる。 727 706 */ 728 707 if (p_myaddr == NADR || p_myaddr->portno == TCP_PORTANY) … … 731 710 goto err_ret; 732 711 733 /* ã³ãã¯ã·ã§ã³ã®éè¨ããã¹ãããã*/712 /* コネクションの開設をポストする。*/ 734 713 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 735 714 sig_sem(SEM_TCP_POST_OUTPUT); 736 715 737 716 /* 738 * ã¤ãã³ãã ESTABLISHED ã«ãªãã¾ã§å¾ 739 ã¤ã 740 * ã¤ãã³ãã CLOSED ã«ãªã£ãå ´åã¯ãä½ããã®ã¨ã©ã¼ãçºçãããã 741 * æ¥ç¶è¦æ±ãæå¦ããããã¨ãæå³ãã¦ããã 717 * イベントが ESTABLISHED になるまで待つ。 718 * イベントが CLOSED になった場合は、何らかのエラーが発生したか、 719 * 接続要求が拒否されたことを意味している。 742 720 */ 743 721 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | … … 754 732 if (error != E_OK) { 755 733 /* 756 * é信端ç¹ããåä»å£ã解æ¾ãã757 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã734 * 通信端点から受付口を解放し、 735 * イベントフラグをクローズに設定する。 758 736 */ 759 737 cep->rep = NULL; … … 779 757 780 758 /* 781 * tcp_user_closed -- ã¦ã¼ã¶ããã®ã³ãã¯ã·ã§ã³ã®éæ¾759 * tcp_user_closed -- ユーザからのコネクションの開放 782 760 */ 783 761 … … 787 765 switch (cep->fsm_state) { 788 766 789 case TCP_FSM_CLOSED: /* ã¯ãã¼ãº*/790 case TCP_FSM_LISTEN: /* ååãªã¼ãã³*/767 case TCP_FSM_CLOSED: /* クローズ */ 768 case TCP_FSM_LISTEN: /* 受動オープン */ 791 769 cep->fsm_state = TCP_FSM_CLOSED; 792 770 cep = tcp_close(cep); 793 771 break; 794 772 795 case TCP_FSM_SYN_SENT: /* è½åãªã¼ãã³ãSYN éä¿¡æ¸ã¿*/796 case TCP_FSM_SYN_RECVD: /* SYN ãåä¿¡ããSYN éä¿¡æ¸ã¿*/773 case TCP_FSM_SYN_SENT: /* 能動オープン、SYN 送信済み */ 774 case TCP_FSM_SYN_RECVD: /* SYN を受信し、SYN 送信済み */ 797 775 cep->flags |= TCP_CEP_FLG_NEED_FIN; 798 776 break; 799 777 800 case TCP_FSM_ESTABLISHED: /* ã³ãã¯ã·ã§ã³éè¨å®äº*/778 case TCP_FSM_ESTABLISHED: /* コネクション開設完了 */ 801 779 cep->fsm_state = TCP_FSM_FIN_WAIT_1; 802 780 break; 803 781 804 case TCP_FSM_CLOSE_WAIT: /* ç¸æãã FIN åä¿¡ãAPP ã®çµäºå¾ 805 ã¡ */ 782 case TCP_FSM_CLOSE_WAIT: /* 相手から FIN 受信、APP の終了待ち */ 806 783 cep->fsm_state = TCP_FSM_LAST_ACK; 807 784 break; … … 814 791 815 792 /* 816 * tcp_cls_cep -- é信端ç¹ã®ã¯ãã¼ãºãæ¨æºæ©è½ã793 * tcp_cls_cep -- 通信端点のクローズ【標準機能】 817 794 */ 818 795 … … 826 803 #ifndef TCP_CFG_NON_BLOCKING 827 804 828 /* tmout ã TMO_NBLK ãªãã¨ã©ã¼*/805 /* tmout が TMO_NBLK ならエラー */ 829 806 if (tmout == TMO_NBLK) 830 807 return E_PAR; … … 833 810 834 811 /* 835 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã836 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼812 * CEP をロックし、API 機能コードとタスク識別子を記録する。 813 * すでに記録されていれば、ペンディング中なのでエラー 837 814 */ 838 815 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_CLS_CEP)) != E_OK) … … 841 818 #ifdef TCP_CFG_NON_BLOCKING 842 819 843 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/844 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/820 /* タイムアウトをチェックする。*/ 821 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 845 822 846 823 if (!IS_PTR_DEFINED(cep->callback)) 847 824 error = E_OBJ; 848 else if (cep->fsm_state == TCP_FSM_CLOSED) { /* ãã§ã«ã¯ãã¼ãºããã¦ããã¨ã*/825 else if (cep->fsm_state == TCP_FSM_CLOSED) { /* すでにクローズされているとき */ 849 826 850 827 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 … … 864 841 } 865 842 else { 866 /* NBLK ã®API æ©è½ã³ã¼ããè¨å®ããã*/843 /* NBLK のAPI 機能コードを設定する。*/ 867 844 cep->rcv_nblk_tfn = TFN_TCP_CLS_CEP; 868 845 869 if ((cep = tcp_user_closed(cep)) != NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/870 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/846 if ((cep = tcp_user_closed(cep)) != NULL) { /* コネクションを切断する。*/ 847 /* 切断セグメント出力をポストする。*/ 871 848 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 872 849 sig_sem(SEM_TCP_POST_OUTPUT); 873 850 } 874 851 875 /* cep ã NULL ã§æ»ã£ã¦ããå ´åã¯ã876 * æ¢ã«ã³ãã¯ã·ã§ã³ãåæããã¦ãããã¨ãæå³ãã¦ããã877 * ã¾ãããã®å ´åã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºããã¦ããã852 /* cep が NULL で戻ってきた場合は、 853 * 既にコネクションが切断されていることを意味している。 854 * また、この場合コールバック関数が呼び出されている。 878 855 */ 879 856 return E_WBLK; 880 857 } 881 858 } 882 else { /* éãã³ããããã³ã°ã³ã¼ã«*/883 884 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 885 886 if ((cep = tcp_user_closed(cep)) == NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/887 888 /* cep ã NULL ã§æ»ã£ã¦ããå ´åã¯ã889 * æ¢ã«ã³ãã¯ã·ã§ã³ãåæããã¦ãããã¨ãæå³ãã¦ããã859 else { /* 非ノンブロッキングコール */ 860 861 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 862 863 if ((cep = tcp_user_closed(cep)) == NULL) { /* コネクションを切断する。*/ 864 865 /* cep が NULL で戻ってきた場合は、 866 * 既にコネクションが切断されていることを意味している。 890 867 */ 891 868 return error; 892 869 } 893 870 else { 894 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/871 /* 切断セグメント出力をポストする。*/ 895 872 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 896 873 sig_sem(SEM_TCP_POST_OUTPUT); 897 874 898 /* ã¤ãã³ããã©ã°ã CLOSED ã«ãªãã¾ã§å¾ 899 ã¤ã*/ 875 /* イベントフラグが CLOSED になるまで待つ。*/ 900 876 error = twai_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED, TWF_ORW, &flag, tmout); 901 877 if (error == E_OK && cep->error != E_OK) … … 904 880 if (error != E_OK) { 905 881 if (error == E_RLWAI) { 906 /* tcp_cls_cep ããã£ã³ã»ã«ãããã¨ãã¯ãRST ãéä¿¡ããã*/882 /* tcp_cls_cep がキャンセルされたときは、RST を送信する。*/ 907 883 tcp_respond(NULL, cep, cep->rcv_nxt, cep->snd_una - 1, 908 884 cep->rbufsz - cep->rwbuf_count, TCP_FLG_RST); 909 885 } 910 886 911 /* ã¿ã¤ãã¼ãåæ¢ããã*/887 /* タイマーを停止する。*/ 912 888 tcp_cancel_timers(cep); 913 889 914 890 /* 915 * é信端ç¹ãããã¯ãã916 * åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã891 * 通信端点をロックし、 892 * 受信再構成キューのネットワークバッファを解放する。 917 893 */ 918 894 syscall(wai_sem(cep->semid_lock)); … … 920 896 syscall(sig_sem(cep->semid_lock)); 921 897 922 /* ç¶æ 923 ãæªä½¿ç¨ã«ããã*/ 898 /* 状態を未使用にする。*/ 924 899 cep->fsm_state = TCP_FSM_CLOSED; 925 900 926 901 /* 927 * 以ä¸ã«é¢ä¿ããªããã©ã°ãã¯ãªã¢ã¼ããã928 * ã»éåä¿¡ã¦ã£ã³ããããã¡ã®çã³ãã¼æ©è½929 * ã»åçãªé信端ç¹ã®çæã»åé¤æ©è½902 * 以下に関係しないフラグをクリアーする。 903 * ・送受信ウィンドバッファの省コピー機能 904 * ・動的な通信端点の生成・削除機能 930 905 */ 931 906 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | … … 933 908 934 909 /* 935 * é信端ç¹ãããã¯ãã936 * éåä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã910 * 通信端点をロックし、 911 * 送受信ウィンドバッファキューのネットワークバッファを解放する。 937 912 */ 938 913 cep->rwbuf_count = 0; … … 962 937 963 938 /* 964 * tcp_sht_cep -- ãã¼ã¿éä¿¡ã®çµäºãæ¨æºæ©è½ã939 * tcp_sht_cep -- データ送信の終了【標準機能】 965 940 */ 966 941 … … 972 947 973 948 /* 974 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã975 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼949 * CEP をロックし、API 機能コードとタスク識別子を記録する。 950 * すでに記録されていれば、ペンディング中なのでエラー 976 951 */ 977 952 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SHT_CEP)) != E_OK) 978 953 return error; 979 954 980 /* TCP é信端ç¹ã®ã³ãã¯ã·ã§ã³ã確ç«ç¶æ 981 ã§ãªããã°ã¨ã©ã¼ */ 955 /* TCP 通信端点のコネクションが確立状態でなければエラー */ 982 956 if (!TCP_FSM_HAVE_ESTABLISHED(cep->fsm_state)) { 983 957 if ((error = cep->error) == E_OK) … … 985 959 } 986 960 987 else if ((cep = tcp_user_closed(cep)) != NULL) { /* ã³ãã¯ã·ã§ã³ãåæããã*/988 989 /* åæã»ã°ã¡ã³ãåºåããã¹ãããã*/961 else if ((cep = tcp_user_closed(cep)) != NULL) { /* コネクションを切断する。*/ 962 963 /* 切断セグメント出力をポストする。*/ 990 964 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 991 965 sig_sem(SEM_TCP_POST_OUTPUT); … … 1002 976 1003 977 /* 1004 * tcp_snd_dat -- ãã±ããã®éä¿¡ãæ¨æºæ©è½ã978 * tcp_snd_dat -- パケットの送信【標準機能】 1005 979 */ 1006 980 … … 1013 987 #ifdef TCP_CFG_NON_BLOCKING 1014 988 1015 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/989 /* data が NULL か、len < 0 ならエラー */ 1016 990 if (data == NULL || len < 0) 1017 991 return E_PAR; … … 1019 993 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1020 994 1021 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/995 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1022 996 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1023 997 return E_PAR; … … 1026 1000 1027 1001 /* 1028 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1029 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1002 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1003 * すでに記録されていれば、ペンディング中なのでエラー 1030 1004 */ 1031 1005 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_DAT)) != E_OK) 1032 1006 return error; 1033 1007 1034 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 1035 ãè¦ãã*/ 1008 /* 送信できるか、通信端点の状態を見る。*/ 1036 1009 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_DAT, tmout)) != E_OK) 1037 1010 goto err_ret; … … 1039 1012 #ifdef TCP_CFG_NON_BLOCKING 1040 1013 1041 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1042 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1043 1044 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1014 /* タイムアウトをチェックする。*/ 1015 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1016 1017 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1045 1018 if (!TCP_IS_SWBUF_FULL(cep)) { 1046 1019 1047 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1020 /* 送信ウィンドバッファにデータを書き込む。*/ 1048 1021 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 1049 1022 1050 /* åºåããã¹ãããã*/1023 /* 出力をポストする。*/ 1051 1024 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1052 1025 sig_sem(SEM_TCP_POST_OUTPUT); … … 1054 1027 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1055 1028 1056 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1029 /* コールバック関数を呼び出す。*/ 1057 1030 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)error); 1058 1031 1059 1032 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1060 1033 1061 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1034 /* コールバック関数を呼び出す。*/ 1062 1035 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)&error); 1063 1036 … … 1076 1049 } 1077 1050 } 1078 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1079 1080 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1081 1082 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 1083 ã¤ã*/ 1051 else { /* 非ノンブロッキングコール */ 1052 1053 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1054 1055 /* 送信ウィンドバッファが空くのを待つ。*/ 1084 1056 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1085 1057 goto err_ret; 1086 1058 1087 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1059 /* 送信ウィンドバッファにデータを書き込む。*/ 1088 1060 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 1089 1061 1090 /* ãã¼ã¿ãéä¿¡ãããéä¿¡ã¦ã£ã³ããããã¡ããã«ã®ã¨ãã¯å¼·å¶çã«éä¿¡ããã*/1062 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 1091 1063 if (TCP_IS_SWBUF_FULL(cep)) 1092 1064 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 1093 1065 1094 /* åºåããã¹ãããã*/1066 /* 出力をポストする。*/ 1095 1067 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1096 1068 sig_sem(SEM_TCP_POST_OUTPUT); … … 1116 1088 1117 1089 /* 1118 * tcp_snd_oob -- ç·æ¥ãã¼ã¿ã®éä¿¡ãæ¡å¼µæ©è½ã1090 * tcp_snd_oob -- 緊急データの送信【拡張機能】 1119 1091 */ 1120 1092 … … 1127 1099 #ifdef TCP_CFG_NON_BLOCKING 1128 1100 1129 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/1101 /* data が NULL か、len < 0 ならエラー */ 1130 1102 if (data == NULL || len < 0) 1131 1103 return E_PAR; … … 1133 1105 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1134 1106 1135 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/1107 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1136 1108 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1137 1109 return E_PAR; … … 1140 1112 1141 1113 /* 1142 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1143 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1114 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1115 * すでに記録されていれば、ペンディング中なのでエラー 1144 1116 */ 1145 1117 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK) 1146 1118 return error; 1147 1119 1148 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 1149 ãè¦ãã*/ 1120 /* 送信できるか、通信端点の状態を見る。*/ 1150 1121 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK) 1151 1122 goto err_ret; … … 1153 1124 #ifdef TCP_CFG_NON_BLOCKING 1154 1125 1155 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1156 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1157 1158 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1126 /* タイムアウトをチェックする。*/ 1127 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1128 1129 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1159 1130 if (!TCP_IS_SWBUF_FULL(cep)) { 1160 1131 1161 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1132 /* 送信ウィンドバッファにデータを書き込む。*/ 1162 1133 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 1163 1134 1164 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/1135 /* 送信緊急ポインタを設定する。*/ 1165 1136 cep->snd_up = cep->snd_una + cep->swbuf_count; 1166 1137 1167 /* åºåããã¹ãããã*/1138 /* 出力をポストする。*/ 1168 1139 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1169 1140 sig_sem(SEM_TCP_POST_OUTPUT); … … 1171 1142 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1172 1143 1173 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1144 /* コールバック関数を呼び出す。*/ 1174 1145 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error); 1175 1146 1176 1147 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1177 1148 1178 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1149 /* コールバック関数を呼び出す。*/ 1179 1150 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)&error); 1180 1151 … … 1193 1164 } 1194 1165 } 1195 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1196 1197 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1198 1199 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 1200 ã¤ã*/ 1166 else { /* 非ノンブロッキングコール */ 1167 1168 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1169 1170 /* 送信ウィンドバッファが空くのを待つ。*/ 1201 1171 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1202 1172 goto err_ret; 1203 1173 1204 /* éä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãæ¸ãè¾¼ãã*/1174 /* 送信ウィンドバッファにデータを書き込む。*/ 1205 1175 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 1206 1176 1207 /* éä¿¡ç·æ¥ãã¤ã³ã¿ãè¨å®ããã*/1177 /* 送信緊急ポインタを設定する。*/ 1208 1178 cep->snd_up = cep->snd_una + cep->swbuf_count; 1209 1179 1210 /* ãã¼ã¿ãéä¿¡ãããéä¿¡ã¦ã£ã³ããããã¡ããã«ã®ã¨ãã¯å¼·å¶çã«éä¿¡ããã*/1180 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 1211 1181 if (TCP_IS_SWBUF_FULL(cep)) 1212 1182 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 1213 1183 1214 /* åºåããã¹ãããã*/1184 /* 出力をポストする。*/ 1215 1185 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1216 1186 sig_sem(SEM_TCP_POST_OUTPUT); … … 1236 1206 1237 1207 /* 1238 * tcp_get_buf -- éä¿¡ç¨ãããã¡ã®ç²å¾ãæ¨æºæ©è½ã1208 * tcp_get_buf -- 送信用バッファの獲得【標準機能】 1239 1209 */ 1240 1210 … … 1247 1217 #ifdef TCP_CFG_NON_BLOCKING 1248 1218 1249 /* p_buf ã NULL ãªãã¨ã©ã¼*/1219 /* p_buf が NULL ならエラー */ 1250 1220 if (p_buf == NULL) 1251 1221 return E_PAR; … … 1253 1223 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1254 1224 1255 /* p_buf ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/1225 /* p_buf が NULL か、tmout が TMO_NBLK ならエラー */ 1256 1226 if (p_buf == NULL || tmout == TMO_NBLK) 1257 1227 return E_PAR; … … 1260 1230 1261 1231 /* 1262 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1263 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1232 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1233 * すでに記録されていれば、ペンディング中なのでエラー 1264 1234 */ 1265 1235 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_GET_BUF)) != E_OK) 1266 1236 return error; 1267 1237 1268 /* éä¿¡ã§ããããé信端ç¹ã®ç¶æ 1269 ãè¦ãã*/ 1238 /* 送信できるか、通信端点の状態を見る。*/ 1270 1239 if ((error = tcp_can_send_more(cep, TFN_TCP_GET_BUF, tmout)) != E_OK) 1271 1240 goto err_ret; … … 1273 1242 #ifdef TCP_CFG_NON_BLOCKING 1274 1243 1275 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1276 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1244 /* タイムアウトをチェックする。*/ 1245 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1277 1246 1278 1247 if (!TCP_IS_SWBUF_FULL(cep)) { 1279 1248 1280 /* éä¿¡ã¦ã£ã³ããããã¡ã«ç©ºããããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1249 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1281 1250 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 1282 1251 1283 1252 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1284 1253 1285 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1254 /* コールバック関数を呼び出す。*/ 1286 1255 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)error); 1287 1256 1288 1257 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1289 1258 1290 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1259 /* コールバック関数を呼び出す。*/ 1291 1260 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)&error); 1292 1261 … … 1304 1273 } 1305 1274 1306 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1307 1308 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1309 1310 /* éä¿¡ã¦ã£ã³ããããã¡ã空ãã®ãå¾ 1311 ã¤ã*/ 1275 else { /* 非ノンブロッキングコール */ 1276 1277 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1278 1279 /* 送信ウィンドバッファが空くのを待つ。*/ 1312 1280 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1313 1281 goto err_ret; 1314 1282 1315 /* éä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/1283 /* 送信ウィンドバッファの空アドレスを獲得する。*/ 1316 1284 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 1317 1285 … … 1333 1301 1334 1302 /* 1335 * tcp_snd_buf -- ãããã¡å 1336 ã®ãã¼ã¿ã®éä¿¡ãæ¨æºæ©è½ã 1303 * tcp_snd_buf -- バッファ内のデータの送信【標準機能】 1337 1304 */ 1338 1305 … … 1343 1310 ER error; 1344 1311 1345 /* éä¿¡ããé·ã len ããã§ãã¯ããã*/1312 /* 送信する長さ len をチェックする。*/ 1346 1313 if (len < 0) 1347 1314 return E_PAR; 1348 1315 1349 /* éä¿¡ããé·ãlen ã 0 ã§ããã°ãä½ãããªãã§æ»ãã*/1316 /* 送信する長さlen が 0 であれば、何もしないで戻る。*/ 1350 1317 if (len == 0) 1351 1318 return E_OK; 1352 1319 1353 1320 /* 1354 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1355 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1321 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1322 * すでに記録されていれば、ペンディング中なのでエラー 1356 1323 */ 1357 1324 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_BUF)) != E_OK) 1358 1325 return error; 1359 1326 1360 /* éä¿¡ããé·ã len ããã§ãã¯ããã*/1327 /* 送信する長さ len をチェックする。*/ 1361 1328 if (len > cep->get_buf_len) { 1362 1329 error = E_OBJ; … … 1364 1331 } 1365 1332 1366 /* éä¿¡ã§ããããCEP ã® FSM ç¶æ 1367 ãè¦ãã*/ 1333 /* 送信できるか、CEP の FSM 状態を見る。*/ 1368 1334 if (!TCP_FSM_CAN_SEND_MORE(cep->fsm_state)) { 1369 1335 if ((error = cep->error) == E_OK) … … 1372 1338 } 1373 1339 1374 /* éä¿¡ã¦ã£ã³ããããã¡ã®ãã¼ã¿ãéä¿¡å¯è½ã«ããã*/1340 /* 送信ウィンドバッファのデータを送信可能にする。*/ 1375 1341 TCP_SEND_SWBUF(cep, (uint_t)len); 1376 1342 1377 /* åºåããã¹ãããã*/1343 /* 出力をポストする。*/ 1378 1344 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1379 1345 sig_sem(SEM_TCP_POST_OUTPUT); … … 1390 1356 1391 1357 /* 1392 * tcp_rcv_dat -- ãã±ããã®åä¿¡ãæ¨æºæ©è½ã1358 * tcp_rcv_dat -- パケットの受信【標準機能】 1393 1359 */ 1394 1360 … … 1401 1367 #ifdef TCP_CFG_NON_BLOCKING 1402 1368 1403 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/1369 /* data が NULL か、len < 0 ならエラー */ 1404 1370 if (data == NULL || len < 0) 1405 1371 return E_PAR; … … 1407 1373 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1408 1374 1409 /* data ã NULLãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/1375 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1410 1376 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1411 1377 return E_PAR; … … 1414 1380 1415 1381 /* 1416 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1417 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1382 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1383 * すでに記録されていれば、ペンディング中なのでエラー 1418 1384 */ 1419 1385 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_RCV_DAT)) != E_OK) 1420 1386 return error; 1421 1387 1422 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 1423 ãè¦ãã*/ 1388 /* 受信できるか、通信端点の状態を見る。*/ 1424 1389 if (tcp_can_recv_more(&error, cep, TFN_TCP_RCV_DAT, tmout) != E_OK) 1425 1390 goto err_ret; … … 1427 1392 #ifdef TCP_CFG_NON_BLOCKING 1428 1393 1429 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1430 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1431 1432 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1394 /* タイムアウトをチェックする。*/ 1395 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1396 1397 /* 受信ウィンドバッファにデータがあればコールバック関数を呼び出す。*/ 1433 1398 if (cep->rwbuf_count > 0) { 1434 1399 1435 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/1400 /* 受信ウィンドバッファからデータを取り出す。*/ 1436 1401 len = TCP_READ_RWBUF(cep, data, (uint_t)len); 1437 1402 … … 1456 1421 } 1457 1422 } 1458 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1459 1460 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1461 1462 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 1463 ¥åãããã¾ã§å¾ 1464 ã¤ã*/ 1423 else { /* 非ノンブロッキングコール */ 1424 1425 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1426 1427 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 1465 1428 if ((error = tcp_wait_rwbuf(cep, tmout)) != E_OK) 1466 1429 goto err_ret; 1467 1430 1468 /* åä¿¡ã¦ã£ã³ããããã¡ãããã¼ã¿ãåãåºãã*/1431 /* 受信ウィンドバッファからデータを取り出す。*/ 1469 1432 error = TCP_READ_RWBUF(cep, data, (uint_t)len); 1470 1433 1471 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/1434 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 1472 1435 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1473 1436 sig_sem(SEM_TCP_POST_OUTPUT); … … 1492 1455 1493 1456 /* 1494 * tcp_rcv_oob -- ç·æ¥ãã¼ã¿ã®åä¿¡ãæ¡å¼µæ©è½ã1457 * tcp_rcv_oob -- 緊急データの受信【拡張機能】 1495 1458 * 1496 * 注æ: éä¿¡å´ãè¤æ°ãªã¯ãããã®ãã¼ã¿ãéä¿¡ãã¦ãã1497 * ç·æ¥ãã¤ã³ã¿ãæã 1 ãªã¯ãããã®ãã¼ã¿ã®ã¿åä¿¡ããã1459 * 注意: 送信側が複数オクテットのデータを送信しても、 1460 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。 1498 1461 */ 1499 1462 … … 1504 1467 uint8_t *urg; 1505 1468 1506 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1469 /* TCP 通信端点 ID をチェックする。*/ 1507 1470 if (!VAID_TCP_CEPID(cepid)) 1508 1471 return E_ID; 1509 1472 1510 /* data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/1473 /* data が NULL か、len < 0 ならエラー */ 1511 1474 if (data == NULL || len < 0) 1512 1475 return E_PAR; 1513 1476 1514 /* TCP é信端ç¹ãå¾ãã*/1477 /* TCP 通信端点を得る。*/ 1515 1478 cep = GET_TCP_CEP(cepid); 1516 1479 1517 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 1518 ãè¦ãã*/ 1519 /* åä¿¡ã§ããããfsm_state ãè¦ãã*/ 1480 /* 受信できるか、通信端点の状態を見る。*/ 1481 /* 受信できるか、fsm_state を見る。*/ 1520 1482 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state)) 1521 1483 return E_OBJ; 1522 1484 1523 1485 /* 1524 * ç·æ¥ãã¼ã¿å 1525 ¥ãã®ã»ã°ã¡ã³ãã® TCP ãããã 1526 * è¨å®ããã¦ããªããã°ãç·æ¥ãã¼ã¿ãåä¿¡ãã¦ããªãã 1486 * 緊急データ入りのセグメントの TCP ヘッダが 1487 * 設定されていなければ、緊急データを受信していない。 1527 1488 */ 1528 1489 if (cep->urg_tcph == NULL) 1529 1490 return E_OBJ; 1530 1491 1531 /* len == 0 ãªããããã¡ãªã¼ãã¼ããã¼*/1492 /* len == 0 ならバッファオーバーフロー */ 1532 1493 if (len == 0) 1533 1494 return E_BOVR; 1534 1495 1535 /* ç·æ¥ãã¤ã³ã¿ãæã 1 ãªã¯ãããã®ãã¼ã¿ãèªã¿åãã*/1496 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/ 1536 1497 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET; 1537 1498 *(uint8_t*)data = *urg; 1538 1499 1539 /* èªã¿åã£ããã¼ã¿ããå¾ãã® SDU ãåã«è©°ããã*/1500 /* 読み取ったデータから後ろの SDU を前に詰める。*/ 1540 1501 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1); 1541 1502 1542 /* tcp_rcv_oob() ãå¼åºããããã¨ç¥ãããããã«ãNULL ãè¨å®ããã*/1503 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/ 1543 1504 cep->urg_tcph = NULL; 1544 1505 … … 1553 1514 1554 1515 /* 1555 * tcp_rcv_buf -- åä¿¡ãããã¼ã¿ã®å 1556 ¥ã£ããããã¡ã®ç²å¾ãæ¨æºæ©è½ã 1516 * tcp_rcv_buf -- 受信したデータの入ったバッファの獲得【標準機能】 1557 1517 */ 1558 1518 … … 1565 1525 #ifdef TCP_CFG_NON_BLOCKING 1566 1526 1567 /* p_buf ã NULL ãªãã¨ã©ã¼*/1527 /* p_buf が NULL ならエラー */ 1568 1528 if (p_buf == NULL) 1569 1529 return E_PAR; … … 1571 1531 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1572 1532 1573 /* p_buf ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/1533 /* p_buf が NULL か、tmout が TMO_NBLK ならエラー */ 1574 1534 if (p_buf == NULL || tmout == TMO_NBLK) 1575 1535 return E_PAR; … … 1578 1538 1579 1539 /* 1580 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1581 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1540 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1541 * すでに記録されていれば、ペンディング中なのでエラー 1582 1542 */ 1583 1543 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_RCV_BUF)) != E_OK) 1584 1544 return error; 1585 1545 1586 /* åä¿¡ã§ããããé信端ç¹ã®ç¶æ 1587 ãè¦ãã*/ 1546 /* 受信できるか、通信端点の状態を見る。*/ 1588 1547 if (tcp_can_recv_more(&error, cep, TFN_TCP_RCV_DAT, tmout) != E_OK) 1589 1548 goto err_ret; … … 1591 1550 #ifdef TCP_CFG_NON_BLOCKING 1592 1551 1593 /* ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã*/1594 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/1595 1596 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ãããã°ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1552 /* タイムアウトをチェックする。*/ 1553 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1554 1555 /* 受信ウィンドバッファにデータがあればコールバック関数を呼び出す。*/ 1597 1556 if (cep->rwbuf_count > 0) { 1598 1557 1599 /* åä¿¡ã¦ã£ã³ããããã¡ã®ç©ºã¢ãã¬ã¹ãç²å¾ããã*/1558 /* 受信ウィンドバッファの空アドレスを獲得する。*/ 1600 1559 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 1601 1560 1602 1561 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1603 1562 1604 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1563 /* コールバック関数を呼び出す。*/ 1605 1564 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)error); 1606 1565 1607 1566 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1608 1567 1609 /* ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãã*/1568 /* コールバック関数を呼び出す。*/ 1610 1569 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)&error); 1611 1570 … … 1621 1580 } 1622 1581 } 1623 else { /* éãã³ããããã³ã°ã³ã¼ã« */ 1624 1625 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1626 1627 /* åä¿¡ã¦ã£ã³ããããã¡ã«ãã¼ã¿ããªããã°ãå 1628 ¥åãããã¾ã§å¾ 1629 ã¤ã*/ 1582 else { /* 非ノンブロッキングコール */ 1583 1584 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1585 1586 /* 受信ウィンドバッファにデータがなければ、入力があるまで待つ。*/ 1630 1587 if ((error = tcp_wait_rwbuf(cep, tmout)) != E_OK) { 1631 1588 cep->rwbuf_count = 0; … … 1633 1590 } 1634 1591 1635 /* åä¿¡ã¦ã£ã³ããããã¡ã®ã¢ãã¬ã¹ãç²å¾ããã*/1592 /* 受信ウィンドバッファのアドレスを獲得する。*/ 1636 1593 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 1637 1594 … … 1653 1610 1654 1611 /* 1655 * tcp_rel_buf -- åä¿¡ç¨ãããã¡ã®è§£æ¾ãæ¨æºæ©è½ã1612 * tcp_rel_buf -- 受信用バッファの解放【標準機能】 1656 1613 */ 1657 1614 … … 1662 1619 ER error; 1663 1620 1664 /* 解æ¾ããé·ã len ããã§ãã¯ããã*/1621 /* 解放する長さ len をチェックする。*/ 1665 1622 if (len < 0) 1666 1623 return E_PAR; 1667 1624 1668 1625 /* 1669 * CEP ãããã¯ããAPI æ©è½ã³ã¼ãã¨ã¿ã¹ã¯èå¥åãè¨é²ããã1670 * ãã§ã«è¨é²ããã¦ããã°ããã³ãã£ã³ã°ä¸ãªã®ã§ã¨ã©ã¼1626 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1627 * すでに記録されていれば、ペンディング中なのでエラー 1671 1628 */ 1672 1629 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_REL_BUF)) != E_OK) 1673 1630 return error; 1674 1631 1675 /* 解æ¾ããé·ã len ããã§ãã¯ããã*/1632 /* 解放する長さ len をチェックする。*/ 1676 1633 if (len > cep->rcv_buf_len) { 1677 1634 error = E_OBJ; … … 1679 1636 } 1680 1637 1681 /* é信端ç¹ãããã¯ããã*/1638 /* 通信端点をロックする。*/ 1682 1639 syscall(wai_sem(cep->semid_lock)); 1683 1640 1684 /* åä¿¡ã¦ã£ã³ããããã¡ããåä¿¡ãããªã¯ããããåé¤ããã*/1641 /* 受信ウィンドバッファから受信したオクテットを削除する。*/ 1685 1642 TCP_DROP_RWBUF(cep, (uint_t)len); 1686 1643 1687 /* tcp_rcv_buf ã®å²å½ã¦é·ããªã»ããããã*/1644 /* tcp_rcv_buf の割当て長をリセットする。*/ 1688 1645 cep->rcv_buf_len = 0; 1689 1646 1690 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1647 /* 通信端点のロックを解除する。*/ 1691 1648 syscall(sig_sem(cep->semid_lock)); 1692 1649 1693 /* ç¸æã«ã¦ã£ã³ãã¦ãµã¤ãºãå¤ãã£ããã¨ãç¥ãããããåºåããã¹ãããã*/1650 /* 相手にウィンドウサイズが変わったことを知らせるため出力をポストする。*/ 1694 1651 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1695 1652 sig_sem(SEM_TCP_POST_OUTPUT); … … 1706 1663 1707 1664 /* 1708 * tcp_can_snd -- ãã³ãã£ã³ã°ãã¦ããéä¿¡ã®ãã£ã³ã»ã«1665 * tcp_can_snd -- ペンディングしている送信のキャンセル 1709 1666 */ 1710 1667 … … 1714 1671 ER error = E_OK; 1715 1672 1716 /* é信端ç¹ãããã¯ããã*/1673 /* 通信端点をロックする。*/ 1717 1674 syscall(wai_sem(cep->semid_lock)); 1718 1675 1719 1676 /* 1720 * snd_tskid ã TA_NULL ãªãã1721 * ãã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼1677 * snd_tskid が TA_NULL なら、 1678 * ペンディングしていないのでエラー 1722 1679 */ 1723 1680 if (cep->snd_tskid == TA_NULL) 1724 1681 error = EV_NOPND; 1725 1682 1726 /* ãã³ãã£ã³ã°ä¸ã® API æ©è½ã³ã¼ãã¨ä¸è´ããªããã°ã¨ã©ã¼*/1683 /* ペンディング中の API 機能コードと一致しなければエラー */ 1727 1684 else if (fncd != TFN_TCP_ALL && fncd != cep->snd_tfn) 1728 1685 error = E_OBJ; 1729 1686 1730 /* å¦çããã£ã³ã»ã«ããã*/1687 /* 処理をキャンセルする。*/ 1731 1688 else { 1732 1689 1733 /* åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1690 /* 受信再構成キューのネットワークバッファを解放する。*/ 1734 1691 tcp_free_reassq(cep); 1735 1692 1736 /* åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1693 /* 受信ウィンドバッファキューのネットワークバッファを解放する。*/ 1737 1694 cep->rwbuf_count = 0; 1738 1695 TCP_FREE_RWBUFQ(cep); 1739 1696 1740 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1697 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 1741 1698 TCP_FREE_SWBUFQ(cep); 1742 1699 1743 1700 #ifdef TCP_CFG_NON_BLOCKING 1744 1701 1745 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF) { /* ãã³ããããã³ã°ã³ã¼ã«*/1702 if (cep->snd_nblk_tfn != TFN_TCP_UNDEF) { /* ノンブロッキングコール */ 1746 1703 1747 1704 switch (cep->snd_nblk_tfn) { 1748 1705 1749 1706 case TFN_TCP_CON_CEP: 1750 /* é信端ç¹ããåä»å£ã解æ¾ããã*/1707 /* 通信端点から受付口を解放する。*/ 1751 1708 cep->rep = NULL; 1752 1709 cep->fsm_state = TCP_FSM_CLOSED; … … 1789 1746 } 1790 1747 1791 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1748 /* 通信端点のロックを解除する。*/ 1792 1749 syscall(sig_sem(cep->semid_lock)); 1793 1750 … … 1796 1753 1797 1754 /* 1798 * tcp_can_rcv -- ãã³ãã£ã³ã°ãã¦ããåä¿¡ã®ãã£ã³ã»ã«1755 * tcp_can_rcv -- ペンディングしている受信のキャンセル 1799 1756 */ 1800 1757 … … 1804 1761 ER error = E_OK; 1805 1762 1806 /* é信端ç¹ãããã¯ããã*/1763 /* 通信端点をロックする。*/ 1807 1764 syscall(wai_sem(cep->semid_lock)); 1808 1765 1809 1766 /* 1810 * rcv_tskid ã TA_NULL ãªãã1811 * ãã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼1767 * rcv_tskid が TA_NULL なら、 1768 * ペンディングしていないのでエラー 1812 1769 */ 1813 1770 if (cep->rcv_tskid == TA_NULL) 1814 1771 error = EV_NOPND; 1815 1772 1816 /* ãã³ãã£ã³ã°ä¸ã® API æ©è½ã³ã¼ãã¨ä¸è´ããªããã°ã¨ã©ã¼*/1773 /* ペンディング中の API 機能コードと一致しなければエラー */ 1817 1774 else if (fncd != TFN_TCP_ALL && fncd != cep->rcv_tfn) 1818 1775 error = E_OBJ; 1819 1776 1820 /* å¦çããã£ã³ã»ã«ããã*/1777 /* 処理をキャンセルする。*/ 1821 1778 else { 1822 1779 1823 /* åä¿¡åæ§æãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1780 /* 受信再構成キューのネットワークバッファを解放する。*/ 1824 1781 tcp_free_reassq(cep); 1825 1782 1826 /* åä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1783 /* 受信ウィンドバッファキューのネットワークバッファを解放する。*/ 1827 1784 cep->rwbuf_count = 0; 1828 1785 TCP_FREE_RWBUFQ(cep); 1829 1786 1830 /* éä¿¡ã¦ã£ã³ããããã¡ãã¥ã¼ã®ãããã¯ã¼ã¯ãããã¡ã解æ¾ããã*/1787 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ 1831 1788 TCP_FREE_SWBUFQ(cep); 1832 1789 1833 1790 #ifdef TCP_CFG_NON_BLOCKING 1834 1791 1835 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { /* ãã³ããããã³ã°ã³ã¼ã«*/1792 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { /* ノンブロッキングコール */ 1836 1793 1837 1794 switch (cep->rcv_nblk_tfn) { … … 1839 1796 case TFN_TCP_ACP_CEP: 1840 1797 /* 1841 * é信端ç¹ããåä»å£ã解æ¾ãã1842 * ã¤ãã³ããã©ã°ãã¯ãã¼ãºã«è¨å®ããã1798 * 通信端点から受付口を解放し、 1799 * イベントフラグをクローズに設定する。 1843 1800 */ 1844 1801 cep->rep = NULL; … … 1888 1845 } 1889 1846 1890 /* é信端ç¹ã®ããã¯ã解é¤ããã*/1847 /* 通信端点のロックを解除する。*/ 1891 1848 syscall(sig_sem(cep->semid_lock)); 1892 1849 … … 1895 1852 1896 1853 /* 1897 * tcp_can_cep -- ãã³ãã£ã³ã°ãã¦ããå¦çã®ãã£ã³ã»ã«ãæ¨æºæ©è½ã1854 * tcp_can_cep -- ペンディングしている処理のキャンセル【標準機能】 1898 1855 */ 1899 1856 … … 1904 1861 ER error = E_OK, snd_err, rcv_err; 1905 1862 1906 /* API æ©è½ã³ã¼ãããã§ãã¯ããã*/1863 /* API 機能コードをチェックする。*/ 1907 1864 if (!VALID_TFN_TCP_CAN(fncd)) 1908 1865 return E_PAR; 1909 1866 1910 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1867 /* TCP 通信端点 ID をチェックする。*/ 1911 1868 if (!VAID_TCP_CEPID(cepid)) 1912 1869 return E_ID; 1913 1870 1914 /* TCP é信端ç¹ãå¾ãã*/1871 /* TCP 通信端点を得る。*/ 1915 1872 cep = GET_TCP_CEP(cepid); 1916 1873 1917 /* TCP é信端ç¹ããã§ãã¯ããã*/1874 /* TCP 通信端点をチェックする。*/ 1918 1875 if (!VALID_TCP_CEP(cep)) 1919 1876 return E_NOEXS; 1920 1877 1921 if (fncd == TFN_TCP_ALL) { /* TFN_TCP_ALL ã®å¦ç*/1878 if (fncd == TFN_TCP_ALL) { /* TFN_TCP_ALL の処理 */ 1922 1879 snd_err = tcp_can_snd(cep, fncd); 1923 1880 rcv_err = tcp_can_rcv(cep, fncd); 1924 1881 1925 1882 /* 1926 * snd_err 㨠rcv_err ã®ã©ã¡ããEV_NOPND1927 * ãªãããã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼1883 * snd_err と rcv_err のどちらも EV_NOPND 1884 * なら、ペンディングしていないのでエラー 1928 1885 */ 1929 1886 if (snd_err == EV_NOPND && rcv_err == EV_NOPND) … … 1942 1899 } 1943 1900 1944 else if (IS_TFN_TCP_RCV(fncd)) { /* åä¿¡å¦çã®ãã£ã³ã»ã«*/1901 else if (IS_TFN_TCP_RCV(fncd)) { /* 受信処理のキャンセル */ 1945 1902 if ((error = tcp_can_rcv(cep, fncd)) == EV_NOPND) 1946 1903 error = E_OBJ; 1947 1904 } 1948 1905 1949 else { /* éä¿¡å¦çã®ãã£ã³ã»ã«*/1906 else { /* 送信処理のキャンセル */ 1950 1907 if ((error = tcp_can_snd(cep, fncd)) == EV_NOPND) 1951 1908 error = E_OBJ; … … 1958 1915 1959 1916 /* 1960 * tcp_set_opt -- TCP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã1917 * tcp_set_opt -- TCP 通信端点オプションの設定【拡張機能】 1961 1918 * 1962 * 注æ: è¨å®å¯è½ãª TCP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã1919 * 注意: 設定可能な TCP 通信端点オプションは無いため、E_PAR が返される。 1963 1920 */ 1964 1921 … … 1972 1929 T_TCP_CEP *cep; 1973 1930 1974 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1931 /* TCP 通信端点 ID をチェックする。*/ 1975 1932 if (!VAID_TCP_CEPID(cepid)) 1976 1933 return E_ID; 1977 1934 1978 /* TCP é信端ç¹ãå¾ãã*/1935 /* TCP 通信端点を得る。*/ 1979 1936 cep = GET_TCP_CEP(cepid); 1980 1937 1981 /* TCP é信端ç¹ããã§ãã¯ããã*/1938 /* TCP 通信端点をチェックする。*/ 1982 1939 if (!VALID_TCP_CEP(cep)) 1983 1940 return E_NOEXS; … … 1991 1948 1992 1949 /* 1993 * tcp_get_opt -- TCP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã1950 * tcp_get_opt -- TCP 通信端点オプションの設定【拡張機能】 1994 1951 * 1995 * 注æ: è¨å®å¯è½ãª TCP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã1952 * 注意: 設定可能な TCP 通信端点オプションは無いため、E_PAR が返される。 1996 1953 */ 1997 1954 … … 2005 1962 T_TCP_CEP *cep; 2006 1963 2007 /* TCP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/1964 /* TCP 通信端点 ID をチェックする。*/ 2008 1965 if (!VAID_TCP_CEPID(cepid)) 2009 1966 return E_ID; 2010 1967 2011 /* TCP é信端ç¹ãå¾ãã*/1968 /* TCP 通信端点を得る。*/ 2012 1969 cep = GET_TCP_CEP(cepid); 2013 1970 2014 /* TCP é信端ç¹ããã§ãã¯ããã*/1971 /* TCP 通信端点をチェックする。*/ 2015 1972 if (!VALID_TCP_CEP(cep)) 2016 1973 return E_NOEXS;
Note:
See TracChangeset
for help on using the changeset viewer.