Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 75 75 #include <sil.h> 76 76 #include "kernel_cfg.h" 77 #include "tinet_cfg.h" 77 78 78 79 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 83 84 #include <t_services.h> 84 85 #include "kernel_id.h" 86 #include "tinet_id.h" 85 87 86 88 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 93 95 #include <net/if_loop.h> 94 96 #include <net/ethernet.h> 95 #include <net/ppp_ipcp.h>96 97 #include <net/net.h> 98 #include <net/net_endian.h> 97 99 #include <net/net_var.h> 98 100 #include <net/net_buf.h> … … 102 104 #include <netinet/in.h> 103 105 #include <netinet/in_var.h> 104 #include <netinet6/in6.h>105 #include <netinet6/in6_var.h>106 106 #include <netinet/in_itron.h> 107 107 #include <netinet/ip.h> 108 108 #include <netinet/ip_var.h> 109 #include <netinet/ip6.h>110 #include <netinet6/ip6_var.h>111 109 #include <netinet/tcp.h> 112 #include <netinet/tcp_timer.h>113 110 #include <netinet/tcp_var.h> 114 111 #include <netinet/tcp_fsm.h> 115 112 #include <netinet/tcp_seq.h> 113 #include <netinet/tcp_timer.h> 116 114 117 115 #include <net/if_var.h> 118 116 119 117 #ifdef SUPPORT_TCP 120 121 /*122 * IPv4 と IPv6 の切り替えマクロ123 */124 125 #if defined(SUPPORT_INET4)126 127 #define TCP_CRE_REP tcp_cre_rep128 #define TCP_ACP_CEP tcp_acp_cep129 #define TCP_CON_CEP tcp_con_cep130 131 #endif /* of #if defined(SUPPORT_INET4) */132 133 #if defined(SUPPORT_INET6)134 135 #define TCP_CRE_REP tcp6_cre_rep136 #define TCP_ACP_CEP tcp6_acp_cep137 #define TCP_CON_CEP tcp6_con_cep138 139 #endif /* of #if defined(SUPPORT_INET6) */140 118 141 119 /* … … 169 147 170 148 /* 171 * tcp_cre_rep -- TCP 受付口の生成【拡張機能】 172 */ 173 174 #ifdef __tcp_cre_rep 175 176 #ifdef TCP_CFG_EXTENTIONS 177 178 ER 179 TCP_CRE_REP (ID repid, T_TCP_CREP *pk_crep) 180 { 181 T_TCP_REP *rep; 182 ER error; 183 184 /* TCP 受付口 ID をチェックする。*/ 185 if (!VAID_TCP_REPID(repid)) 186 return E_ID; 187 188 /* pk_crep が NULL ならエラー */ 189 if (pk_crep == NULL) 190 return E_PAR; 191 192 /* TCP 受付口を得る。*/ 193 rep = GET_TCP_REP(repid); 194 195 /* TCP 受付口が、動的生成用でなければエラー */ 196 if (!DYNAMIC_TCP_REP(rep)) 197 return E_ID; 198 199 /* 受付口をロックする。*/ 200 syscall(wai_sem(rep->semid_lock)); 201 202 /* 203 * TCP 受付口をチェックする。生成済みであればエラー 204 */ 205 if (VALID_TCP_REP(rep)) 206 error = E_OBJ; 207 else { 208 209 /* TCP 受付口生成情報をコピーする。*/ 210 rep->repatr = pk_crep->repatr; /* 受付口属性 */ 211 rep->myaddr = pk_crep->myaddr; /* 自分のアドレス */ 212 213 /* TCP 受付口を生成済みにする。*/ 214 rep->flags |= TCP_REP_FLG_VALID; 215 error = E_OK; 216 } 217 218 /* 受付口のロックを解除する。*/ 219 syscall(sig_sem(rep->semid_lock)); 220 221 return error; 222 } 223 224 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 225 226 #endif /* of #ifdef __tcp_cre_cep */ 227 228 #ifdef __tcp_del_rep 229 230 #ifdef TCP_CFG_EXTENTIONS 231 232 /* 233 * tcp_find_cep_rep -- TCP 受付口をリンクしている TCP 通信端点を得る。 234 */ 235 236 static T_TCP_CEP* 237 tcp_find_cep_rep (T_TCP_REP* rep) 238 { 239 T_TCP_CEP* cep; 240 241 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { 242 if (cep->rep == rep) 243 return cep; 244 } 245 246 return NULL; 247 } 248 249 /* 250 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 251 */ 252 253 254 ER 255 tcp_del_rep (ID repid) 256 { 257 T_TCP_CEP *cep; 258 T_TCP_REP *rep; 259 ER error = E_OK; 260 261 /* TCP 受付口 ID をチェックする。*/ 262 if (!VAID_TCP_REPID(repid)) 263 return E_ID; 264 265 /* TCP 受付口を得る。*/ 266 rep = GET_TCP_REP(repid); 267 268 /* TCP 受付口が、動的生成用でなければエラー */ 269 if (!DYNAMIC_TCP_REP(rep)) 270 return E_ID; 271 272 /* 受付口をロックする。*/ 273 syscall(wai_sem(rep->semid_lock)); 274 275 /* TCP 受付口をチェックする。未生成の場合はエラー */ 276 if (!VALID_TCP_REP(rep)) 277 error = E_NOEXS; 278 else { 279 if ((cep = tcp_find_cep_rep(rep)) != NULL) { 280 /* 281 * すでに受動オープンしているとき 282 *(tcp_acp_cep が呼ばれているとき)は、 283 * tcp_acp_cep を終了させる。 284 */ 285 286 /* 通信端点をロックする。*/ 287 syscall(wai_sem(cep->semid_lock)); 288 289 /* 290 * 通信端点から受付口を解放し、 291 * イベントフラグをクローズに設定する。 292 */ 293 cep->rep = NULL; 294 cep->fsm_state = TCP_FSM_CLOSED; 295 cep->error = E_DLT; 296 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 297 298 #ifdef TCP_CFG_NON_BLOCKING 299 300 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { 301 if (IS_PTR_DEFINED(cep->callback)) { 302 303 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 304 305 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)E_DLT); 306 307 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 308 309 ER error = E_DLT; 310 311 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&error); 312 313 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 314 315 } 316 else 317 error = E_OBJ; 318 cep->rcv_nblk_tfn = TFN_TCP_UNDEF; 319 } 320 321 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 322 323 cep->rcv_tskid = TA_NULL; 324 cep->rcv_tfn = TFN_TCP_UNDEF; 325 326 /* 通信端点のロックを解除する。*/ 327 syscall(sig_sem(cep->semid_lock)); 328 329 } 330 else 331 error = E_OK; 332 333 /* TCP 受付口を未生成にする。*/ 334 rep->flags &= ~TCP_REP_FLG_VALID; 335 } 336 337 /* 受付口のロックを解除する。*/ 338 syscall(sig_sem(rep->semid_lock)); 339 340 return error; 341 } 342 343 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 344 345 #endif /* of #ifdef __tcp_del_rep */ 346 347 /* 348 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 349 */ 350 351 #ifdef __tcp_cre_cep 352 353 #ifdef TCP_CFG_EXTENTIONS 354 355 ER 356 tcp_cre_cep (ID cepid, T_TCP_CCEP *pk_ccep) 357 { 358 T_TCP_CEP *cep; 359 ER error; 360 361 /* TCP 通信端点 ID をチェックする。*/ 362 if (!VAID_TCP_CEPID(cepid)) 363 return E_ID; 364 365 /* pk_ccep が NULL ならエラー */ 366 if (pk_ccep == NULL) 367 return E_PAR; 368 369 /* TCP 通信端点を得る。*/ 370 cep = GET_TCP_CEP(cepid); 371 372 /* TCP 通信端点が、動的生成用でなければエラー */ 373 if (!DYNAMIC_TCP_CEP(cep)) 374 return E_ID; 375 376 /* 通信端点をロックする。*/ 377 syscall(wai_sem(cep->semid_lock)); 378 379 /* 380 * TCP 通信端点をチェックする。生成済みであればエラー 381 */ 382 if (VALID_TCP_CEP(cep)) 383 error = E_OBJ; 384 else { 385 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 通信端点を生成済みにする。*/ 395 cep->flags |= TCP_CEP_FLG_VALID; 396 error = E_OK; 397 } 398 399 /* 通信端点のロックを解除する。*/ 400 syscall(sig_sem(cep->semid_lock)); 401 402 return error; 403 } 404 405 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 406 407 #endif /* of #ifdef __tcp_cre_cep */ 408 409 /* 410 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 411 */ 412 413 #ifdef __tcp_del_cep 414 415 #ifdef TCP_CFG_EXTENTIONS 416 417 ER 418 tcp_del_cep (ID cepid) 419 { 420 T_TCP_CEP *cep; 421 ER error; 422 423 /* TCP 通信端点 ID をチェックする。*/ 424 if (!VAID_TCP_CEPID(cepid)) 425 return E_ID; 426 427 /* TCP 通信端点を得る。*/ 428 cep = GET_TCP_CEP(cepid); 429 430 /* TCP 通信端点が、動的生成用でなければエラー */ 431 if (!DYNAMIC_TCP_CEP(cep)) 432 return E_ID; 433 434 /* 通信端点をロックする。*/ 435 syscall(wai_sem(cep->semid_lock)); 436 437 /* 438 * TCP 通信端点をチェックする。以下の場合はエラー 439 * ・未生成。 440 * ・使用中。 441 */ 442 if (!VALID_TCP_CEP(cep)) 443 error = E_NOEXS; 444 else if (cep->fsm_state != TCP_FSM_CLOSED) 445 error = E_OBJ; 446 else { 447 448 /* TCP 通信端点を未生成にする。*/ 449 cep->flags &= ~TCP_CEP_FLG_VALID; 450 error = E_OK; 451 } 452 453 /* 通信端点のロックを解除する。*/ 454 syscall(sig_sem(cep->semid_lock)); 455 456 return error; 457 } 458 459 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 460 461 #endif /* of #ifdef __tcp_del_cep */ 462 463 #ifdef TCP_CFG_PASSIVE_OPEN 464 465 /* 466 * tcp_acp_cep -- 接続要求待ち (受動オープン)【標準機能】 467 */ 468 469 #ifdef __tcp_acp_cep 470 471 ER 472 TCP_ACP_CEP (ID cepid, ID repid, T_IPEP *p_dstaddr, TMO tmout) 473 { 474 T_TCP_REP *rep; 475 T_TCP_CEP *cep; 476 ER error; 477 FLGPTN flag; 478 479 /* TCP 受付口をチェックする。*/ 480 if (!VAID_TCP_REPID(repid)) 481 return E_ID; 482 483 #ifdef TCP_CFG_NON_BLOCKING 484 485 /* p_dstaddr が NULL ならエラー */ 486 if (p_dstaddr == NULL) 487 return E_PAR; 488 489 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 490 491 /* p_dstaddr が NULL か、tmout が TMO_NBLK ならエラー */ 492 if (p_dstaddr == NULL || tmout == TMO_NBLK) 493 return E_PAR; 494 495 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 496 497 /* 498 * CEP をロックし、API 機能コードとタスク識別子を記録する。 499 * すでに記録されていれば、ペンディング中なのでエラー 500 */ 501 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_ACP_CEP)) != E_OK) 502 return error; 503 504 /* CEP の FSM がクローズ状態でなければエラー。*/ 505 if (cep->fsm_state != TCP_FSM_CLOSED) { 506 error = E_OBJ; 507 goto err_ret; 508 } 509 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 510 511 /* TCP 通信端点を初期化する。*/ 512 tcp_init_cep(cep); 513 514 /* TCP 受付口を得る。*/ 515 rep = GET_TCP_REP(repid); 516 517 #ifdef TCP_CFG_EXTENTIONS 518 519 /* TCP 受付口をロックする。*/ 520 syscall(wai_sem(rep->semid_lock)); 521 522 /* TCP 受付口をチェックする。*/ 523 if (!VALID_TCP_REP(rep)) { 524 syscall(sig_sem(rep->semid_lock)); 525 error = E_NOEXS; 526 goto err_ret; 527 } 528 529 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 530 531 /* TCP 通信端点にTCP受付口を記録する。*/ 532 cep->rep = rep; 533 534 #ifdef TCP_CFG_EXTENTIONS 535 536 /* TCP 受付口のロックを解除する。*/ 537 syscall(sig_sem(rep->semid_lock)); 538 539 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 540 541 /* TCP 受付口のアドレスをコピーする。*/ 542 cep->myaddr = rep->myaddr; 543 544 /* 通信端点を設定する。*/ 545 cep->fsm_state = TCP_FSM_LISTEN; 546 547 #ifdef TCP_CFG_NON_BLOCKING 548 549 /* タイムアウトをチェックする。*/ 550 if (tmout == TMO_NBLK) { 551 /* ノンブロッキングコール */ 552 cep->p_dstaddr = p_dstaddr; 553 cep->rcv_nblk_tfn = TFN_TCP_ACP_CEP; 554 return E_WBLK; 555 } 556 else { 557 558 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 559 560 /* 561 * FSM が ESTABLISHED になるまで待つ。 562 * FSM が CLOSED になった場合は、エラーが発生したことを意味している。 563 */ 564 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | 565 TCP_CEP_EVT_ESTABLISHED), TWF_ORW, &flag, tmout); 566 if (error == E_OK) { 567 if (cep->error != E_OK) 568 error = cep->error; 569 else if (cep->fsm_state == TCP_FSM_CLOSED) 570 error = E_TMOUT; 571 } 572 573 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_ESTABLISHED))); 574 575 if (error == E_OK) { 576 /* 相手のアドレスをコピーする。*/ 577 *p_dstaddr = cep->dstaddr; 578 } 579 else { 580 /* 581 * 通信端点から受付口を解放し、 582 * イベントフラグをクローズに設定する。 583 */ 584 cep->rep = NULL; 585 cep->fsm_state = TCP_FSM_CLOSED; 586 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 587 } 588 589 #ifdef TCP_CFG_NON_BLOCKING 590 591 } 592 593 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 594 595 err_ret: 596 cep->rcv_tskid = TA_NULL; 597 cep->rcv_tfn = TFN_TCP_UNDEF; 598 return error; 599 } 600 601 #endif /* of #ifdef __tcp_acp_cep */ 602 603 #endif /* of #ifdef TCP_CFG_PASSIVE_OPEN */ 604 605 /* 606 * tcp_con_cep -- 接続要求 (能動オープン)【標準機能】 607 */ 608 609 #ifdef __tcp_con_cep 610 611 ER 612 TCP_CON_CEP (ID cepid, T_IPEP *p_myaddr, T_IPEP *p_dstaddr, TMO tmout) 613 { 614 T_TCP_CEP *cep; 615 ER error; 616 FLGPTN flag; 617 618 #ifdef TCP_CFG_NON_BLOCKING 619 620 /* 621 * p_dstaddr または p_myaddr が NULL か、 622 * あて先がマルチキャストアドレスならエラー 623 */ 624 if (p_myaddr == NULL || p_dstaddr == NULL || IN_IS_ADDR_MULTICAST(&p_dstaddr->ipaddr)) 625 return E_PAR; 626 627 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 628 629 /* 630 * p_dstaddr または p_myaddr が NULL 、 631 * あて先がマルチキャストアドレスか、 632 * tmout が TMO_NBLK ならエラー 633 */ 634 if (p_myaddr == NULL || p_dstaddr == NULL || 635 IN_IS_ADDR_MULTICAST(&p_dstaddr->ipaddr) || tmout == TMO_NBLK) 636 return E_PAR; 637 638 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 639 640 /* 641 * CEP をロックし、API 機能コードとタスク識別子を記録する。 642 * すでに記録されていれば、ペンディング中なのでエラー 643 */ 644 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_CON_CEP)) != E_OK) 645 return error; 646 647 /* CEP の FSM がクローズ状態でなければエラー。*/ 648 if (cep->fsm_state != TCP_FSM_CLOSED) { 649 error = E_OBJ; 650 goto err_ret; 651 } 652 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 653 654 /* シーケンス番号を初期化する。*/ 655 if (tcp_iss == 0) 656 tcp_init_iss(); 657 658 /* 通信端点を初期化する。*/ 659 tcp_init_cep(cep); 660 661 /* 662 * p_myaddr が NADR (-1) ではなく、自 IP アドレスが ANY でなければ、 663 * 指定された IP アドレスを割り当てる。 664 */ 665 if (p_myaddr != NADR && !IN_IS_ADDR_ANY(&p_myaddr->ipaddr)) 666 cep->myaddr.ipaddr = p_myaddr->ipaddr; 667 else { 668 T_IN_IFADDR *ia; 669 670 if ((ia = IN_IFAWITHIFP(IF_GET_IFNET(), &p_dstaddr->ipaddr)) == NULL) { 671 error = E_PAR; 672 goto err_ret; 673 } 674 cep->myaddr.ipaddr = ia->addr; 675 } 676 677 /* 通信端点を設定する。*/ 678 cep->fsm_state = TCP_FSM_SYN_SENT; 679 cep->dstaddr = *p_dstaddr; 680 cep->iss = tcp_iss; 681 cep->timer[TCP_TIM_KEEP] = TCP_TVAL_KEEP_INIT; 682 tcp_iss += TCP_ISS_INCR() / 2; 683 init_send_seq(cep); 684 685 #ifdef TCP_CFG_NON_BLOCKING 686 687 /* タイムアウトをチェックする。*/ 688 if (tmout == TMO_NBLK) { 689 /* ノンブロッキングコール */ 690 cep->p_dstaddr = p_dstaddr; 691 cep->p_myaddr = p_myaddr; 692 cep->snd_nblk_tfn = TFN_TCP_CON_CEP; 693 694 /* コネクションの開設をポストする。*/ 695 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 696 sig_sem(SEM_TCP_POST_OUTPUT); 697 return E_WBLK; 698 } 699 else { 700 701 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 702 703 /* 704 * p_myaddr が NADR (-1) か、 705 * 自ポート番号が TCP_PORTANY なら、自動で割り当てる。 706 */ 707 if (p_myaddr == NADR || p_myaddr->portno == TCP_PORTANY) 708 tcp_alloc_auto_port(cep); 709 else if ((error = tcp_alloc_port(cep, p_myaddr->portno)) != E_OK) 710 goto err_ret; 711 712 /* コネクションの開設をポストする。*/ 713 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 714 sig_sem(SEM_TCP_POST_OUTPUT); 715 716 /* 717 * イベントが ESTABLISHED になるまで待つ。 718 * イベントが CLOSED になった場合は、何らかのエラーが発生したか、 719 * 接続要求が拒否されたことを意味している。 720 */ 721 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | 722 TCP_CEP_EVT_ESTABLISHED), TWF_ORW, &flag, tmout); 723 if (error == E_OK) { 724 if (cep->error != E_OK) 725 error = cep->error; 726 else if (cep->fsm_state == TCP_FSM_CLOSED) 727 error = E_CLS; 728 } 729 730 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_ESTABLISHED))); 731 732 if (error != E_OK) { 733 /* 734 * 通信端点から受付口を解放し、 735 * イベントフラグをクローズに設定する。 736 */ 737 cep->rep = NULL; 738 cep->fsm_state = TCP_FSM_CLOSED; 739 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 740 } 741 742 #ifdef TCP_CFG_NON_BLOCKING 743 744 } 745 746 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 747 748 err_ret: 749 cep->snd_tskid = TA_NULL; 750 cep->snd_tfn = TFN_TCP_UNDEF; 751 return error; 752 } 753 754 #endif /* of #ifdef __tcp_con_cep */ 149 * IPv6 と IPv4 で引数が異なる関数のコンパイル 150 */ 151 152 #if defined(SUPPORT_INET6) 153 154 #define T_IPEP T_IPV6EP 155 #define TCP_ACP_CEP tcp6_acp_cep 156 #define TCP_CON_CEP tcp6_con_cep 157 #define TCP_FIND_CEP_REP tcp6_find_cep_rep 158 159 #if defined(SUPPORT_INET4) 160 161 #undef T_TCP_REP 162 #define T_TCP_REP T_TCP6_REP 163 164 #endif /* of #if defined(SUPPORT_INET4) */ 165 166 #define TCP_CRE_REP tcp6_cre_rep 167 #define TCP_DEL_REP_BODY tcp6_del_rep_body 168 #define GET_TCP_REP GET_TCP6_REP 169 #define VALID_TCP_REPID VALID_TCP6_REPID 170 #define T_TCPN_CREP T_TCP6_CREP 171 #define API_PROTO API_PROTO_IPV6 172 173 #include <netinet/tcpn_usrreq.c> 174 175 #undef T_IPEP 176 #undef TCP_ACP_CEP 177 #undef TCP_CON_CEP 178 #undef TCP_FIND_CEP_REP 179 180 #undef TCP_CRE_REP 181 #undef TCP_DEL_REP_BODY 182 #undef GET_TCP_REP 183 #undef VALID_TCP_REPID 184 #undef T_TCPN_CREP 185 #undef API_PROTO 186 187 #endif /* of #if defined(SUPPORT_INET6) */ 188 189 #if defined(SUPPORT_INET4) 190 191 #define T_IPEP T_IPV4EP 192 #define TCP_ACP_CEP tcp_acp_cep 193 #define TCP_CON_CEP tcp_con_cep 194 #define TCP_FIND_CEP_REP tcp4_find_cep_rep 195 196 #if defined(SUPPORT_INET6) 197 198 #undef T_TCP_REP 199 #define T_TCP_REP T_TCP4_REP 200 201 #endif /* of #if defined(SUPPORT_INET6) */ 202 203 #define TCP_CRE_REP tcp_cre_rep 204 #define TCP_DEL_REP_BODY tcp4_del_rep_body 205 #define GET_TCP_REP GET_TCP4_REP 206 #define VALID_TCP_REPID VALID_TCP4_REPID 207 #define T_TCPN_CREP T_TCP_CREP 208 #define API_PROTO API_PROTO_IPV4 209 210 #include <netinet/tcpn_usrreq.c> 211 212 #endif /* of #if defined(SUPPORT_INET4) */ 755 213 756 214 #ifdef __tcp_cls_cep … … 904 362 * ・動的な通信端点の生成・削除機能 905 363 */ 906 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | 907 TCP_CEP_FLG_DYNAMIC | TCP_CEP_FLG_VALID); 364 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; 908 365 909 366 /* … … 1025 482 sig_sem(SEM_TCP_POST_OUTPUT); 1026 483 484 /* コールバック関数を呼び出す。*/ 1027 485 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1028 1029 /* コールバック関数を呼び出す。*/1030 486 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)error); 1031 1032 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1033 1034 /* コールバック関数を呼び出す。*/ 487 #else 1035 488 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)&error); 1036 1037 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1038 489 #endif 1039 490 error = E_WBLK; 1040 491 goto err_ret; … … 1082 533 1083 534 #endif /* of #ifdef __tcp_snd_dat */ 1084 1085 #ifdef __tcp_snd_oob1086 1087 #ifdef TCP_CFG_EXTENTIONS1088 1089 /*1090 * tcp_snd_oob -- 緊急データの送信【拡張機能】1091 */1092 1093 ER_UINT1094 tcp_snd_oob (ID cepid, void *data, int_t len, TMO tmout)1095 {1096 T_TCP_CEP *cep;1097 ER_UINT error;1098 1099 #ifdef TCP_CFG_NON_BLOCKING1100 1101 /* data が NULL か、len < 0 ならエラー */1102 if (data == NULL || len < 0)1103 return E_PAR;1104 1105 #else /* of #ifdef TCP_CFG_NON_BLOCKING */1106 1107 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */1108 if (data == NULL || len < 0 || tmout == TMO_NBLK)1109 return E_PAR;1110 1111 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1112 1113 /*1114 * CEP をロックし、API 機能コードとタスク識別子を記録する。1115 * すでに記録されていれば、ペンディング中なのでエラー1116 */1117 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK)1118 return error;1119 1120 /* 送信できるか、通信端点の状態を見る。*/1121 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK)1122 goto err_ret;1123 1124 #ifdef TCP_CFG_NON_BLOCKING1125 1126 /* タイムアウトをチェックする。*/1127 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */1128 1129 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/1130 if (!TCP_IS_SWBUF_FULL(cep)) {1131 1132 /* 送信ウィンドバッファにデータを書き込む。*/1133 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len);1134 1135 /* 送信緊急ポインタを設定する。*/1136 cep->snd_up = cep->snd_una + cep->swbuf_count;1137 1138 /* 出力をポストする。*/1139 cep->flags |= TCP_CEP_FLG_POST_OUTPUT;1140 sig_sem(SEM_TCP_POST_OUTPUT);1141 1142 #ifdef TCP_CFG_NON_BLOCKING_COMPAT141143 1144 /* コールバック関数を呼び出す。*/1145 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error);1146 1147 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */1148 1149 /* コールバック関数を呼び出す。*/1150 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)&error);1151 1152 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */1153 1154 error = E_WBLK;1155 goto err_ret;1156 }1157 else {1158 cep->snd_data = data;1159 cep->snd_len = len;1160 cep->snd_nblk_tfn = TFN_TCP_SND_OOB;1161 TCP_ALLOC_SWBUF(cep);1162 1163 return E_WBLK;1164 }1165 }1166 else { /* 非ノンブロッキングコール */1167 1168 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1169 1170 /* 送信ウィンドバッファが空くのを待つ。*/1171 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK)1172 goto err_ret;1173 1174 /* 送信ウィンドバッファにデータを書き込む。*/1175 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) {1176 1177 /* 送信緊急ポインタを設定する。*/1178 cep->snd_up = cep->snd_una + cep->swbuf_count;1179 1180 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/1181 if (TCP_IS_SWBUF_FULL(cep))1182 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR;1183 1184 /* 出力をポストする。*/1185 cep->flags |= TCP_CEP_FLG_POST_OUTPUT;1186 sig_sem(SEM_TCP_POST_OUTPUT);1187 }1188 1189 #ifdef TCP_CFG_NON_BLOCKING1190 1191 }1192 1193 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1194 1195 err_ret:1196 cep->snd_tskid = TA_NULL;1197 cep->snd_tfn = TFN_TCP_UNDEF;1198 return error;1199 }1200 1201 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1202 1203 #endif /* of #ifdef __tcp_snd_oob */1204 535 1205 536 #ifdef __tcp_get_buf … … 1250 581 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 1251 582 583 /* コールバック関数を呼び出す。*/ 1252 584 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1253 1254 /* コールバック関数を呼び出す。*/1255 585 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)error); 1256 1257 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1258 1259 /* コールバック関数を呼び出す。*/ 586 #else 1260 587 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)&error); 1261 1262 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1263 588 #endif 1264 589 error = E_WBLK; 1265 590 goto err_ret; … … 1401 726 len = TCP_READ_RWBUF(cep, data, (uint_t)len); 1402 727 728 /* コールバック関数を呼び出す。*/ 1403 729 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1404 1405 730 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_DAT, (void*)(uint32_t)len); 1406 1407 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1408 731 #else 1409 732 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_DAT, (void*)&len); 1410 1411 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1412 733 #endif 1413 734 error = E_WBLK; 1414 735 goto err_ret; … … 1449 770 1450 771 #endif /* of #ifdef __tcp_rcv_dat */ 1451 1452 #ifdef __tcp_rcv_oob1453 1454 #ifdef TCP_CFG_EXTENTIONS1455 1456 /*1457 * tcp_rcv_oob -- 緊急データの受信【拡張機能】1458 *1459 * 注意: 送信側が複数オクテットのデータを送信しても、1460 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。1461 */1462 1463 ER_UINT1464 tcp_rcv_oob (ID cepid, void *data, int_t len)1465 {1466 T_TCP_CEP *cep;1467 uint8_t *urg;1468 1469 /* TCP 通信端点 ID をチェックする。*/1470 if (!VAID_TCP_CEPID(cepid))1471 return E_ID;1472 1473 /* data が NULL か、len < 0 ならエラー */1474 if (data == NULL || len < 0)1475 return E_PAR;1476 1477 /* TCP 通信端点を得る。*/1478 cep = GET_TCP_CEP(cepid);1479 1480 /* 受信できるか、通信端点の状態を見る。*/1481 /* 受信できるか、fsm_state を見る。*/1482 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state))1483 return E_OBJ;1484 1485 /*1486 * 緊急データ入りのセグメントの TCP ヘッダが1487 * 設定されていなければ、緊急データを受信していない。1488 */1489 if (cep->urg_tcph == NULL)1490 return E_OBJ;1491 1492 /* len == 0 ならバッファオーバーフロー */1493 if (len == 0)1494 return E_BOVR;1495 1496 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/1497 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET;1498 *(uint8_t*)data = *urg;1499 1500 /* 読み取ったデータから後ろの SDU を前に詰める。*/1501 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1);1502 1503 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/1504 cep->urg_tcph = NULL;1505 1506 return 1;1507 }1508 1509 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1510 1511 #endif /* of #ifdef __tcp_rcv_oob */1512 772 1513 773 #ifdef __tcp_rcv_buf … … 1559 819 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 1560 820 821 /* コールバック関数を呼び出す。*/ 1561 822 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1562 1563 /* コールバック関数を呼び出す。*/1564 823 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)error); 1565 1566 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1567 1568 /* コールバック関数を呼び出す。*/ 824 #else 1569 825 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)&error); 1570 1571 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1572 826 #endif 1573 827 error = E_WBLK; 1574 828 goto err_ret; … … 1705 959 1706 960 case TFN_TCP_CON_CEP: 1707 /* 通信端点から受付口を解放する。*/ 961 /* 962 * 通信端点から受付口を解放し、 963 * イベントフラグをクローズに設定する。 964 */ 1708 965 cep->rep = NULL; 966 967 #if defined(_IP6_CFG) && defined(_IP4_CFG) 968 cep->rep4 = NULL; 969 #endif 970 1709 971 cep->fsm_state = TCP_FSM_CLOSED; 1710 972 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); … … 1800 1062 */ 1801 1063 cep->rep = NULL; 1064 1065 #if defined(_IP6_CFG) && defined(_IP4_CFG) 1066 cep->rep4 = NULL; 1067 #endif 1068 1802 1069 cep->fsm_state = TCP_FSM_CLOSED; 1803 1070 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); … … 1866 1133 1867 1134 /* TCP 通信端点 ID をチェックする。*/ 1868 if (!VA ID_TCP_CEPID(cepid))1135 if (!VALID_TCP_CEPID(cepid)) 1869 1136 return E_ID; 1870 1137 … … 1914 1181 #endif /* of #ifdef __tcp_can_cep */ 1915 1182 1183 #ifdef TCP_CFG_EXTENTIONS 1184 1185 #ifdef __tcp_cre_cep 1186 1187 /* 1188 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 1189 */ 1190 1191 ER 1192 tcp_cre_cep (ID cepid, T_TCP_CCEP *pk_ccep) 1193 { 1194 T_TCP_CEP *cep; 1195 ER error; 1196 1197 /* TCP 通信端点 ID をチェックする。*/ 1198 if (!VALID_TCP_CEPID(cepid)) 1199 return E_ID; 1200 1201 /* pk_ccep が NULL ならエラー */ 1202 if (pk_ccep == NULL) 1203 return E_PAR; 1204 1205 /* TCP 通信端点を得る。*/ 1206 cep = GET_TCP_CEP(cepid); 1207 1208 /* TCP 通信端点が、動的生成用でなければエラー */ 1209 if (!DYNAMIC_TCP_CEP(cep)) 1210 return E_ID; 1211 1212 /* 通信端点をロックする。*/ 1213 syscall(wai_sem(cep->semid_lock)); 1214 1215 /* 1216 * TCP 通信端点をチェックする。生成済みであればエラー 1217 */ 1218 if (VALID_TCP_CEP(cep)) 1219 error = E_OBJ; 1220 else { 1221 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 通信端点を生成済みにする。*/ 1231 cep->flags |= TCP_CEP_FLG_VALID; 1232 error = E_OK; 1233 } 1234 1235 /* 通信端点のロックを解除する。*/ 1236 syscall(sig_sem(cep->semid_lock)); 1237 1238 return error; 1239 } 1240 1241 #endif /* of #ifdef __tcp_cre_cep */ 1242 1243 /* 1244 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 1245 */ 1246 1247 #ifdef __tcp_del_cep 1248 1249 ER 1250 tcp_del_cep (ID cepid) 1251 { 1252 T_TCP_CEP *cep; 1253 ER error; 1254 1255 /* TCP 通信端点 ID をチェックする。*/ 1256 if (!VALID_TCP_CEPID(cepid)) 1257 return E_ID; 1258 1259 /* TCP 通信端点を得る。*/ 1260 cep = GET_TCP_CEP(cepid); 1261 1262 /* TCP 通信端点が、動的生成用でなければエラー */ 1263 if (!DYNAMIC_TCP_CEP(cep)) 1264 return E_ID; 1265 1266 /* 通信端点をロックする。*/ 1267 syscall(wai_sem(cep->semid_lock)); 1268 1269 /* 1270 * TCP 通信端点をチェックする。以下の場合はエラー 1271 * ・未生成。 1272 * ・使用中。 1273 */ 1274 if (!VALID_TCP_CEP(cep)) 1275 error = E_NOEXS; 1276 else if (cep->fsm_state != TCP_FSM_CLOSED) 1277 error = E_OBJ; 1278 else { 1279 1280 /* TCP 通信端点を未生成にする。*/ 1281 cep->flags &= ~TCP_CEP_FLG_VALID; 1282 error = E_OK; 1283 } 1284 1285 /* 通信端点のロックを解除する。*/ 1286 syscall(sig_sem(cep->semid_lock)); 1287 1288 return error; 1289 } 1290 1291 #endif /* of #ifdef __tcp_del_cep */ 1292 1293 #ifdef __tcp_snd_oob 1294 1295 /* 1296 * tcp_snd_oob -- 緊急データの送信【拡張機能】 1297 */ 1298 1299 ER_UINT 1300 tcp_snd_oob (ID cepid, void *data, int_t len, TMO tmout) 1301 { 1302 T_TCP_CEP *cep; 1303 ER_UINT error; 1304 1305 #ifdef TCP_CFG_NON_BLOCKING 1306 1307 /* data が NULL か、len < 0 ならエラー */ 1308 if (data == NULL || len < 0) 1309 return E_PAR; 1310 1311 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1312 1313 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1314 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1315 return E_PAR; 1316 1317 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1318 1319 /* 1320 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1321 * すでに記録されていれば、ペンディング中なのでエラー 1322 */ 1323 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK) 1324 return error; 1325 1326 /* 送信できるか、通信端点の状態を見る。*/ 1327 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK) 1328 goto err_ret; 1329 1330 #ifdef TCP_CFG_NON_BLOCKING 1331 1332 /* タイムアウトをチェックする。*/ 1333 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1334 1335 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1336 if (!TCP_IS_SWBUF_FULL(cep)) { 1337 1338 /* 送信ウィンドバッファにデータを書き込む。*/ 1339 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 1340 1341 /* 送信緊急ポインタを設定する。*/ 1342 cep->snd_up = cep->snd_una + cep->swbuf_count; 1343 1344 /* 出力をポストする。*/ 1345 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1346 sig_sem(SEM_TCP_POST_OUTPUT); 1347 1348 /* コールバック関数を呼び出す。*/ 1349 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1350 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error); 1351 #else 1352 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)&error); 1353 #endif 1354 error = E_WBLK; 1355 goto err_ret; 1356 } 1357 else { 1358 cep->snd_data = data; 1359 cep->snd_len = len; 1360 cep->snd_nblk_tfn = TFN_TCP_SND_OOB; 1361 TCP_ALLOC_SWBUF(cep); 1362 1363 return E_WBLK; 1364 } 1365 } 1366 else { /* 非ノンブロッキングコール */ 1367 1368 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1369 1370 /* 送信ウィンドバッファが空くのを待つ。*/ 1371 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1372 goto err_ret; 1373 1374 /* 送信ウィンドバッファにデータを書き込む。*/ 1375 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 1376 1377 /* 送信緊急ポインタを設定する。*/ 1378 cep->snd_up = cep->snd_una + cep->swbuf_count; 1379 1380 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 1381 if (TCP_IS_SWBUF_FULL(cep)) 1382 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 1383 1384 /* 出力をポストする。*/ 1385 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1386 sig_sem(SEM_TCP_POST_OUTPUT); 1387 } 1388 1389 #ifdef TCP_CFG_NON_BLOCKING 1390 1391 } 1392 1393 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1394 1395 err_ret: 1396 cep->snd_tskid = TA_NULL; 1397 cep->snd_tfn = TFN_TCP_UNDEF; 1398 return error; 1399 } 1400 1401 #endif /* of #ifdef __tcp_snd_oob */ 1402 1403 #ifdef __tcp_rcv_oob 1404 1405 /* 1406 * tcp_rcv_oob -- 緊急データの受信【拡張機能】 1407 * 1408 * 注意: 送信側が複数オクテットのデータを送信しても、 1409 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。 1410 */ 1411 1412 ER_UINT 1413 tcp_rcv_oob (ID cepid, void *data, int_t len) 1414 { 1415 T_TCP_CEP *cep; 1416 uint8_t *urg; 1417 1418 /* TCP 通信端点 ID をチェックする。*/ 1419 if (!VALID_TCP_CEPID(cepid)) 1420 return E_ID; 1421 1422 /* data が NULL か、len < 0 ならエラー */ 1423 if (data == NULL || len < 0) 1424 return E_PAR; 1425 1426 /* TCP 通信端点を得る。*/ 1427 cep = GET_TCP_CEP(cepid); 1428 1429 /* 受信できるか、通信端点の状態を見る。*/ 1430 /* 受信できるか、fsm_state を見る。*/ 1431 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state)) 1432 return E_OBJ; 1433 1434 /* 1435 * 緊急データ入りのセグメントの TCP ヘッダが 1436 * 設定されていなければ、緊急データを受信していない。 1437 */ 1438 if (cep->urg_tcph == NULL) 1439 return E_OBJ; 1440 1441 /* len == 0 ならバッファオーバーフロー */ 1442 if (len == 0) 1443 return E_BOVR; 1444 1445 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/ 1446 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET; 1447 *(uint8_t*)data = *urg; 1448 1449 /* 読み取ったデータから後ろの SDU を前に詰める。*/ 1450 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1); 1451 1452 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/ 1453 cep->urg_tcph = NULL; 1454 1455 return 1; 1456 } 1457 1458 #endif /* of #ifdef __tcp_rcv_oob */ 1459 1460 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 1461 1462 #ifdef TCP_CFG_EXTENTIONS 1463 1464 #ifdef __tcp_del_rep 1465 1466 /* 1467 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 1468 */ 1469 1470 #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 1471 1472 #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 1473 1474 ER 1475 tcp_del_rep (ID repid) 1476 { 1477 1478 /* 1479 * TCP 受付口 ID をチェックする。 1480 * IPv6 用 TCP 受付口であれば、 1481 * IPv6 用の「TCP 受付口の削除関数(本体)」を呼出す。 1482 */ 1483 //NET_DEBUG_TCP3("tcp_del_rep1[r=%d,n=%d,x=%d]\n", 1484 // repid, TMIN_TCP6_REPID, tmax_tcp6_repid); 1485 //NET_DEBUG_TCP3("tcp_del_rep2[r=%d,n=%d,x=%d]\n", 1486 // repid, TMIN_TCP4_REPID, tmax_tcp4_repid); 1487 if (VALID_TCP6_REPID(repid)) 1488 return tcp6_del_rep_body(repid); 1489 1490 /* 1491 * TCP 受付口 ID をチェックする。 1492 * IPv4 用 TCP 受付口であれば、 1493 * IPv4 用の「TCP 受付口の削除関数(本体)」を呼出す。 1494 */ 1495 else if (VALID_TCP4_REPID(repid)) 1496 return tcp4_del_rep_body(repid); 1497 else 1498 return E_ID; 1499 1500 } 1501 1502 #else /* of #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 */ 1503 1504 ER 1505 tcp_del_rep (ID repid) 1506 { 1507 1508 /* TCP 受付口 ID をチェックする。*/ 1509 if (VALID_TCP6_REPID(repid)) 1510 return tcp6_del_rep_body(repid); 1511 else 1512 return E_ID; 1513 1514 } 1515 1516 #endif /* of #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 */ 1517 1518 #else /* of #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 */ 1519 1520 ER 1521 tcp_del_rep (ID repid) 1522 { 1523 1524 /* TCP 受付口 ID をチェックする。*/ 1525 if (VALID_TCP4_REPID(repid)) 1526 return tcp4_del_rep_body(repid); 1527 else 1528 return E_ID; 1529 1530 } 1531 1532 #endif /* of #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 */ 1533 1534 #endif /* of #ifdef __tcp_del_rep */ 1535 1916 1536 /* 1917 1537 * tcp_set_opt -- TCP 通信端点オプションの設定【拡張機能】 … … 1922 1542 #ifdef __tcp_set_opt 1923 1543 1924 #ifdef TCP_CFG_EXTENTIONS1925 1926 1544 ER 1927 1545 tcp_set_opt (ID cepid, int_t optname, void *optval, int_t optlen) … … 1930 1548 1931 1549 /* TCP 通信端点 ID をチェックする。*/ 1932 if (!VA ID_TCP_CEPID(cepid))1550 if (!VALID_TCP_CEPID(cepid)) 1933 1551 return E_ID; 1934 1552 … … 1943 1561 } 1944 1562 1945 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1946 1947 1563 #endif /* of #ifdef __tcp_set_opt */ 1948 1564 … … 1955 1571 #ifdef __tcp_get_opt 1956 1572 1957 #ifdef TCP_CFG_EXTENTIONS1958 1959 1573 ER 1960 1574 tcp_get_opt (ID cepid, int_t optname, void *optval, int_t optlen) … … 1963 1577 1964 1578 /* TCP 通信端点 ID をチェックする。*/ 1965 if (!VA ID_TCP_CEPID(cepid))1579 if (!VALID_TCP_CEPID(cepid)) 1966 1580 return E_ID; 1967 1581 … … 1976 1590 } 1977 1591 1592 #endif /* of #ifdef __tcp_get_opt */ 1593 1978 1594 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 1979 1595 1980 #endif /* of #ifdef __tcp_get_opt */1981 1982 1596 #endif /* of #ifdef SUPPORT_TCP */
Note:
See TracChangeset
for help on using the changeset viewer.