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_subr.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 *
     
    9696#include <net/if_loop.h>
    9797#include <net/ethernet.h>
    98 #include <net/if_arp.h>
    99 #include <net/ppp_ipcp.h>
    10098#include <net/net.h>
     99#include <net/net_endian.h>
    101100#include <net/net_var.h>
    102101#include <net/net_buf.h>
     
    105104
    106105#include <netinet/in.h>
    107 #include <netinet6/in6.h>
    108 #include <netinet6/in6_var.h>
    109106#include <netinet/in_var.h>
     107#include <netinet/in_itron.h>
    110108#include <netinet/ip.h>
    111109#include <netinet/ip_var.h>
    112 #include <netinet/ip6.h>
    113 #include <netinet6/ip6_var.h>
    114 #include <netinet6/nd6.h>
    115110#include <netinet/tcp.h>
    116 #include <netinet/tcp_timer.h>
    117111#include <netinet/tcp_var.h>
    118112#include <netinet/tcp_fsm.h>
    119113#include <netinet/tcp_seq.h>
    120 #include <netinet/in_itron.h>
     114#include <netinet/tcp_timer.h>
    121115
    122116#ifdef SUPPORT_TCP
     
    147141
    148142static uint16_t tcp_port_auto = TCP_PORT_FIRST_AUTO;    /* 自動割り当て番号     */
     143
     144#if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0
     145
     146/*
     147 *  タスクからの Time Wait 状態 CEP 分離機能
     148 */
     149
     150/*
     151 *  変数
     152 */
     153
     154T_TCP_TWCEP tcp_twcep[NUM_TCP_TW_CEP_ENTRY];
     155
     156/*
     157 *  tcp_move_twcep -- 必要な情報を Time Wait 用 TCP 通信端点に移して、
     158 *                    標準の TCP 通信端点を開放する。
     159 */
     160
     161void
     162tcp_move_twcep (T_TCP_CEP *cep)
     163{
     164        T_TCP_TWCEP*    twcep;
     165
     166        /* 空きの Time Wait 用 TCP 通信端点を探索する。*/
     167        for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) {
     168                if (twcep->fsm_state != TCP_FSM_TIME_WAIT) {
     169
     170                        /*
     171                         *  通信端点をロックし、
     172                         *  必要な情報を Time Wait 用 TCP 通信端点に移す。
     173                         */
     174                        syscall(wai_sem(cep->semid_lock));
     175                        twcep->flags            = (uint8_t)cep->flags;
     176                        twcep->rbufsz           = cep->rbufsz;
     177                        twcep->dstaddr          = cep->dstaddr;
     178                        twcep->myaddr           = cep->myaddr;
     179                        twcep->snd_una          = cep->snd_una;
     180                        twcep->rcv_nxt          = cep->rcv_nxt;
     181                        twcep->rwbuf_count      = cep->rwbuf_count;
     182                        twcep->fsm_state        = cep->fsm_state;
     183                        twcep->timer_2msl       = cep->timer[TCP_TIM_2MSL];
     184
     185                        /* 通信端点をロックを解除する。*/
     186                        syscall(sig_sem(cep->semid_lock));
     187
     188                        /* 標準 TCP 通信端点を開放する。*/
     189                        tcp_close(cep);
     190
     191                        break;
     192                        }
     193                }
     194        }
     195
     196/*
     197 *  tcp_find_twcep -- ポート番号から Time Wait 用 TCP 通信端点を得る。
     198 */
     199
     200T_TCP_TWCEP*
     201tcp_find_twcep (T_NET_BUF *input, uint_t off)
     202{
     203        T_TCP_TWCEP*    twcep;
     204        T_TCP_HDR       *tcph;
     205
     206        tcph = GET_TCP_HDR(input, off);
     207       
     208        /*
     209         *  状態が TIME WAIT で、
     210         *  IP アドレスとポート番号が一致する通信端点を探索する。
     211         */
     212        for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) {
     213                if (twcep->fsm_state == TCP_FSM_TIME_WAIT                   &&
     214                    IN_IS_DSTADDR_ACCEPT    (&twcep->myaddr.ipaddr,  input) &&
     215                    IN_ARE_NET_SRCADDR_EQUAL(&twcep->dstaddr.ipaddr, input) &&
     216                    tcph->dport == twcep->myaddr.portno                     &&
     217                    tcph->sport == twcep->dstaddr.portno)
     218                        return twcep;
     219                }
     220
     221        return NULL;
     222        }
     223
     224#endif  /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */
     225
     226/*
     227 *  tcp_find_cep -- ポート番号から TCP 通信端点を得る。
     228 */
     229
     230T_TCP_CEP*
     231tcp_find_cep (T_NET_BUF *input, uint_t off)
     232{
     233        T_TCP_CEP*      cep;
     234        T_TCP_HDR       *tcph;
     235
     236        tcph = GET_TCP_HDR(input, off);
     237       
     238        /*
     239         *  状態が SYN 送信済み以後は、
     240         *  IP アドレスとポート番号が一致する TCP 通信端点を探索する。
     241         */
     242        for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) {
     243                if (cep->fsm_state >= TCP_FSM_SYN_SENT                    &&
     244                    IN_IS_DSTADDR_ACCEPT    (&cep->myaddr.ipaddr,  input) &&
     245                    IN_ARE_NET_SRCADDR_EQUAL(&cep->dstaddr.ipaddr, input) &&
     246                    tcph->dport == cep->myaddr.portno                     &&
     247                    tcph->sport == cep->dstaddr.portno)
     248                        return cep;
     249                }
     250
     251        /* IPv4 で受動オープン中の TCP 通信端点を先に探索する。*/   
     252        for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) {
     253                if ((cep->flags & TCP_CEP_FLG_IPV4)                   &&
     254                     cep->fsm_state == TCP_FSM_LISTEN                 &&
     255                     GET_IP_VER(input) == IPV4_VERSION                &&
     256                     IN_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, input) &&
     257                     tcph->dport == cep->myaddr.portno)
     258                        return cep;
     259                }
     260
     261        /* 受動オープン中の TCP 通信端点を探索する。*/   
     262        for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) {
     263
     264#if defined(_IP6_CFG) && defined(_IP4_CFG)
     265
     266                if (cep->flags & TCP_CEP_FLG_IPV4) {
     267                        if (cep->fsm_state == TCP_FSM_LISTEN                 &&
     268                            GET_IP_VER(input) == IPV4_VERSION                &&
     269                            IN_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, input) &&
     270                            tcph->dport == cep->myaddr.portno)
     271                                return cep;
     272                        }
     273                else {
     274
     275#if defined(API_CFG_IP4MAPPED_ADDR)
     276
     277                        if (cep->fsm_state == TCP_FSM_LISTEN                 &&
     278                            IN_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, input) &&
     279                            tcph->dport == cep->myaddr.portno)
     280                                return cep;
     281
     282#else   /* of #if defined(API_CFG_IP4MAPPED_ADDR) */
     283
     284                        if (cep->fsm_state == TCP_FSM_LISTEN                   &&
     285                            INN6_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, input) &&
     286                            tcph->dport == cep->myaddr.portno)
     287                                return cep;
     288
     289#endif  /* of #if defined(API_CFG_IP4MAPPED_ADDR) */
     290
     291                        }
     292
     293#else   /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     294
     295                if (cep->fsm_state == TCP_FSM_LISTEN                 &&
     296                    IN_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, input) &&
     297                    tcph->dport == cep->myaddr.portno)
     298                        return cep;
     299
     300#endif  /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     301                }
     302
     303        return NULL;
     304        }
     305
     306/*
     307 *  tcp_is_addr_accept -- 受信可能な IP アドレスとポート番号であることを確認する。
     308 */
     309
     310bool_t
     311tcp_is_addr_accept (T_NET_BUF *input, uint_t off)
     312{
     313        T_TCP_HDR       *tcph;
     314
     315        tcph = GET_TCP_HDR(input, off);
     316
     317#if !defined(_IP6_CFG) && defined(_IP4_CFG) && defined(SUPPORT_LOOP)
     318
     319        /*
     320         *  次のときは破棄する。
     321         *    ・ポート番号が同一で、送受信 IP アドレス が同一。
     322         *      ただし、送信元 IP アドレスがローカルループバックなら良い。
     323         *    ・マルチキャストアドレス
     324         */
     325
     326        if (tcph->dport == tcph->sport &&
     327            (IN4_ARE_HDR_ADDR_EQUAL(input) && !IN4_ARE_NET_ADDR_EQUAL(&GET_IP4_HDR(input)->dst, &IPV4_ADDR_LOOPBACK)))
     328                return RET_DROP;
     329
     330#else   /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) && defined(SUPPORT_LOOP) */
     331
     332        /*
     333         *  次のときは、受信可能ではない。
     334         *    ・ポート番号が同一で、送受信 IP アドレス が同一。
     335         *    ・マルチキャストアドレス
     336         */
     337        if (tcph->dport == tcph->sport && IN_ARE_HDR_ADDR_EQUAL(input))
     338                return false;
     339
     340#endif  /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) && defined(SUPPORT_LOOP) */
     341
     342        if (IN_IS_NET_ADDR_MULTICAST(input))
     343                return false;
     344        else
     345                return true;
     346        }
    149347
    150348/*
     
    162360
    163361        for (q = cep->reassq; q != NULL; q = nq) {
    164                 nq = GET_TCP_Q_HDR(q, GET_TCP_IP_Q_HDR(q)->thoff)->next;
     362                nq = GET_TCP_Q_HDR(q, GET_IP_TCP_Q_HDR_OFFSET(q))->next;
    165363                syscall(rel_net_buf(q));
    166364                }
     
    184382                        tcp_port_auto = TCP_PORT_FIRST_AUTO;
    185383
    186 #ifdef TCP_CFG_PASSIVE_OPEN
    187 
    188                 for (ix = tmax_tcp_repid; ix -- > 0; ) {
     384#if defined(TNUM_TCP6_REPID)
     385#if TNUM_TCP6_REPID > 0
     386
     387                for (ix = tmax_tcp6_repid; ix -- > 0; ) {
    189388
    190389#ifdef TCP_CFG_EXTENTIONS
    191390
    192                         if (VALID_TCP_REP(&tcp_rep[ix]) && tcp_rep[ix].myaddr.portno == portno) {
     391                        if (VALID_TCP_REP(&tcp6_rep[ix]) && tcp6_rep[ix].myaddr.portno == portno) {
    193392                                portno = TCP_PORTANY;
    194393                                break;
     
    197396#else   /* of #ifdef TCP_CFG_EXTENTIONS */
    198397
    199                         if (tcp_rep[ix].myaddr.portno == portno) {
     398                        if (tcp6_rep[ix].myaddr.portno == portno) {
    200399                                portno = TCP_PORTANY;
    201400                                break;
     
    206405                        }
    207406
    208 #endif  /* of #ifdef TCP_CFG_PASSIVE_OPEN */
     407#endif  /* of #if TNUM_TCP6_REPID > 0 */
     408#endif  /* of #if defined(TNUM_TCP6_REPID) */
     409
     410#if defined(TNUM_TCP4_REPID)
     411#if TNUM_TCP4_REPID > 0
     412
     413                for (ix = tmax_tcp4_repid; ix -- > 0; ) {
     414
     415#ifdef TCP_CFG_EXTENTIONS
     416
     417                        if (VALID_TCP_REP(&tcp4_rep[ix]) && tcp4_rep[ix].myaddr.portno == portno) {
     418                                portno = TCP_PORTANY;
     419                                break;
     420                                }
     421
     422#else   /* of #ifdef TCP_CFG_EXTENTIONS */
     423
     424                        if (tcp4_rep[ix].myaddr.portno == portno) {
     425                                portno = TCP_PORTANY;
     426                                break;
     427                                }
     428
     429#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
     430
     431                        }
     432
     433#endif  /* of #if TNUM_TCP4_REPID > 0 */
     434#endif  /* of #if defined(TNUM_TCP4_REPID) */
    209435
    210436                if (portno != TCP_PORTANY) {
     
    273499        SYSTIM now;
    274500
    275 #ifdef SUPPORT_ETHER
    276 
    277         T_IF_SOFTC      *ic;
    278 
    279         ic = IF_ETHER_NIC_GET_SOFTC();
    280         syscall(get_tim(&now));
    281         net_srand(now + (ic->ifaddr.lladdr[2] << 24)
    282                       + (ic->ifaddr.lladdr[3] << 16)
    283                       + (ic->ifaddr.lladdr[4] <<  8)
    284                       + (ic->ifaddr.lladdr[5]      ));
    285 
    286 #else   /* of #ifdef SUPPORT_ETHER */
    287 
    288501        syscall(get_tim(&now));
    289502        net_srand(now);
    290 
    291 #endif  /* of #ifdef SUPPORT_ETHER */
    292 
    293503        tcp_iss = net_rand();
    294504        }
     
    319529         * ・送受信ウィンドバッファの省コピー機能
    320530         * ・動的な通信端点の生成・削除機能
     531         * ・通信端点のネットワーク層プロトコル
    321532         */
    322         cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK |
    323                        TCP_CEP_FLG_DYNAMIC       | TCP_CEP_FLG_VALID);
     533        cep->flags &= TCP_CEP_FLG_NOT_CLEAR;
    324534
    325535#ifdef TCP_CFG_NON_BLOCKING
     
    341551                                        /* TCP 通信端点からTCP 受付口を解放する。*/
    342552                                        cep->rep = NULL;
     553
     554#if defined(_IP6_CFG) && defined(_IP4_CFG)
     555                                        cep->rep4 = NULL;
     556#endif
     557
    343558                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)E_CLS);
    344559                                        break;
     
    397612                                        /* TCP 通信端点から TCP 受付口を解放する。*/
    398613                                        cep->rep = NULL;
     614
     615#if defined(_IP6_CFG) && defined(_IP4_CFG)
     616                                        cep->rep4 = NULL;
     617#endif
     618
    399619                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)E_CLS);
    400620                                        break;
     
    431651
    432652                                case TFN_TCP_ACP_CEP:
     653
    433654                                        /* TCP 通信端点からTCP 受付口を解放する。*/
    434655                                        cep->rep = NULL;
     656
     657#if defined(_IP6_CFG) && defined(_IP4_CFG)
     658                                        cep->rep4 = NULL;
     659#endif
     660
     661                                        /* 接続エラーを設定する。*/
    435662                                        len      = E_CLS;
    436663                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
     
    489716
    490717                                case TFN_TCP_CON_CEP:
    491                                         /* TCP 通信端点から TCP 受付口を解放する。*/
     718
     719                                        /* TCP 通信端点からTCP 受付口を解放する。*/
    492720                                        cep->rep = NULL;
     721
     722#if defined(_IP6_CFG) && defined(_IP4_CFG)
     723                                        cep->rep4 = NULL;
     724#endif
     725
     726                                        /* 接続エラーを設定する。*/
    493727                                        len      = E_CLS;
    494728                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
     
    589823                sig_sem(SEM_TCP_POST_OUTPUT);
    590824                }
    591         else
     825        else {
    592826                cep = tcp_close(cep);
     827                }
    593828        return cep;
    594829        }
     
    602837             T_TCP_SEQ ack, T_TCP_SEQ seq, uint_t rbfree, uint8_t flags)
    603838{
    604         T_IP_HDR        *iph;
    605839        T_TCP_HDR       *tcph;
    606840        uint_t          win = 0;
     841        uint_t          hdr_offset;
    607842
    608843        if ((flags & TCP_FLG_RST) == 0)
     
    614849         */
    615850        if (output != NULL) {
    616                 T_IN_ADDR       ipaddr;
    617                 uint16_t                portno;
     851                uint16_t        portno;
    618852
    619853                /*
     
    626860                        }
    627861
    628                 iph  = GET_IP_HDR(output);
    629 
    630                 /* IP アドレスを交換する。*/
    631                 ipaddr = iph->src;
    632                 iph->src = iph->dst;
    633                 iph->dst = ipaddr;
    634 
    635 #if defined(SUPPORT_INET6)
     862                ip_exchg_addr(output);
     863
     864#if defined(_IP6_CFG)
    636865
    637866                /* トラヒッククラスとフローラベルをクリアする。*/
    638                 iph->vcf = htonl(IP6_MAKE_VCF(IP6_VCF_V(ntohl(iph->vcf)), 0));
    639 
    640 #endif  /* of #if defined(SUPPORT_INET6) */
     867                SET_IP_CF(output, 0);
     868
     869#endif  /* of #if defined(_IP6_CFG) */
    641870
    642871                /* TCP SDU 長を 0 にする。*/
    643                 SET_IP_SDU_SIZE(iph, TCP_HDR_SIZE);
    644 
    645                 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET);
     872                SET_IP_SDU_SIZE(output, TCP_HDR_SIZE);
     873
     874                tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET(output));
    646875
    647876                /* ポート番号を交換する。*/
     
    658887                return;
    659888        else {
    660                 if (tcp_get_segment(&output, cep, 0,
    661                                     0, (uint_t)(net_buf_max_siz() - IF_IP_TCP_HDR_SIZE),
     889                if (tcpn_get_segment(&output, cep, 0,
     890                                    0, (uint_t)net_buf_max_siz(),
    662891                                    NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF) != E_OK)
    663892                        return;
    664                 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET);
     893                tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET(output));
    665894                flags |= TCP_FLG_ACK;
    666895                }
     
    675904         *  チェックサムを設定する。
    676905         */
    677         tcph->sum = IN_CKSUM(output, IPPROTO_TCP, IF_IP_TCP_HDR_OFFSET,
    678                              (uint_t)GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET));
     906        hdr_offset = IF_IP_TCP_HDR_OFFSET(output);
     907        tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset,
     908                             (uint_t)GET_TCP_HDR_SIZE(output, hdr_offset));
    679909
    680910        /* ネットワークバッファ長を調整する。*/
    681         output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET);
     911        output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset);
    682912
    683913#ifdef TCP_CFG_TRACE
     
    690920        IP_OUTPUT(output, TMO_TCP_OUTPUT);
    691921        }
    692 
    693 /*
    694  *  tcp_set_header -- TCP ヘッダを設定する。
    695  */
    696 
    697 void
    698 tcp_set_header (T_NET_BUF *nbuf, T_TCP_CEP *cep, uint_t thoff, uint_t optlen)
    699 {
    700         T_TCP_HDR       *tcph = GET_TCP_HDR(nbuf, thoff);
    701 
    702         /* TCP ヘッダに情報を設定する。*/
    703         tcph->sport     = htons(cep->myaddr.portno);
    704         tcph->dport     = htons(cep->dstaddr.portno);
    705         tcph->doff      = TCP_MAKE_DATA_OFF(TCP_HDR_SIZE + optlen);
    706         tcph->sum       = tcph->flags = 0;
    707         }
    708 
     922#if 0
    709923/*
    710924 *  tcp_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。
     
    712926 *    戻り値       エラーコード
    713927 *    optlen    オプションサイズ、4 オクテット単位
     928 *    maxlen    最大セグメントサイズ(IF/IP/TCP ヘッダサイズを含まない)
    714929 *    len       TCP SDU サイズ
    715930 */
     
    719934                 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout)
    720935{
     936        T_TCP_HDR       *tcph;
    721937        ER              error;
    722938
     
    728944                                     &cep->myaddr.ipaddr,
    729945                                     IPPROTO_TCP, IP_DEFTTL, nbatr, tmout)) != E_OK) {
     946                syslog(LOG_WARNING, "[TCP] NET BUF busy, len: %d, CEP: %d.",
     947                                    (uint16_t)(TCP_HDR_SIZE + optlen + len), GET_TCP_CEPID(cep));
     948                return error;
     949                }
     950
     951        /* TCP ヘッダに情報を設定する。*/
     952
     953        /* TCP ヘッダに情報を設定する。*/
     954        tcph = GET_TCP_HDR(*nbuf, IF_IP_TCP_HDR_OFFSET(*nbuf));
     955        tcph->sport     = htons(cep->myaddr.portno);
     956        tcph->dport     = htons(cep->dstaddr.portno);
     957        tcph->doff      = TCP_MAKE_DATA_OFF(TCP_HDR_SIZE + optlen);
     958        tcph->sum       = tcph->flags = 0;
     959
     960        return E_OK;
     961        }
     962#endif
     963/*
     964 *  tcpn_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。
     965 *
     966 *    戻り値       エラーコード
     967 *    optlen    オプションサイズ、4 オクテット単位
     968 *    maxlen    最大セグメントサイズ(IF/IP/TCP ヘッダサイズを含む)
     969 *    len       TCP SDU サイズ
     970 */
     971
     972ER
     973tcpn_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
     974                 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout)
     975{
     976        T_TCP_HDR       *tcph;
     977        ER              error;
     978
     979        /* IP データグラムを獲得する。*/
     980        if ((error = IN_GET_DATAGRAM(nbuf,
     981                                     (uint_t)(TCP_HDR_SIZE + optlen + len),
     982                                     (uint_t)(maxlen - IF_IP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)),
     983                                     &cep->dstaddr.ipaddr,
     984                                     &cep->myaddr.ipaddr,
     985                                     IPPROTO_TCP, IP_DEFTTL, nbatr, tmout)) != E_OK) {
    730986                syslog(LOG_WARNING, "[TCP] NET BUF busy,  len:%4d, CEP: %d.",
    731987                                    (uint16_t)(TCP_HDR_SIZE + optlen + len), GET_TCP_CEPID(cep));
     
    734990
    735991        /* TCP ヘッダに情報を設定する。*/
    736         tcp_set_header(*nbuf, cep, IF_IP_TCP_HDR_OFFSET, optlen);
     992
     993        /* TCP ヘッダに情報を設定する。*/
     994        tcph = GET_TCP_HDR(*nbuf, IF_IP_TCP_HDR_OFFSET(*nbuf));
     995        tcph->sport     = htons(cep->myaddr.portno);
     996        tcph->dport     = htons(cep->dstaddr.portno);
     997        tcph->doff      = TCP_MAKE_DATA_OFF(TCP_HDR_SIZE + optlen);
     998        tcph->sum       = tcph->flags = 0;
    737999
    7381000        return E_OK;
     
    7611023                                error = E_OBJ;
    7621024                        else {
    763 
     1025                                /* コールバック関数を呼び出す。*/
    7641026#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    765 
    766                                 /* コールバック関数を呼び出す。*/
    7671027                                (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error);
    768 
    769 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    770 
    771                                 /* コールバック関数を呼び出す。*/
     1028#else
    7721029                                (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error);
    773 
    774 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    775 
     1030#endif
    7761031                                error = E_WBLK;
    7771032                                }
     
    7981053                                        error = E_OBJ;
    7991054                                else {
    800 
     1055                                        error = E_OBJ;
     1056
     1057                                        /* コールバック関数を呼び出す。*/
    8011058#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    802 
    803                                         /* コールバック関数を呼び出す。*/
    804                                         (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)E_OBJ);
    805 
    806 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    807 
    808                                         /* コールバック関数を呼び出す。*/
    809                                         error = E_OBJ;
     1059                                        (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error);
     1060#else
    8101061                                        (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error);
    811 
    812 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    813 
     1062#endif
    8141063                                        error = E_WBLK;
    8151064                                        }
     
    8591108                                *error = E_OBJ;
    8601109                        else {
     1110                                /* コールバック関数を呼び出す。*/
    8611111#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    862 
    863                                 /* コールバック関数を呼び出す。*/
    8641112                                (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error);
    865 
    866 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    867 
    868                                 /* コールバック関数を呼び出す。*/
     1113#else
    8691114                                (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error);
    870 
    871 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    872 
     1115#endif
    8731116                                *error = E_WBLK;
    8741117                                }
     
    9001143                                        *error = E_OBJ;
    9011144                                else {
    902 
     1145                                        *error = E_OBJ;
     1146
     1147                                        /* コールバック関数を呼び出す。*/
    9031148#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    904 
    905                                         /* コールバック関数を呼び出す。*/
    906                                         (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)E_OBJ);
    907 
    908 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    909 
    910                                         /* コールバック関数を呼び出す。*/
    911                                         *error = E_OBJ;
     1149                                        (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error);
     1150#else
    9121151                                        (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error);
    913 
    914 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    915 
     1152#endif
    9161153                                        *error = E_WBLK;
    9171154                                        }
     
    9611198                                 *  受信ウィンドバッファキューのネットワークバッファを解放する。
    9621199                                 */
    963 #ifdef TCP_CFG_RWBUF_CSAVE
    964 #endif
    9651200                                syscall(wai_sem(cep->semid_lock));
    9661201                                TCP_FREE_RWBUFQ(cep);
     
    9711206                        }
    9721207                }
    973         else
     1208        else {
    9741209                syscall(clr_flg(cep->rcv_flgid, (FLGPTN)(~TCP_CEP_EVT_RWBUF_READY)));
     1210                }
    9751211
    9761212        return E_OK;
     
    9941230                while (cep->reassq != NULL) {
    9951231                        q = cep->reassq;
    996                         qhdr = GET_TCP_Q_HDR(q, GET_TCP_IP_Q_HDR(q)->thoff);
     1232                        qhdr = GET_TCP_Q_HDR(q, GET_IP_TCP_Q_HDR_OFFSET(q));
    9971233                        if (qhdr->seq != cep->rcv_nxt)
    9981234                                break;
     
    10051241
    10061242                        /* データを受信ウィンドバッファに書き込む。*/
    1007                         TCP_WRITE_RWBUF(cep, q, (uint_t)(GET_TCP_IP_Q_HDR(q)->thoff));
     1243                        TCP_WRITE_RWBUF(cep, q, (uint_t)(GET_IP_TCP_Q_HDR_OFFSET(q)));
    10081244                        }
    10091245                }
     
    10281264
    10291265        /*  TCP ヘッダの位置を保存する。*/
    1030         GET_TCP_IP_Q_HDR(input)->thoff = thoff;
     1266        SET_IP_TCP_Q_HDR_OFFSET(input, thoff);
    10311267
    10321268        /*
     
    10351271         *  このとき、IP のオプション(拡張ヘッダ)と TCP のオプションは削除する。
    10361272         */
    1037         len  = IF_IP_TCP_HDR_SIZE + inqhdr->slen;
     1273        len  = IF_IP_TCP_HDR_SIZE(input) + inqhdr->slen;
    10381274
    10391275        if (len <= MAX_TCP_REALLOC_SIZE) {
     
    10801316         */
    10811317        for (q = cep->reassq, p = NULL; q != NULL; ) {
    1082                 qhdr = GET_TCP_Q_HDR(q, GET_TCP_IP_Q_HDR(q)->thoff);
     1318                qhdr = GET_TCP_Q_HDR(q, GET_IP_TCP_Q_HDR_OFFSET(q));
    10831319                if (SEQ_GT(qhdr->seq, inqhdr->seq))
    10841320                        break;
     
    11061342         */
    11071343        if (p != NULL) {
    1108                 qhdr = GET_TCP_Q_HDR(p, GET_TCP_IP_Q_HDR(p)->thoff);
     1344                qhdr = GET_TCP_Q_HDR(p, GET_IP_TCP_Q_HDR_OFFSET(p));
    11091345                len = qhdr->seq + qhdr->slen - inqhdr->seq;
    11101346                if (len > 0) {
     
    11691405         */
    11701406        while (q != NULL) {
    1171                 qhdr = GET_TCP_Q_HDR(q, GET_TCP_IP_Q_HDR(q)->thoff);
     1407                qhdr = GET_TCP_Q_HDR(q, GET_IP_TCP_Q_HDR_OFFSET(q));
    11721408                len = inqhdr->seq + inqhdr->slen - qhdr->seq;
    11731409                if (len <= 0)
     
    12011437                nq = qhdr->next;
    12021438                if (p)
    1203                         GET_TCP_Q_HDR(p, GET_TCP_IP_Q_HDR(p)->thoff)->next = nq;
     1439                        GET_TCP_Q_HDR(p, GET_IP_TCP_Q_HDR_OFFSET(p))->next = nq;
    12041440                else
    12051441                        cep->reassq = nq;
     
    12131449                }
    12141450        else {
    1215                 inqhdr->next = GET_TCP_Q_HDR(p, GET_TCP_IP_Q_HDR(p)->thoff)->next;
    1216                 GET_TCP_Q_HDR(p, GET_TCP_IP_Q_HDR(p)->thoff)->next = input;
     1451                inqhdr->next = GET_TCP_Q_HDR(p, GET_IP_TCP_Q_HDR_OFFSET(p))->next;
     1452                GET_TCP_Q_HDR(p, GET_IP_TCP_Q_HDR_OFFSET(p))->next = input;
    12171453                }
    12181454
     
    12431479tcp_init_cep (T_TCP_CEP *cep)
    12441480{
     1481
    12451482#ifdef TCP_CFG_RWBUF_CSAVE
    12461483        /*
     
    12551492#endif  /* of #ifdef TCP_CFG_RWBUF_CSAVE */
    12561493
     1494
    12571495        memset((uint8_t*)cep + offsetof(T_TCP_CEP, timer), 0,
    12581496               sizeof(T_TCP_CEP) - offsetof(T_TCP_CEP, timer));
     
    12731511         * ・送受信ウィンドバッファの省コピー機能
    12741512         * ・動的な通信端点の生成・削除機能
     1513         * ・通信端点のネットワーク層プロトコル
    12751514         */
    1276         cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK |
    1277                        TCP_CEP_FLG_DYNAMIC       | TCP_CEP_FLG_VALID);
     1515        cep->flags &= TCP_CEP_FLG_NOT_CLEAR;
    12781516
    12791517        /* セマフォを初期化する。*/
    1280         sig_sem (cep->semid_lock);
     1518        sig_sem(cep->semid_lock);
    12811519
    12821520        /* フラグを初期化する。*/
     
    12921530tcp_notify (T_NET_BUF *input, ER error)
    12931531{
    1294         T_IP_HDR        *iph;
    1295         T_TCP_HDR       *tcph;
    12961532        T_TCP_CEP       *cep;
    12971533
    1298         iph  = GET_IP_HDR(input);
    1299         tcph = GET_TCP_HDR(input, GET_TCP_HDR_OFFSET(input));
    1300 
    1301         if ((cep = tcp_find_cep(&iph->src, tcph->sport, &iph->dst, tcph->dport)) != NULL) {
     1534        if ((cep = tcp_find_cep(input, GET_TCP_HDR_OFFSET(input))) != NULL) {
    13021535
    13031536                /*
     
    13281561
    13291562/*
    1330  *  tcp_find_cep -- ポート番号から TCP 通信端点を得る。
    1331  *
    1332  *    注意: dstaddr は、
    1333  *          TINET-1.2 からネットワークバイトオーダ、
    1334  *          TINET-1.1 までは、ホストバイトオーダ
    1335  */
    1336 
    1337 T_TCP_CEP*
    1338 tcp_find_cep (T_IN_ADDR *dstaddr, uint16_t dstport, T_IN_ADDR *peeraddr, uint16_t peerport)
    1339 {
    1340         T_TCP_CEP*      cep;
    1341        
    1342         /*
    1343          *  状態が SYN 送信済み以後は、
    1344          *  IP アドレスとポート番号が一致する通信端点を探索する。
    1345          */
    1346         for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) {
    1347                 if (cep->fsm_state >= TCP_FSM_SYN_SENT                    &&
    1348                     IN_IS_DSTADDR_ACCEPT (&cep->myaddr.ipaddr,  dstaddr)  &&
    1349                     IN_ARE_NET_ADDR_EQUAL(&cep->dstaddr.ipaddr, peeraddr) &&
    1350                     dstport  == cep->myaddr.portno                        &&
    1351                     peerport == cep->dstaddr.portno)
    1352                         return cep;
    1353                 }
    1354 
    1355         /* 受動オープン中の通信端点を探索する。*/
    1356         for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) {
    1357                 if (cep->fsm_state == TCP_FSM_LISTEN &&
    1358                     IN_IS_DSTADDR_ACCEPT(&cep->myaddr.ipaddr, dstaddr) &&
    1359                     dstport == cep->myaddr.portno)
    1360                         return cep;
    1361                 }
    1362 
    1363         return NULL;
    1364         }
    1365 
    1366 /*
    13671563 *  tcp_lock_cep -- TCP 通信端点をロックする。
    13681564 */
     
    13771573
    13781574        /* TCP 通信端点 ID をチェックする。*/
    1379         if (!VAID_TCP_CEPID(cepid))
     1575        if (!VALID_TCP_CEPID(cepid))
    13801576                return E_ID;
    13811577
     
    14241620
    14251621#ifdef TCP_CFG_TRACE
     1622
     1623/*
     1624 *  トレース出力に用いるシリアルポート番号
     1625 */
    14261626
    14271627#ifndef CONSOLE_PORTID
     
    16241824{
    16251825        SYSTIM          time;
    1626         T_IP_HDR        *iph;
    16271826        T_TCP_HDR       *tcph;
    16281827        char            buf[9];
     
    16321831                return;
    16331832
    1634 #if defined(SUPPORT_INET4)
     1833#if defined(_IP4_CFG)
     1834
     1835#if defined(_IP6_CFG)
     1836
     1837        if (!((TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY) ||
     1838             ((cep->flags & TCP_CEP_FLG_IPV4) &&
     1839              IN6_IS_ADDR_V4MAPPED(&cep->dstaddr.ipaddr) &&
     1840              (ntohl(cep->dstaddr.ipaddr.s6_addr32[3]) == TCP_CFG_TRACE_IPV4_RADDR))))
     1841                return;
     1842
     1843#else   /* of #if defined(_IP6_CFG) */
    16351844
    16361845        if (!(TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY || cep->dstaddr.ipaddr == TCP_CFG_TRACE_IPV4_RADDR))
    16371846                return;
    16381847
    1639 #endif  /* of #if defined(SUPPORT_INET4) */
     1848#endif  /* of #if defined(_IP6_CFG) */
     1849
     1850#endif  /* of #if defined(_IP4_CFG) */
    16401851
    16411852        syscall(wai_sem(SEM_TCP_TRACE));
    16421853        syscall(get_tim(&time));
    1643         iph  = GET_IP_HDR(output);
    16441854        tcph = GET_TCP_HDR(output, GET_TCP_HDR_OFFSET(output));
    16451855        if (time > 99999999)
     
    16481858                trace_printf(CONSOLE_PORTID, "=O%6d.%03d", time / 1000, time % 1000);
    16491859        if (cep == NULL)
    1650                 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:-----");
     1860                trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:--------");
    16511861        else
    1652                 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%05x",
     1862                trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%08x",
    16531863                                             GET_TCP_CEPID(cep),
    16541864                                             tcp_strfsm[cep->fsm_state], cep->flags);
     
    16631873        trace_printf(CONSOLE_PORTID, " w:%5d l:%4d>\n",
    16641874                                     ntohs(tcph->win),
    1665                                      GET_IP_SDU_SIZE(iph) - TCP_HDR_LEN(tcph->doff));
     1875                                     GET_IP_SDU_SIZE(output) - TCP_HDR_LEN(tcph->doff));
    16661876        syscall(sig_sem(SEM_TCP_TRACE));
    16671877        }
     
    16771887{
    16781888        SYSTIM          time;
    1679         T_IP_HDR        *iph;
    16801889        T_TCP_HDR       *tcph;
    16811890        char            buf[9];
     
    16851894                return;
    16861895
    1687 #if defined(SUPPORT_INET4)
     1896#if defined(_IP4_CFG)
     1897
     1898#if defined(_IP6_CFG)
     1899
     1900        if (!((TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY) ||
     1901             ((cep->flags & TCP_CEP_FLG_IPV4) &&
     1902              IN6_IS_ADDR_V4MAPPED(&cep->dstaddr.ipaddr) &&
     1903              (ntohl(cep->dstaddr.ipaddr.s6_addr32[3]) == TCP_CFG_TRACE_IPV4_RADDR))))
     1904                return;
     1905
     1906#else   /* of #if defined(_IP6_CFG) */
    16881907
    16891908        if (!(TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY || cep->dstaddr.ipaddr == TCP_CFG_TRACE_IPV4_RADDR))
    16901909                return;
    16911910
    1692 #endif  /* of #if defined(SUPPORT_INET4) */
     1911#endif  /* of #if defined(_IP6_CFG) */
     1912
     1913#endif  /* of #if defined(_IP4_CFG) */
    16931914
    16941915        syscall(wai_sem(SEM_TCP_TRACE));
    16951916        syscall(get_tim(&time));
    1696         iph  = GET_IP_HDR(input);
    16971917        tcph = GET_TCP_HDR(input, GET_TCP_HDR_OFFSET(input));
    16981918        if (time > 99999999)
     
    17011921                trace_printf(CONSOLE_PORTID, "<I%6d.%03d", time / 1000, time % 1000);
    17021922        if (cep == NULL)
    1703                 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:-----");
     1923                trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:--------");
    17041924        else
    1705                 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%05x",
     1925                trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%08x",
    17061926                                             GET_TCP_CEPID(cep),
    17071927                                             tcp_strfsm[cep->fsm_state], cep->flags);
     
    17121932                trace_printf(CONSOLE_PORTID, " a:%10u s:%10u", tcph->ack, tcph->seq);
    17131933        trace_printf(CONSOLE_PORTID, " w:%5d l:%4d=\n",
    1714                                      tcph->win, GET_IP_SDU_SIZE(iph) - TCP_HDR_LEN(tcph->doff));
     1934                                     tcph->win, GET_IP_SDU_SIZE(input) - TCP_HDR_LEN(tcph->doff));
    17151935        syscall(sig_sem(SEM_TCP_TRACE));
    17161936        }
Note: See TracChangeset for help on using the changeset viewer.