Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.c

    r321 r331  
    22 *  TINET (TCP/IP Protocol Stack)
    33 *
    4  *  Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
     4 *  Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
    55 *                   Tomakomai National College of Technology, JAPAN
    66 *
     
    7575#include <sil.h>
    7676#include "kernel_cfg.h"
     77#include "tinet_cfg.h"
    7778
    7879#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8384#include <t_services.h>
    8485#include "kernel_id.h"
     86#include "tinet_id.h"
    8587
    8688#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9395#include <net/if_loop.h>
    9496#include <net/ethernet.h>
    95 #include <net/ppp_ipcp.h>
    9697#include <net/net.h>
     98#include <net/net_endian.h>
    9799#include <net/net_var.h>
    98100#include <net/net_buf.h>
     
    102104#include <netinet/in.h>
    103105#include <netinet/in_var.h>
    104 #include <netinet6/in6.h>
    105 #include <netinet6/in6_var.h>
    106106#include <netinet/in_itron.h>
    107107#include <netinet/ip.h>
    108108#include <netinet/ip_var.h>
    109 #include <netinet/ip6.h>
    110 #include <netinet6/ip6_var.h>
    111109#include <netinet/tcp.h>
    112 #include <netinet/tcp_timer.h>
    113110#include <netinet/tcp_var.h>
    114111#include <netinet/tcp_fsm.h>
    115112#include <netinet/tcp_seq.h>
     113#include <netinet/tcp_timer.h>
    116114
    117115#include <net/if_var.h>
    118116
    119117#ifdef SUPPORT_TCP
    120 
    121 /*
    122  *  IPv4 と IPv6 の切り替えマクロ
    123  */
    124 
    125 #if defined(SUPPORT_INET4)
    126 
    127 #define TCP_CRE_REP     tcp_cre_rep
    128 #define TCP_ACP_CEP     tcp_acp_cep
    129 #define TCP_CON_CEP     tcp_con_cep
    130 
    131 #endif  /* of #if defined(SUPPORT_INET4) */
    132 
    133 #if defined(SUPPORT_INET6)
    134 
    135 #define TCP_CRE_REP     tcp6_cre_rep
    136 #define TCP_ACP_CEP     tcp6_acp_cep
    137 #define TCP_CON_CEP     tcp6_con_cep
    138 
    139 #endif  /* of #if defined(SUPPORT_INET6) */
    140118
    141119/*
     
    169147
    170148/*
    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) */
    755213
    756214#ifdef __tcp_cls_cep
     
    904362                                 * ・動的な通信端点の生成・削除機能
    905363                                 */
    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;
    908365
    909366                                /*
     
    1025482                        sig_sem(SEM_TCP_POST_OUTPUT);
    1026483
     484                        /* コールバック関数を呼び出す。*/
    1027485#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1028 
    1029                         /* コールバック関数を呼び出す。*/
    1030486                        (*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
    1035488                        (*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
    1039490                        error = E_WBLK;
    1040491                        goto err_ret;
     
    1082533
    1083534#endif  /* of #ifdef __tcp_snd_dat */
    1084 
    1085 #ifdef __tcp_snd_oob
    1086 
    1087 #ifdef TCP_CFG_EXTENTIONS
    1088 
    1089 /*
    1090  *  tcp_snd_oob -- 緊急データの送信【拡張機能】
    1091  */
    1092 
    1093 ER_UINT
    1094 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_BLOCKING
    1100 
    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_BLOCKING
    1125 
    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_COMPAT14
    1143 
    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_BLOCKING
    1190 
    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 */
    1204535
    1205536#ifdef __tcp_get_buf
     
    1250581                        error = TCP_GET_SWBUF_ADDR(cep, p_buf);
    1251582
     583                        /* コールバック関数を呼び出す。*/
    1252584#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1253 
    1254                         /* コールバック関数を呼び出す。*/
    1255585                        (*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
    1260587                        (*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
    1264589                        error = E_WBLK;
    1265590                        goto err_ret;
     
    1401726                        len = TCP_READ_RWBUF(cep, data, (uint_t)len);
    1402727
     728                        /* コールバック関数を呼び出す。*/
    1403729#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1404 
    1405730                        (*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
    1409732                        (*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
    1413734                        error = E_WBLK;
    1414735                        goto err_ret;
     
    1449770
    1450771#endif  /* of #ifdef __tcp_rcv_dat */
    1451 
    1452 #ifdef __tcp_rcv_oob
    1453 
    1454 #ifdef TCP_CFG_EXTENTIONS
    1455 
    1456 /*
    1457  *  tcp_rcv_oob -- 緊急データの受信【拡張機能】
    1458  *
    1459  *    注意: 送信側が複数オクテットのデータを送信しても、
    1460  *          緊急ポインタが指す 1 オクテットのデータのみ受信する。
    1461  */
    1462 
    1463 ER_UINT
    1464 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 */
    1512772
    1513773#ifdef __tcp_rcv_buf
     
    1559819                        error = TCP_GET_RWBUF_ADDR(cep, p_buf);
    1560820
     821                        /* コールバック関数を呼び出す。*/
    1561822#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1562 
    1563                         /* コールバック関数を呼び出す。*/
    1564823                        (*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
    1569825                        (*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
    1573827                        error = E_WBLK;
    1574828                        goto err_ret;
     
    1705959
    1706960                        case TFN_TCP_CON_CEP:
    1707                                 /*  通信端点から受付口を解放する。*/
     961                                /*
     962                                 *  通信端点から受付口を解放し、
     963                                 *  イベントフラグをクローズに設定する。
     964                                 */
    1708965                                cep->rep = NULL;
     966
     967#if defined(_IP6_CFG) && defined(_IP4_CFG)
     968                                cep->rep4 = NULL;
     969#endif
     970
    1709971                                cep->fsm_state = TCP_FSM_CLOSED;
    1710972                                syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED));
     
    18001062                                 */
    18011063                                cep->rep = NULL;
     1064
     1065#if defined(_IP6_CFG) && defined(_IP4_CFG)
     1066                                cep->rep4 = NULL;
     1067#endif
     1068
    18021069                                cep->fsm_state = TCP_FSM_CLOSED;
    18031070                                syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED));
     
    18661133
    18671134        /* TCP 通信端点 ID をチェックする。*/
    1868         if (!VAID_TCP_CEPID(cepid))
     1135        if (!VALID_TCP_CEPID(cepid))
    18691136                return E_ID;
    18701137
     
    19141181#endif  /* of #ifdef __tcp_can_cep */
    19151182
     1183#ifdef TCP_CFG_EXTENTIONS
     1184
     1185#ifdef __tcp_cre_cep
     1186
     1187/*
     1188 *  tcp_cre_cep -- TCP 通信端点の生成【拡張機能】
     1189 */
     1190
     1191ER
     1192tcp_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
     1249ER
     1250tcp_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
     1299ER_UINT
     1300tcp_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
     1395err_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
     1412ER_UINT
     1413tcp_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
     1474ER
     1475tcp_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
     1504ER
     1505tcp_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
     1520ER
     1521tcp_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
    19161536/*
    19171537 *  tcp_set_opt -- TCP 通信端点オプションの設定【拡張機能】
     
    19221542#ifdef __tcp_set_opt
    19231543
    1924 #ifdef TCP_CFG_EXTENTIONS
    1925 
    19261544ER
    19271545tcp_set_opt (ID cepid, int_t optname, void *optval, int_t optlen)
     
    19301548
    19311549        /* TCP 通信端点 ID をチェックする。*/
    1932         if (!VAID_TCP_CEPID(cepid))
     1550        if (!VALID_TCP_CEPID(cepid))
    19331551                return E_ID;
    19341552
     
    19431561        }
    19441562
    1945 #endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    1946 
    19471563#endif  /* of #ifdef __tcp_set_opt */
    19481564
     
    19551571#ifdef __tcp_get_opt
    19561572
    1957 #ifdef TCP_CFG_EXTENTIONS
    1958 
    19591573ER
    19601574tcp_get_opt (ID cepid, int_t optname, void *optval, int_t optlen)
     
    19631577
    19641578        /* TCP 通信端点 ID をチェックする。*/
    1965         if (!VAID_TCP_CEPID(cepid))
     1579        if (!VALID_TCP_CEPID(cepid))
    19661580                return E_ID;
    19671581
     
    19761590        }
    19771591
     1592#endif  /* of #ifdef __tcp_get_opt */
     1593
    19781594#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    19791595
    1980 #endif  /* of #ifdef __tcp_get_opt */
    1981 
    19821596#endif  /* of #ifdef SUPPORT_TCP */
Note: See TracChangeset for help on using the changeset viewer.