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_input.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 *
     
    9595#include <net/ethernet.h>
    9696#include <net/net.h>
     97#include <net/net_endian.h>
    9798#include <net/net_var.h>
    9899#include <net/net_buf.h>
     
    102103#include <netinet/in.h>
    103104#include <netinet/in_var.h>
    104 #include <netinet6/in6.h>
    105 #include <netinet6/in6_var.h>
    106 #include <netinet6/nd6.h>
    107105#include <netinet/in_itron.h>
    108106#include <netinet/ip.h>
    109107#include <netinet/ip_var.h>
    110 #include <netinet/ip6.h>
    111 #include <netinet6/ip6_var.h>
    112108#include <netinet/ip_icmp.h>
    113109#include <netinet/tcp.h>
    114 #include <netinet/tcp_timer.h>
    115110#include <netinet/tcp_var.h>
    116111#include <netinet/tcp_fsm.h>
    117112#include <netinet/tcp_seq.h>
     113#include <netinet/tcp_timer.h>
    118114
    119115#ifdef SUPPORT_TCP
     
    139135static void close_connection    (T_TCP_CEP *cep, bool_t *needoutput);
    140136static void set_rexmt_timer     (T_TCP_CEP *cep,  T_TCP_TIME rtt);
    141 static uint8_t reassemble               (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, uint8_t flags);
     137static uint8_t reassemble       (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, uint8_t flags);
    142138static ER drop_after_ack        (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff);
    143139static ER listening             (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, T_TCP_SEQ iss);
     
    147143static void trim_length         (T_TCP_HDR *tcph,  T_TCP_CEP *cep);
    148144static void parse_option        (T_TCP_HDR *tcph,  T_TCP_CEP *cep);
    149 static bool_t update_wnd                (T_TCP_HDR *tcph,  T_TCP_CEP *cep);
     145static bool_t update_wnd        (T_TCP_HDR *tcph,  T_TCP_CEP *cep);
    150146static void proc_urg            (T_TCP_HDR *tcph,  T_TCP_CEP *cep);
    151 
    152 #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0
    153 
    154 /*
    155  *  タスクからの Time Wait 状態 CEP 分離機能
    156  */
    157 
    158 /*
    159  *  関数
    160  */
    161 
    162 static T_TCP_TWCEP*tcp_find_twcep (T_IN_ADDR *dstaddr,  uint16_t dstport,
    163                                    T_IN_ADDR *peeraddr, uint16_t peerport);
    164 
    165 /*
    166  *  変数
    167  */
    168 
    169 T_TCP_TWCEP tcp_twcep[NUM_TCP_TW_CEP_ENTRY];
    170 
    171 /*
    172  *  tcp_find_twcep -- ポート番号から Time Wait 用 TCP 通信端点を得る。
    173  *
    174  *    注意: dstaddr は、ネットワークバイトオーダ
    175  */
    176 
    177 static T_TCP_TWCEP*
    178 tcp_find_twcep (T_IN_ADDR *dstaddr, uint16_t dstport, T_IN_ADDR *peeraddr, uint16_t peerport)
    179 {
    180         T_TCP_TWCEP*    twcep;
    181        
    182         /*
    183          *  状態が TIME WAIT で、
    184          *  IP アドレスとポート番号が一致する通信端点を探索する。
    185          */
    186         for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) {
    187                 if (twcep->fsm_state == TCP_FSM_TIME_WAIT                   &&
    188                     IN_IS_DSTADDR_ACCEPT (&twcep->myaddr.ipaddr,  dstaddr)  &&
    189                     IN_ARE_NET_ADDR_EQUAL(&twcep->dstaddr.ipaddr, peeraddr) &&
    190                     dstport  == twcep->myaddr.portno                        &&
    191                     peerport == twcep->dstaddr.portno)
    192                         return twcep;
    193                 }
    194 
    195         return NULL;
    196         }
    197 
    198 /*
    199  *  必要な情報を Time Wait 用 TCP 通信端点に移して、
    200  *  標準の TCP 通信端点を開放する。
    201  */
    202 
    203 void
    204 tcp_move_twcep (T_TCP_CEP *cep)
    205 {
    206         T_TCP_TWCEP*    twcep;
    207 
    208         /* 空きの Time Wait 用 TCP 通信端点を探索する。*/
    209         for (twcep = &tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; twcep -- != tcp_twcep; ) {
    210                 if (twcep->fsm_state != TCP_FSM_TIME_WAIT) {
    211 
    212                         /*
    213                          *  通信端点をロックし、
    214                          *  必要な情報を Time Wait 用 TCP 通信端点に移す。
    215                          */
    216                         syscall(wai_sem(cep->semid_lock));
    217                         twcep->rbufsz           = cep->rbufsz;
    218                         twcep->dstaddr          = cep->dstaddr;
    219                         twcep->myaddr           = cep->myaddr;
    220                         twcep->snd_una          = cep->snd_una;
    221                         twcep->rcv_nxt          = cep->rcv_nxt;
    222                         twcep->rwbuf_count      = cep->rwbuf_count;
    223                         twcep->fsm_state        = cep->fsm_state;
    224                         twcep->timer_2msl       = cep->timer[TCP_TIM_2MSL];
    225 
    226                         /* 通信端点をロックを解除する。*/
    227                         syscall(sig_sem(cep->semid_lock));
    228 
    229                         /* 標準 TCP 通信端点を開放する。*/
    230                         tcp_close(cep);
    231 
    232                         break;
    233                         }
    234                 }
    235         }
    236 
    237 #endif  /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */
    238147
    239148/*
     
    421330
    422331                /*  TCP ヘッダの位置を保存する。*/
    423                 GET_TCP_IP_Q_HDR(input)->thoff = thoff;
     332                SET_IP_TCP_Q_HDR_OFFSET(input, thoff);
    424333
    425334                /* SDU のオフセット(元はウィンドサイズ)をリセットする。*/
     
    448357listening (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, T_TCP_SEQ iss)
    449358{
    450         T_IP_HDR        *iph;
    451359        T_TCP_HDR       *tcph;
    452360
    453         iph  = GET_IP_HDR(input);
    454361        tcph = GET_TCP_HDR(input, thoff);
    455362
     
    473380                return RET_DROP;
    474381
    475 #if defined(SUPPORT_INET4)
    476 
    477 #ifdef SUPPORT_LOOP
    478 
    479382        /*
    480          *  次のときは破棄する。
    481          *    ・ポート番号が同一で、送受信 IP アドレス が同一。
    482          *      ただし、ローカルループバック (127.0.0.1) なら良い。
    483          *    ・マルチキャストアドレス
    484          */
    485 
    486         if (tcph->dport == tcph->sport &&
    487             (iph->dst == iph->src && ntohl(iph->src) != IPV4_ADDR_LOOPBACK))
     383         *  受信可能な IP アドレスとポート番号であることを確認する。
     384         */
     385        if (!tcp_is_addr_accept(input, thoff))
    488386                return RET_DROP;
    489387
    490 #else   /* of #ifdef SUPPORT_LOOP */
    491 
    492         /*
    493          *  次のときは破棄する。
    494          *    ・ポート番号が同一で、送受信 IP アドレス が同一。
    495          *    ・マルチキャストアドレス
    496          */
    497 
    498         if (tcph->dport == tcph->sport && iph->dst == iph->src)
    499                 return RET_DROP;
    500 
    501 #endif  /* of #ifdef SUPPORT_LOOP */
    502 
    503 #endif  /* of #if defined(SUPPORT_INET4) */
    504 
    505 #if defined(SUPPORT_INET6)
    506 
    507         /*
    508          *  次のときは破棄する。
    509          *    ・ポート番号が同一で、送受信 IP アドレス が同一。
    510          *    ・マルチキャストアドレス
    511          */
    512 
    513         if (tcph->dport == tcph->sport && IN_ARE_ADDR_EQUAL(&iph->dst, &iph->src))
    514                 return RET_DROP;
    515 
    516 #endif  /* of #if defined(SUPPORT_INET6) */
    517 
    518         if (IN_IS_NET_ADDR_MULTICAST(&iph->dst))
    519                 return RET_DROP;
    520 
    521388        /* 相手のアドレスを記録する。*/
    522         IN_COPY_TO_HOST(&cep->dstaddr.ipaddr, &iph->src);
     389        IN_COPY_TO_HOST(&cep->dstaddr.ipaddr, input);
    523390        cep->dstaddr.portno = tcph->sport;
    524391
     
    919786                        cep->rep = NULL;
    920787
     788#if defined(_IP6_CFG) && defined(_IP4_CFG)
     789                        cep->rep4 = NULL;
     790#endif
     791
    921792                        syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_ESTABLISHED));
    922793
     
    926797
    927798                                /* 相手のアドレスをコピーする。*/
     799
     800#if defined(_IP6_CFG) && defined(_IP4_CFG)
     801
     802                                if (cep->flags & TCP_CEP_FLG_IPV4) {
     803                                        (*cep->p_dstaddr4).ipaddr = ntohl(cep->dstaddr.ipaddr.s6_addr32[3]);
     804                                        (*cep->p_dstaddr4).portno = cep->dstaddr.portno;
     805                                        }
     806                                else
     807                                        *cep->p_dstaddr = cep->dstaddr;
     808
     809#else   /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     810
    928811                                *cep->p_dstaddr = cep->dstaddr;
     812
     813#endif  /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
    929814
    930815                                if (IS_PTR_DEFINED(cep->callback)) {
     
    13691254        case TCP_FSM_ESTABLISHED:       /* コネクション開設完了           */
    13701255                cep->fsm_state = TCP_FSM_CLOSE_WAIT;
     1256                syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_RWBUF_READY));
    13711257                break;
    13721258
     
    14211307{
    14221308        T_NET_BUF       *input = *inputp;
    1423         T_IP_HDR        *iph;
    14241309        T_TCP_HDR       *tcph;
    14251310        T_TCP_CEP       *cep = NULL;
     
    14421327
    14431328        /* ヘッダ長をチェックする。*/
    1444         if (input->len < IF_IP_TCP_HDR_SIZE) {
     1329        if (input->len < IF_IP_TCP_HDR_SIZE(input)) {
    14451330                NET_COUNT_TCP(net_count_tcp[NC_TCP_RECV_BAD_HEADERS], 1);
    14461331                goto drop;
    14471332                }
    14481333
    1449         iph  = GET_IP_HDR(input);
    14501334        tcph = GET_TCP_HDR(input, *offp);
    14511335
     
    14871371         *  状態が Time Wait 中の CEP を探索する。
    14881372         */
    1489         twcep = tcp_find_twcep(&iph->dst, tcph->dport, &iph->src, tcph->sport);
     1373        twcep = tcp_find_twcep(input, *offp);
    14901374        if (twcep != NULL) {
    14911375
     
    15101394        else
    15111395                /* 標準の TCP 通信端点を得る。*/
    1512                 cep = tcp_find_cep(&iph->dst, tcph->dport, &iph->src, tcph->sport);
     1396                cep = tcp_find_cep(input, *offp);
    15131397
    15141398#else   /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */
    15151399
    15161400        /* TCP 通信端点を得る。*/
    1517         cep = tcp_find_cep(&iph->dst, tcph->dport, &iph->src, tcph->sport);
     1401        cep = tcp_find_cep(input, *offp);
    15181402
    15191403#endif  /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */
     
    18941778         */
    18951779
    1896         if ((tcph->flags & TCP_FLG_RST) || IN_IS_NET_ADDR_MULTICAST(&iph->dst))
     1780        if ((tcph->flags & TCP_FLG_RST) || IN_IS_NET_ADDR_MULTICAST(input))
    18971781                goto drop;
    18981782
     
    19071791                rbfree = cep->rbufsz - cep->rwbuf_count;
    19081792
    1909         if (tcph->flags & TCP_FLG_ACK) {
     1793        if (tcph->flags & TCP_FLG_ACK)
    19101794                tcp_respond(input, cep, 0, tcph->ack, rbfree, TCP_FLG_RST);
    1911                 }
    19121795        else {
    19131796                if (tcph->flags & TCP_FLG_SYN)
Note: See TracChangeset for help on using the changeset viewer.