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

Location:
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet
Files:
15 added
39 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/icmp6.h

    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 *
     
    102102#define _IP_ICMP6_H_
    103103
    104 #ifdef SUPPORT_INET6
    105 
    106104/*
    107105 *  ICMPv6 ヘッダ
     
    117115                uint8_t         data8[4];
    118116                } data;
    119         } __attribute__((packed, aligned(2)))T_ICMP6_HDR;
     117        } __attribute__((packed, aligned(2))) T_ICMP6_HDR;
    120118
    121119#define icmp6_data32                    data.data32
     
    133131#define GET_ICMP6_SDU(nbuf,ihoff)       ((uint8_t*)((nbuf)->buf) + ihoff + ICMP6_HDR_SIZE)
    134132
    135 #define GET_IP6_ICMP6_HDR_SIZE(nbuf)    (GET_IP6_HDR_SIZE(GET_IP6_HDR(nbuf)) + ICMP6_HDR_SIZE)
     133#define GET_IP6_ICMP6_HDR_SIZE(nbuf)    (GET_IP6_HDR_SIZE(nbuf) + ICMP6_HDR_SIZE)
    136134#define GET_IF_IP6_ICMP6_HDR_SIZE(nbuf) (IF_HDR_SIZE + GET_IP6_ICMP6_HDR_SIZE(nbuf))
    137135
     
    218216        T_IN6_ADDR      target;
    219217        /* この後にオプションが続く */
    220         } __attribute__((packed, aligned(2)))T_NEIGHBOR_SOLICIT_HDR;
     218        } T_NEIGHBOR_SOLICIT_HDR;
    221219
    222220#define NEIGHBOR_SOLICIT_HDR_SIZE       (sizeof(T_NEIGHBOR_SOLICIT_HDR))
     
    230228
    231229#define GET_IP6_NEIGHBOR_SOLICIT_HDR_SIZE(nbuf)         \
    232                                         (GET_IP6_HDR_SIZE(GET_IP6_HDR(nbuf)) + NEIGHBOR_SOLICIT_HDR_SIZE)
     230                                        (GET_IP6_HDR_SIZE(nbuf) + NEIGHBOR_SOLICIT_HDR_SIZE)
    233231#define GET_IF_IP6_NEIGHBOR_SOLICIT_HDR_SIZE(nbuf)      \
    234232                                        (GET_IP6_NEIGHBOR_SOLICIT_HDR_SIZE(nbuf) + IF_HDR_SIZE)
     
    242240        T_IN6_ADDR      target;
    243241        /* この後にオプションが続く */
    244         } __attribute__((packed, aligned(2)))T_NEIGHBOR_ADVERT_HDR;
     242        } __attribute__((packed, aligned(2))) T_NEIGHBOR_ADVERT_HDR;
    245243
    246244/* ICMP6 ヘッダのデータ部の定義 */
     
    261259
    262260#define GET_IP6_NEIGHBOR_ADVERT_HDR_SIZE(nbuf)          \
    263                                         (GET_IP6_HDR_SIZE(GET_IP6_HDR(nbuf)) + NEIGHBOR_ADVERT_HDR_SIZE)
     261                                        (GET_IP6_HDR_SIZE(nbuf) + NEIGHBOR_ADVERT_HDR_SIZE)
    264262#define GET_IF_IP6_NEIGHBOR_ADVERT_HDR_SIZE(nbuf)       \
    265263                                        (GET_IP6_NEIGHBOR_ADVERT_HDR_SIZE(nbuf) + IF_HDR_SIZE)
     
    285283/*
    286284 *  ルータ通知
     285 *
     286 *    RFC4291: IP Version 6 Addressing Architecture
     287 *    RFC4941: Privacy Extensions for Stateless Address Autoconfiguration in IPv6
     288 *    RFC6106: IPv6 Router Advertisement Options for DNS Configuration
    287289 */
    288290
     
    292294        uint32_t        retransmit;             /* [ms] 近隣要請送信間隔        */
    293295        /* この後にオプションが続く */
    294         } __attribute__((packed, aligned(2)))T_ROUTER_ADVERT_HDR;
     296        } __attribute__((packed, aligned(2))) T_ROUTER_ADVERT_HDR;
    295297
    296298/* ICMP6 ヘッダのデータ部の定義 */
     
    311313
    312314#define GET_IP6_ROUTER_ADVERT_HDR_SIZE(nbuf)    \
    313                                         (GET_IP6_HDR_SIZE(GET_IP6_HDR(nbuf)) + ROUTER_ADVERT_HDR_SIZE)
     315                                        (GET_IP6_HDR_SIZE(nbuf) + ROUTER_ADVERT_HDR_SIZE)
    314316#define GET_IF_IP6_ROUTER_ADVERT_HDR_SIZE(nbuf) \
    315317                                        (GET_IP6_ROUTER_ADVERT_HDR_SIZE(nbuf) + IF_HDR_SIZE)
     
    324326
    325327/*
     328 *  M: RA以外の方法で自動的にアドレスを設定することを許可する。
     329 *  O: RA以外の方法で自動的にアドレス以外の情報を設定することをを許可する。
     330 *
     331 *   M   O
     332 *  ON  ON      アドレスとそれ以外の情報をDHCPv6で設定する(statefull)
     333 *  ON  OFF     アドレスはDHCPv6で設定するが、それ以外は手動で設定する。
     334 *  OFF ON      アドレスは RA で設定するが、それ以外の情報をDHCPv6で設定する(stateless)
     335 *  OFF OFF     DHCPv6 は使用しない。
     336 */
     337
     338/*
    326339 *  ルータ要請
    327340 */
     
    329342typedef struct t_router_solicit_hdr {
    330343        T_ICMP6_HDR     hdr;
    331         } __attribute__((packed, aligned(2)))T_ROUTER_SOLICIT_HDR;
     344        } __attribute__((packed, aligned(2))) T_ROUTER_SOLICIT_HDR;
    332345
    333346/* ICMP6 ヘッダのデータ部の定義 */
     
    347360
    348361#define GET_IP6_ROUTER_SOLICIT_HDR_SIZE(nbuf)           \
    349                                         (GET_IP6_HDR_SIZE(GET_IP6_HDR(nbuf)) + ROUTER_SOLICIT_HDR_SIZE)
     362                                        (GET_IP6_HDR_SIZE(nbuf) + ROUTER_SOLICIT_HDR_SIZE)
    350363#define GET_IF_IP6_ROUTER_SOLICIT_HDR_SIZE(nbuf)        \
    351364                                        (GET_IP6_ROUTER_SOLICIT_HDR_SIZE(nbuf) + IF_HDR_SIZE)
     
    360373        T_ICMP6_HDR     hdr;
    361374        T_IN6_ADDR      target;
    362         } __attribute__((packed, aligned(2)))T_NEIGHBOR_HDR;
     375        } __attribute__((packed, aligned(2))) T_NEIGHBOR_HDR;
    363376
    364377/* 近隣探索オプションヘッダ */
     
    367380        uint8_t         type;                   /* オプションタイプ                     */
    368381        uint8_t         len;                    /* オプション長、単位は 8 バイト     */
    369         } __attribute__((packed, aligned(2)))T_ND_OPT_HDR;
     382        } __attribute__((packed, aligned(2))) T_ND_OPT_HDR;
    370383
    371384#define ND_OPT_HDR_SIZE                 (sizeof(T_ND_OPT_HDR))
     
    393406        uint32_t        reserved;
    394407        T_IN6_ADDR      prefix;         /* プレフィックス              */
    395         } __attribute__((packed, aligned(2)))T_ND_OPT_PREFIX_INFO;
     408        } __attribute__((packed, aligned(2))) T_ND_OPT_PREFIX_INFO;
    396409
    397410#define ND_OPT_PI_FLAG_ONLINK   UINT_C(0x80)            /* オンリンクプレフィックス */
     
    405418        uint16_t        reserved;
    406419        uint32_t        mtu;            /* MTU                          */
    407         } __attribute__((packed, aligned(2)))T_ND_OPT_MTU_HDR;
     420        } __attribute__((packed, aligned(2))) T_ND_OPT_MTU_HDR;
    408421
    409422/*
     
    416429        T_IN6_ADDR      dst;            /* 向け直しの終点アドレス          */
    417430        /* この後にオプションが続く */
    418         } __attribute__((packed, aligned(2)))T_ND_REDIRECT_HDR;
     431        } __attribute__((packed, aligned(2))) T_ND_REDIRECT_HDR;
    419432
    420433#define ND_REDIRECT_HDR_SIZE            (sizeof(T_ND_REDIRECT_HDR))
     
    480493#endif  /* of #ifdef ICMP_CFG_CALLBACK_ECHO_REPLY */
    481494
    482 #endif  /* of #ifdef SUPPORT_INET6 */
    483 
    484495#endif  /* of #ifndef _IP_ICMP6_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/icmp_var.h

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.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 *
     
    9494#include <net/if_arp.h>
    9595#include <net/net.h>
     96#include <net/net_endian.h>
    9697#include <net/net_buf.h>
    9798#include <net/net_var.h>
     
    106107#include <net/if_var.h>
    107108
    108 #if defined(SUPPORT_INET4) && defined(SUPPORT_ETHER)
     109#if defined(_IP4_CFG) && defined(SUPPORT_ETHER)
    109110
    110111/*
     
    118119 */
    119120
    120 static T_ARP_ENTRY *arp_lookup (T_IN4_ADDR addr, bool_t create);
    121121static void in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input);
    122122static void arp_timer (void *ignore);
    123123
    124124/*
     125 *  in_arpinput -- TCP/IP 用 ARP の入力関数
     126 */
     127
     128static void
     129in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input)
     130{
     131        T_NET_BUF       *pending;
     132        T_ETHER_HDR     *eth;
     133        T_ARP_HDR       *arph;
     134        T_ETHER_ARP_HDR *et_arph;
     135        T_ARP_ENTRY     *ent;
     136        T_IFNET         *ifp = IF_GET_IFNET();
     137        T_IN4_ADDR      saddr, taddr;
     138
     139        et_arph = GET_ETHER_ARP_HDR(input);
     140
     141        ntoahl(saddr, et_arph->sproto);         /* 送信元 IP アドレス  */
     142        ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
     143
     144        /*
     145         *  以下の場合はエラー
     146         *    ・送信ホストの物理アドレスが自分
     147         *    ・送信ホストの物理アドレスがブロードキャスト
     148         */
     149        if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
     150            memcmp(et_arph->shost, ether_broad_cast_addr, ETHER_ADDR_LEN) == 0)
     151                goto err_ret;
     152
     153        /*
     154         *  送信ホストの IP アドレスが自分の場合は、重複しているので
     155         *  相手にも知らせる。
     156         *  ただし、自分と相手のアドレスが未定義(IPV4_ADDRANY)の時は何もしない。
     157         */
     158        if ((saddr == ifp->in4_ifaddr.addr) && (saddr != IPV4_ADDRANY)) {
     159
     160#ifdef ARP_CFG_CALLBACK_DUPLICATED
     161
     162                if (arp_callback_duplicated(et_arph->shost)) {
     163                        syslog(LOG_ERROR, "[ARP] IP address duplicated: %s",
     164                                          ip2str(NULL, &ifp->in4_ifaddr.addr),
     165                                          mac2str(NULL, et_arph->shost));
     166                        taddr = saddr;
     167                        goto reply;
     168                        }
     169                else
     170                        goto buf_rel;
     171
     172#else   /* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
     173
     174                syslog(LOG_ERROR, "[ARP] IP address duplicated: %s",
     175                                  ip2str(NULL, &ifp->in4_ifaddr.addr),
     176                                  mac2str(NULL, et_arph->shost));
     177                taddr = saddr;
     178                goto reply;
     179
     180#endif  /* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
     181
     182                }
     183
     184        /*
     185         *  以下の場合は何もしない。
     186         *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
     187         *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
     188         *      解決も行っているが、本実装では、自分以外の IP
     189         *      アドレスの解決は行わない。
     190         */
     191        if (taddr != ifp->in4_ifaddr.addr)
     192                goto buf_rel;
     193
     194        /*
     195         *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
     196         *  キャッシュになければ、新たにエントリを登録する。
     197         */
     198        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
     199        ent = arp_lookup(saddr, true);
     200
     201        memcpy(ent->mac_addr, et_arph->shost, ETHER_ADDR_LEN);
     202        ent->expire = ARP_CACHE_KEEP;
     203
     204        /*
     205         *  送信がペンデングされているフレームがあれば送信する。
     206         */
     207        if (ent->hold) {
     208
     209                /* フレームの Ethernet ヘッダを設定する。*/
     210                memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
     211
     212                pending = ent->hold;
     213                ent->hold = NULL;
     214                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
     215
     216                /* ペンディングされているフレームを送信する。*/
     217                IF_RAW_OUTPUT(pending, TMO_FEVR);
     218
     219                }
     220        else
     221                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
     222
     223reply:
     224
     225        arph = GET_ARP_HDR(input);
     226
     227        /* アドレス解決要求でなければ終了 */
     228        if (ntohs(arph->opcode) != ARPOP_REQUEST)
     229                goto buf_rel;
     230
     231        /* Ethernet ARP ヘッダを設定する。*/
     232        memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
     233        memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
     234        memcpy(et_arph->tproto, (uint8_t*)&et_arph->sproto, sizeof(T_IN_ADDR));
     235        ahtonl(et_arph->sproto, taddr);
     236
     237        /* Ethernet ARP ヘッダを設定する。*/
     238        arph->opcode = htons(ARPOP_REPLY);
     239
     240        /* Ethernet ヘッダを設定する。*/
     241        eth = GET_ETHER_HDR(input);
     242        memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
     243        memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
     244
     245        /* ARP 応答を送信する。*/
     246        IF_RAW_OUTPUT(input, TMO_FEVR);
     247        return;
     248
     249err_ret:
     250        NET_COUNT_ARP(net_count_arp.in_err_packets, 1);
     251buf_rel:
     252        syscall(rel_net_buf(input));
     253        }
     254
     255/*
     256 *  arp_timer -- ARP キャッシュの更新
     257 */
     258
     259static void
     260arp_timer (void *ignore)
     261{
     262        int_t   ix;
     263
     264        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
     265
     266        for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
     267                if (arp_cache[ix].expire) {
     268                        arp_cache[ix].expire -= ARP_TIMER_TMO;
     269                        if (arp_cache[ix].expire == 0) {
     270                                /* 送信がペンデングされているフレームがあれば捨てる。*/
     271                                if (arp_cache[ix].hold) {
     272                                        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
     273                                        syscall(rel_net_buf(arp_cache[ix].hold));
     274                                        }
     275                                memset(&arp_cache[ix], 0, sizeof(T_ARP_ENTRY));
     276                                }
     277                        }
     278                }
     279
     280        syscall(sig_sem(SEM_ARP_CACHE_LOCK));
     281        timeout(arp_timer, NULL, ARP_TIMER_TMO);
     282        }
     283
     284/*
    125285 *  arp_lookup -- ARP キャッシュの探索と登録
    126286 *
     
    128288 */
    129289
    130 static T_ARP_ENTRY *
     290T_ARP_ENTRY *
    131291arp_lookup (T_IN4_ADDR addr, bool_t create)
    132292{
     
    170330
    171331/*
    172  *  in_arpinput -- TCP/IP 用 ARP の入力関数
    173  */
    174 
    175 static void
    176 in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input)
    177 {
    178         T_NET_BUF       *pending;
    179         T_ETHER_HDR     *eth;
    180         T_ARP_HDR       *arph;
    181         T_ETHER_ARP_HDR *et_arph;
    182         T_ARP_ENTRY     *ent;
    183         T_IFNET         *ifp = IF_GET_IFNET();
    184         T_IN4_ADDR      saddr, taddr;
    185 
    186         et_arph = GET_ETHER_ARP_HDR(input);
    187 
    188         ntoahl(saddr, et_arph->sproto);         /* 送信元 IP アドレス  */
    189         ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
    190 
    191         /*
    192          *  以下の場合はエラー
    193          *    ・送信ホストの物理アドレスが自分
    194          *    ・送信ホストの物理アドレスがブロードキャスト
    195          */
    196         if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
    197             memcmp(et_arph->shost, ether_broad_cast_addr, ETHER_ADDR_LEN) == 0)
    198                 goto err_ret;
    199 
    200         /*
    201          *  送信ホストの IP アドレスが自分の場合は、重複しているので
    202          *  相手にも知らせる。
    203          */
    204         if (saddr == ifp->in_ifaddr.addr) {
    205 
    206 #ifdef ARP_CFG_CALLBACK_DUPLICATED
    207 
    208                 if (arp_callback_duplicated(et_arph->shost)) {
    209                         syslog(LOG_ERROR, "[ARP] IP address duplicated: %s", mac2str(NULL, et_arph->shost));
    210                         taddr = saddr;
    211                         goto reply;
    212                         }
    213                 else
    214                         goto buf_rel;
    215 
    216 #else   /* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
    217 
    218                 syslog(LOG_ERROR, "[ARP] IP address duplicated: %s", mac2str(NULL, et_arph->shost));
    219                 taddr = saddr;
    220                 goto reply;
    221 
    222 #endif  /* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
    223 
    224                 }
    225 
    226         /*
    227          *  以下の場合は何もしない。
    228          *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
    229          *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
    230          *      解決も行っているが、本実装では、自分以外の IP
    231          *      アドレスの解決は行わない。
    232          */
    233         if (taddr != ifp->in_ifaddr.addr)
    234                 goto buf_rel;
    235 
    236         /*
    237          *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
    238          *  キャッシュになければ、新たにエントリを登録する。
    239          */
    240         syscall(wai_sem(SEM_ARP_CACHE_LOCK));
    241         ent = arp_lookup(saddr, true);
    242 
    243         memcpy(ent->mac_addr, et_arph->shost, ETHER_ADDR_LEN);
    244         ent->expire = ARP_CACHE_KEEP;
    245 
    246         /*
    247          *  送信がペンデングされているフレームがあれば送信する。
    248          */
    249         if (ent->hold) {
    250 
    251                 /* フレームの Ethernet ヘッダを設定する。*/
    252                 memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
    253 
    254                 pending = ent->hold;
    255                 ent->hold = NULL;
    256                 syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    257 
    258                 /* ペンディングされているフレームを送信する。*/
    259                 IF_RAW_OUTPUT(pending, TMO_FEVR);
    260 
    261                 }
    262         else
    263                 syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    264 
    265 reply:
    266 
    267         arph = GET_ARP_HDR(input);
    268 
    269         /* アドレス解決要求でなければ終了 */
    270         if (ntohs(arph->opcode) != ARPOP_REQUEST)
    271                 goto buf_rel;
    272 
    273         /* Ethernet ARP ヘッダを設定する。*/
    274         memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
    275         memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
    276         memcpy(et_arph->tproto, (uint8_t*)&et_arph->sproto, sizeof(T_IN_ADDR));
    277         ahtonl(et_arph->sproto, taddr);
    278 
    279         /* Ethernet ARP ヘッダを設定する。*/
    280         arph->opcode = htons(ARPOP_REPLY);
    281 
    282         /* Ethernet ヘッダを設定する。*/
    283         eth = GET_ETHER_HDR(input);
    284         memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
    285         memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
    286 
    287         /* ARP 応答を送信する。*/
    288         IF_RAW_OUTPUT(input, TMO_FEVR);
    289         return;
    290 
    291 err_ret:
    292         NET_COUNT_ARP(net_count_arp.in_err_packets, 1);
    293 buf_rel:
    294         syscall(rel_net_buf(input));
    295         }
    296 
    297 /*
    298  *  arp_timer -- ARP キャッシュの更新
    299  */
    300 
    301 static void
    302 arp_timer (void *ignore)
    303 {
    304         int_t   ix;
    305 
    306         syscall(wai_sem(SEM_ARP_CACHE_LOCK));
    307 
    308         for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
    309                 if (arp_cache[ix].expire) {
    310                         arp_cache[ix].expire -= ARP_TIMER_TMO;
    311                         if (arp_cache[ix].expire == 0) {
    312                                 /* 送信がペンデングされているフレームがあれば捨てる。*/
    313                                 if (arp_cache[ix].hold) {
    314                                         NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
    315                                         syscall(rel_net_buf(arp_cache[ix].hold));
    316                                         }
    317                                 memset(&arp_cache[ix], 0, sizeof(T_ARP_ENTRY));
    318                                 }
    319                         }
    320                 }
    321 
    322         syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    323         timeout(arp_timer, NULL, ARP_TIMER_TMO);
    324         }
    325 
    326 /*
    327332 *  arp_request -- MAC アドレス解決要求
    328333 */
     
    359364                /* イーサネット ARP ヘッダを設定する。*/
    360365                et_arph = GET_ETHER_ARP_HDR(arp_req);
    361                 src     = IF_GET_IFNET()->in_ifaddr.addr;
     366                src     = IF_GET_IFNET()->in4_ifaddr.addr;
    362367                memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
    363368                memset(et_arph->thost, 0,              ETHER_ADDR_LEN);
     
    444449         */
    445450        if (gw == IPV4_ADDR_BROADCAST ||
    446             gw == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask)) {
     451            gw == ((ifp->in4_ifaddr.addr & ifp->in4_ifaddr.mask) | ~ifp->in4_ifaddr.mask)) {
    447452                memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN);
    448453                return true;
     
    504509        eaddr->lladdr[1] = UINT_C(0x00);
    505510        eaddr->lladdr[2] = UINT_C(0x5E);
    506         eaddr->lladdr[3] = (maddr & 0x7F0000) >> 16;
    507         eaddr->lladdr[4] = (maddr & 0xFF00) >> 8;
    508         eaddr->lladdr[5] = maddr & 0xFF;
     511        eaddr->lladdr[3] = (uint8_t)((maddr & 0x7F0000) >> 16);
     512        eaddr->lladdr[4] = (uint8_t)((maddr & 0xFF00) >> 8);
     513        eaddr->lladdr[5] = (uint8_t)(maddr & 0xFF);
    509514        }
    510515#endif  /* ETHER_CFG_MULTICAST */
    511516
    512 #endif  /* of #if defined(SUPPORT_INET4) && defined(SUPPORT_ETHER) */
     517#endif  /* of #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.cfg

    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 *
     
    3636 */
    3737
    38 #ifdef SUPPORT_ETHER
     38#if defined(_IP4_CFG) && defined(SUPPORT_ETHER)
    3939
    4040/* ARP キャッシュ更新用セマフォ */
     
    4242CRE_SEM(SEM_ARP_CACHE_LOCK, { TA_TPRI, 1, 1 });
    4343
    44 #endif  /* of #ifdef SUPPORT_ETHER */
     44#endif  /* of #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.h

    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 *
     
    106106 */
    107107
     108extern T_ARP_ENTRY *arp_lookup (T_IN4_ADDR addr, bool_t create);
    108109extern ER arp_request (T_IF_ADDR *ifaddr, T_IN4_ADDR dst);
    109110extern void arp_input (T_IF_ADDR *ifaddr, T_NET_BUF *input);
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in.h

    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 *
     
    7373#include <tinet_kernel_defs.h>
    7474
     75#include <netinet/in4.h>
    7576#include <netinet6/in6.h>
    7677
     
    7980 */
    8081
    81 #define TINET_PRVER             UINT_C(0x1054)  /* TINET のバージョン番号 */
     82#define TINET_PRVER             UINT_C(0x1070)  /* TINET のバージョン番号 */
    8283
    8384/*
     
    9293#define IPPROTO_HOPOPTS         UINT_C(0)       /* IPv6 中継点 (Hop-by-Hop) オプション  */
    9394#define IPPROTO_ICMP            UINT_C(1)       /* ICMP                                 */
     95#define IPPROTO_IGMP            UINT_C(2)       /* IGMP                                 */
    9496#define IPPROTO_TCP             UINT_C(6)       /* TCP                                  */
    9597#define IPPROTO_UDP             UINT_C(17)      /* UDP                                  */
     
    107109
    108110/*
    109  *  IPv4 アドレス
     111 *  ポートの長さ
    110112 */
    111113
    112 /* 前方参照 */
    113 
    114 #ifndef T_IN4_ADDR_DEFINED
    115 
    116 typedef uint32_t T_IN4_ADDR;
    117 
    118 #define T_IN4_ADDR_DEFINED
    119 
    120 #endif  /* of #ifndef T_IN4_ADDR_DEFINED */
    121 
    122 /*
    123  *  ITRON TCP/IPv4 アドレス/ポート番号の定義
    124  */
    125 
    126 typedef struct t_ipv4ep {
    127         uint32_t        ipaddr;         /* IPv4 アドレス    */
    128         uint16_t        portno;         /* ポート番号                */
    129         } T_IPV4EP;
    130 
    131 /*
    132  *  アドレス/ポートの長さ
    133  */
    134 
    135 #define IPV4_ADDR_LEN           4
    136114#define PORT_NUM_LEN            2
    137115
     
    152130
    153131/*
    154  *  IP アドレスの定義
     132 *  API IPプロトコルの指定
    155133 */
    156134
    157 #define IPV4_ADDRANY            ULONG_C(0x00000000)     /* ITRON TCP/IP 標準      */
    158 
    159 #define IPV4_ADDR_LOOPBACK      ULONG_C(0x7f000001)
    160 #define IPV4_ADDR_LOOPBACK_MASK IPV4_CLASS_A_MASK
    161 #define IPV4_ADDR_BROADCAST     ULONG_C(0xffffffff)
    162 
    163 #define IPV4_CLASS_A(i)         (((i) & ULONG_C(0x80000000)) == 0)
    164 #define IPV4_CLASS_A_NET        ULONG_C(0xff000000)
    165 #define IPV4_CLASS_A_MASK       ULONG_C(0xff000000)
    166 #define IPV4_CLASS_A_HOST       ULONG_C(0x00ffffff)
    167 
    168 #define IPV4_CLASS_B(i)         (((i) & ULONG_C(0xc0000000)) == ULONG_C(0x80000000))
    169 #define IPV4_CLASS_B_NET        ULONG_C(0xffff0000)
    170 #define IPV4_CLASS_B_MASK       ULONG_C(0xffff0000)
    171 #define IPV4_CLASS_B_HOST       ULONG_C(0x0000ffff)
    172 
    173 #define IPV4_CLASS_C(i)         (((i) & ULONG_C(0xe0000000)) == ULONG_C(0xc0000000))
    174 #define IPV4_CLASS_C_NET        ULONG_C(0xffffff00)
    175 #define IPV4_CLASS_C_MASK       ULONG_C(0xffffff00)
    176 #define IPV4_CLASS_C_HOST       ULONG_C(0x000000ff)
    177 
    178 #define IPV4_CLASS_D(i)         (((i) & ULONG_C(0xf0000000)) == ULONG_C(0xe0000000))
    179 
    180 #define IN4_IS_ADDR_MULTICAST(i)        IPV4_CLASS_D(i)
    181 
    182 #define MAKE_IPV4_LOCAL_BROADCAST(i)    (IPV4_CLASS_A(i)?((i)|IPV4_CLASS_A_HOST):\
    183                                          IPV4_CLASS_B(i)?((i)|IPV4_CLASS_B_HOST):\
    184                                          IPV4_CLASS_C(i)?((i)|IPV4_CLASS_C_HOST):\
    185                                          IPV4_ADDR_BROADCAST)
    186 
    187 #define MAKE_IPV4_LOCAL_MASK(i)         (IPV4_CLASS_A(i)?IPV4_CLASS_A_MASK:\
    188                                          IPV4_CLASS_B(i)?IPV4_CLASS_B_MASK:\
    189                                          IPV4_CLASS_C(i)?IPV4_CLASS_C_MASK:\
    190                                          IPV4_ADDRANY)
    191 
    192 #define MAKE_IPV4_ADDR(a,b,c,d)         ((T_IN4_ADDR)(((uint32_t)(a)<<24)|((uint32_t)(b)<<16)|((uint32_t)(c)<<8)|(d)))
     135#define API_PROTO_IPVn                  'n'
     136#define API_PROTO_IPV6                  '6'
     137#define API_PROTO_IPV4                  '4'
    193138
    194139/*
    195  *  動的生成用 TCP 通信端点
     140 *  動的生成用 TCP/IPv6 通信端点
    196141 */
    197142
    198 typedef struct t_tcp_ccep {
    199         /* 標準 */
    200         ATR             cepatr;         /* 通信端点属性                       */
    201         void            *sbuf;          /* 送信用ウィンドバッファ  */
    202         int_t           sbufsz;         /* 送信用ウィンドバッファサイズ       */
    203         void            *rbuf;          /* 受信用ウィンドバッファ  */
    204         int_t           rbufsz;         /* 受信用ウィンドバッファサイズ       */
    205         FP              callback;       /* コールバック                       */
    206         /* 実装依存 */
    207         } T_TCP_CCEP;
     143#define T_TCP6_CCEP                     T_TCP_CCEP
    208144
    209145/*
    210  *  動的生成用 TCP 受付口
     146 *  バイトオーダ関数の定義
     147 *
     148 *    tinet/net/net.h でもバイトオーダの定義を行っているが、
     149 *    tinet/net/net.h をインクルードしない
     150 *    アプリケーションプログラム用に
     151 *    ターゲット依存しないバイトオーダ関数を定義する。
    211152 */
    212153
    213 #if defined(SUPPORT_INET4)
     154#if defined(_NET_CFG_BYTE_ORDER)
    214155
    215 typedef struct t_tcp_crep {
    216         /* 標準 */
    217         ATR             repatr;         /* 受付口属性                */
    218         T_IPV4EP        myaddr;         /* 自分のアドレス      */
    219         /* 実装依存 */
    220         } T_TCP_CREP;
     156/*  tinet/net/net.h をインクルードしている。*/
    221157
    222 #endif  /* of #if defined(SUPPORT_INET4) */
     158#else   /* of #if defined(_NET_CFG_BYTE_ORDER) */
    223159
    224 /*
    225  *  動的生成用 UDP 通信端点
    226  */
     160extern uint16_t ntohs (uint16_t net);
     161extern uint16_t htons (uint16_t host);
     162extern uint32_t ntohl (uint32_t net);
     163extern uint32_t htonl (uint32_t host);
    227164
    228 #if defined(SUPPORT_INET4)
     165#define NTOHS(n)        (n=ntohs(n))
     166#define HTONS(h)        (h=htons(h))
     167#define NTOHL(n)        (n=ntohl(n))
     168#define HTONL(h)        (h=htonl(h))
    229169
    230 typedef struct t_udp_ccep {
    231         /* 標準 */
    232         ATR             cepatr;         /* UDP 通信端点属性           */
    233         T_IPV4EP        myaddr;         /* 自分のアドレス              */
    234         FP              callback;       /* コールバック関数             */
    235         /* 実装依存 */
    236         } T_UDP_CCEP;
    237 
    238 #endif  /* of #if defined(SUPPORT_INET4) */
    239 
    240 /*
    241  *  IPv4 と IPv6 をコンパイル時に選択するためのマクロ
    242  */
    243 
    244 #if defined(SUPPORT_INET4)
    245 
    246 #define T_IN_ADDR                       T_IN4_ADDR
    247 #define T_IPEP                          T_IPV4EP
    248 #define IP_ADDRANY                      IPV4_ADDRANY
    249 
    250 #define IN_ARE_ADDR_EQUAL(n,h)          (*(n)==*(h))
    251 #define IN_ARE_NET_ADDR_EQUAL(n,h)      (ntohl(*(n))==*(h))
    252 #define IN_COPY_TO_NET(d,s)             (*(d)=htonl(*(s)))
    253 #define IN_COPY_TO_HOST(d,s)            (*(d)=ntohl(*(s)))
    254 #define IN_IS_ADDR_MULTICAST(a)         IN4_IS_ADDR_MULTICAST(*(a))
    255 #define IN_IS_NET_ADDR_MULTICAST(a)     IN4_IS_ADDR_MULTICAST(ntohl(*(a)))
    256 #define IN_IS_ADDR_ANY(a)               (*(a)==IPV4_ADDRANY)
    257 
    258 #endif  /* of #if defined(SUPPORT_INET4) */
     170#endif  /* of #if defined(_NET_CFG_BYTE_ORDER) */
    259171
    260172/*
     
    264176extern const char *in_strtfn (FN fncd);
    265177
    266 #if defined(SUPPORT_INET4)
    267 
    268 extern ER in4_add_ifaddr (T_IN4_ADDR addr, T_IN4_ADDR mask);
    269 extern ER in4_add_route (int_t index, T_IN4_ADDR target,
    270                                       T_IN4_ADDR mask, T_IN4_ADDR gateway);
    271 extern char *ip2str (char *buf, const T_IN4_ADDR *p_ipaddr);
    272 extern const T_IN4_ADDR *in4_get_ifaddr (int_t index);
    273 
    274 #endif  /* of #if defined(SUPPORT_INET4) */
    275 
    276178#endif  /* of #ifndef _IN_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_itron.h

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_rename.h

    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 *
     
    6666#define tcp_drop                _tinet_tcp_drop
    6767#define tcp_respond             _tinet_tcp_respond
    68 #define tcp_set_header          _tinet_tcp_set_header
    6968#define tcp_get_segment         _tinet_tcp_get_segment
    7069#define tcp_rexmt_val           _tinet_tcp_rexmt_val
    7170#define tcp_init_cep            _tinet_tcp_init_cep
    7271#define tcp_notify              _tinet_tcp_notify
    73 #define tcp_find_cep            _tinet_tcp_find_cep
    7472#define tcp_alloc_auto_port     _tinet_tcp_alloc_auto_port
    7573#define tcp_alloc_port          _tinet_tcp_alloc_port
     
    8381#define tcp_output_trace        _tinet_tcp_output_trace
    8482#define tcp_input_trace         _tinet_tcp_input_trace
     83#define tcp_find_cep            _tinet_tcp_find_cep
     84#define tcp_find_twcep          _tinet_tcp_find_twcep
     85#define tcp_is_addr_accept      _tinet_tcp_is_addr_accept
     86#define tcp_move_twcep          _tinet_tcp_move_twcep
     87#define tcpn_get_segment        _tinet_tcpn_get_segment
    8588
    8689/* netinet/tcp_subr_cs.c */
     
    136139/* tcp_cfg.c */
    137140
    138 #define tcp_rep                 _tinet_tcp_rep
     141#define tcp6_rep                _tinet_tcp6_rep
     142#define tcp4_rep                _tinet_tcp4_rep
    139143#define tcp_cep                 _tinet_tcp_cep
    140144#define tcp_twcep               _tinet_tcp_twcep
     
    146150/* netinet/udp_input.c */
    147151
    148 #define udp_input               _tinet_udp_input
     152#define udp6_reply_no_port      _tinet_udp6_reply_no_port
     153#define udp6_input_select       _tinet_udp6_input_select
     154#define udp6_input              _tinet_udp6_input
     155#define udp4_reply_no_port      _tinet_udp4_reply_no_port
     156#define udp4_input_select       _tinet_udp4_input_select
     157#define udp4_input              _tinet_udp4_input
    149158
    150159/* netinet/udp_subr.c */
    151160
    152 #define udp_alloc_port          _tinet_udp_alloc_port
    153 #define udp_alloc_auto_port     _tinet_udp_alloc_auto_port
     161#define udp6_alloc_port         _tinet_udp6_alloc_port
     162#define udp6_alloc_auto_port    _tinet_udp6_alloc_auto_port
     163#define udp6_notify             _tinet_udp6_notify
     164#define udp6_find_cep           _tinet_udp6_find_cep
     165#define udp4_alloc_port         _tinet_udp4_alloc_port
     166#define udp4_alloc_auto_port    _tinet_udp4_alloc_auto_port
     167#define udp4_notify             _tinet_udp4_notify
     168#define udp4_find_cep           _tinet_udp4_find_cep
    154169
    155170/* netinet/udp_usrreq.c */
     
    164179/* udp_cfg.c */
    165180
    166 #define udp_cep                 _tinet_udp_cep
     181#define udp6_cep                _tinet_udp6_cep
     182#define udp4_cep                _tinet_udp4_cep
    167183#define tmax_udp_cepid          _tinet_tmax_udp_cepid
    168184#define tmax_udp_ccepid         _tinet_tmax_udp_cepid   /* TINET 1.3 との互換性のための定義 */
     
    188204/* netinet/in_subr.c */
    189205
     206#define inn_addrwithifp         _tinet_inn_addrwithifp
     207#define in_cksum_carry          _tinet_in_cksum_carry
     208#define inn_is_addr_multicast   _tinet_inn_is_addr_multicast
     209#define inn_get_datagram        _tinet_inn_get_datagram
     210#define inn_is_dstaddr_accept   _tinet_inn_is_dstaddr_accept
     211#define ip_exchg_addr           _tinet_ip_exchg_addr
     212#define inn_copy_to_host        _tinet_inn_copy_to_host
     213#define in_cksum_sum            _tinet_in_cksum_sum
     214#define inn_are_net_srcaddr_equal       \
     215                                _tinet_inn_are_net_srcaddr_equal
     216
     217/* netinet/in4_subr.c */
     218
     219#define in4_add_ifaddr          _tinet_in4_add_ifaddr
    190220#define in4_set_header          _tinet_in4_set_header
     221#define inn4_is_dstaddr_accept  _tinet_inn4_is_dstaddr_accept
     222#define in4_rtredirect          _tinet_in4_rtredirect
     223#define in_rtnewentry           _tinet_in_rtnewentry
     224#define in_cksum                _tinet_in_cksum
     225#define in4_addrwithifp         _tinet_in4_addrwithifp
     226#define in4_rtalloc             _tinet_in4_rtalloc
     227#define in4_init                _tinet_in4_init
     228#define in_rttimer              _tinet_in_rttimer
     229#define in4_get_ifaddr          _tinet_in4_get_ifaddr
    191230#define in4_get_datagram        _tinet_in4_get_datagram
     231#define in4_is_dstaddr_accept   _tinet_in4_is_dstaddr_accept
    192232#define in4_cksum               _tinet_in4_cksum
    193 #define in4_rtalloc             _tinet_in4_rtalloc
    194 #define in4_rtredirect          _tinet_in4_rtredirect
    195 #define in4_init                _tinet_in4_init
    196 #define in4_is_dstaddr_accept   _tinet_in4_is_dstaddr_accept
     233#define in_rtinit               _tinet_in_rtinit
    197234#define in4_ifawithifp          _tinet_in4_ifawithifp
    198 #define in_cksum                _tinet_in_cksum
    199 #define in_cksum_carry          _tinet_in_cksum_carry
    200 #define in_cksum_sum            _tinet_in_cksum_sum
    201 #define in_rtnewentry           _tinet_in_rtnewentry
    202 #define in_rtinit               _tinet_in_rtinit
    203 #define in_rttimer              _tinet_in_rttimer
    204235
    205236/* netinet/if_ether.c */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_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 *
     
    7171#include <kernel.h>
    7272#include <sil.h>
    73 #include <t_syslog.h>
    7473#include "kernel_cfg.h"
    7574
     
    9190#include <net/if_ppp.h>
    9291#include <net/ethernet.h>
    93 #include <net/ppp_ipcp.h>
    9492#include <net/net.h>
     93#include <net/net_endian.h>
    9594#include <net/net_var.h>
    9695#include <net/net_buf.h>
     
    9897
    9998#include <netinet/in.h>
    100 #include <netinet6/in6.h>
    10199#include <netinet/in_var.h>
    102 #include <netinet/in_itron.h>
    103100#include <netinet/ip.h>
    104101#include <netinet/ip_var.h>
    105 #include <netinet/tcp_timer.h>
     102#include <netinet/in_itron.h>
    106103
    107104#include <net/if_var.h>
    108105
    109 #if defined(SUPPORT_INET4)
    110 
    111 /*
    112  *  in4_get_ifaddr -- インタフェースに設定されているアドレスを返す。
    113  */
    114 
    115 const T_IN4_ADDR *
    116 in4_get_ifaddr (int_t index)
    117 {
    118         T_IFNET         *ifp = IF_GET_IFNET();
    119 
    120         return &ifp->in_ifaddr.addr;
    121         }
    122 
    123 /*
    124  *  ip2str -- IPv4 アドレスを文字列に変換する。
     106/*
     107 *  in_cksum_sum -- チェックサムの合計計算関数
     108 *
     109 *  注意: data は 4 オクテット単位でパディングすること。
     110 *        data が 2 オクテット単位にアラインされていないと
     111 *        例外が発生する可能性がある。
     112 *        len  は 4 オクテット単位にアラインされていること。
     113 *
     114 *        戻り値はホストバイトオーダ
     115 */
     116
     117uint32_t
     118in_cksum_sum (void *data, uint_t len /*オクテット単位*/)
     119{
     120        uint32_t sum = 0;
     121
     122        for ( ; len > 0; len -= 2) {
     123                sum += *((uint16_t*)data);
     124                data = (uint8_t*)data + 2;
     125                }
     126
     127#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
     128        return sum;
     129#elif _NET_CFG_BYTE_ORDER == _NET_CFG_LITTLE_ENDIAN
     130        return ((sum >> 8) & 0xffff) + ((sum & 0xff) << 8) + ((sum >> 24) & 0xff);
     131#endif  /* #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN */
     132
     133        }
     134
     135/*
     136 *  in_cksum_carry -- チェックサムの桁上げ計算関数
     137 *
     138 *  注意: data は 4 オクテット単位でパディングすること。
     139 *        data が 2 オクテット単位にアラインされていないと
     140 *        例外が発生する可能性がある。
     141 *        len  は 4 オクテット単位にアラインされていること。
     142 */
     143
     144uint32_t
     145in_cksum_carry (uint32_t sum)
     146{
     147        uint32_t        carry;
     148
     149        while (sum >= 0x00010000) {
     150                carry = sum >> 16;
     151                sum   = (sum & 0xffff) + carry;
     152                }
     153
     154        return sum;
     155        }
     156
     157/*
     158 *  in_strtfn -- API 機能コードの文字表現を返す。
     159 */
     160
     161typedef struct t_strtfn {
     162        FN              fncd;   /* API 機能コード    */
     163        const char      *str;   /* 文字表現         */
     164        } T_STRTFN;
     165
     166const T_STRTFN strtfn[] = {
     167        { TEV_TCP_RCV_OOB,      "TEV_TCP_RCV_OOB" },
     168        { TFN_TCP_DEL_REP,      "TFN_TCP_DEL_REP" },
     169        { TFN_TCP_CRE_CEP,      "TFN_TCP_CRE_CEP" },
     170        { TFN_TCP_DEL_CEP,      "TFN_TCP_DEL_CEP" },
     171        { TFN_TCP_ACP_CEP,      "TFN_TCP_ACP_CEP" },
     172        { TFN_TCP_CON_CEP,      "TFN_TCP_CON_CEP" },
     173        { TFN_TCP_SHT_CEP,      "TFN_TCP_SHT_CEP" },
     174        { TFN_TCP_CLS_CEP,      "TFN_TCP_CLS_CEP" },
     175        { TFN_TCP_SND_DAT,      "TFN_TCP_SND_DAT" },
     176        { TFN_TCP_RCV_DAT,      "TFN_TCP_RCV_DAT" },
     177        { TFN_TCP_GET_BUF,      "TFN_TCP_GET_BUF" },
     178        { TFN_TCP_SND_BUF,      "TFN_TCP_SND_BUF" },
     179        { TFN_TCP_RCV_BUF,      "TFN_TCP_RCV_BUF" },
     180        { TFN_TCP_REL_BUF,      "TFN_TCP_REL_BUF" },
     181        { TFN_TCP_SND_OOB,      "TFN_TCP_SND_OOB" },
     182        { TFN_TCP_RCV_OOB,      "TFN_TCP_RCV_OOB" },
     183        { TFN_TCP_CAN_CEP,      "TFN_TCP_CAN_CEP" },
     184        { TFN_TCP_SET_OPT,      "TFN_TCP_SET_OPT" },
     185        { TFN_TCP_GET_OPT,      "TFN_TCP_GET_OPT" },
     186        { TFN_TCP_ALL,          "TFN_TCP_ALL"     },
     187
     188        { TEV_UDP_RCV_DAT,      "TEV_UDP_RCV_DAT" },
     189        { TFN_UDP_DEL_CEP,      "TFN_UDP_DEL_CEP" },
     190        { TFN_UDP_SND_DAT,      "TFN_UDP_SND_DAT" },
     191        { TFN_UDP_RCV_DAT,      "TFN_UDP_RCV_DAT" },
     192        { TFN_UDP_CAN_CEP,      "TFN_UDP_CAN_CEP" },
     193        { TFN_UDP_SET_OPT,      "TFN_UDP_SET_OPT" },
     194        { TFN_UDP_GET_OPT,      "TFN_UDP_GET_OPT" },
     195        };
     196
     197const char *
     198in_strtfn (FN fncd)
     199{
     200        int_t   ix;
     201
     202        for (ix = sizeof(strtfn) / sizeof(T_STRTFN); ix -- > 0; )
     203                if (strtfn[ix].fncd == fncd)
     204                        return strtfn[ix].str;
     205
     206        return "unknown TFN";
     207        }
     208
     209#if defined(_IP4_CFG)
     210
     211/*
     212 *  ipv42str -- IPv4 アドレスを文字列に変換する。
    125213 */
    126214
    127215char *
    128 ip2str (char *buf, const T_IN4_ADDR *ipaddr)
     216ipv42str (char *buf, const T_IN4_ADDR *ipaddr)
    129217{
    130218        static char     addr_sbuf[NUM_IPV4ADDR_STR_BUFF][sizeof("123.123.123.123")];
     
    153241        }
    154242
    155 /*
    156  *  in4_set_header -- IPv4 ヘッダを設定する。
     243#endif  /* of #if defined(_IP4_CFG) */
     244
     245/*
     246 *  in6_is_addr_ipv4mapped -- IPv4 射影アドレスである事を検査する。
     247 */
     248
     249bool_t
     250in6_is_addr_ipv4mapped (const T_IN6_ADDR *addr)
     251{
     252        return IN6_IS_ADDR_V4MAPPED(addr);
     253        }
     254
     255#if defined(_IP6_CFG) && defined(_IP4_CFG)
     256
     257/*
     258 *  ip_exchg_addr -- IP アドレスを交換する。
     259 */
     260
     261static void
     262ip6_exchg_addr (T_NET_BUF *nbuf)
     263{
     264        T_IP6_HDR       *iph;
     265        T_IN6_ADDR      ipaddr;
     266
     267        iph  = GET_IP6_HDR(nbuf);
     268
     269        /* IPv6 アドレスを交換する。*/
     270        ipaddr = iph->src;
     271        iph->src = iph->dst;
     272        iph->dst = ipaddr;
     273        }
     274
     275static void
     276ip4_exchg_addr (T_NET_BUF *nbuf)
     277{
     278        T_IP4_HDR       *iph;
     279        T_IN4_ADDR      ipaddr;
     280
     281        iph  = GET_IP4_HDR(nbuf);
     282
     283        /* IPv4 アドレスを交換する。*/
     284        ipaddr = iph->src;
     285        iph->src = iph->dst;
     286        iph->dst = ipaddr;
     287        }
     288
     289void
     290ip_exchg_addr (T_NET_BUF *nbuf)
     291{
     292        if (GET_IP_VER(nbuf) == 6)
     293                ip6_exchg_addr(nbuf);
     294        else
     295                ip4_exchg_addr(nbuf);
     296        }
     297
     298#else   /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     299
     300/*
     301 *  ip_exchg_addr -- IP アドレスを交換する。
     302 */
     303
     304void
     305ip_exchg_addr (T_NET_BUF *nbuf)
     306{
     307        T_IP_HDR        *iph;
     308        T_IN_ADDR       ipaddr;
     309
     310        iph  = GET_IP_HDR(nbuf);
     311
     312        /* IP アドレスを交換する。*/
     313        ipaddr = iph->src;
     314        iph->src = iph->dst;
     315        iph->dst = ipaddr;
     316        }
     317
     318#endif  /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     319
     320#if defined(_IP6_CFG) && defined(_IP4_CFG)
     321
     322/*
     323 *  inn_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。
     324 */
     325
     326bool_t
     327inn_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_NET_BUF *nbuf)
     328{
     329        if        (GET_IP_VER(nbuf)==IPV6_VERSION)
     330                return INN6_IS_DSTADDR_ACCEPT(myaddr, nbuf);
     331        else /*if (GET_IP_VER(nbuf)==IPV4_VERSION)*/ {
     332                T_IP4_HDR       *ip4h;
     333
     334                ip4h  = GET_IP4_HDR(nbuf);
     335                if (IN6_IS_ADDR_UNSPECIFIED(myaddr))
     336                        return ntohl(ip4h->dst) == IF_GET_IFNET()->in4_ifaddr.addr;
     337                else {
     338                        T_IN6_ADDR      dstaddr;
     339
     340                        return IN6_ARE_ADDR_EQUAL(myaddr, in6_make_ipv4mapped(&dstaddr, ntohl(ip4h->dst)));
     341                        }
     342                }
     343        }
     344
     345/*
     346 *  inn_are_net_srcaddr_equal -- アドレスが同一かチェックする。
     347 */
     348
     349bool_t
     350inn_are_net_srcaddr_equal (T_IN6_ADDR *ipaddr, T_NET_BUF *nbuf)
     351{
     352        if        (GET_IP_VER(nbuf)==IPV6_VERSION)
     353                return IN6_ARE_ADDR_EQUAL(ipaddr, &GET_IP6_HDR(nbuf)->src);
     354        else /*if (GET_IP_VER(nbuf)==IPV4_VERSION)*/ {
     355
     356
     357                T_IN6_ADDR      srcaddr;
     358
     359                return IN6_ARE_ADDR_EQUAL(ipaddr, in6_make_ipv4mapped(&srcaddr, ntohl(GET_IP4_HDR(nbuf)->src)));
     360                }
     361        }
     362
     363/*
     364 *  inn_copy_to_host -- IP ヘッダからホスト表現変換して、IP アドレスをコピーする。
     365 */
     366
     367void
     368inn_copy_to_host (T_IN6_ADDR *dst, T_NET_BUF *nbuf)
     369{
     370        if        (GET_IP_VER(nbuf)==IPV6_VERSION)
     371                memcpy(dst, &GET_IP6_HDR(nbuf)->src, sizeof(T_IN6_ADDR));
     372        else /*if (GET_IP_VER(nbuf)==IPV4_VERSION)*/
     373                in6_make_ipv4mapped(dst, ntohl(GET_IP4_HDR(nbuf)->src));
     374
     375        }
     376
     377/*
     378 *  inn_get_datagram -- IPv6/IPv4 データグラムを獲得し、ヘッダを設定する。
    157379 */
    158380
    159381ER
    160 in4_set_header (T_NET_BUF *nbuf, uint_t len,
    161                 T_IN4_ADDR *dstaddr, T_IN4_ADDR *srcaddr, uint8_t proto, uint8_t ttl)
    162 {
    163         T_IP4_HDR       *ip4h = GET_IP4_HDR(nbuf);
    164         T_IFNET         *ifp = IF_GET_IFNET();
    165 
    166         /* IP ヘッダを設定する。*/
    167         ip4h->vhl       = IP4_MAKE_VHL(IPV4_VERSION, IP4_HDR_SIZE >> 2);
    168         ip4h->len       = htons(IP4_HDR_SIZE + len);
    169         ip4h->proto     = proto;
    170         ip4h->ttl       = ttl;
    171         ip4h->type      = 0;
    172         ip4h->id        = ip4h->flg_off = ip4h->sum = 0;
    173 
    174         /* IP アドレスを設定する。*/
    175         ip4h->dst       = htonl(*dstaddr);
    176 
    177         if (srcaddr == NULL || *srcaddr == IPV4_ADDRANY)
    178                 ip4h->src = htonl(ifp->in_ifaddr.addr);
     382inn_get_datagram (T_NET_BUF **nbuf, uint_t len, uint_t maxlen,
     383                  T_IN6_ADDR *dstaddr, T_IN6_ADDR *srcaddr,
     384                  uint8_t next, uint8_t hlim, ATR nbatr, TMO tmout)
     385{
     386        if (IN6_IS_ADDR_V4MAPPED(dstaddr)) {
     387                T_IN4_ADDR ip4dstaddr, ip4srcaddr;
     388
     389                ip4dstaddr = ntohl(dstaddr->s6_addr32[3]);
     390                if (IN6_IS_ADDR_UNSPECIFIED(srcaddr))
     391                        ip4srcaddr = IF_GET_IFNET()->in4_ifaddr.addr;
     392                else
     393                        ip4srcaddr = ntohl(srcaddr->s6_addr32[3]);
     394
     395                return in4_get_datagram(nbuf, len, maxlen, &ip4dstaddr, &ip4srcaddr, next, hlim, nbatr, tmout);
     396                }
    179397        else
    180                 ip4h->src = htonl(*srcaddr);
    181 
    182         return E_OK;
    183         }
    184 
    185 /*
    186  *  in4_get_datagram -- IPv4 データグラムを獲得し、ヘッダを設定する。
    187  */
    188 
    189 ER
    190 in4_get_datagram (T_NET_BUF **nbuf, uint_t len, uint_t maxlen,
    191                   T_IN4_ADDR *dstaddr, T_IN4_ADDR *srcaddr,
    192                   uint8_t proto, uint8_t ttl, ATR nbatr, TMO tmout)
    193 {
    194         ER      error;
    195         uint_t  align;
    196 
    197         /* データ長を 4 オクテット境界に調整する。*/
    198         align = (len + 3) >> 2 << 2;
    199 
    200         /* ネットワークバッファを獲得する。*/
    201         if ((error = tget_net_buf_ex(nbuf, (uint_t)(IF_IP4_HDR_SIZE + align),
    202                                            (uint_t)(IF_IP4_HDR_SIZE + maxlen), nbatr, tmout)) != E_OK)
    203                 return error;
    204 
    205         /*
    206          *  より大きなサイズのネットワークバッファを獲得する場合のみ長さを調整する。
    207          *  より小さなサイズのネットワークバッファの獲得は、送信ウィンドバッファの
    208          *  省コピー機能で使用され、実際に送信するまで、データサイズは決定できない。
    209          */
    210         if ((nbatr & NBA_SEARCH_ASCENT) != 0)
    211                 (*nbuf)->len = (uint16_t)(IF_IP4_HDR_SIZE + len);
    212 
    213         /* IP ヘッダを設定する。*/
    214         if ((error = in4_set_header(*nbuf, len, dstaddr, srcaddr, proto, ttl)) != E_OK)
    215                 return error;
    216 
    217         /* 4 オクテット境界までパディングで埋める。*/
    218         if (align > len)
    219                 memset((GET_IP4_SDU(*nbuf) + len), 0, (size_t)(align - len));
    220 
    221         return E_OK;
    222         }
    223 
    224 /*
    225  *  in4_cksum -- IPv4 のトランスポート層ヘッダのチェックサムを計算する。
    226  *
    227  *  注意: 戻り値はネットワークバイトオーダ
    228  */
     398                return in6_get_datagram(nbuf, len, maxlen, dstaddr, srcaddr, next, hlim, nbatr, tmout);
     399        }
     400
     401/*
     402 * inn_addrwithifp -- 宛先アドレスにふさわしい送信元アドレスを、
     403 *                   ネットワークインタフェースから探索する。
     404 */
     405
     406T_IN6_ADDR *
     407inn_addrwithifp (T_IFNET *ifp, T_IN6_ADDR *src, T_IN6_ADDR *dst)
     408{
     409        T_IN6_IFADDR *ifaddr;
     410
     411        if (IN6_IS_ADDR_V4MAPPED(dst))
     412                return in6_make_ipv4mapped (src, ifp->in4_ifaddr.addr);
     413        else if ((ifaddr = in6_ifawithifp(ifp, dst)) == NULL)
     414                return NULL;
     415        else {
     416                *src = ifaddr->addr;
     417                return src;
     418                }
     419        }
     420
     421/*
     422 *  inn_is_addr_multicast -- アドレスがマルチキャストアドレスかチェックする。
     423 */
     424
     425bool_t
     426inn_is_addr_multicast (T_IN6_ADDR *addr)
     427{
     428
     429        if (IN6_IS_ADDR_V4MAPPED(addr))
     430                return IN4_IS_ADDR_MULTICAST(ntohl(addr->s6_addr32[3]));
     431        else
     432                return IN6_IS_ADDR_MULTICAST(addr);
     433        }
     434
     435#endif  /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */
     436
     437/*
     438 *  バイトオーダ関数の定義
     439 *
     440 *    tinet/net/net.h でもバイトオーダの定義を行っているが、
     441 *    tinet/net/net.h をインクルードしない
     442 *    アプリケーションプログラム用に
     443 *    ターゲット依存しないバイトオーダ関数を定義する。
     444 */
     445
     446#if defined(_NET_CFG_BYTE_ORDER)
     447
     448#undef ntohs
     449#undef htons
     450#undef ntohl
     451#undef htonl
     452
     453#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
    229454
    230455uint16_t
    231 in4_cksum (T_NET_BUF *nbuf, uint8_t proto, uint_t off, uint_t len)
    232 {
    233         uint32_t        sum;
    234         uint_t          align;
    235 
    236         /* 4 オクテット境界のデータ長 */
    237         align = (len + 3) >> 2 << 2;
    238 
    239         /* 4 オクテット境界までパディングで埋める。*/
    240         if (align > len)
    241                 memset((uint8_t*)nbuf->buf + off + len, 0, (size_t)(align - len));
    242 
    243         sum = in_cksum_sum(nbuf->buf + off, align)
    244             + in_cksum_sum(&GET_IP4_HDR(nbuf)->src, sizeof(T_IN4_ADDR) * 2)
    245             + len + proto;
    246         sum = in_cksum_carry(sum);
    247 
    248         return (uint16_t)(~htons((uint16_t)sum));
    249         }
    250 
    251 /*
    252  *  in_cksum -- チェックサム計算関数、IPv4、ICMPv4 用
    253  *
    254  *  注意: data は 4 オクテット単位でパディングすること。
    255  *        data が 2 オクテット単位にアラインされていないと
    256  *        例外が発生する可能性がある。
    257  *        len  は 4 オクテット単位にアラインされていること。
    258  *
    259  *        戻り値はネットワークバイトオーダ
    260  */
     456ntohs (uint16_t net)
     457{
     458        return net;
     459        }
    261460
    262461uint16_t
    263 in_cksum (void *data, uint_t len /*オクテット単位*/)
    264 {
    265         uint16_t        sum;
    266 
    267         sum = (uint16_t)in_cksum_carry(in_cksum_sum(data, len));
    268         return (uint16_t)(~htons(sum));
    269         }
    270 
    271 /*
    272  *  in4_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。
    273  *
    274  *    注意: dstaddr は、
    275  *          TINET-1.2 からネットワークバイトオーダ、
    276  *          TINET-1.1 までは、ホストバイトオーダ
    277  */
    278 
    279 bool_t
    280 in4_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
    281 {
    282         if (*myaddr == IPV4_ADDRANY)
    283                 return ntohl(*dstaddr) == IF_GET_IFNET()->in_ifaddr.addr;
    284         else
    285                 return ntohl(*dstaddr) == *myaddr;
    286         }
    287 
    288 /*
    289  * in4_ifawithifp -- 宛先アドレスにふさわしい送信元アドレスを、
    290  *                   ネットワークインタフェースから探索する。
    291  *                   in6_ifawithifp をシミュレートするだけで、
    292  *                   エラーを返すことはない。
    293  */
    294 
    295 T_IN4_IFADDR *
    296 in4_ifawithifp (T_IFNET *ifp, T_IN4_ADDR *dst)
    297 {
    298         return &ifp->in_ifaddr;
    299         }
    300 
    301 /*
    302  *  in4_add_ifaddr -- インタフェースに IPv4 アドレスを設定する。
    303  */
    304 
    305 ER
    306 in4_add_ifaddr (T_IN4_ADDR addr, T_IN4_ADDR mask)
    307 {
    308         T_IFNET *ifp = IF_GET_IFNET();
    309 
    310         ifp->in_ifaddr.addr = addr;
    311         ifp->in_ifaddr.mask = mask;
    312         return E_OK;
    313         }
    314 
    315 #if NUM_ROUTE_ENTRY > 0
    316 
    317 /*
    318  *  in4_add_route -- 経路表にエントリを設定する。
    319  */
    320 
    321 ER
    322 in4_add_route (int_t index, T_IN4_ADDR target, T_IN4_ADDR mask, T_IN4_ADDR gateway)
    323 {
    324 
    325         if (0 <= index && index < NUM_STATIC_ROUTE_ENTRY) {
    326                 routing_tbl[index].target  = target;
    327                 routing_tbl[index].mask    = mask;
    328                 routing_tbl[index].gateway = gateway;
    329                 return E_OK;
    330                 }
    331         else
    332                 return E_PAR;
    333         }
    334 
    335 #endif  /* of #if NUM_ROUTE_ENTRY > 0 */
    336 
    337 /*
    338  *  in4_rtalloc -- ルーティング表を探索する。
    339  */
    340 
    341 T_IN4_ADDR
    342 in4_rtalloc (T_IN4_ADDR dst)
    343 {
    344         int_t ix;
    345 
    346         for (ix = NUM_ROUTE_ENTRY; ix --; )
    347                 if ((routing_tbl[ix].flags & IN_RTF_DEFINED) &&
    348                     (dst & routing_tbl[ix].mask) == routing_tbl[ix].target) {
    349                         if (routing_tbl[ix].gateway == 0)
    350                                 return dst;
    351                         else {
    352                                 return routing_tbl[ix].gateway;
    353                                 }
    354                         }
    355         return dst;
    356         }
    357 
    358 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    359 
    360 /*
    361  *  in4_rtredirect -- ルーティング表にエントリを登録する。
    362  *
    363  *    注意: 引数 tmo の単位は [ms]。
    364  */
    365 
    366 void
    367 in4_rtredirect (T_IN4_ADDR gateway, T_IN4_ADDR target, uint8_t flags, uint32_t tmo)
    368 {
    369         T_IN_RTENTRY    *frt;
    370 
    371         frt = in_rtnewentry(flags, tmo);
    372         frt->gateway    = gateway;
    373         frt->target     = target;
    374         frt->mask       = 0xffffffff;
    375         }
    376 
    377 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
    378 
    379 /*
    380  *  in4_timer -- IPv4 共通タイマー
    381  *
    382  *    1秒周期で起動される。
    383  */
    384 
    385 static void
    386 in4_timer (void *ignore)
    387 {
    388 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    389 
    390         in_rttimer();
    391 
    392 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
    393 
    394 #ifdef IP4_CFG_FRAGMENT
    395 
    396         ip_frag_timer();
    397 
    398 #endif  /* of #ifdef IP4_CFG_FRAGMENT */
    399 
    400         timeout(in4_timer, NULL, IN_TIMER_TMO);
    401         }
    402 
    403 /*
    404  *  in4_init -- IPv4 共通機能を初期化する。
    405  */
    406 
    407 void
    408 in4_init (void)
    409 {
    410 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    411 
    412         in_rtinit();
    413 
    414 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
    415 
    416         timeout(in4_timer, NULL, IN_TIMER_TMO);
    417         }
    418 
    419 #endif  /* of #if defined(SUPPORT_INET4) */
    420 
    421 #if NUM_REDIRECT_ROUTE_ENTRY > 0
    422 
    423 /*
    424  *  in_rtinit -- ルーティング表を初期化する。
    425  */
    426 
    427 void
    428 in_rtinit (void)
    429 {
    430         int_t ix;
    431 
    432         for (ix = 0; ix < NUM_STATIC_ROUTE_ENTRY; ix ++)
    433                 routing_tbl[ix].flags = IN_RTF_DEFINED;
    434 
    435         for ( ; ix < NUM_ROUTE_ENTRY; ix ++)
    436                 routing_tbl[ix].flags = 0;
    437         }
    438 
    439 /*
    440  *  in_rtnewentry -- 新しいエントリを獲得する。
    441  */
    442 
    443 T_IN_RTENTRY *
    444 in_rtnewentry (uint8_t flags, uint32_t tmo)
    445 {
    446         SYSTIM          now;
    447         T_IN_RTENTRY    *rt, *frt = NULL;
    448         int_t           ix;
    449 
    450         /* 空きエントリを探す。*/
    451         for (ix = NUM_STATIC_ROUTE_ENTRY; ix < NUM_ROUTE_ENTRY; ix ++) {
    452                 rt = &routing_tbl[ix];
    453                 if ((routing_tbl[ix].flags & IN_RTF_DEFINED) == 0) {
    454                         frt = rt;
    455                         break;
    456                         }
    457                 }
    458 
    459         /* expire の単位は [s]。*/
    460         syscall(get_tim(&now));
    461         now /= SYSTIM_HZ;
    462 
    463         if (frt == NULL) {
    464                 /* 空きがなければ、有効時間がもっとも短いエントリを空きにする。*/
    465                 T_IN_RTENTRY    *srt = NULL;
    466                 int_t           diff, sdiff = INT_MAX;
    467 
    468                 syscall(wai_sem(SEM_IN_ROUTING_TBL));
    469                 for (ix = NUM_STATIC_ROUTE_ENTRY; ix < NUM_ROUTE_ENTRY; ix ++) {
    470                         rt = &routing_tbl[ix];
    471                         diff = (int_t)(rt->expire - now);
    472                         if (diff <= 0) {        /* rt->expire <= now */
    473                                 /* 既に、有効時間が過ぎている。*/
    474                                 frt = rt;
    475                                 break;
    476                                 }
    477                         else if (diff < sdiff) {
    478                                 srt = rt;
    479                                 sdiff = diff;
    480                                 }
    481                         }
    482                 if (frt == NULL)
    483                         frt = srt;
    484                 frt->flags = 0;
    485                 syscall(sig_sem(SEM_IN_ROUTING_TBL));
    486                 }
    487 
    488         frt->flags  = (uint8_t)(flags | IN_RTF_DEFINED);
    489         frt->expire = now + tmo / SYSTIM_HZ;
    490         return frt;
    491         }
    492 
    493 /*
    494  *  in_rttimer -- ルーティング表の管理タイマー
    495  */
    496 
    497 void
    498 in_rttimer (void)
    499 {
    500         SYSTIM  now;
    501         int_t   ix;
    502 
    503         /* expire の単位は [s]。*/
    504         syscall(get_tim(&now));
    505         now /= SYSTIM_HZ;
    506 
    507         syscall(wai_sem(SEM_IN_ROUTING_TBL));
    508         for (ix = NUM_STATIC_ROUTE_ENTRY; ix < NUM_ROUTE_ENTRY; ix ++)
    509                 if ((routing_tbl[ix].flags & IN_RTF_DEFINED) &&
    510                     (int_t)(routing_tbl[ix].expire - now) <= 0)
    511                         routing_tbl[ix].flags = 0;
    512         syscall(sig_sem(SEM_IN_ROUTING_TBL));
    513         }
    514 
    515 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
    516 
    517 /*
    518  *  in_cksum_sum -- チェックサムの合計計算関数
    519  *
    520  *  注意: data は 4 オクテット単位でパディングすること。
    521  *        data が 2 オクテット単位にアラインされていないと
    522  *        例外が発生する可能性がある。
    523  *        len  は 4 オクテット単位にアラインされていること。
    524  *
    525  *        戻り値はホストバイトオーダ
    526  */
     462htons (uint16_t host)
     463{
     464        return host;
     465        }
    527466
    528467uint32_t
    529 in_cksum_sum (void *data, uint_t len /*オクテット単位*/)
    530 {
    531         uint32_t sum = 0;
    532 
    533         for ( ; len > 0; len -= 2) {
    534                 sum += *((uint16_t*)data);
    535                 data = (uint8_t*)data + 2;
    536                 }
    537 
    538 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
    539         return sum;
    540 #elif _NET_CFG_BYTE_ORDER == _NET_CFG_LITTLE_ENDIAN
    541         return ((sum >> 8) & 0xffff) + ((sum & 0xff) << 8) + ((sum >> 24) & 0xff);
     468ntohl (uint32_t net)
     469{
     470        return net;
     471        }
     472
     473uint32_t
     474htonl (uint32_t host)
     475{
     476        return host;
     477        }
     478
     479#elif _NET_CFG_BYTE_ORDER == _NET_CFG_LITTLE_ENDIAN     /* of #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN */
     480
     481uint16_t
     482ntohs (uint16_t net)
     483{
     484        return NET_REV_ENDIAN_HWORD(net);
     485        }
     486
     487uint16_t
     488htons (uint16_t host)
     489{
     490        return NET_REV_ENDIAN_HWORD(host);
     491        }
     492
     493uint32_t
     494ntohl (uint32_t net)
     495{
     496        return NET_REV_ENDIAN_WORD(net);
     497        }
     498
     499uint32_t
     500htonl (uint32_t host)
     501{
     502        return NET_REV_ENDIAN_WORD(host);
     503        }
     504
     505#else   /* #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN */
     506
     507#error "_NET_CFG_BYTE_ORDER expected."
     508
    542509#endif  /* #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN */
    543510
    544         }
    545 
    546 /*
    547  *  in_cksum_carry -- チェックサムの桁上げ計算関数
    548  *
    549  *  注意: data は 4 オクテット単位でパディングすること。
    550  *        data が 2 オクテット単位にアラインされていないと
    551  *        例外が発生する可能性がある。
    552  *        len  は 4 オクテット単位にアラインされていること。
    553  */
    554 
    555 uint32_t
    556 in_cksum_carry (uint32_t sum)
    557 {
    558         uint32_t        carry;
    559 
    560         while (sum >= 0x00010000) {
    561                 carry = sum >> 16;
    562                 sum   = (sum & 0xffff) + carry;
    563                 }
    564 
    565         return sum;
    566         }
    567 
    568 /*
    569  *  in_strtfn -- API 機能コードの文字表現を返す。
    570  */
    571 
    572 const char *
    573 in_strtfn (FN fncd)
    574 {
    575         switch (fncd) {
    576 
    577         /* TCP 関係 */
    578 
    579         case TFN_TCP_CRE_REP:
    580                 return "TFN_TCP_CRE_REP";
    581                 break;
    582         case TFN_TCP_DEL_REP:
    583                 return "TFN_TCP_DEL_REP";
    584                 break;
    585         case TFN_TCP_CRE_CEP:
    586                 return "TFN_TCP_CRE_CEP";
    587                 break;
    588         case TFN_TCP_DEL_CEP:
    589                 return "TFN_TCP_DEL_CEP";
    590                 break;
    591         case TFN_TCP_ACP_CEP:
    592                 return "TFN_TCP_ACP_CEP";
    593                 break;
    594         case TFN_TCP_CON_CEP:
    595                 return "TFN_TCP_CON_CEP";
    596                 break;
    597         case TFN_TCP_SHT_CEP:
    598                 return "TFN_TCP_SHT_CEP";
    599                 break;
    600         case TFN_TCP_CLS_CEP:
    601                 return "TFN_TCP_CLS_CEP";
    602                 break;
    603         case TFN_TCP_SND_DAT:
    604                 return "TFN_TCP_SND_DAT";
    605                 break;
    606         case TFN_TCP_RCV_DAT:
    607                 return "TFN_TCP_RCV_DAT";
    608                 break;
    609         case TFN_TCP_GET_BUF:
    610                 return "TFN_TCP_GET_BUF";
    611                 break;
    612         case TFN_TCP_SND_BUF:
    613                 return "TFN_TCP_SND_BUF";
    614                 break;
    615         case TFN_TCP_RCV_BUF:
    616                 return "TFN_TCP_RCV_BUF";
    617                 break;
    618         case TFN_TCP_REL_BUF:
    619                 return "TFN_TCP_REL_BUF";
    620                 break;
    621         case TFN_TCP_SND_OOB:
    622                 return "TFN_TCP_SND_OOB";
    623                 break;
    624         case TFN_TCP_RCV_OOB:
    625                 return "TFN_TCP_RCV_OOB";
    626                 break;
    627         case TFN_TCP_CAN_CEP:
    628                 return "TFN_TCP_CAN_CEP";
    629                 break;
    630         case TFN_TCP_SET_OPT:
    631                 return "TFN_TCP_SET_OPT";
    632                 break;
    633         case TFN_TCP_GET_OPT:
    634                 return "TFN_TCP_GET_OPT";
    635                 break;
    636         case TFN_TCP_ALL:
    637                 return "ALL";
    638                 break;
    639 
    640         /* UDP 関係 */
    641 
    642         case TFN_UDP_CRE_CEP:
    643                 return "TFN_UDP_CRE_CEP";
    644                 break;
    645         case TFN_UDP_DEL_CEP:
    646                 return "TFN_UDP_DEL_CEP";
    647                 break;
    648         case TFN_UDP_SND_DAT:
    649                 return "TFN_UDP_SND_DAT";
    650                 break;
    651         case TFN_UDP_RCV_DAT:
    652                 return "TFN_UDP_RCV_DAT";
    653                 break;
    654         case TFN_UDP_CAN_CEP:
    655                 return "TFN_UDP_CAN_CEP";
    656                 break;
    657         case TFN_UDP_SET_OPT:
    658                 return "TFN_UDP_SET_OPT";
    659                 break;
    660         case TFN_UDP_GET_OPT:
    661                 return "TFN_UDP_GET_OPT";
    662                 break;
    663 
    664         default:
    665                 return "unknown TFN";
    666                 }
    667         }
     511#endif  /* of #if defined(_NET_CFG_BYTE_ORDER) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_var.h

    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 *
     
    7171#define _IN_VAR_H_
    7272
    73 #if defined(SUPPORT_INET6)
    74 
     73#include <netinet/in4_var.h>
    7574#include <netinet6/in6_var.h>
    76 
    77 #endif  /* of #if defined(SUPPORT_INET6) */
    7875
    7976/*
     
    10299
    103100/*
    104  *  インタフェースアドレス構造体
    105  */
    106 
    107 typedef struct t_in4_ifaddr {
    108         T_IN4_ADDR              addr;           /* IPv4 アドレス    */
    109         T_IN4_ADDR              mask;           /* サブネットマスク     */
    110         } T_IN4_IFADDR;
    111 
    112 /*
    113  *  ルーティング表エントリ構造体
    114  */
    115 
    116 typedef struct t_in4_rtentry {
    117         T_IN4_ADDR      target;         /* 目標ネットワークアドレス                 */
    118         T_IN4_ADDR      mask;           /* 目標ネットワークアドレスのサブネットマスク        */
    119         T_IN4_ADDR      gateway;        /* ゲートウェイの IP アドレス                      */
    120         uint32_t        expire;         /* 有効時間が切れる時刻 [s]                       */
    121         uint8_t         flags;          /* フラグ                                  */
    122         } T_IN4_RTENTRY;
    123 
    124 /*
    125  *  TINET 1.1 との互換性のための定義
    126  */
    127 
    128 #ifdef NUM_ROUTE_ENTRY
    129 
    130 #define NUM_STATIC_ROUTE_ENTRY          NUM_ROUTE_ENTRY
    131 #define NUM_REDIRECT_ROUTE_ENTRY        0
    132 #define T_RT_ENTRY                      T_IN_RTENTRY
    133 
    134 #else   /* of #ifdef NUM_ROUTE_ENTRY */
    135 
    136 #define NUM_ROUTE_ENTRY                 \
    137         (NUM_STATIC_ROUTE_ENTRY + NUM_REDIRECT_ROUTE_ENTRY)
    138                                         /* ルーティング表のエントリ数        */
    139 
    140 #endif  /* of #ifdef NUM_ROUTE_ENTRY */
    141 
    142 /*
    143101 *  ルーティングエントリ状態フラグ
    144102 */
     
    151109 */
    152110
    153 #if defined(SUPPORT_INET4)
    154 
    155 #define IN_SET_HEADER(nbuf,len,dst,src,proto,ttl)       \
    156                                         in4_set_header(nbuf,len,dst,src,proto,ttl)
     111#if defined(_IP6_CFG)
     112
     113#define T_IN_ADDR                       T_IN6_ADDR
     114#define T_IPEP                          T_IPV6EP
     115#define IP_ADDRANY                      IPV6_ADDRANY
     116
     117#elif defined(_IP4_CFG) /* of #if defined(_IP6_CFG) */
     118
     119#define T_IN_ADDR                       T_IN4_ADDR
     120#define T_IPEP                          T_IPV4EP
     121#define IP_ADDRANY                      IPV4_ADDRANY
     122
     123#endif  /* of #if defined(_IP6_CFG) */
     124
     125#if defined(_IP6_CFG)
     126
     127#if defined(_IP4_CFG)
     128
     129#define IN_CKSUM(nbuf,proto,off,len)    (GET_IP_VER(nbuf)==IPV6_VERSION \
     130                                        ?in6_cksum(nbuf,proto,off,len)  \
     131                                        :in4_cksum(nbuf,proto,off,len))
     132#define IN_IS_DSTADDR_ACCEPT(myaddr,nbuf)       \
     133                                        inn_is_dstaddr_accept(myaddr,nbuf)
     134#define IN_ARE_HDR_ADDR_EQUAL(nbuf)     (GET_IP_VER(nbuf)==IPV6_VERSION \
     135                                        ?IN6_ARE_ADDR_EQUAL(&GET_IP6_HDR(nbuf)->dst,&GET_IP6_HDR(nbuf)->src)    \
     136                                        :IN4_ARE_ADDR_EQUAL(&GET_IP4_HDR(nbuf)->dst,&GET_IP4_HDR(nbuf)->src))
     137#define IN_ARE_NET_SRCADDR_EQUAL(ipaddr,nbuf)   \
     138                                        inn_are_net_srcaddr_equal(ipaddr,nbuf)
     139#define IN_COPY_TO_HOST(dst,nbuf)       inn_copy_to_host(dst,nbuf)
     140#define IN_GET_DATAGRAM(nbuf,len,maxlen,dst,src,next,hlim,nbatr,tmout)  \
     141                                        inn_get_datagram(nbuf,len,maxlen,dst,src,next,hlim,nbatr,tmout)
     142#define IN_IS_ADDR_MULTICAST(addr)      inn_is_addr_multicast(addr)
     143#define IN_IS_NET_ADDR_MULTICAST(nbuf)  IN_IS_ADDR_MULTICAST(&GET_IP6_HDR(nbuf)->dst)
     144#define IN_ADDRWITHIFP(ifp,src,dst)     inn_addrwithifp(ifp,src,dst)
     145#define IN_IS_ADDR_ANY(addr)            IN6_IS_ADDR_UNSPECIFIED(addr)
     146
     147#else   /* of #if defined(_IP4_CFG) */
     148
     149#define IN_CKSUM(nbuf,proto,off,len)    in6_cksum(nbuf,proto,off,len)
     150#define IN_IS_DSTADDR_ACCEPT(myaddr,nbuf)       \
     151                                        INN6_IS_DSTADDR_ACCEPT(myaddr,nbuf)
     152#define IN_ARE_HDR_ADDR_EQUAL(nbuf)     IN6_ARE_ADDR_EQUAL(&GET_IP6_HDR(nbuf)->dst,&GET_IP6_HDR(nbuf)->src)
     153#define IN_ARE_NET_SRCADDR_EQUAL(ipaddr,nbuf)   \
     154                                        IN6_ARE_ADDR_EQUAL(ipaddr,&GET_IP6_HDR(nbuf)->src)
     155#define IN_COPY_TO_HOST(dst,nbuf)       IN6_COPY_TO_HOST(dst, nbuf)
     156#define IN_GET_DATAGRAM(nbuf,len,maxlen,dst,src,next,hlim,nbatr,tmout)  \
     157                                        in6_get_datagram(nbuf,len,maxlen,dst,src,next,hlim,nbatr,tmout)
     158#define IN_IS_ADDR_MULTICAST(addr)      IN6_IS_ADDR_MULTICAST(addr)
     159#define IN_IS_NET_ADDR_MULTICAST(nbuf)  IN6_IS_ADDR_MULTICAST(&GET_IP6_HDR(nbuf)->dst)
     160#define IN_ADDRWITHIFP(ifp,src,dst)     in6_addrwithifp(ifp,src,dst)
     161#define IN_IS_ADDR_ANY(addr)            IN6_IS_ADDR_UNSPECIFIED(addr)
     162
     163#endif  /* of #if defined(_IP4_CFG) */
     164
     165#else   /* of #if defined(_IP6_CFG) */
     166
     167#if defined(_IP4_CFG)
     168
     169#define IN_CKSUM(nbuf,proto,off,len)    in4_cksum(nbuf,proto,off,len)
     170#define IN_IS_DSTADDR_ACCEPT(myaddr,nbuf)       \
     171                                        inn4_is_dstaddr_accept(myaddr,nbuf)
     172#define IN_ARE_HDR_ADDR_EQUAL(nbuf)     IN4_ARE_ADDR_EQUAL(&GET_IP4_HDR(nbuf)->dst,&GET_IP4_HDR(nbuf)->src)
     173#define IN_ARE_NET_SRCADDR_EQUAL(ipaddr,nbuf)   \
     174                                        (*(ipaddr)==ntohl(GET_IP4_HDR(nbuf)->src))
     175#define IN_COPY_TO_HOST(dst,nbuf)       IN4_COPY_TO_HOST(dst, nbuf)
    157176#define IN_GET_DATAGRAM(nbuf,len,maxlen, dst,src,proto,ttl,nbatr,tmout) \
    158177                                        in4_get_datagram(nbuf,len,maxlen, dst,src,proto,ttl,nbatr,tmout)
    159 #define IN_CKSUM(nbuf,proto,off,len)    in4_cksum(nbuf,proto,off,len)
    160 #define IN_IS_DSTADDR_ACCEPT(myaddr,dstaddr)                    \
    161                                         in4_is_dstaddr_accept(myaddr,dstaddr)
    162 #define IN_IFAWITHIFP(ifp,dst)          in4_ifawithifp(ifp,dst)
    163 #define T_IN_IFADDR                     T_IN4_IFADDR
    164 #define T_IN_RTENTRY                    T_IN4_RTENTRY
    165 
    166 #endif  /* of #if defined(SUPPORT_INET4) */
    167 
    168 /*
    169  *  ルーティング表
    170  */
    171 
    172 extern T_IN_RTENTRY routing_tbl[];
    173 
    174 /*
    175  *  前方参照
    176  */
    177 
    178 #ifndef T_NET_BUF_DEFINED
    179 typedef struct t_net_buf T_NET_BUF;
    180 #define T_NET_BUF_DEFINED
    181 #endif
    182 
    183 #ifndef T_IFNET_DEFINED
    184 typedef struct t_ifnet T_IFNET;
    185 #define T_IFNET_DEFINED
    186 #endif
     178#define IN_IS_ADDR_MULTICAST(addr)      IN4_IS_ADDR_MULTICAST(*(addr))
     179#define IN_IS_NET_ADDR_MULTICAST(nbuf)  IN4_IS_ADDR_MULTICAST(ntohl(GET_IP4_HDR(nbuf)->dst))
     180#define IN_ADDRWITHIFP(ifp,src,dst)     in4_addrwithifp(ifp,src,dst)
     181#define IN_IS_ADDR_ANY(addr)            IN4_IS_ADDR_ANY(addr)
     182
     183#else   /* of #if defined(_IP4_CFG) */
     184
     185#error "not implemented."
     186
     187#endif  /* of #if defined(_IP4_CFG) */
     188
     189#endif  /* of #if defined(_IP6_CFG) */
     190
     191#ifndef _MACRO_ONLY
    187192
    188193/*
    189194 *  関数
    190195 */
    191 
    192 extern void ip_input (T_NET_BUF *data);
    193 extern ER in4_set_header (T_NET_BUF *nbuf, uint_t len,
    194                           T_IN4_ADDR *dstaddr, T_IN4_ADDR *srcaddr, uint8_t proto, uint8_t ttl);
    195 extern ER in4_get_datagram (T_NET_BUF **nbuf, uint_t len, uint_t maxlen,
    196                             T_IN4_ADDR *dstaddr, T_IN4_ADDR *srcaddr,
    197                             uint8_t proto, uint8_t ttl, ATR nbatr, TMO tmout);
    198 extern uint16_t in4_cksum (T_NET_BUF *nbuf, uint8_t proto, uint_t off, uint_t len);
    199 extern T_IN4_ADDR in4_rtalloc (T_IN4_ADDR dst);
    200 extern void in4_rtredirect (T_IN4_ADDR gateway, T_IN4_ADDR target, uint8_t flags, uint32_t tmo);
    201 extern void in4_init (void);
    202 extern T_IN4_IFADDR *in4_ifawithifp (T_IFNET *ifp, T_IN4_ADDR *dst);
    203 extern T_IN_RTENTRY *in_rtnewentry (uint8_t flags, uint32_t tmo);
    204 extern void in_rttimer (void);
    205 extern void in_rtinit (void);
    206 extern const T_NET_BUF**ip_get_frag_queue (void);
    207 
    208 /*
    209  *  in4_is_dstaddr_accept -- 宛先アドレスとして正しいかチェックする。
    210  *
    211  *    注意: dstaddr は、
    212  *          TINET-1.2 からネットワークバイトオーダ、
    213  *          TINET-1.1 までは、ホストバイトオーダ
    214  */
    215 extern bool_t in4_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr);
    216 
    217 /*
    218  *  in_cksum -- チェックサム計算関数、IPv4、ICMPv4 用
    219  *
    220  *  注意: data は 4 オクテット単位でパディングすること。
    221  *        data が 2 オクテット単位にアラインされていないと
    222  *        例外が発生する可能性がある。
    223  *        len  は 4 オクテット単位にアラインされていること。
    224  */
    225 extern uint16_t in_cksum(void *data, uint_t len /*オクテット単位*/);
    226 
    227 /*
    228  *  in_cksum_sum -- チェックサムの合計計算関数
    229  *
    230  *  注意: data は 4 オクテット単位でパディングすること。
    231  *        data が 2 オクテット単位にアラインされていないと
    232  *        例外が発生する可能性がある。
    233  *        len  は 4 オクテット単位にアラインされていること。
    234  */
    235 extern uint32_t in_cksum_sum (void *data, uint_t len /*オクテット単位*/);
    236 
    237 /*
    238  *  in_cksum_carry -- チェックサムの桁上げ計算関数
    239  *
    240  *  注意: data は 4 オクテット単位でパディングすること。
    241  *        data が 2 オクテット単位にアラインされていないと
    242  *        例外が発生する可能性がある。
    243  *        len  は 4 オクテット単位にアラインされていること。
    244  */
    245 extern uint32_t in_cksum_carry (uint32_t sum);
     196extern bool_t   inn_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_NET_BUF *nbuf);
     197extern bool_t   inn_is_addr_multicast (T_IN6_ADDR *addr);
     198extern bool_t   inn_are_net_srcaddr_equal (T_IN6_ADDR *ipaddr, T_NET_BUF *nbuf);
     199extern void     inn_copy_to_host (T_IN6_ADDR *dst, T_NET_BUF *nbuf);
     200extern ER       inn_get_datagram (T_NET_BUF **nbuf, uint_t len, uint_t maxlen,
     201                                  T_IN6_ADDR *dstaddr, T_IN6_ADDR *srcaddr,
     202                                  uint8_t next, uint8_t hlim, ATR nbatr, TMO tmout);
     203extern T_IN6_ADDR *inn_addrwithifp (T_IFNET *ifp, T_IN6_ADDR *src, T_IN6_ADDR *dst);
     204
     205#endif  /* of #ifndef _MACRO_ONLY */
    246206
    247207#endif  /* of #ifndef _IN_VAR_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip.cfg

    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 *
     
    3636 */
    3737
    38 #if defined(SUPPORT_INET4)
     38#if defined(_IP4_CFG)
    3939
    4040#ifdef IP4_CFG_FRAGMENT
     
    4646#endif  /* of #ifdef IP4_CFG_FRAGMENT */
    4747
    48 #if NUM_REDIRECT_ROUTE_ENTRY > 0
     48#if NUM_IN4_REDIRECT_ROUTE_ENTRY > 0
    4949
    5050/* ルーティング表(向け直し)*/
    5151
    52 CRE_SEM(SEM_IN_ROUTING_TBL, { TA_TPRI, 1, 1 });
     52CRE_SEM(SEM_IN4_ROUTING_TBL, { TA_TPRI, 1, 1 });
    5353
    54 #endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
     54#endif  /* of #if NUM_IN4_REDIRECT_ROUTE_ENTRY > 0 */
    5555
    56 #endif  /* of #if defined(SUPPORT_INET4) */
     56#endif  /* of #if defined(_IP4_CFG) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip.h

    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 *
     
    7171#define _IP4_H_
    7272
     73#include <netinet/ip6.h>
     74
    7375/*
    7476 *  IPv4 の定義、RFC791 参照
     
    134136/* IPv4 と IPv6 をコンパイル時に選択するためのマクロ */
    135137
    136 #if defined(SUPPORT_INET4)
     138#if !defined(_IP6_CFG) && defined(_IP4_CFG)
    137139
    138140#define IP_HDR_SIZE     IP4_HDR_SIZE
     
    140142#define IP_DEFTTL       IP4_DEFTTL
    141143
    142 #endif  /* of #if defined(SUPPORT_INET4) */
     144#endif  /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) */
    143145
    144146#endif  /* of #ifndef _IP4_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip6.h

    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 *
     
    102102#define _IP6_H_
    103103
    104 #ifdef SUPPORT_INET6
    105 
    106104/*
    107105 *  IPv6 の定義、RFC2460 参照
     
    262260
    263261/*
    264  *  IPv4 と IPv6 をコンパイル時に選択するためのマクロ
     262 *  IPv6 と IPv4 をコンパイル時に選択するためのマクロ
    265263 */
    266264
     
    273271/* ルータ通知を受信する場合は、通知された値 */
    274272
    275 #define IP_DEFTTL       ip6_defhlim
     273#define IP6_DEFTTL      ip6_defhlim
    276274
    277275#else   /* #if NUM_ND6_DEF_RTR_ENTRY > 0 */
     
    279277/* ルータ通知を受信しない場合の値は既定値 */
    280278
    281 #define IP_DEFTTL       IPV6_DEFHLIM
     279#define IP6_DEFTTL      IPV6_DEFHLIM
    282280
    283281#endif  /* #if NUM_ND6_DEF_RTR_ENTRY > 0 */
     282
     283/* IPv4 と IPv6 をコンパイル時に選択するためのマクロ */
     284
     285#ifdef _IP6_CFG
    284286
    285287#define IP_HDR_SIZE     IP6_HDR_SIZE
    286288#define T_IP_HDR        T_IP6_HDR
    287 
    288 #endif  /* of #ifdef SUPPORT_INET6 */
     289#define IP_DEFTTL       IP6_DEFTTL
     290
     291#endif  /* of #ifdef _IP6_CFG */
    289292
    290293#endif  /* of #ifndef _IP6_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.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 *
     
    7676#include <t_syslog.h>
    7777#include "kernel_cfg.h"
     78#include "tinet_cfg.h"
    7879
    7980#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8384#include <s_services.h>
    8485#include <t_services.h>
     86#include "tinet_id.h"
    8587
    8688#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9597#include <net/ppp_ipcp.h>
    9698#include <net/net.h>
     99#include <net/net_endian.h>
    97100#include <net/net_buf.h>
    98101#include <net/net_timer.h>
     
    106109#include <netinet/icmp_var.h>
    107110#include <netinet/tcp.h>
    108 #include <netinet/tcp_timer.h>
    109111#include <netinet/tcp_var.h>
     112#include <netinet/udp_var.h>
     113
     114#include <net/if_var.h>
     115
     116#if defined(_IP4_CFG)
    110117
    111118/*
     
    130137static void icmp_unreach (T_NET_BUF *input, uint_t ihoff);
    131138
     139#if defined(NUM_REDIRECT_ROUTE_ENTRY)
    132140#if NUM_REDIRECT_ROUTE_ENTRY > 0
    133141
     
    135143
    136144#endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
     145#endif  /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
    137146
    138147/*
     
    147156        T_IP4_HDR       *ip4h;
    148157        T_ICMP4_HDR     *icmp4h;
    149         T_IN4_ADDR      addr;
     158        T_IFNET         *ifp = IF_GET_IFNET();
    150159
    151160        NET_COUNT_MIB(icmp_stats.icmpInEchos, 1);
    152161
    153         /* メッセージの型をエコー要求 (8) から エコー応答 (0) に     */
    154         /* 変更して送り返す。                                    */
    155 
    156         icmp4h = GET_ICMP4_HDR(input, ihoff);
    157         icmp4h->type = ICMP4_ECHO_REPLY;
    158 
    159         /* IP ヘッダの宛先と発信元を交換する。*/
    160         ip4h      = GET_IP4_HDR(input);
    161         addr      = ip4h->src;
    162         ip4h->src = ip4h->dst;
    163         ip4h->dst = addr;
    164 
    165         /* チェックサムを計算する。*/
    166         icmp4h->sum = 0;
    167         icmp4h->sum = in_cksum(icmp4h,
    168                                (uint_t)(((input->len - GET_IF_IP4_HDR_SIZE(input)) + 3) >> 2 << 2));
    169 
    170         /* 送信する。*/
    171         NET_COUNT_ICMP4(net_count_icmp4.out_octets,
    172                        input->len - GET_IF_IP4_HDR_SIZE(input));
    173         NET_COUNT_ICMP4(net_count_icmp4.out_packets, 1);
    174         NET_COUNT_MIB(icmp_stats.icmpOutMsgs, 1);
    175         NET_COUNT_MIB(icmp_stats.icmpOutEchoReps, 1);
    176         ip_output(input, TMO_ICMP_OUTPUT);
     162        /* IPv4 アドレスが未定義の時は応答しない。*/
     163        if (!IN4_IS_ADDR_ANY(&ifp->in4_ifaddr.addr)) {
     164
     165                /*
     166                 *  メッセージの型をエコー要求 (8) から
     167                 *  エコー応答 (0) に変更して送り返す。
     168                 */
     169
     170                icmp4h = GET_ICMP4_HDR(input, ihoff);
     171                icmp4h->type = ICMP4_ECHO_REPLY;
     172
     173                /*
     174                 *  宛先アドレスは受信したメッセージの送信元アドレス。
     175                 *  送信元アドレスは自 IPv4 アドレス。
     176                 */
     177                ip4h      = GET_IP4_HDR(input);
     178                ip4h->dst = ip4h->src;
     179                ip4h->src = htonl(ifp->in4_ifaddr.addr);
     180
     181                /* チェックサムを計算する。*/
     182                icmp4h->sum = 0;
     183                icmp4h->sum = in_cksum(icmp4h,
     184                                       (uint_t)(((input->len - GET_IF_IP4_HDR_SIZE(input)) + 3) >> 2 << 2));
     185
     186                /* 送信する。*/
     187                NET_COUNT_ICMP4(net_count_icmp4.out_octets,
     188                               input->len - GET_IF_IP4_HDR_SIZE(input));
     189                NET_COUNT_ICMP4(net_count_icmp4.out_packets, 1);
     190                NET_COUNT_MIB(icmp_stats.icmpOutMsgs, 1);
     191                NET_COUNT_MIB(icmp_stats.icmpOutEchoReps, 1);
     192                ip_output(input, TMO_ICMP_OUTPUT);
     193                }
    177194        }
    178195
     
    212229        code  = GET_ICMP4_HDR(input, ihoff)->code;
    213230        error = code2error[code];
    214         if (ip4h->proto == IPPROTO_TCP) {
    215 
    216 #ifdef SUPPORT_TCP
     231
     232        /* 最終ヘッダが TCP/UDP のみ対応する。*/
     233        if (ip4h->proto == IPPROTO_TCP || ip4h->proto == IPPROTO_UDP) {
    217234
    218235                memcpy(GET_IP4_HDR(input), ip4h, input->len - (IP4_HDR_SIZE + ICMP4_HDR_SIZE));
    219236                input->len -= IP4_HDR_SIZE + ICMP4_HDR_SIZE;
    220                 tcp_notify(input, error);
    221 
    222 #endif  /* of #ifdef SUPPORT_TCP */
     237
     238#if defined(SUPPORT_TCP)
     239
     240                if (ip4h->proto == IPPROTO_TCP)
     241                        tcp_notify(input, error);
     242
     243#endif  /* of #if defined(SUPPORT_TCP) */
     244
     245#if defined(SUPPORT_UDP) && TNUM_UDP4_CEPID > 0
     246
     247                if (ip4h->proto == IPPROTO_UDP)
     248                        udp4_notify(input, error);
     249
     250#endif  /* of #if defined(SUPPORT_UDP) && TNUM_UDP4_CEPID > 0 */
    223251
    224252                }
     
    227255        }
    228256
     257#if defined(NUM_REDIRECT_ROUTE_ENTRY)
    229258#if NUM_REDIRECT_ROUTE_ENTRY > 0
    230259
     
    264293
    265294#endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
     295#endif  /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
    266296
    267297/*
     
    314344        case ICMP4_ECHO_REPLY:
    315345
    316 #ifdef ICMP_CFG_CALLBACK_ECHO_REPLY
     346#if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY)
    317347
    318348                icmp_echo_reply(input, *offp);
    319349
    320 #endif  /* of #ifdef ICMP_CFG_CALLBACK_ECHO_REPLY */
     350#endif  /* of #if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY) */
    321351
    322352                break;
     
    326356        case ICMP4_REDIRECT:
    327357
     358#if defined(NUM_REDIRECT_ROUTE_ENTRY)
    328359#if NUM_REDIRECT_ROUTE_ENTRY > 0
    329360
     
    338369
    339370#endif  /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
     371#else   /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
     372
     373                addr = ntohl(icmp4h->data.addr);
     374                syslog(LOG_INFO, "[ICMP] redirect ignored, addr: %s.", ip2str(NULL, &addr));
     375
     376#endif  /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
    340377
    341378                break;
     
    371408
    372409        ip4h  = GET_IP4_HDR(input);
    373         ip4hl = GET_IP4_HDR_SIZE(ip4h);
     410        ip4hl = GET_IP4_HDR_SIZE(input);
    374411
    375412        /* 送信用の IP データグラムを獲得する。*/
     
    378415        else
    379416                len = 8;
    380 
     417       
    381418        saddr = ntohl(ip4h->src);
    382419        if (in4_get_datagram(&output, (uint_t)(ICMP4_HDR_SIZE + ip4hl + len), 0,
     
    417454
    418455#endif  /* of #ifdef ICMP_REPLY_ERROR */
     456
     457#endif  /* of #if defined(_IP4_CFG) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.h

    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 *
     
    7171#define _IP_ICMP_H_
    7272
     73#include <netinet/icmp6.h>
     74
    7375/*
    7476 *  ICMP ヘッダの定義、RFC 792
     
    9698#define GET_ICMP4_SDU(nbuf,ihoff)       ((uint8_t*)((nbuf)->buf) + ihoff + ICMP4_HDR_SIZE)
    9799
    98 #define GET_ICMP4_HDR_OFFSET(nbuf)      (GET_IF_IP_HDR_SIZE(nbuf))
     100#define GET_ICMP4_HDR_OFFSET(nbuf)      (GET_IF_IP4_HDR_SIZE(nbuf))
    99101
    100 #define GET_IP4_ICMP4_HDR_SIZE(nbuf)    (GET_IP4_HDR_SIZE(GET_IP4_HDR(nbuf)) + ICMP4_HDR_SIZE)
     102#define GET_IP4_ICMP4_HDR_SIZE(nbuf)    (GET_IP4_HDR_SIZE(nbuf) + ICMP4_HDR_SIZE)
    101103#define GET_IF_IP4_ICMP4_HDR_SIZE(nbuf) (IF_HDR_SIZE + GET_IP4_ICMP4_HDR_SIZE(nbuf))
    102104
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_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 *
     
    7777#include <t_syslog.h>
    7878#include "kernel_cfg.h"
     79#include "tinet_cfg.h"
    7980
    8081#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8586#include <t_services.h>
    8687#include "kernel_id.h"
     88#include "tinet_id.h"
    8789
    8890#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9799#include <net/ppp_ipcp.h>
    98100#include <net/net.h>
     101#include <net/net_endian.h>
    99102#include <net/net_buf.h>
    100103#include <net/net_count.h>
     
    107110#include <netinet/ip_icmp.h>
    108111#include <netinet/tcp.h>
    109 #include <netinet/tcp_timer.h>
    110112#include <netinet/tcp_var.h>
    111113#include <netinet/udp.h>
    112114#include <netinet/udp_var.h>
     115#include <netinet/ip_igmp.h>
    113116
    114117#if defined(SUPPORT_IPSEC)
     
    122125
    123126#include <net/if_var.h>
     127
     128#if defined(_IP4_CFG)
    124129
    125130/*
     
    345350ip_remove_options (T_NET_BUF *nbuf)
    346351{
    347         T_IP_HDR        *iph;
    348 
    349         iph  = GET_IP_HDR(nbuf);
    350 
    351         if (GET_IP_HDR_SIZE(iph) > IP4_HDR_SIZE) {
    352                 memmove((char *)iph + IP4_HDR_SIZE, GET_IP_SDU(nbuf),
    353                         (size_t)(iph->len - GET_IP_HDR_SIZE(iph)));
     352        T_IP4_HDR       *iph;
     353        uint_t          hdr_size;
     354
     355        iph  = GET_IP4_HDR(nbuf);
     356        hdr_size = GET_IP4_HDR_SIZE(nbuf);
     357
     358        if (hdr_size > IP4_HDR_SIZE) {
     359                memmove((char *)iph + IP4_HDR_SIZE, GET_IP4_SDU(nbuf),
     360                        (size_t)(iph->len - hdr_size));
    354361                iph->vhl   = IP4_MAKE_VHL(IPV4_VERSION, IP4_HDR_SIZE >> 2);
    355                 iph->len  -= (uint16_t)(GET_IP_HDR_SIZE(iph) - IP4_HDR_SIZE);
    356                 nbuf->len -= (uint16_t)(GET_IP_HDR_SIZE(iph) - IP4_HDR_SIZE);
     362                iph->len  -= (uint16_t)(hdr_size - IP4_HDR_SIZE);
     363                nbuf->len -= (uint16_t)(hdr_size - IP4_HDR_SIZE);
    357364                }
    358365
     
    389396                }
    390397
    391         ip4h  = GET_IP4_HDR(input);
    392         hlen = GET_IP4_HDR_SIZE(ip4h);
     398        ip4h = GET_IP4_HDR(input);
     399        hlen = GET_IP4_HDR_SIZE(input);
    393400
    394401        /* バージョンをチェックする。*/
     
    429436        /* 送信元アドレスをチェックする。*/
    430437        src = ntohl(ip4h->src);
    431         bc  = (ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask;
     438        bc  = (ifp->in4_ifaddr.addr & ifp->in4_ifaddr.mask) | ~ifp->in4_ifaddr.mask;
    432439
    433440#ifdef SUPPORT_LOOP
     
    441448#else   /* of #ifdef SUPPORT_LOOP */
    442449
    443         if (src == ifp->in_ifaddr.addr || src == bc || src == IPV4_ADDR_BROADCAST || src == IPV4_ADDRANY) {
     450        if (src == ifp->in4_ifaddr.addr || src == bc || src == IPV4_ADDR_BROADCAST || src == IPV4_ADDRANY) {
    444451                NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
    445452                NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
     
    459466         */
    460467
    461         if ((ifp->in_ifaddr.addr != IPV4_ADDRANY) &&
    462             (!(dst == ifp->in_ifaddr.addr || dst == bc ||
    463                dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY))) {
     468#if defined(ETHER_CFG_MULTICAST)
     469        if ((ifp->in4_ifaddr.addr != IPV4_ADDRANY) &&
     470                (!(dst == ifp->in4_ifaddr.addr || dst == bc ||
     471                   dst == IPV4_ADDR_BROADCAST  || dst == IPV4_ADDRANY ||
     472                  IN4_IS_ADDR_MULTICAST(dst)))) {
    464473                NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
    465474                NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
    466475                goto buf_rel;
    467476                }
     477#else
     478        if ((ifp->in4_ifaddr.addr != IPV4_ADDRANY) &&
     479            (!(dst == ifp->in4_ifaddr.addr || dst == bc ||
     480               dst == IPV4_ADDR_BROADCAST  || dst == IPV4_ADDRANY))) {
     481                NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
     482                NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
     483                goto buf_rel;
     484                }
     485#endif
    468486
    469487#else   /* of #ifdef DHCP_CFG */
    470488
    471489#if defined(ETHER_CFG_MULTICAST)
    472         if (!(dst == ifp->in_ifaddr.addr || dst == bc ||
     490        if (!(dst == ifp->in4_ifaddr.addr || dst == bc ||
    473491                  dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY ||
    474492                  IN4_IS_ADDR_MULTICAST(dst))) {
     
    478496                }
    479497#else
    480         if (!(dst == ifp->in_ifaddr.addr || dst == bc ||
    481               dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY)) {
     498        if (!(dst == ifp->in4_ifaddr.addr || dst == bc ||
     499              dst == IPV4_ADDR_BROADCAST  || dst == IPV4_ADDRANY)) {
    482500                NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
    483501                NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
     
    525543        switch (ip4h->proto) {
    526544
    527 #ifdef SUPPORT_UDP
    528         case IPPROTO_UDP:
    529                 NET_COUNT_MIB(ip_stats.ipInDelivers, 1);
    530                 udp_input(&input, &off, NULL);
    531                 return;
    532                 break;
    533 #endif  /* of #ifdef SUPPORT_UDP */
    534 
    535 #ifdef SUPPORT_TCP
     545#if defined(SUPPORT_TCP)
    536546        case IPPROTO_TCP:
    537547                NET_COUNT_MIB(ip_stats.ipInDelivers, 1);
     
    539549                return;
    540550                break;
    541 #endif  /* of #ifdef SUPPORT_UDP */
     551#endif  /* of #if defined(SUPPORT_TCP) */
     552
     553#if defined(SUPPORT_UDP) && ( (TNUM_UDP4_CEPID > 0) || \
     554                             ((TNUM_UDP6_CEPID > 0) && defined(API_CFG_IP4MAPPED_ADDR)))
     555        case IPPROTO_UDP:
     556                NET_COUNT_MIB(ip_stats.ipInDelivers, 1);
     557                udp4_input(&input, &off, NULL);
     558                return;
     559                break;
     560#endif  /* of #if defined(SUPPORT_UDP) && TNUM_UDP4_CEPID > 0 */
    542561
    543562        case IPPROTO_ICMP:
     
    546565                return;
    547566                break;
     567
     568#if defined(SUPPORT_IGMP)
     569        case IPPROTO_IGMP:
     570                NET_COUNT_MIB(ip_stats.ipInDelivers, 1);
     571                igmp_input(&input, &off, NULL);
     572                return;
     573                break;
     574#endif /* of #ifdef UDP_CFG_EXTENTIONS */
    548575
    549576#if defined(SUPPORT_IPSEC)
     
    560587
    561588                /* ローカル IP アドレスに届いたデータグラムのみ ICMP エラーを通知する。*/
    562                 if (dst == ifp->in_ifaddr.addr) {
     589                if (dst == ifp->in4_ifaddr.addr) {
    563590                        T_IN4_ADDR      src;
    564591
     
    578605        syscall(rel_net_buf(input));
    579606        }
     607
     608#endif  /* of #if defined(_IP4_CFG) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_output.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 *
     
    9393#include <net/ppp.h>
    9494#include <net/net.h>
     95#include <net/net_endian.h>
    9596#include <net/net_buf.h>
    9697#include <net/net_count.h>
     
    104105#include <netinet6/ipsec.h>
    105106#endif
     107
     108#if defined(_IP4_CFG)
    106109
    107110static uint16_t frag_id = 0;
     
    221224
    222225                len  = ntohs(ip4h->len);
    223                 off  = hlen = GET_IP4_HDR_SIZE(ip4h);
     226                off  = hlen = GET_IP4_HDR_SIZE(output);
    224227                while (off < len) {
    225228                        if (off + (IF_MTU - IP4_HDR_SIZE) < len)
     
    245248                                fip4h->id       = htons(frag_id);
    246249                                fip4h->sum      = 0;
    247                                 fip4h->sum      = in_cksum(fip4h, GET_IP4_HDR_SIZE(fip4h));
     250                                fip4h->sum      = in_cksum(fip4h, GET_IP4_HDR_SIZE(frag));
    248251
    249252                                NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(fip4h->len));
     
    279282                frag_id ++;
    280283                ip4h->sum = 0;
    281                 ip4h->sum = in_cksum(ip4h, GET_IP4_HDR_SIZE(ip4h));
     284                ip4h->sum = in_cksum(ip4h, GET_IP4_HDR_SIZE(output));
    282285
    283286                NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(ip4h->len));
     
    301304        frag_id ++;
    302305        ip4h->sum = 0;
    303         ip4h->sum = in_cksum(ip4h, (uint_t)GET_IP4_HDR_SIZE(ip4h));
     306        ip4h->sum = in_cksum(ip4h, (uint_t)GET_IP4_HDR_SIZE(output));
    304307
    305308        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(ip4h->len));
     
    327330        return error;
    328331        }
     332
     333#endif  /* of #if defined(_IP4_CFG) */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_var.h

    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 *
     
    7171#define _IP_VAR_H_
    7272
    73 /*
    74  *  IPv4 ヘッダ・ペイロードアクセスマクロ
    75  */
    76 
    77 #define IF_IP4_HDR_SIZE                 (IF_HDR_SIZE + IP4_HDR_SIZE)
    78 
    79 #define GET_IP4_HDR(nbuf)               ((T_IP4_HDR*)((nbuf)->buf + IF_HDR_SIZE))
    80 #define GET_IP4_SDU(nbuf)               ((uint8_t*)((nbuf)->buf) + GET_IF_IP4_HDR_SIZE(nbuf))
    81 
    82 #define GET_IP4_HDR_SIZE(iph)           ((uint8_t)IP4_VHL_HL((iph)->vhl) << 2)
    83 #define GET_IP4_SDU_SIZE(iph)           (ntohs((iph)->len) - GET_IP4_HDR_SIZE(iph))
    84 #define GET_IF_IP4_HDR_SIZE(nbuf)       (IF_HDR_SIZE + (GET_IP4_HDR_SIZE(GET_IP4_HDR(nbuf))))
    85 
    86 #define SET_IP4_SDU_SIZE(iph,slen)      ((iph)->len=(uint16_t)htons((slen) + IP4_HDR_SIZE))
     73#include <netinet/ip4_var.h>
     74#include <netinet6/ip6_var.h>
    8775
    8876/*
     
    9078 */
    9179
    92 #if defined(SUPPORT_INET4)
     80#define GET_IP_VER(nbuf)                (*(uint8_t*)((nbuf)->buf+IF_HDR_SIZE)>>4)
    9381
    94 #define T_TCP_IP_Q_HDR                  T_TCP_IP4_Q_HDR
     82#if defined(_IP6_CFG)
    9583
    96 #define IF_IP_HDR_SIZE                  IF_IP4_HDR_SIZE
     84#if defined(_IP4_CFG)
     85
     86#define IF_IP_HDR_SIZE(nbuf)            (GET_IP_VER(nbuf)==IPV6_VERSION?IF_IP6_HDR_SIZE:IF_IP4_HDR_SIZE)
     87#define IF_IP_NET_HDR_SIZE(addr)        (IN6_IS_ADDR_V4MAPPED(addr)?IF_IP4_HDR_SIZE:IF_IP6_HDR_SIZE)
     88
     89#define IP_OUTPUT(nbuf,tmout)           (GET_IP_VER(nbuf)==IPV6_VERSION?ip6_output(nbuf,0,tmout):ip_output(nbuf,tmout))
     90#define IP_REMOVE_OPTIONS(nbuf)         (GET_IP_VER(nbuf)==IPV6_VERSION?ip6_remove_exthdrs(nbuf):ip_remove_options(nbuf))
     91
     92#define GET_IP_HDR(nbuf)                (GET_IP_VER(nbuf)==IPV6_VERSION?GET_IP6_HDR(nbuf):GET_IP4_HDR(nbuf))
     93#define GET_IP_HDR_SIZE(nbuf)           (GET_IP_VER(nbuf)==IPV6_VERSION?GET_IP6_HDR_SIZE(nbuf):GET_IP4_HDR_SIZE(nbuf))
     94#define GET_IP_SDU_SIZE(nbuf)           (GET_IP_VER(nbuf)==IPV6_VERSION?GET_IP6_SDU_SIZE(nbuf):GET_IP4_SDU_SIZE(nbuf))
     95#define GET_IF_IP_HDR_SIZE(nbuf)        (GET_IP_VER(nbuf)==IPV6_VERSION?GET_IF_IP6_HDR_SIZE(nbuf):GET_IF_IP4_HDR_SIZE(nbuf))
     96#define GET_IP_TCP_Q_HDR_OFFSET(nbuf)   (GET_IP_VER(nbuf)==IPV6_VERSION?\
     97                                        ((T_IP6_TCP_Q_HDR*)GET_IP6_HDR(nbuf))->thoff:((T_IP4_TCP_Q_HDR*)GET_IP4_HDR(nbuf))->thoff)
     98
     99#define SET_IP_CF(nbuf,cf)              (GET_IP_VER(nbuf)==IPV6_VERSION?SET_IP6_CF(nbuf,cf):(0))
     100#define SET_IP_SDU_SIZE(nbuf,len)       (GET_IP_VER(nbuf)==IPV6_VERSION?SET_IP6_SDU_SIZE(nbuf,len):SET_IP4_SDU_SIZE(nbuf,len))
     101#define SET_IP_TCP_Q_HDR_OFFSET(nbuf,thoff)     \
     102                                        (GET_IP_VER(nbuf)==IPV6_VERSION\
     103                                                ?(((T_IP6_TCP_Q_HDR*)GET_IP6_HDR(nbuf))->thoff=thoff)\
     104                                                :(((T_IP4_TCP_Q_HDR*)GET_IP4_HDR(nbuf))->thoff=thoff))
     105
     106#else   /* of #if defined(_IP4_CFG) */
     107
     108#define IF_IP_HDR_SIZE(nbuf)            IF_IP6_HDR_SIZE
     109#define IF_IP_NET_HDR_SIZE(addr)        IF_IP6_HDR_SIZE
     110
     111#define IP_OUTPUT(nbuf,tmout)           ip6_output(nbuf,0,tmout)
     112#define IP_REMOVE_OPTIONS(nbuf)         ip6_remove_exthdrs(nbuf)
     113
     114#define GET_IP_HDR(nbuf)                GET_IP6_HDR(nbuf)
     115#define GET_IP_HDR_SIZE(nbuf)           GET_IP6_HDR_SIZE(nbuf)
     116#define GET_IP_SDU_SIZE(nbuf)           GET_IP6_SDU_SIZE(nbuf)
     117#define GET_IF_IP_HDR_SIZE(nbuf)        GET_IF_IP6_HDR_SIZE(nbuf)
     118#define GET_IP_TCP_Q_HDR_OFFSET(nbuf)   (((T_IP6_TCP_Q_HDR*)GET_IP6_HDR(nbuf))->thoff)
     119
     120#define SET_IP_CF(nbuf,cf)              SET_IP6_CF(nbuf,cf)
     121#define SET_IP_SDU_SIZE(nbuf,len)       SET_IP6_SDU_SIZE(nbuf,len)
     122#define SET_IP_TCP_Q_HDR_OFFSET(nbuf,thoff)     \
     123                                        (((T_IP6_TCP_Q_HDR*)GET_IP6_HDR(nbuf))->thoff=thoff)
     124
     125#endif  /* of #if defined(_IP4_CFG) */
     126
     127#else   /* of #if defined(_IP6_CFG) */
     128
     129#if defined(_IP4_CFG)
     130
     131#define IF_IP_HDR_SIZE(nbuf)            IF_IP4_HDR_SIZE
     132#define IF_IP_NET_HDR_SIZE(addr)        IF_IP4_HDR_SIZE
     133
     134#define IP_OUTPUT(nbuf,tmout)           ip_output(nbuf,tmout)
     135#define IP_REMOVE_OPTIONS(nbuf)         ip_remove_options(nbuf)
    97136
    98137#define GET_IP_HDR(nbuf)                GET_IP4_HDR(nbuf)
    99 #define GET_IP_SDU(nbuf)                GET_IP4_SDU(nbuf)
     138#define GET_IP_HDR_SIZE(nbuf)           GET_IP4_HDR_SIZE(nbuf)
     139#define GET_IP_SDU_SIZE(nbuf)           GET_IP4_SDU_SIZE(nbuf)
     140#define GET_IF_IP_HDR_SIZE(nbuf)        GET_IF_IP4_HDR_SIZE(nbuf)
     141#define GET_IP_TCP_Q_HDR_OFFSET(nbuf)   (((T_IP4_TCP_Q_HDR*)GET_IP4_HDR(nbuf))->thoff)
    100142
    101 #define GET_IP_HDR_SIZE(iph)            GET_IP4_HDR_SIZE(iph)
    102 #define GET_IP_SDU_SIZE(iph)            GET_IP4_SDU_SIZE(iph)
    103 #define GET_IF_IP_HDR_SIZE(nbuf)        GET_IF_IP4_HDR_SIZE(nbuf)
     143#define SET_IP_SDU_SIZE(nbuf,len)       SET_IP4_SDU_SIZE(nbuf,len)
     144#define SET_IP_TCP_Q_HDR_OFFSET(nbuf,thoff)     \
     145                                        (((T_IP4_TCP_Q_HDR*)GET_IP4_HDR(nbuf))->thoff=thoff)
    104146
    105 #define SET_IP_SDU_SIZE(iph,len)        SET_IP4_SDU_SIZE(iph,len)
     147#else   /* of #if defined(_IP4_CFG) */
    106148
    107 #define IP_OUTPUT(nbuf,tmout)           ip_output(nbuf,tmout)
    108 #define IP_INIT()                       ip_init()
    109 #define IP_REMOVE_OPTIONS(nbuf)         ip_remove_options(nbuf)
     149#error "not implemented."
    110150
    111 #endif  /* of #if defined(SUPPORT_INET4) */
     151#endif  /* of #if defined(_IP4_CFG) */
    112152
    113 /*
    114  *  IP の MSS サイズのネットワークバッファ
    115  */
    116 
    117 typedef struct t_net_buf_ip_mss {
    118         uint16_t        len;    /* データの長さ               */
    119         uint8_t         idix;   /* mpfid のインデックス        */
    120         uint8_t         flags;  /* フラグ          */
    121 #ifdef IF_ETHER_NIC_NET_BUF_ALIGN
    122         uint8_t         nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
    123 #endif
    124 #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
    125         uint8_t         halign[4 - IF_HDR_ALIGN];
    126 #endif
    127         uint8_t         buf[IF_HDR_SIZE + IP4_MSS];
    128                                 /* バッファ本体               */
    129         } T_NET_BUF_IP_MSS;
    130 
    131 /*
    132  *  65536 オクテットサイズのネットワークバッファ
    133  */
    134 
    135 typedef struct t_net_buf4_65536 {
    136         uint16_t        len;    /* データの長さ               */
    137         uint8_t         idix;   /* mpfid のインデックス        */
    138         uint8_t         flags;  /* フラグ          */
    139 #ifdef IF_ETHER_NIC_NET_BUF_ALIGN
    140         uint8_t         nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
    141 #endif
    142 #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
    143         uint8_t         halign[4 - IF_HDR_ALIGN];
    144 #endif
    145         uint8_t         buf[IF_IP4_HDR_SIZE + 65536];
    146                                 /* バッファ本体               */
    147 #if defined(IF_PDU_HDR_PADDING)
    148         uint8_t         padding[IF_PDU_HDR_PADDING];
    149 #endif                          /* ヘッダの余分               */
    150         } T_NET_BUF4_65536;
    151 
    152 #ifdef IP4_CFG_FRAGMENT
    153 
    154 /*
    155  *  再構成キュー用 IPv4 ヘッダの定義
    156  */
    157 
    158 typedef struct t_qip4_hdr {
    159         uint8_t         vhl;            /* version << 4 | header length >> 2    */
    160                                         /* length は 4 octets 単位         */
    161         uint8_t         type;           /* type of services                     */
    162         uint16_t        len;            /* total length                         */
    163 
    164         uint16_t        id;             /* identification                       */
    165         uint16_t        flg_off;        /* fragment flag & offset               */
    166 
    167         uint8_t         ttl;            /* time to live                         */
    168         uint8_t         proto;          /* protocol                             */
    169         uint16_t        sum;            /* checksum                             */
    170 
    171         uint32_t        src;            /* source address                       */
    172 
    173         T_NET_BUF       *next;          /* 次の IPv4 フラグメント                       */
    174         } __attribute__((packed, aligned(2)))T_QIP4_HDR;
    175 
    176 #define QIP4_HDR_SIZE                   (sizeof(T_QIP4_HDR))
    177 #define IF_QIP4_HDR_SIZE                (IF_HDR_SIZE + QIP4_HDR_SIZE)
    178 
    179 #define GET_QIP4_HDR(nbuf)              ((T_QIP4_HDR*)((nbuf)->buf + IF_HDR_SIZE))
    180 #define GET_QIP4_SDU(nbuf)              ((uint8_t*)(nbuf)->buf + GET_IF_QIP4_HDR_SIZE(nbuf))
    181 
    182 #define GET_QIP4_HDR_SIZE(iph)          ((uint8_t)IP4_VHL_HL((iph)->vhl) << 2)
    183 #define GET_IF_QIP4_HDR_SIZE(nbuf)      (IF_HDR_SIZE + (GET_QIP4_HDR_SIZE(GET_QIP4_HDR(nbuf))))
    184 
    185 /*
    186  *  データグラム再構成用ネットワークバッファ
    187  */
    188 
    189 typedef struct t_net_buf4_reassm {
    190         uint16_t        len;    /* データの長さ               */
    191         uint8_t         idix;   /* mpfid のインデックス        */
    192         uint8_t         flags;  /* フラグ          */
    193 #ifdef IF_ETHER_NIC_NET_BUF_ALIGN
    194         uint8_t         nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
    195 #endif
    196 #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
    197         uint8_t         align[4 - IF_HDR_ALIGN];
    198 #endif
    199         uint8_t         buf[IP4_CFG_FRAG_REASSM_SIZE];
    200                                 /* バッファ本体               */
    201         } T_NET_BUF4_REASSM;
    202 
    203 #endif  /* of #ifdef IP4_CFG_FRAGMENT */
    204 
    205 /*
    206  *  TCP の再構成キューにおける IPv4 ヘッダの定義
    207  */
    208 
    209 typedef struct t_tcp_ip4_q_hdr {
    210         uint8_t         vhl;            /* version << 4 | header length >> 2    */
    211                                         /* length は 4 octets 単位         */
    212         uint8_t         type;           /* type of services                     */
    213         uint16_t        len;            /* total length                         */
    214 
    215         uint16_t        id;             /* identification                       */
    216         uint16_t        flg_off;        /* fragment flag & offset               */
    217 
    218         uint8_t         ttl;            /* time to live                         */
    219         uint8_t         proto;          /* protocol                             */
    220         uint16_t        thoff;          /* TCP ヘッダのオフセット                */
    221 
    222         T_IN4_ADDR      src;            /* source address                       */
    223         T_IN4_ADDR      dst;            /* destination address                  */
    224         } __attribute__((packed, aligned(2)))T_TCP_IP4_Q_HDR;
    225 
    226 #ifdef SUPPORT_MIB
    227 
    228 /*
    229  *  SNMP の 管理情報ベース (MIB)
    230  */
    231 
    232 typedef struct t_ip_stats {
    233         uint32_t        ipInReceives;
    234         uint32_t        ipInHdrErrors;
    235         uint32_t        ipInAddrErrors;
    236 /*      uint32_t        ipForwDatagrams;*/
    237         uint32_t        ipInUnknownProtos;
    238 /*      uint32_t        ipInDiscards;*/
    239         uint32_t        ipInDelivers;
    240         uint32_t        ipOutRequests;
    241         uint32_t        ipOutDiscards;
    242 /*      uint32_t        ipOutNoRoutes;*/
    243 
    244 #ifdef IP4_CFG_FRAGMENT
    245 
    246         uint32_t        ipReasmReqds;
    247         uint32_t        ipReasmOKs;
    248         uint32_t        ipReasmFails;
    249         uint32_t        ipFragOKs;
    250         uint32_t        ipFragFails;
    251         uint32_t        ipFragCreates;
    252 
    253 #else   /* of #ifdef IP4_CFG_FRAGMENT */
    254 
    255         uint32_t        ipReasmReqds;
    256 /*      uint32_t        ipReasmOKs;*/
    257         uint32_t        ipReasmFails;
    258 /*      uint32_t        ipFragOKs;*/
    259 /*      uint32_t        ipFragFails;*/
    260 /*      uint32_t        ipFragCreates;*/
    261 
    262 #endif  /* of #ifdef IP4_CFG_FRAGMENT */
    263 
    264 } T_IP_STATS;
    265 
    266 extern T_IP_STATS ip_stats;
    267 
    268 #endif  /* of #ifdef SUPPORT_MIB */
    269 
    270 /*
    271  *  関数
    272  */
    273 
    274 extern void ip_frag_timer (void);
    275 extern void ip_init (void);
    276 extern ER ip_remove_options (T_NET_BUF *nbuf);
    277 extern ER ip_output (T_NET_BUF *nbuf, TMO tmout);
     153#endif  /* of #if defined(_IP6_CFG) */
    278154
    279155#endif  /* of #ifndef _IP_VAR_H_ */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp.cfg

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp.h

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_fsm.h

    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 *
  • 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)
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_output.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 *
     
    9393#include <net/ethernet.h>
    9494#include <net/net.h>
     95#include <net/net_endian.h>
     96#include <net/net_var.h>
    9597#include <net/net_buf.h>
    9698#include <net/net_timer.h>
     
    98100
    99101#include <netinet/in.h>
    100 #include <netinet6/in6.h>
    101102#include <netinet/in_var.h>
    102103#include <netinet/in_itron.h>
    103104#include <netinet/ip.h>
    104105#include <netinet/ip_var.h>
    105 #include <netinet6/in6_var.h>
    106 #include <netinet/ip6.h>
    107 #include <netinet6/ip6_var.h>
    108106#include <netinet/tcp.h>
    109 #include <netinet/tcp_timer.h>
    110107#include <netinet/tcp_var.h>
    111108#include <netinet/tcp_fsm.h>
    112109#include <netinet/tcp_seq.h>
     110#include <netinet/tcp_timer.h>
    113111
    114112#ifdef SUPPORT_TCP
     
    150148        T_NET_BUF       *output;
    151149        T_TCP_HDR       *tcph;
    152         uint_t          optlen;
     150        uint_t          optlen, hdr_offset;
    153151        ER              error;
    154152
     
    210208                 */
    211209                len = 0;
    212                 if ((error = tcp_get_segment(&output, cep, optlen,
    213                                             len, (uint_t)(net_buf_max_siz() - IF_IP_TCP_HDR_SIZE),
     210                if ((error = tcpn_get_segment(&output, cep, optlen,
     211                                            len, (uint_t)net_buf_max_siz(),
    214212                                            NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) {
    215213                        if (cep->timer[TCP_TIM_REXMT] == 0)
     
    222220
    223221        if (IS_PTR_DEFINED(cep->sbuf)) {
    224                 if ((error = tcp_get_segment(&output, cep, optlen,
    225                                              len, (uint_t)(net_buf_max_siz() - IF_IP_TCP_HDR_SIZE),
     222                if ((error = tcpn_get_segment(&output, cep, optlen,
     223                                             len, (uint_t)net_buf_max_siz(),
    226224                                             NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) {
    227225                        if (cep->timer[TCP_TIM_REXMT] == 0)
     
    247245                 */
    248246                len = 0;
    249                 if ((error = tcp_get_segment(&output, cep, optlen,
    250                                             len, (uint_t)(net_buf_max_siz() - IF_IP_TCP_HDR_SIZE),
     247                if ((error = tcpn_get_segment(&output, cep, optlen,
     248                                            len, (uint_t)net_buf_max_siz(),
    251249                                            NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) {
    252250                        if (cep->timer[TCP_TIM_REXMT] == 0)
     
    258256#else   /* of #if defined(TCP_CFG_SWBUF_CSAVE_ONLY) */
    259257
    260         if ((error = tcp_get_segment(&output, cep, optlen,
    261                                      len, (uint_t)(net_buf_max_siz() - IF_IP_TCP_HDR_SIZE),
     258        if ((error = tcpn_get_segment(&output, cep, optlen,
     259                                     len, (uint_t)net_buf_max_siz(),
    262260                                     NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) {
    263261                if (cep->timer[TCP_TIM_REXMT] == 0)
     
    272270         *  本実装では、最大セグメントサイズのみ設定する。
    273271         */
     272        hdr_offset = IF_IP_TCP_HDR_OFFSET(output);
    274273        if (flags & TCP_FLG_SYN) {
    275274                cep->snd_nxt = cep->iss;
     
    277276#ifdef TCP_CFG_OPT_MSS
    278277
    279                 optp = GET_TCP_OPT(output, IF_IP_TCP_HDR_OFFSET);
     278                optp = GET_TCP_OPT(output, hdr_offset);
    280279                *optp ++ = TCP_OPT_MAXSEG;
    281280                *optp ++ = TCP_OPT_LEN_MAXSEG;
     
    324323                }
    325324
    326         tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET);
     325        tcph = GET_TCP_HDR(output, hdr_offset);
    327326
    328327        /*
     
    379378         */
    380379        tcph->sum = 0;
    381         tcph->sum = IN_CKSUM(output, IPPROTO_TCP, (uint_t)GET_TCP_HDR_OFFSET(output),
    382                              GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len);
     380        tcph->sum = IN_CKSUM(output, IPPROTO_TCP, hdr_offset, GET_TCP_HDR_SIZE(output, hdr_offset) + len);
    383381
    384382        /* ネットワークバッファ長を調整する。*/
    385         output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len);
     383        output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset) + len);
    386384
    387385        /*
     
    490488         * ・動的な通信端点の生成・削除機能
    491489         */
    492         cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK |
    493                        TCP_CEP_FLG_DYNAMIC       | TCP_CEP_FLG_VALID);
     490        cep->flags &= TCP_CEP_FLG_NOT_CLEAR;
    494491
    495492        return error;
     
    864861#endif  /* of #ifdef TCP_CFG_NON_BLOCKING */
    865862
    866                 if ((error = tcp_get_segment(&cep->swbufq, cep, 0,
    867                                              (uint_t) TCP_CFG_SWBUF_CSAVE_MIN_SIZE,
    868                                              (uint_t)(TCP_CFG_SWBUF_CSAVE_MAX_SIZE - IF_IP_TCP_HDR_SIZE),
     863                if ((error = tcpn_get_segment(&cep->swbufq, cep, 0,
     864                                             (uint_t)TCP_CFG_SWBUF_CSAVE_MIN_SIZE,
     865                                             (uint_t)TCP_CFG_SWBUF_CSAVE_MAX_SIZE,
    869866                                             (ATR)(NBA_SEARCH_DESCENT |
    870867                                                   NBA_RESERVE_TCP    |
     
    888885                                len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf);
    889886
     887                                /* コールバック関数を呼び出す。*/
    890888#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    891 
    892                                 /* コールバック関数を呼び出す。*/
    893889                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
    894 
    895 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    896 
    897                                 /* コールバック関数を呼び出す。*/
     890#else
    898891                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
    899 
    900 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
     892#endif
    901893
    902894
     
    924916                                /* フラグを、送信可能に設定し、強制的に送信する。*/
    925917                                cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT;
     918
     919                                /* コールバック関数を呼び出す。*/
    926920#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    927 
    928                                 /* コールバック関数を呼び出す。*/
    929921                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
    930 
    931 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    932 
    933                                 /* コールバック関数を呼び出す。*/
     922#else
    934923                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
    935 
    936 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
     924#endif
    937925
    938926
     
    999987        tcp_init();
    1000988
    1001 #ifdef SUPPORT_INET6
     989#ifdef _IP6_CFG
    1002990
    1003991        /* IPv6 のステートレス・アドレス自動設定を実行する。*/
    1004992        in6_if_up(IF_GET_IFNET());
    1005993
    1006 #endif  /* of #ifdef SUPPORT_INET6 */
     994#endif  /* of #ifdef _IP6_CFG */
    1007995
    1008996        while (true) {
     
    10831071
    10841072                                                if (IS_PTR_DEFINED(cep->callback))
    1085 
    10861073#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1087 
    10881074                                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)error);
    1089 
    1090 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1091 
     1075#else
    10921076                                                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&error);
    1093 
    1094 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1095 
     1077#endif
    10961078                                                else
    10971079                                                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_seq.h

    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 *
  • 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        }
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr_cs.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/if_arp.h>
    97 #include <net/ppp_ipcp.h>
    9897#include <net/net.h>
     98#include <net/net_endian.h>
    9999#include <net/net_var.h>
    100100#include <net/net_buf.h>
     
    103103
    104104#include <netinet/in.h>
    105 #include <netinet6/in6.h>
    106 #include <netinet6/in6_var.h>
    107105#include <netinet/in_var.h>
     106#include <netinet/in_itron.h>
    108107#include <netinet/ip.h>
    109108#include <netinet/ip_var.h>
    110 #include <netinet/ip6.h>
    111 #include <netinet6/ip6_var.h>
    112 #include <netinet6/nd6.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>
    118 #include <netinet/in_itron.h>
     113#include <netinet/tcp_timer.h>
    119114
    120115#ifdef SUPPORT_TCP
     
    122117#ifdef TCP_CFG_SWBUF_CSAVE
    123118
    124 #ifndef TCP_CFG_SWBUF_CSAVE_ONLY
     119#ifdef TCP_CFG_SWBUF_CSAVE_ONLY
     120
     121#else   /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
    125122
    126123/*
     
    242239        }
    243240
    244 #endif  /* of #ifndef TCP_CFG_SWBUF_CSAVE_ONLY */
     241#endif  /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
    245242
    246243/*
     
    270267{
    271268        ER_UINT error;
     269        uint_t  hdr_size = IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr);
    272270
    273271        /* 通信端点をロックする。*/
    274272        syscall(wai_sem(cep->semid_lock));
    275273
    276         if ((error = net_buf_siz(cep->swbufq)) > 0 && error >= IF_IP_TCP_HDR_SIZE) {
    277 
     274        if ((error = net_buf_siz(cep->swbufq)) > 0 && error >= hdr_size) {
    278275
    279276                /*
     
    291288                 *  空きサイズを 4 オクテット境界に調整する。
    292289                 */
    293                 error = (uint_t)(((error - IF_IP_TCP_HDR_SIZE) >> 2 << 2) + IF_IP_TCP_HDR_SIZE);
     290                error = (uint_t)(((error - hdr_size) >> 2 << 2) + hdr_size);
    294291
    295292                if (len > cep->sbufsz - cep->swbuf_count)
    296293                        len = (uint_t)(cep->sbufsz - cep->swbuf_count);
    297                 if (len > (error - IF_IP_TCP_HDR_SIZE))
    298                         len = (uint_t)(error - IF_IP_TCP_HDR_SIZE);
     294                if (len > (error - hdr_size))
     295                        len = (uint_t)(error - hdr_size);
    299296
    300297                /* 送信ウインドサイズによりサイズを調整する。*/
     
    315312
    316313                /* ネットワークバッファ長と IP データグラム長を設定する。*/
    317                 cep->swbufq->len = (uint16_t)(cep->swbuf_count + IF_IP_TCP_HDR_SIZE);
    318                 SET_IP_SDU_SIZE(GET_IP_HDR(cep->swbufq), cep->swbuf_count + TCP_HDR_SIZE);
     314                cep->swbufq->len = (uint16_t)(cep->swbuf_count + hdr_size);
     315                SET_IP_SDU_SIZE(cep->swbufq, cep->swbuf_count + TCP_HDR_SIZE);
    319316
    320317                /* フラグを、送信可能に設定する。*/
     
    324321        else {  /* 送信ウインドバッファが不正 */
    325322                syslog(LOG_WARNING, "[TCP] illegal window buff for send, CEP: %d, %4d < %4d.",
    326                                     GET_TCP_CEPID(cep), error, IF_IP_TCP_HDR_SIZE);
     323                                    GET_TCP_CEPID(cep), error, hdr_size);
    327324
    328325                /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/
     
    348345        int_t   win;
    349346
    350 
    351347        /* 送信ウィンドバッファが割当て済みで、空きがあれば終了する。*/
    352348        if ((cep->flags & TCP_CEP_FLG_WBCS_MASK) == TCP_CEP_FLG_WBCS_NBUF_READY &&
    353             (cep->swbuf_count + IF_IP_TCP_HDR_SIZE) < net_buf_siz(cep->swbufq))
     349            (cep->swbuf_count + IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)) < net_buf_siz(cep->swbufq))
    354350                return E_OK;
    355351
     
    423419
    424420        /* ネットワークバッファを獲得する。*/
    425         if ((error = tcp_get_segment(&cep->swbufq, cep, 0,
     421        if ((error = tcpn_get_segment(&cep->swbufq, cep, 0,
    426422                                     TCP_CFG_SWBUF_CSAVE_MIN_SIZE,
    427                                      TCP_CFG_SWBUF_CSAVE_MAX_SIZE - IF_IP_TCP_HDR_SIZE,
     423                                     TCP_CFG_SWBUF_CSAVE_MAX_SIZE,
    428424                                     NBA_SEARCH_DESCENT, tmout)) != E_OK)
    429425                return error;
     
    463459                 *  空きサイズを 4 オクテット境界に調整する。
    464460                 */
    465                 error = (uint_t)(((error - IF_IP_TCP_HDR_SIZE) >> 2 << 2) - cep->swbuf_count);
     461                error = (uint_t)(((error - IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr)) >> 2 << 2) - cep->swbuf_count);
    466462
    467463                /* 送信ウインドサイズによりサイズを調整する。*/
     
    508504
    509505        /* ネットワークバッファ長と IP データグラム長を設定する。*/
    510         cep->swbufq->len = (uint16_t)(cep->swbuf_count + IF_IP_TCP_HDR_SIZE);
    511         SET_IP_SDU_SIZE(GET_IP_HDR(cep->swbufq), len + TCP_HDR_SIZE);
     506        cep->swbufq->len = (uint16_t)(cep->swbuf_count + IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr));
     507        SET_IP_SDU_SIZE(cep->swbufq, len + TCP_HDR_SIZE);
    512508
    513509        /* tcp_get_buf の割当て長をリセットする。*/
     
    573569{
    574570        return (cep->flags & TCP_CEP_FLG_WBCS_MASK) != TCP_CEP_FLG_WBCS_NBUF_READY ||
    575                 cep->swbuf_count >= cep->swbufq->len - IF_IP_TCP_HDR_SIZE;
     571                cep->swbuf_count >= cep->swbufq->len - IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr);
    576572        }
    577573
     
    590586
    591587        /* 送信ウインドバッファのアドレスを設定する。*/
    592         cep->sbuf_wptr = cep->sbuf_rptr = GET_TCP_SDU(cep->swbufq, IF_IP_TCP_HDR_OFFSET);
     588        cep->sbuf_wptr = cep->sbuf_rptr = GET_TCP_SDU(cep->swbufq, IF_IP_TCP_NET_HDR_OFFSET(&cep->dstaddr.ipaddr));
    593589
    594590        /* フラグを、ネットワークバッファ割当て済みに設定する。*/
     
    664660#ifdef TCP_CFG_RWBUF_CSAVE
    665661
    666 #ifndef TCP_CFG_RWBUF_CSAVE_ONLY
     662#ifdef TCP_CFG_RWBUF_CSAVE_ONLY
     663
     664#else   /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
    667665
    668666/*
     
    736734        }
    737735
    738 #endif  /* of #ifndef TCP_CFG_RWBUF_CSAVE_ONLY */
     736#endif  /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
    739737
    740738/*
     
    753751        if (cep->rwbufq != NULL) {
    754752
    755                 qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff);
     753                qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq));
    756754                cep->rwbuf_count -= len;
    757755
     
    796794         */
    797795        while (cep->rwbufq != NULL && len > 0) {
    798                 qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff);
     796                qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq));
    799797
    800798                /*
     
    808806
    809807                memcpy(buf,
    810                        GET_TCP_SDU(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff) + qhdr->soff,
     808                       GET_TCP_SDU(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)) + qhdr->soff,
    811809                       (size_t)blen);
    812810
     
    850848
    851849                /* 受信ウィンドバッファのデータのアドレスの先頭を設定する。*/
    852                 qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff);
    853                 *p_buf = GET_TCP_SDU(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff) + qhdr->soff;
     850                qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq));
     851                *p_buf = GET_TCP_SDU(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)) + qhdr->soff;
    854852
    855853                /* 受信ウィンドバッファのデータ長を計算する。*/
     
    880878        if (cep->rwbuf_count == 0 && cep->reassq == NULL) {
    881879                while (cep->rwbufq != NULL) {
    882                         next = GET_TCP_Q_HDR(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff)->next;
     880                        next = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq))->next;
    883881
    884882#ifdef TCP_CFG_RWBUF_CSAVE_MAX_QUEUES
     
    961959        nextp = &cep->rwbufq;
    962960        while (*nextp)
    963                 nextp = &GET_TCP_Q_HDR(*nextp, GET_TCP_IP_Q_HDR(*nextp)->thoff)->next;
     961                nextp = &GET_TCP_Q_HDR(*nextp, GET_IP_TCP_Q_HDR_OFFSET(*nextp))->next;
    964962        *nextp = input;
    965963
     
    984982                int_t   len;
    985983
    986                 qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff);
     984                qhdr = GET_TCP_Q_HDR(cep->rwbufq, GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq));
    987985                len = qhdr->slen;
    988986
     
    999997                        /* 受信ウィンドバッファのアドレスを返す。*/
    1000998                        *cep->rcv_p_buf = GET_TCP_SDU(cep->rwbufq,
    1001                                           GET_TCP_IP_Q_HDR(cep->rwbufq)->thoff) + qhdr->soff;
     999                                          GET_IP_TCP_Q_HDR_OFFSET(cep->rwbufq)) + qhdr->soff;
    10021000
    10031001                        if (IS_PTR_DEFINED(cep->callback))
    10041002
    10051003#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1006 
    10071004                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)len);
    1008 
    1009 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1010 
     1005#else
    10111006                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
    1012 
    1013 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1014 
     1007#endif
    10151008                        else
    10161009                                syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
     
    10531046
    10541047#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    1055 
    10561048                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)len);
    1057 
    1058 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1059 
     1049#else
    10601050                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
    1061 
    1062 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    1063 
     1051#endif
    10641052                        else
    10651053                                syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr_ncs.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/if_arp.h>
    97 #include <net/ppp_ipcp.h>
    9897#include <net/net.h>
     98#include <net/net_endian.h>
    9999#include <net/net_var.h>
    100100#include <net/net_buf.h>
     
    103103
    104104#include <netinet/in.h>
    105 #include <netinet6/in6.h>
    106 #include <netinet6/in6_var.h>
    107105#include <netinet/in_var.h>
     106#include <netinet/in_itron.h>
    108107#include <netinet/ip.h>
    109108#include <netinet/ip_var.h>
    110 #include <netinet/ip6.h>
    111 #include <netinet6/ip6_var.h>
    112 #include <netinet6/nd6.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>
    118 #include <netinet/in_itron.h>
     113#include <netinet/tcp_timer.h>
    119114
    120115#ifdef SUPPORT_TCP
     
    134129{
    135130        uint8_t *wptr, *rptr;
     131        uint_t  sdu_size   = GET_IP_SDU_SIZE(output);
     132        uint_t  hdr_offset = IF_IP_TCP_HDR_OFFSET(output);
    136133
    137134        /* SDU の大きさをチェックする。*/
    138         if (GET_IP_SDU_SIZE(GET_IP_HDR(output)) < GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET) + len) {
     135        if (sdu_size < GET_TCP_HDR_SIZE(output, hdr_offset) + len) {
    139136                syslog(LOG_INFO, "[TCP] shrink SUD len: %d -> %d",
    140                        (uint16_t)len, (uint16_t)(GET_IP_SDU_SIZE(GET_IP_HDR(output)) - GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET)));
    141                 len = GET_IP_SDU_SIZE(GET_IP_HDR(output)) - GET_TCP_HDR_SIZE2(output, IF_IP_TCP_HDR_OFFSET);
    142                 }
    143 
    144         wptr = GET_TCP_SDU(output, IF_IP_TCP_HDR_OFFSET);
     137                       (uint16_t)len, (uint16_t)(sdu_size - GET_TCP_HDR_SIZE(output, hdr_offset)));
     138                len = sdu_size - GET_TCP_HDR_SIZE(output, hdr_offset);
     139                }
     140
     141        wptr = GET_TCP_SDU(output, hdr_offset);
    145142
    146143        /* 通信端点をロックする。*/
     
    222219
    223220                        if (IS_PTR_DEFINED(cep->callback))
     221
    224222#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    225 
    226223                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)(uint32_t)len);
    227 
    228 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    229 
     224#else
    230225                                (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
    231 
    232 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    233 
     226#endif
    234227                        else
    235228                                syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
     
    268261
    269262#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    270 
    271263                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)error);
    272 
    273 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    274 
     264#else
    275265                        (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&error);
    276 
    277 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    278 
     266#endif
    279267                else
    280268                        syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
     
    628616
    629617#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    630 
    631618                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)(uint32_t)len);
    632 
    633 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    634 
     619#else
    635620                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
    636 
    637 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    638 
     621#endif
    639622                        else
    640623                                syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
     
    680663
    681664#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    682 
    683665                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)(uint32_t)len);
    684 
    685 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    686 
     666#else
    687667                                (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
    688 
    689 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    690 
     668#endif
    691669                        else
    692670                                syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep));
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_timer.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 *
     
    9191#include <net/if_loop.h>
    9292#include <net/ethernet.h>
    93 #include <net/net.h>
     93#include <net/net_endian.h>
    9494#include <net/net_var.h>
    95 #include <net/net_buf.h>
    9695#include <net/net_timer.h>
    9796
    9897#include <netinet/in.h>
    9998#include <netinet/in_var.h>
    100 #include <netinet6/in6.h>
    101 #include <netinet6/in6_var.h>
    10299#include <netinet/ip.h>
    103 #include <netinet/ip6.h>
    104100#include <netinet/tcp.h>
    105 #include <netinet/tcp_timer.h>
    106101#include <netinet/tcp_var.h>
    107102#include <netinet/tcp_fsm.h>
    108103#include <netinet/tcp_seq.h>
     104#include <netinet/tcp_timer.h>
    109105
    110106#ifdef SUPPORT_TCP
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_timer.h

    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 *
     
    7373/* TCP タイマ変数 */
    7474
    75 #define NUM_TCP_TIMERS          4       /* TCP のタイマ数    */
     75//#define NUM_TCP_TIMERS                4       /* TCP のタイマ数    */
    7676
    7777#define TCP_TIM_REXMT           0       /* 再送タイマ                */
     
    135135#define TCP_MAX_REXMT_SHIFT     12      /* 最大再送回数               */
    136136
    137 /* TCP タイマ値の型 */
    138 
    139 typedef int16_t T_TCP_TIME;
    140 
    141137/*
    142138 *  関数
  • 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 */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_var.h

    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 */
    7676
    77 #define IP_TCP_HDR_SIZE                 (IP_HDR_SIZE + TCP_HDR_SIZE)
    78 #define IF_IP_TCP_HDR_SIZE              (IF_IP_HDR_SIZE + TCP_HDR_SIZE)
    79 #define IF_IP_TCP_HDR_OFFSET            (IF_IP_HDR_SIZE)
    80 #define IF_IP_TCP_SDU_OFFSET            (IF_IP_TCP_HDR_SIZE)
    81 
    8277#define GET_TCP_HDR(nbuf,thoff)         ((T_TCP_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
    8378#define GET_TCP_OPT(nbuf,thoff)         ((uint8_t*)((nbuf)->buf) + thoff + TCP_HDR_SIZE)
    84 #define GET_TCP_SDU(nbuf,thoff)         ((uint8_t*)((nbuf)->buf) + thoff + GET_TCP_HDR_SIZE2(nbuf,thoff))
     79#define GET_TCP_SDU(nbuf,thoff)         ((uint8_t*)((nbuf)->buf) + thoff + GET_TCP_HDR_SIZE(nbuf,thoff))
    8580
    8681#define GET_TCP_HDR_OFFSET(nbuf)        (GET_IF_IP_HDR_SIZE(nbuf))
    8782
    88 #define GET_TCP_HDR_SIZE2(nbuf,thoff)   (TCP_HDR_LEN(GET_TCP_HDR(nbuf,thoff)->doff))
    89 #define GET_IP_TCP_HDR_SIZE2(nbuf,thoff) \
    90                                         (GET_IP_HDR_SIZE(GET_IP_HDR(nbuf)) + GET_TCP_HDR_SIZE2(nbuf,thoff))
    91 #define GET_IF_IP_TCP_HDR_SIZE2(nbuf,thoff) \
    92                                         (IF_HDR_SIZE + GET_IP_TCP_HDR_SIZE2(nbuf,thoff))
     83#define GET_TCP_HDR_SIZE(nbuf,thoff)    (TCP_HDR_LEN(GET_TCP_HDR(nbuf,thoff)->doff))
     84
     85#define GET_IP_TCP_HDR_SIZE(nbuf,thoff) (GET_IP_HDR_SIZE(nbuf) + GET_TCP_HDR_SIZE(nbuf,thoff))
     86#define GET_IF_IP_TCP_HDR_SIZE(nbuf,thoff) \
     87                                        (IF_HDR_SIZE + GET_IP_TCP_HDR_SIZE(nbuf,thoff))
     88#define IF_IP_TCP_HDR_SIZE(nbuf)        (IF_IP_HDR_SIZE(nbuf) + TCP_HDR_SIZE)
     89#define IF_IP_TCP_HDR_OFFSET(nbuf)      (IF_IP_HDR_SIZE(nbuf))
     90#define IF_IP_TCP_NET_HDR_SIZE(addr)    (IF_IP_NET_HDR_SIZE(addr) + TCP_HDR_SIZE)
     91#define IF_IP_TCP_NET_HDR_OFFSET(addr)  (IF_IP_NET_HDR_SIZE(addr))
    9392
    9493/*
     
    9695 */
    9796
    98 #if defined(SUPPORT_INET4)
     97#if !defined(_IP6_CFG) && defined(_IP4_CFG)
    9998
    10099#define IP4_TCP_HDR_SIZE                IP_TCP_HDR_SIZE
    101100#define IF_IP4_TCP_HDR_SIZE             IF_IP_TCP_HDR_SIZE
    102 #define GET_IP4_TCP_HDR_SIZE(nbuf)      GET_IP_TCP_HDR_SIZE(nbuf)       
    103 #define GET_IF_IP4_TCP_HDR_SIZE(nbuf)   GET_IF_IP_TCP_HDR_SIZE(nbuf)   
    104 
    105 #endif  /* of #if defined(SUPPORT_INET4) */
     101#define GET_IP4_TCP_HDR_SIZE(nbuf)      GET_IP_TCP_HDR_SIZE1(nbuf)     
     102#define GET_IF_IP4_TCP_HDR_SIZE(nbuf)   GET_IF_IP_TCP_HDR_SIZE1(nbuf)   
     103
     104#endif  /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) */
    106105
    107106/*
     
    110109
    111110#define TMIN_TCP_CREPID                 TMIN_TCP_REPID
     111#define TNUM_TCP_CREPID                 TNUM_TCP_REPID
     112
    112113#define TMIN_TCP_CCEPID                 TMIN_TCP_CEPID
    113 #define TNUM_TCP_CREPID                 TNUM_TCP_REPID
    114114#define TNUM_TCP_CCEPID                 TNUM_TCP_CEPID
    115115
     
    121121
    122122/*
     123 * TCP で使用する変数の型の定義
     124 */
     125
     126typedef uint32_t T_TCP_SEQ;
     127typedef uint16_t T_TCP_SEG;
     128typedef uint16_t T_TCP_WND;
     129typedef int16_t T_TCP_TIME;
     130
     131/*
     132 *  TCP タイマ変数
     133 */
     134
     135#define NUM_TCP_TIMERS          4       /* TCP のタイマ数    */
     136
     137/*
    123138 *  TCP 受付口
    124139 */
    125140
     141/* IPv6 用 TCP 受付口 */
     142
     143typedef struct t_tcp6_rep {
     144
     145        /*
     146         * ITRON TCP/IP API、TCP 受付口と同じメンバ
     147         */
     148        ATR             repatr;         /* 受付口属性                */
     149        T_IPV6EP        myaddr;         /* 自分のアドレス      */
     150
     151#ifdef TCP_CFG_EXTENTIONS
     152        uint16_t        flags;          /* 受付口フラグ               */
     153        ID              semid_lock;     /* 受付口ロック               */
     154#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
     155
     156        } T_TCP6_REP;
     157
    126158/* IPv4 用 TCP 受付口 */
     159
    127160typedef struct t_tcp4_rep {
    128161
     
    140173        } T_TCP4_REP;
    141174
    142 /* IPv6 用 TCP 受付口 */
    143 typedef struct t_tcp6_rep {
    144 
    145         /*
    146          * ITRON TCP/IP API、TCP 受付口と同じメンバ
    147          */
    148         ATR             repatr;         /* 受付口属性                */
    149         T_IPV6EP        myaddr;         /* 自分のアドレス      */
    150 
    151 #ifdef TCP_CFG_EXTENTIONS
    152         uint16_t        flags;          /* 受付口フラグ               */
    153         ID              semid_lock;     /* 受付口ロック               */
    154 #endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    155 
    156         } T_TCP6_REP;
    157 
    158 #if defined(SUPPORT_INET4)
     175#if defined(_IP6_CFG)
     176
     177#define T_TCP_REP       T_TCP6_REP
     178
     179#else   /* of #if defined(_IP6_CFG) */
     180
     181#if defined(_IP4_CFG)
     182
    159183#define T_TCP_REP       T_TCP4_REP
    160 #endif
    161 
    162 #if defined(SUPPORT_INET6)
    163 #define T_TCP_REP       T_TCP6_REP
    164 #endif
     184
     185#endif  /* of #if defined(_IP4_CFG) */
     186
     187#endif  /* of #if defined(_IP6_CFG) */
     188
     189#define T_TCP_REP_DEFINED
    165190
    166191/*
     
    175200 */
    176201
    177 typedef uint32_t T_TCP_SEQ;
    178 typedef uint16_t T_TCP_SEG;
    179 typedef uint16_t T_TCP_WND;
    180 
    181 /*
    182  * 通常の IPv4 TCP 通信端点
    183  */
    184 typedef struct t_tcp4_cep {
     202#ifndef T_NET_BUF_DEFINED
     203
     204typedef struct t_net_buf T_NET_BUF;
     205
     206#define T_NET_BUF_DEFINED
     207
     208#endif  /* of #ifndef T_NET_BUF_DEFINED */
     209
     210typedef struct t_tcp_cep {
    185211
    186212        /*
     
    232258#ifdef TCP_CFG_NON_BLOCKING
    233259
    234         T_IPV4EP        *p_dstaddr;     /* 相手のアドレスへのポインタ        */
    235         T_IPV4EP        *p_myaddr;      /* 自分のアドレスへのポインタ        */
     260        T_IPEP          *p_dstaddr;     /* 相手のアドレスへのポインタ        */
     261        T_IPEP          *p_myaddr;      /* 自分のアドレスへのポインタ        */
     262
     263#if defined(_IP6_CFG) && defined(_IP4_CFG)
     264        T_IPV4EP        *p_dstaddr4;    /* 相手のアドレスへのポインタ        */
     265        T_IPV4EP        *p_myaddr4;     /* 自分のアドレスへのポインタ        */
     266#endif
     267       
    236268        int16_t         snd_nblk_tfn;   /* 送信動作中の API 機能コード     */
    237269        int16_t         rcv_nblk_tfn;   /* 受信動作中の API 機能コード     */
     
    247279#ifdef TCP_CFG_SWBUF_CSAVE
    248280        T_NET_BUF       *swbufq;        /* 送信ウィンドバッファキュー        */
    249 #endif  /* of #ifdef TCP_CFG_SWBUF_CSAVE */
     281#endif
    250282
    251283        /*
     
    254286
    255287        T_TCP_TIME      timer[NUM_TCP_TIMERS];  /* TCP のタイマ             */
    256         T_IPV4EP        dstaddr;        /* 相手のアドレス              */
    257         T_IPV4EP        myaddr;         /* 自分のアドレス              */
    258         T_TCP4_REP      *rep;           /* 受付口                  */
     288        T_IPEP          dstaddr;        /* 相手のアドレス              */
     289        T_IPEP          myaddr;         /* 自分のアドレス              */
    259290        T_NET_BUF       *reassq;        /* 受信再構成キュー             */
     291
     292#if defined(_IP6_CFG)
     293
     294#if defined(_IP4_CFG)
     295
     296        T_TCP4_REP      *rep4;          /* IPv4 用受付口            */
     297
     298#endif  /* of #if defined(_IP4_CFG) */
     299
     300        T_TCP6_REP      *rep;           /* IPv6 用受付口            */
     301
     302#else   /* of #if defined(_IP6_CFG) */
     303
     304#if defined(_IP4_CFG)
     305
     306        T_TCP4_REP      *rep;           /* IPv4 用受付口            */
     307
     308#endif  /* of #if defined(_IP4_CFG) */
     309
     310#endif  /* of #if defined(_IP6_CFG) */
     311
    260312
    261313#ifdef TCP_CFG_RWBUF_CSAVE
    262314        T_NET_BUF       *rwbufq;        /* 受信ウィンドバッファキュー        */
    263 #endif  /* of #ifdef TCP_CFG_RWBUF_CSAVE */
     315#endif
    264316
    265317#ifdef TCP_CFG_EXTENTIONS
     
    298350
    299351#if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)
    300         uint8_t         rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数  */
    301 #endif  /* of #if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)       */
    302 
    303         } T_TCP4_CEP;
    304 
    305 /*
    306  * Time Wait 用 IPv4 TCP 通信端点
    307  */
    308 typedef struct t_tcp4_twcep {
     352        uint16_t        rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数  */
     353#endif
     354
     355        } T_TCP_CEP;
     356
     357#define T_TCP6_CEP      T_TCP_CEP
     358#define T_TCP4_CEP      T_TCP_CEP
     359
     360/*
     361 * Time Wait 用 TCP 通信端点
     362 */
     363
     364typedef struct t_tcp_twcep {
    309365        int_t           rbufsz;         /* 受信用ウィンドバッファサイズ       */
    310366        T_TCP_TIME      timer_2msl;     /* 2MSL タイマ                     */
    311         T_IPV4EP        dstaddr;        /* 相手のアドレス              */
    312         T_IPV4EP        myaddr;         /* 自分のアドレス              */
     367        T_IPEP          dstaddr;        /* 相手のアドレス              */
     368        T_IPEP          myaddr;         /* 自分のアドレス              */
    313369        T_TCP_SEQ       snd_una;        /* 未確認の最小送信 SEQ つまり     */
    314370                                        /* 確認された最大送信 SEQ        */
     
    316372        uint16_t        rwbuf_count;    /* 受信ウィンドバッファの使用中サイズ    */
    317373        uint8_t         fsm_state;      /* FSM 状態                       */
    318 
    319         } T_TCP4_TWCEP;
    320 
    321 /*
    322  * 通常の IPv6 TCP 通信端点
    323  */
    324 typedef struct t_tcp6_cep {
    325 
    326         /*
    327          * ITRON TCP/IP API、TCP 通信端点と同じメンバ
    328          */
    329         ATR             cepatr;         /* 通信端点属性                       */
    330         void            *sbuf;          /* 送信用ウィンドバッファ  */
    331         int_t           sbufsz;         /* 送信用ウィンドバッファサイズ       */
    332         void            *rbuf;          /* 受信用ウィンドバッファ  */
    333         int_t           rbufsz;         /* 受信用ウィンドバッファサイズ       */
    334         t_tcp_callback  callback;       /* コールバック関数             */
    335 
    336         /*
    337          * TINET 独自のメンバ
    338          */
    339         uint32_t        flags;          /* 通信端点フラグ              */
    340         ID              semid_lock;     /* 通信端点ロック              */
    341         ID              est_flgid;      /* コネクション状態イベントフラグ      */
    342         ID              snd_flgid;      /* 送信イベントフラグ            */
    343         ID              rcv_flgid;      /* 受信イベントフラグ            */
    344         ID              snd_tskid;      /* 送信タスク識別子             */
    345         ID              rcv_tskid;      /* 受信タスク識別子             */
    346         uint8_t         *sbuf_rptr;     /* 送信用読み出しポインタ          */
    347         uint8_t         *sbuf_wptr;     /* 送信用書き込みポインタ          */
    348         uint8_t         *rbuf_rptr;     /* 受信用読み出しポインタ          */
    349         uint8_t         *rbuf_wptr;     /* 受信用書き込みポインタ          */
    350         T_TCP_SEQ       snd_ssthresh;   /* 輻輳ウィンドサイズ(snd_cwnd)  */
    351                                         /* のしきい値                        */
    352         T_TCP_TIME      rxtcur;         /* 現在の再送タイムアウト          */
    353         T_TCP_TIME      srtt;           /* 平滑化された RTT           */
    354         T_TCP_TIME      rttvar;         /* 平滑化された分散             */
    355         T_TCP_WND       snd_cwnd;       /* 輻輳ウィンドサイズ            */
    356 
    357         /*
    358          *  相手の最大受信セグメントサイズ     
    359          *
    360          *    オリジナルでは、一般のセグメントの最大サイズ (t_maxseg) と、
    361          *    オプション付きのセグメントの最大サイズ (t_maxopd) が別に
    362          *    なっている。これは、現在のインターネットでは、オプション付きの
    363          *    セグメントのほうが多いからと説明されているためである。
    364          *    本実装では、最大セグメントサイズオプション以外のオプションは
    365          *    実装しないので、t_maxseg の使用する。
    366          */
    367         T_TCP_SEG       maxseg;
    368 
    369         T_IPV6EP        *p_dstaddr;     /* 相手のアドレスへのポインタ        */
    370         T_IPV6EP        *p_myaddr;      /* 自分のアドレスへのポインタ        */
    371         int16_t         snd_tfn;        /* 送信動作中の API 機能コード     */
    372         int16_t         rcv_tfn;        /* 受信動作中の API 機能コード     */
    373 
    374 #ifdef TCP_CFG_NON_BLOCKING
    375 
    376         int16_t         snd_nblk_tfn;   /* 送信動作中の API 機能コード     */
    377         int16_t         rcv_nblk_tfn;   /* 受信動作中の API 機能コード     */
    378         void            *snd_data;      /* 送信データ領域の先頭アドレス       */
    379         int_t           snd_len;        /* 送信データ領域の長さ           */
    380         void            *rcv_data;      /* 受信データ領域の先頭アドレス       */
    381         int_t           rcv_len;        /* 受信データ領域の長さ           */
    382         void            **snd_p_buf;    /* 送信バッファへのポインタ */
    383         void            **rcv_p_buf;    /* 受信バッファへのポインタ */
    384 
    385 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING */
    386 
    387 #ifdef TCP_CFG_SWBUF_CSAVE
    388         T_NET_BUF       *swbufq;        /* 送信ウィンドバッファキュー        */
    389 #endif  /* of #ifdef TCP_CFG_SWBUF_CSAVE */
    390 
    391         /*
    392          *  これ以降のメンバーは tcp_init_cep() 関数でゼロクリアーされる。
    393          */
    394 
    395         T_TCP_TIME      timer[NUM_TCP_TIMERS];  /* TCP のタイマ             */
    396         T_IPV6EP        dstaddr;        /* 相手のアドレス              */
    397         T_IPV6EP        myaddr;         /* 自分のアドレス              */
    398         T_TCP6_REP      *rep;           /* 受付口                  */
    399         T_NET_BUF       *reassq;        /* 受信再構成キュー             */
    400 
    401 #ifdef TCP_CFG_RWBUF_CSAVE
    402         T_NET_BUF       *rwbufq;        /* 受信ウィンドバッファキュー        */
    403 #endif  /* of #ifdef TCP_CFG_RWBUF_CSAVE */
    404 
    405 #ifdef TCP_CFG_EXTENTIONS
    406         T_TCP_HDR       *urg_tcph;      /* 緊急データ入りのセグメントの TCP ヘッダ       */
    407         T_TCP_SEQ       snd_up;         /* 送信した緊急ポインタ           */
    408         T_TCP_SEQ       rcv_up;         /* 受信した緊急ポインタ           */
    409 #endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    410 
    411         T_TCP_SEQ       snd_una;        /* 未確認の最小送信 SEQ つまり     */
    412                                         /* 確認された最大送信 SEQ        */
    413         T_TCP_SEQ       snd_max;        /* 送信した最大 SEQ           */
    414         T_TCP_SEQ       snd_nxt;        /* 次に送信する SEQ           */
    415         T_TCP_SEQ       snd_old_nxt;    /* 元の snd_nxt                   */
    416         T_TCP_SEQ       snd_wl1;        /* 前回ウィンドを更新した SEQ      */
    417         T_TCP_SEQ       snd_wl2;        /* 前回ウィンドを更新した ACK      */
    418         T_TCP_SEQ       iss;            /* 自分の SEQ の初期値         */
    419         T_TCP_SEQ       irs;            /* 相手の SEQ の初期値         */
    420         T_TCP_SEQ       rcv_nxt;        /* 受信を期待している最小の SEQ     */
    421         T_TCP_SEQ       rcv_adv;        /* 受信を期待している最大の SEQ     */
    422         T_TCP_SEQ       rcv_wnd;        /* 受信可能なウィンドサイズ */
    423         T_TCP_SEQ       rtseq;          /* 時間計測を始めた SEQ         */
    424         T_TCP_SEQ       last_ack_sent;  /* 最後に送信した ACK          */
    425         T_TCP_TIME      idle;           /* アイドル時間                       */
    426         ER              error;          /* 非同期に発生したエラー          */
    427         ER              net_error;      /* ネットワークのエラー状態 */
    428         T_TCP_WND       snd_wnd;        /* 相手の受信可能ウィンドサイズ       */
    429         T_TCP_WND       max_sndwnd;     /* 今までの最大送信ウィンドサイズ      */
    430         T_TCP_TIME      rtt;            /* 往復時間                 */
    431         uint16_t        swbuf_count;    /* 送信ウィンドバッファの使用中サイズ    */
    432         uint16_t        rwbuf_count;    /* 受信ウィンドバッファの使用中サイズ    */
    433         uint16_t        rcv_buf_len;    /* tcp_rcv_buf の割当て長    */
    434         uint16_t        get_buf_len;    /* tcp_rcv_buf の割当て長    */
    435         uint8_t         rxtshift;       /* 再送信回数の log(2)                */
    436         uint8_t         fsm_state;      /* FSM 状態                       */
    437         uint8_t         dupacks;        /* 再送 ACK 数                     */
    438 
    439 #if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)
    440         uint8_t         rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数  */
    441 #endif  /* of #if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)       */
    442 
    443         } T_TCP6_CEP;
    444 
    445 /*
    446  * Time Wait 用 IPv6 TCP 通信端点
    447  */
    448 typedef struct t_tcp6_twcep {
    449         int_t           rbufsz;         /* 受信用ウィンドバッファサイズ       */
    450         T_TCP_TIME      timer_2msl;     /* 2MSL タイマ                     */
    451         T_IPV6EP        dstaddr;        /* 相手のアドレス              */
    452         T_IPV6EP        myaddr;         /* 自分のアドレス              */
    453         T_TCP_SEQ       snd_una;        /* 未確認の最小送信 SEQ つまり     */
    454                                         /* 確認された最大送信 SEQ        */
    455         T_TCP_SEQ       iss;            /* 自分の SEQ の初期値         */
    456         T_TCP_SEQ       irs;            /* 相手の SEQ の初期値         */
    457         T_TCP_SEQ       rcv_nxt;        /* 受信を期待している最小の SEQ     */
    458         T_TCP_WND       snd_wnd;        /* 相手の受信可能ウィンドサイズ       */
    459         uint16_t        rwbuf_count;    /* 受信ウィンドバッファの使用中サイズ    */
    460         uint8_t         fsm_state;      /* FSM 状態                       */
    461 
    462         } T_TCP6_TWCEP;
    463 
    464 #if defined(SUPPORT_INET4)
    465 #define T_TCP_CEP       T_TCP4_CEP
    466 #define T_TCP_TWCEP     T_TCP4_TWCEP
    467 #endif  /* of #if defined(SUPPORT_INET4) */
    468 
    469 #if defined(SUPPORT_INET6)
    470 #define T_TCP_CEP       T_TCP6_CEP
    471 #define T_TCP_TWCEP     T_TCP6_TWCEP
    472 #endif  /* of #if defined(SUPPORT_INET6) */
     374        uint8_t flags;                  /* 通信端点フラグ              */
     375
     376        } T_TCP_TWCEP;
    473377
    474378#define T_TCP_CEP_DEFINED
     
    478382 */
    479383
    480 #define TCP_CEP_FLG_ACK_NOW             ULONG_C(0x00000001)     /* 直ちに相手に ACK を送る。      */
    481 #define TCP_CEP_FLG_DEL_ACK             ULONG_C(0x00000002)     /* ACK を遅延する。           */
    482 #define TCP_CEP_FLG_SENT_FIN            ULONG_C(0x00000004)     /* FIN を送ってある。          */
    483 #define TCP_CEP_FLG_NEED_SYN            ULONG_C(0x00000008)     /* SYN を送信する。           */
    484 #define TCP_CEP_FLG_NEED_FIN            ULONG_C(0x00000010)     /* FIN を送信する。           */
    485 #define TCP_CEP_FLG_FORCE               ULONG_C(0x00000020)     /* 強制送信。                        */
    486 #define TCP_CEP_FLG_NO_PUSH             ULONG_C(0x00000040)     /* push しない。            */
    487 #define TCP_CEP_FLG_NO_DELAY            ULONG_C(0x00000080)     /* 遅延しない。                       */
    488 #define TCP_CEP_FLG_FORCE_CLEAR         ULONG_C(0x00000100)     /* 強制送信した後フラグをクリアーする。*/
    489 #define TCP_CEP_FLG_POST_OUTPUT         ULONG_C(0x00000200)     /* 送信を開始する。             */
    490 #define TCP_CEP_FLG_RESERVE_OUTPUT      ULONG_C(0x00000400)     /* 送信を予約する。             */
    491 #define TCP_CEP_FLG_DYNAMIC             ULONG_C(0x00001000)     /* 動的生成・削除可能通信端点。       */
    492 #define TCP_CEP_FLG_VALID               ULONG_C(0x00002000)     /* 生成済みで有効な通信端点。        */
    493 #define TCP_CEP_FLG_CLOSE_AFTER_OUTPUT  ULONG_C(0x00004000)     /* 送信した後コネクションを閉じる。*/
    494 #define TCP_CEP_FLG_RESTORE_NEXT_OUTPUT ULONG_C(0x00008000)     /* 送信した後、snd_nxt を元に戻す。*/
     384#define TCP_CEP_FLG_IPV4                ULONG_C(0x00000001)     /* IPv4 用。                      */
     385#define TCP_CEP_FLG_ACK_NOW             ULONG_C(0x00000100)     /* 直ちに相手に ACK を送る。      */
     386#define TCP_CEP_FLG_DEL_ACK             ULONG_C(0x00000200)     /* ACK を遅延する。           */
     387#define TCP_CEP_FLG_SENT_FIN            ULONG_C(0x00000400)     /* FIN を送ってある。          */
     388#define TCP_CEP_FLG_NEED_SYN            ULONG_C(0x00000800)     /* SYN を送信する。           */
     389#define TCP_CEP_FLG_NEED_FIN            ULONG_C(0x00001000)     /* FIN を送信する。           */
     390#define TCP_CEP_FLG_FORCE               ULONG_C(0x00002000)     /* 強制送信。                        */
     391#define TCP_CEP_FLG_NO_PUSH             ULONG_C(0x00004000)     /* push しない。            */
     392#define TCP_CEP_FLG_NO_DELAY            ULONG_C(0x00008000)     /* 遅延しない。                       */
     393#define TCP_CEP_FLG_FORCE_CLEAR         ULONG_C(0x00010000)     /* 強制送信した後フラグをクリアーする。*/
     394#define TCP_CEP_FLG_POST_OUTPUT         ULONG_C(0x00020000)     /* 送信を開始する。             */
     395#define TCP_CEP_FLG_RESERVE_OUTPUT      ULONG_C(0x00040000)     /* 送信を予約する。             */
     396#define TCP_CEP_FLG_DYNAMIC             ULONG_C(0x00100000)     /* 動的生成・削除可能通信端点。       */
     397#define TCP_CEP_FLG_VALID               ULONG_C(0x00200000)     /* 生成済みで有効な通信端点。        */
     398#define TCP_CEP_FLG_CLOSE_AFTER_OUTPUT  ULONG_C(0x00400000)     /* 送信した後コネクションを閉じる。*/
     399#define TCP_CEP_FLG_RESTORE_NEXT_OUTPUT ULONG_C(0x00800000)     /* 送信した後、snd_nxt を元に戻す。*/
    495400
    496401/* 送受信ウィンドバッファの省コピー機能 */
    497 #define TCP_CEP_FLG_WBCS_NBUF_REQ       ULONG_C(0x00080000)     /* ネットワークバッファ割当て要求      */
    498 #define TCP_CEP_FLG_WBCS_MASK           ULONG_C(0x00070000)     /* マスク                  */
     402#define TCP_CEP_FLG_WBCS_NBUF_REQ       ULONG_C(0x80000000)     /* ネットワークバッファ割当て要求*/
     403#define TCP_CEP_FLG_WBCS_MASK           ULONG_C(0x70000000)     /* マスク                  */
    499404#define TCP_CEP_FLG_WBCS_FREE           ULONG_C(0x00000000)     /* 送信ウィンドバッファ未使用        */
    500 #define TCP_CEP_FLG_WBCS_WOPEN_PEND     ULONG_C(0x00010000)     /* 相手の受信ウィンドの開き待ち       */
    501 #define TCP_CEP_FLG_WBCS_NBUF_PEND      ULONG_C(0x00020000)     /* ネットワークバッファ予約待ち       */
    502 #define TCP_CEP_FLG_WBCS_NBUF_RSVD      ULONG_C(0x00030000)     /* ネットワークバッファ予約済み       */
    503 #define TCP_CEP_FLG_WBCS_NBUF_READY     ULONG_C(0x00040000)     /* ネットワークバッファ割当て済み      */
    504 #define TCP_CEP_FLG_WBCS_SEND_READY     ULONG_C(0x00050000)     /* 送信可能                 */
    505 #define TCP_CEP_FLG_WBCS_SENT           ULONG_C(0x00060000)     /* 送信済みで、ACK待ち          */
    506 #define TCP_CEP_FLG_WBCS_ACKED          ULONG_C(0x00070000)     /* 送信済みで、ACK完了          */
     405#define TCP_CEP_FLG_WBCS_WOPEN_PEND     ULONG_C(0x10000000)     /* 相手の受信ウィンドの開き待ち       */
     406#define TCP_CEP_FLG_WBCS_NBUF_PEND      ULONG_C(0x20000000)     /* ネットワークバッファ予約待ち       */
     407#define TCP_CEP_FLG_WBCS_NBUF_RSVD      ULONG_C(0x30000000)     /* ネットワークバッファ予約済み       */
     408#define TCP_CEP_FLG_WBCS_NBUF_READY     ULONG_C(0x40000000)     /* ネットワークバッファ割当て済み*/
     409#define TCP_CEP_FLG_WBCS_SEND_READY     ULONG_C(0x50000000)     /* 送信可能                 */
     410#define TCP_CEP_FLG_WBCS_SENT           ULONG_C(0x60000000)     /* 送信済みで、ACK待ち          */
     411#define TCP_CEP_FLG_WBCS_ACKED          ULONG_C(0x70000000)     /* 送信済みで、ACK完了          */
     412
     413/* 初期化から除外するフラグの定義 */
     414#define TCP_CEP_FLG_NOT_CLEAR           (TCP_CEP_FLG_WBCS_NBUF_REQ|TCP_CEP_FLG_WBCS_MASK|\
     415                                         TCP_CEP_FLG_DYNAMIC|TCP_CEP_FLG_VALID|TCP_CEP_FLG_IPV4)
    507416
    508417/*
     
    513422#define TCP_CEP_EVT_CLOSED              ULONG_C(0x00000002)     /* 未使用状態                        */
    514423#define TCP_CEP_EVT_SWBUF_READY         ULONG_C(0x00000004)     /* 送信ウィンドバッファ空き */
    515 #define TCP_CEP_EVT_RWBUF_READY         ULONG_C(0x00000008)     /* 送信ウィンドバッファデータあり      */
     424#define TCP_CEP_EVT_RWBUF_READY         ULONG_C(0x00000008)     /* 送信ウィンドバッファデータあり*/
    516425#define TCP_CEP_EVT_ALL                 ULONG_C(0xffffffff)     /* 全イベント                        */
    517426
     
    571480
    572481#define GET_TCP_Q_HDR(nbuf,thoff)       ((T_TCP_Q_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
    573 #define GET_TCP_IP_Q_HDR(nbuf)          ((T_TCP_IP_Q_HDR*)GET_IP_HDR(nbuf))
    574482
    575483/*
     
    577485 */
    578486
    579 #define TMIN_TCP_REPID          1       /* TCP 受付口   ID の最小値                    */
    580 #define TMIN_TCP_CEPID          1       /* TCP 通信端点 ID の最小値                     */
    581 #define TMIN_TCP_TWCEPID        1       /* Time Wait 用 TCP 通信端点 ID の最小値 */
     487#define TMIN_TCP_REPID          1                       /* TCP      受付口 ID の最小値                 */
     488#define TMIN_TCP6_REPID         1                       /* TCP/IPv6 受付口 ID の最小値                 */
     489#define TMIN_TCP4_REPID         (TNUM_TCP6_REPID+1)     /* TCP/IPv4 受付口 ID の最小値                 */
     490
     491#define TMIN_TCP_CEPID          1                       /* TCP      通信端点 ID の最小値                        */
     492#define TMIN_TCP6_CEPID         1                       /* TCP/IPv6 通信端点 ID の最小値                        */
     493#define TMIN_TCP4_CEPID         (TNUM_TCP6_CEPID+1)     /* TCP/IPv4 通信端点 ID の最小値                        */
     494
     495#define TMIN_TCP_TWCEPID        1                       /* Time Wait 用 TCP 通信端点 ID の最小値 */
    582496
    583497/*
    584498 *  制御セグメント(データなし)サイズのネットワークバッファ
    585499 */
     500
     501#if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE)
    586502
    587503typedef struct t_net_buf_cseg {
     
    599515        } T_NET_BUF_CSEG;
    600516
    601 #ifdef SUPPORT_MIB
     517#endif  /* of #if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE) */
    602518
    603519/*
     
    618534} T_TCP_STATS;
    619535
    620 #endif  /* of #ifdef SUPPORT_MIB */
    621 
    622536/*
    623537 *  関数シミュレーションマクロ
    624538 */
    625539
    626 #define VAID_TCP_REPID(id)      (TMIN_TCP_REPID<=(id)&&(id)<=tmax_tcp_repid)
    627 #define VAID_TCP_CEPID(id)      (TMIN_TCP_CEPID<=(id)&&(id)<=tmax_tcp_cepid)
    628 
    629 #define INDEX_TCP_REP(id)       ((id)-TMIN_TCP_REPID)
     540/* TCP 受付口 */
     541
     542#define VALID_TCP6_REPID(id)    (TMIN_TCP6_REPID<=(id)&&(id)<=tmax_tcp6_repid)
     543#define VALID_TCP4_REPID(id)    (TMIN_TCP4_REPID<=(id)&&(id)<=tmax_tcp4_repid)
     544
     545#define INDEX_TCP6_REP(id)      ((id)-TMIN_TCP6_REPID)
     546#define INDEX_TCP4_REP(id)      ((id)-TMIN_TCP4_REPID)
     547
     548#define GET_TCP6_REP(id)        (&(tcp6_rep[INDEX_TCP6_REP(id)]))
     549#define GET_TCP4_REP(id)        (&(tcp4_rep[INDEX_TCP4_REP(id)]))
     550
     551#define GET_TCP6_REPID(rep)     ((ID)(((rep)-tcp6_rep)+TMIN_TCP6_REPID))
     552#define GET_TCP4_REPID(rep)     ((ID)(((rep)-tcp4_rep)+TMIN_TCP4_REPID))
     553
     554#ifdef TCP_CFG_EXTENTIONS
     555
     556#define VALID_TCP_REP(rep)      (((rep)->flags&TCP_REP_FLG_VALID)!=0)
     557#define DYNAMIC_TCP_REP(rep)    (((rep)->flags&TCP_REP_FLG_DYNAMIC)!=0)
     558
     559#else   /* of #ifdef TCP_CFG_EXTENTIONS */
     560
     561#define VALID_TCP_REP(rep)      (true)
     562#define DYNAMIC_TCP_REP(rep)    (false)
     563
     564#endif  /* of #ifdef TCP_CFG_EXTENTIONS */
     565
     566/* TCP 通信端点 */
     567
     568#define VALID_TCP_CEPID(id)     (TMIN_TCP_CEPID<=(id)&&(id)<=tmax_tcp_cepid)
    630569#define INDEX_TCP_CEP(id)       ((id)-TMIN_TCP_CEPID)
    631570
    632 #define GET_TCP_REP(id)         (&(tcp_rep[INDEX_TCP_REP(id)]))
    633571#define GET_TCP_CEP(id)         (&(tcp_cep[INDEX_TCP_CEP(id)]))
    634572
    635 #define GET_TCP_REPID(rep)      ((ID)(((rep)-tcp_rep)+TMIN_TCP_REPID))
    636573#define GET_TCP_CEPID(cep)      ((ID)(((cep)-tcp_cep)+TMIN_TCP_CEPID))
    637574#define GET_TCP_TWCEPID(cep)    ((ID)(((cep)-tcp_twcep)+TMIN_TCP_TWCEPID))
     575
     576#define VALID_TCP_CEP(cep)      (((cep)->flags&TCP_CEP_FLG_VALID)!=0)
     577#define DYNAMIC_TCP_CEP(cep)    (((cep)->flags&TCP_CEP_FLG_DYNAMIC)!=0)
     578#define TCP_IS_CEP_IPV6(cep)    (((cep)->flags&TCP_CEP_FLG_IPV4)==0)
     579#define TCP_IS_CEP_IPV4(cep)    (((cep)->flags&TCP_CEP_FLG_IPV4)!=0)
    638580
    639581#define IS_TFN_TCP_RCV(t)       ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_RCV_DAT||\
     
    651593#define VALID_URG_POINTER(urg)  (TCP_CFG_URG_OFFSET==0||urg!=0)
    652594
    653 #define VALID_TCP_CEP(cep)      (((cep)->flags&TCP_CEP_FLG_VALID)!=0)
    654 #define DYNAMIC_TCP_CEP(cep)    (((cep)->flags&TCP_CEP_FLG_DYNAMIC)!=0)
    655 
    656 #ifdef TCP_CFG_EXTENTIONS
    657 
    658 #define VALID_TCP_REP(rep)      (((rep)->flags&TCP_REP_FLG_VALID)!=0)
    659 #define DYNAMIC_TCP_REP(rep)    (((rep)->flags&TCP_REP_FLG_DYNAMIC)!=0)
    660 
    661 #else   /* of #ifdef TCP_CFG_EXTENTIONS */
    662 
    663 #define VALID_TCP_REP(rep)      (true)
    664 #define DYNAMIC_TCP_REP(rep)    (false)
    665 
    666 #endif  /* of #ifdef TCP_CFG_EXTENTIONS */
    667 
    668595/*
    669596 *  全域変数
    670597 */
    671598
    672 extern T_TCP_REP tcp_rep[];
     599extern uint8_t tcp_initialized;
     600
     601extern T_TCP_STATS tcp_stats;
     602
     603/* TCP 受付口 */
     604
     605extern T_TCP6_REP tcp6_rep[];
     606extern T_TCP4_REP tcp4_rep[];
     607
     608#if defined(SUPPORT_INET6)
     609#define tcp_rep tcp6_rep
     610#elif defined(SUPPORT_INET4)
     611#define tcp_rep tcp4_rep
     612#endif
     613
     614extern const ID tmax_tcp_repid;
     615
     616#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4)
     617extern const ID tmax_tcp6_repid;
     618extern const ID tmax_tcp4_repid;
     619#else
     620#define tmax_tcp6_repid tmax_tcp_repid
     621#define tmax_tcp4_repid tmax_tcp_repid
     622#endif
     623
     624/* TCP 通信端点 */
     625
    673626extern T_TCP_CEP tcp_cep[];
    674 extern uint8_t tcp_initialized;
    675 extern const ID tmax_tcp_repid;
     627extern T_TCP_TWCEP tcp_twcep[];
     628
    676629extern const ID tmax_tcp_cepid;
    677 extern T_TCP_TWCEP tcp_twcep[];
    678 
    679 #ifdef SUPPORT_MIB
    680 
    681 extern T_TCP_STATS tcp_stats;
    682 
    683 #endif  /* of #ifdef SUPPORT_MIB */
     630
     631#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4)
     632extern const ID tmax_tcp6_cepid;
     633extern const ID tmax_tcp4_cepid;
     634#else
     635#define tmax_tcp6_cepid tmax_tcp_cepid
     636#define tmax_tcp4_cepid tmax_tcp_cepid
     637#endif
    684638
    685639/*
     
    866820extern void tcp_respond (T_NET_BUF *nbuf, T_TCP_CEP *cep,
    867821                         T_TCP_SEQ ack, T_TCP_SEQ seq, uint_t rbfree, uint8_t flags);
    868 extern void tcp_set_header (T_NET_BUF *nbuf, T_TCP_CEP *cep, uint_t thoff, uint_t optlen);
    869822extern ER tcp_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
    870823                           uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout);
     824extern ER tcpn_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
     825                            uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout);
    871826extern void tcp_init_cep (T_TCP_CEP *cep);
    872827extern void tcp_notify (T_NET_BUF *input, int code);
     
    876831extern void tcp_alloc_auto_port (T_TCP_CEP *cep);
    877832extern ER tcp_alloc_port (T_TCP_CEP *cep, uint16_t portno);
    878 extern void tcp_move_twcep (T_TCP_CEP *cep);
    879833extern ER tcp_lock_cep (ID cepid, T_TCP_CEP **p_cep, FN tfn);
    880834extern void tcp_free_reassq (T_TCP_CEP *cep);
     
    885839extern ER tcp_wait_rwbuf (T_TCP_CEP *cep, TMO tmout);
    886840extern T_TCP_CEP *tcp_user_closed (T_TCP_CEP *cep);
     841extern T_TCP_CEP *tcp_find_cep (T_NET_BUF *input, uint_t off);
     842extern T_TCP_TWCEP*tcp_find_twcep (T_NET_BUF *input, uint_t off);
     843extern bool_t tcp_is_addr_accept (T_NET_BUF *input, uint_t off);
     844extern void tcp_move_twcep (T_TCP_CEP *cep);
    887845
    888846/*
     
    974932
    975933/*
    976  *  tcp_find_cep -- ポート番号から TCP 通信端点を得る。
    977  *
    978  *    注意: myaddr は、
    979  *          TINET-1.2 からネットワークバイトオーダ、
    980  *          TINET-1.1 までは、ホストバイトオーダ
    981  */
    982 extern T_TCP_CEP *tcp_find_cep (T_IN_ADDR *dstaddr,  uint16_t dstport,
    983                                 T_IN_ADDR *peeraddr, uint16_t peerport);
    984 
    985 /*
    986934 *  TCP ヘッダのトレース出力機能用関数
    987935 */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp.cfg

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp.h

    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 *
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_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 *
     
    7272#include <sil.h>
    7373#include <t_syslog.h>
     74#include "tinet_cfg.h"
    7475
    7576#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    7980#include <s_services.h>
    8081#include <t_services.h>
    81 #include "kernel_id.h"
     82#include "tinet_id.h"
    8283
    8384#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9293#include <net/ppp_ipcp.h>
    9394#include <net/net.h>
     95#include <net/net_endian.h>
    9496#include <net/net_buf.h>
    9597#include <net/net_count.h>
     
    9799#include <netinet/in.h>
    98100#include <netinet/in_var.h>
    99 #include <netinet6/in6.h>
    100 #include <netinet6/in6_var.h>
    101101#include <netinet/in_itron.h>
    102102#include <netinet/ip.h>
    103103#include <netinet/ip_var.h>
    104 #include <netinet/ip6.h>
    105 #include <netinet6/ip6_var.h>
    106104#include <netinet/ip_icmp.h>
    107 #include <netinet/icmp6.h>
    108 
    109105#include <netinet/udp.h>
    110106#include <netinet/udp_var.h>
     
    124120#endif  /* of #ifdef SUPPORT_MIB */
    125121
    126 #if defined(SUPPORT_INET4)
    127 
    128 #ifdef DHCP_CFG
    129 
    130122/*
    131  *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
    132  *
    133  *    DHCP_CFG が定義されているときは、以下のデータグラムを受信する。
    134  *
    135  *      ・あて先アドレスがブロードキャスト
    136  *      ・ローカルアドレスが未定義
     123 *  IPv6 と IPv4 で引数が異なる関数のコンパイル
    137124 */
    138125
    139 static bool_t
    140 udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
    141 {
    142         T_IFNET *ifp = IF_GET_IFNET();
     126#undef  IN_COPY_TO_HOST
    143127
    144         if (ifp->in_ifaddr.addr == IPV4_ADDRANY ||
    145             ntohl(*dstaddr) == IPV4_ADDR_BROADCAST ||
    146             ntohl(*dstaddr) == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask))
    147                 return true;
    148         else
    149                 return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
    150         }
     128#if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0
    151129
    152 #elif defined(ETHER_CFG_MULTICAST)
     130#define UDP_INPUT               udp6_input
     131#define UDP_INPUT_SELECT        udp6_input_select
     132#define UDP_REPLY_NO_PORT       udp6_reply_no_port
     133#define UDP_FIND_CEP            udp6_find_cep
     134#define GET_UDP_CEPID           GET_UDP6_CEPID
     135#define T_UDP_CEP               T_UDP6_CEP
     136#define API_PROTO               API_PROTO_IPV6
    153137
    154 /*
    155  *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
    156  *
    157  *    以下の場合もデータグラムを受信する。
    158  *
    159  *      ・あて先アドレスがブロードキャスト
    160  */
     138#if defined(_IP4_CFG)
     139#define IN_COPY_TO_HOST         inn_copy_to_host
     140#else
     141#define IN_COPY_TO_HOST         IN6_COPY_TO_HOST
     142#endif
    161143
    162 static bool_t
    163 udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
    164 {
    165         T_IFNET *ifp = IF_GET_IFNET();
    166         T_IN4_ADDR      dst = ntohl(*dstaddr);
     144#include <netinet6/udp6_input.c>
     145#include <netinet/udpn_input.c>
    167146
    168         if (dst == IPV4_ADDR_BROADCAST ||
    169             dst == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask) ||
    170                 IN4_IS_ADDR_MULTICAST(dst))
    171                 return true;
    172         else
    173                 return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
    174         }
     147#undef  UDP_INPUT
     148#undef  UDP_INPUT_SELECT
     149#undef  UDP_REPLY_NO_PORT
     150#undef  UDP_FIND_CEP
     151#undef  GET_UDP_CEPID
     152#undef  T_UDP_CEP
     153#undef  IN_COPY_TO_HOST
     154#undef  API_PROTO
    175155
    176 #else   /* of #ifdef DHCP_CFG */
     156#endif  /* of #if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0 */
    177157
    178 /*
    179  *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
    180  *
    181  *    以下の場合もデータグラムを受信する。
    182  *
    183  *      ・あて先アドレスがブロードキャスト
    184  */
     158#if defined(_IP4_CFG) && ( (TNUM_UDP4_CEPID > 0) || \
     159                          ((TNUM_UDP6_CEPID > 0) && defined(API_CFG_IP4MAPPED_ADDR)))
    185160
    186 static bool_t
    187 udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
    188 {
    189         T_IFNET *ifp = IF_GET_IFNET();
     161#define UDP_INPUT               udp4_input
     162#define UDP_INPUT_SELECT        udp4_input_select
     163#define UDP_REPLY_NO_PORT       udp4_reply_no_port
     164#define UDP_FIND_CEP            udp4_find_cep
     165#define GET_UDP_CEPID           GET_UDP4_CEPID
     166#define T_UDP_CEP               T_UDP4_CEP
     167#define IN_COPY_TO_HOST         IN4_COPY_TO_HOST
     168#define API_PROTO               API_PROTO_IPV4
    190169
    191         if (ntohl(*dstaddr) == IPV4_ADDR_BROADCAST ||
    192             ntohl(*dstaddr) == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask))
    193                 return true;
    194         else
    195                 return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
    196         }
     170#include <netinet/udp4_input.c>
     171#include <netinet/udpn_input.c>
    197172
    198 #endif  /* of #ifdef DHCP_CFG */
    199 
    200 #endif  /* of #if defined(SUPPORT_INET4) */
    201 
    202 #if defined(SUPPORT_INET6)
    203 
    204 /*
    205  *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
    206  *
    207  *    以下の場合もデータグラムを受信する。
    208  *
    209  *      ・あて先アドレスがマルチキャスト
    210  */
    211 
    212 static bool_t
    213 udp_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_IN6_ADDR *dstaddr)
    214 {
    215         if (IN6_IS_ADDR_MULTICAST(dstaddr))
    216                 return true;
    217         else
    218                 return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
    219         }
    220 
    221 #endif  /* of #if defined(SUPPORT_INET6) */
    222 
    223 /*
    224  *  udp_input -- UDP の入力関数
    225  */
    226 
    227 uint_t
    228 udp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp)
    229 {
    230         T_NET_BUF       *input = *inputp;
    231         T_UDP_CEP       *cep;
    232         T_UDP_HDR       *udph;
    233         T_IP_HDR        *iph;
    234         int_t           ix;
    235         uint_t          len, hlen, ulen;
    236 
    237         hlen = (uint_t)GET_IF_IP_HDR_SIZE(input);
    238 
    239         NET_COUNT_UDP(net_count_udp.in_octets,  input->len - hlen);
    240         NET_COUNT_UDP(net_count_udp.in_packets, 1);
    241         NET_COUNT_MIB(udp_stats.udpInDatagrams, 1);
    242 
    243         /* ヘッダ長をチェックする。*/
    244         if (input->len < hlen + UDP_HDR_SIZE)
    245                 goto buf_rel;
    246 
    247         udph = (T_UDP_HDR *)(input->buf + *offp);
    248 
    249         /* データグラム長をチェックする */
    250         ulen  = ntohs(udph->ulen);
    251         if (ulen != input->len - hlen)
    252                 goto buf_rel;
    253 
    254         /* 宛先ポートが 0 のデータグラムは破棄する。RFC768 */
    255         if (udph->dport == 0)
    256                 goto buf_rel;
    257 
    258 #ifdef UDP_CFG_IN_CHECKSUM
    259 
    260         /* チェックサムをチェックする */
    261         if (udph->sum && IN_CKSUM(input, IPPROTO_UDP, *offp, ulen) != 0)
    262                 goto buf_rel;
    263 
    264 #endif  /* of #ifdef UDP_CFG_IN_CHECKSUM */
    265 
    266         iph = GET_IP_HDR(input);
    267 
    268         /* 宛先アドレスとポートをチェックする */
    269         for (ix = tmax_udp_ccepid; ix -- > 0; ) {
    270                 cep = &udp_cep[ix];
    271                 if (VALID_UDP_CEP(cep) &&
    272                     udp_is_dstaddr_accept(&cep->myaddr.ipaddr, &iph->dst) &&
    273                     ntohs(udph->dport) == cep->myaddr.portno) {
    274                         len = (uint_t)(ntohs(udph->ulen) - UDP_HDR_SIZE);
    275 
    276                         if (cep->rcv_tskid != TA_NULL) {        /* 非ノンブロッキングコールでペンディング中 */
    277                                 if (psnd_dtq(cep->rcvqid, (intptr_t)input) != E_OK)
    278                                         goto buf_rel;
    279                                 }
    280 
    281 #ifdef UDP_CFG_NON_BLOCKING
    282 
    283                         else if (cep->rcv_p_dstaddr != NULL) {  /* ノンブロッキングコールでペンディング中 */
    284 
    285                                 /* p_dstaddr を設定する。*/
    286                                 cep->rcv_p_dstaddr->portno = ntohs(udph->sport);
    287                                 IN_COPY_TO_HOST(&cep->rcv_p_dstaddr->ipaddr, &GET_IP_HDR(input)->src);
    288 
    289                                 /* データをバッファに移す。*/
    290                                 memcpy(cep->rcv_data, GET_UDP_SDU(input, *offp),
    291                                        (size_t)(len < cep->rcv_len ? len : cep->rcv_len));
    292                                 syscall(rel_net_buf(input));
    293 
    294                                 if (IS_PTR_DEFINED(cep->callback))
    295 
    296 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    297 
    298                                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)(uint32_t)len);
    299 
    300 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    301 
    302                                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)&len);
    303 
    304 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    305 
    306                                 else
    307                                         syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
    308                                 cep->rcv_p_dstaddr = NULL;
    309                                 }
    310 
    311 #endif  /* of #ifdef UDP_CFG_NON_BLOCKING */
    312 
    313                         else if (IS_PTR_DEFINED(cep->callback)) {
    314 
    315                                 /* コールバック関数を呼び出す。*/
    316                                 cep->cb_netbuf = input;
    317 
    318 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    319 
    320                                 (*cep->callback)(GET_UDP_CEPID(cep), TEV_UDP_RCV_DAT, (void*)(uint32_t)len);
    321 
    322 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    323 
    324                                 (*cep->callback)(GET_UDP_CEPID(cep), TEV_UDP_RCV_DAT, (void*)&len);
    325 
    326 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    327 
    328                                 /*
    329                                  *  ネットワークバッファがそのままであれば、コールバック関数内で
    330                                  *  データを読み出さなかったことになるので、捨てる。
    331                                  */
    332                                 if (cep->cb_netbuf != NULL)
    333                                         syscall(rel_net_buf(cep->cb_netbuf));
    334                                 }
    335                         else
    336                                 goto buf_rel;
    337 
    338                         return IPPROTO_DONE;
    339                         }
    340                 }
    341 
    342         NET_COUNT_MIB(udp_stats.udpNoPorts, 1);
    343 
    344 #if defined(SUPPORT_INET4)
    345 
    346         /* ローカル IP アドレスに届いたデータグラムのみ ICMP エラーを通知する。*/
    347         if (ntohl(iph->dst) == IF_GET_IFNET()->in_ifaddr.addr) {
    348                 syslog(LOG_INFO, "[UDP] unexp port: %d.", ntohs(udph->dport));
    349 
    350                 icmp_error(ICMP4_UNREACH_PORT, input);
    351                 /* icmp_error では、ネットワークバッファ input を返却しないので下へ抜ける。*/
    352                 }
    353 
    354 #endif  /* of #if defined(SUPPORT_INET4) */
    355 
    356 #if defined(SUPPORT_INET6)
    357 
    358         /* マルチキャストアドレスに届いたデータグラムは ICMP エラーを通知しない。*/
    359         if (!IN6_IS_ADDR_MULTICAST(&iph->dst)) {
    360                 syslog(LOG_INFO, "[UDP] unexp port: %d.", ntohs(udph->dport));
    361 
    362                 /* icmp6_error で、ネットワークバッファ input を返却する。*/
    363                 icmp6_error(input, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0);
    364 
    365                 NET_COUNT_UDP(net_count_udp.in_err_packets, 1);
    366                 NET_COUNT_MIB(udp_stats.udpInErrors, 1);
    367                 return IPPROTO_DONE;
    368                 }
    369 
    370 #endif  /* of #if defined(SUPPORT_INET6) */
    371 
    372 buf_rel:
    373         NET_COUNT_UDP(net_count_udp.in_err_packets, 1);
    374         NET_COUNT_MIB(udp_stats.udpInErrors, 1);
    375         syscall(rel_net_buf(input));
    376         return IPPROTO_DONE;
    377         }
     173#endif  /* of #if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0 */
    378174
    379175#endif  /* of #ifdef SUPPORT_UDP */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_output.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 *
     
    7373#include <t_syslog.h>
    7474#include "kernel_cfg.h"
     75#include "tinet_cfg.h"
    7576
    7677#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8182#include <t_services.h>
    8283#include "kernel_id.h"
     84#include "tinet_id.h"
    8385
    8486#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9294#include <net/ethernet.h>
    9395#include <net/net.h>
     96#include <net/net_endian.h>
    9497#include <net/net_buf.h>
    9598#include <net/net_count.h>
    9699
    97100#include <netinet/in.h>
    98 #include <netinet6/in6.h>
    99101#include <netinet/in_var.h>
    100102#include <netinet/in_itron.h>
     
    102104#include <netinet/ip_var.h>
    103105#include <netinet/ip_icmp.h>
    104 #include <netinet6/in6_var.h>
    105 #include <netinet/ip6.h>
    106 #include <netinet6/ip6_var.h>
    107 #include <netinet6/nd6.h>
    108 #include <netinet/icmp6.h>
    109106#include <netinet/udp.h>
    110107#include <netinet/udp_var.h>
     
    115112
    116113/*
    117  *  関数
    118  */
    119 
    120 static void udp_output (T_UDP_CEP *cep);
    121 
    122 /*
    123  *  UDP 出力タスク
    124  *  ノンブロッキングコールを組み込んだとき使用する。
    125  */
    126 
    127 static void
    128 udp_output (T_UDP_CEP *cep)
    129 {
    130         T_NET_BUF       *output;
    131         T_UDP_HDR       *udph;
    132         ER_UINT         error;
    133 
    134 #ifdef UDP_CFG_OUT_CHECKSUM
    135         uint16_t        sum;
    136 #endif  /* of #ifdef UDP_CFG_OUT_CHECKSUM */
    137 
    138         /* IP データグラムを割り当てる。*/
    139         if ((error = IN_GET_DATAGRAM(&output, (uint_t)(UDP_HDR_SIZE + cep->snd_len), 0,
    140                                      &cep->snd_p_dstaddr->ipaddr,
    141                                      &cep->myaddr.ipaddr,
    142                                      IPPROTO_UDP, IP_DEFTTL,
    143                                      NBA_SEARCH_ASCENT, TMO_UDP_OUTPUT)) != E_OK) {
    144                 goto err_ret;
    145                 }
    146 
    147         /* UDP ヘッダに情報を設定する。*/
    148         udph            = GET_UDP_HDR(output, IF_IP_UDP_HDR_OFFSET);
    149         udph->sport     = htons(cep->myaddr.portno);
    150         udph->dport     = htons(cep->snd_p_dstaddr->portno);
    151         udph->ulen      = htons(UDP_HDR_SIZE + cep->snd_len);
    152         udph->sum       = 0;
    153 
    154         /* データをコピーする。*/
    155         memcpy((void*)GET_UDP_SDU(output, IF_IP_UDP_HDR_OFFSET),
    156                cep->snd_data, (size_t)cep->snd_len);
    157 
    158 #ifdef UDP_CFG_OUT_CHECKSUM
    159 
    160         sum = IN_CKSUM(output, IPPROTO_UDP, IF_IP_UDP_HDR_OFFSET,
    161                        (uint_t)(UDP_HDR_SIZE + cep->snd_len));
    162 
    163         /* 計算したチェックサムの値が 0 なら 0xffff を入れる。*/
    164         if (sum == 0)
    165                 sum = UINT_C(0xffff);
    166         udph->sum = sum;
    167 
    168 #endif/* of #ifdef UDP_CFG_OUT_CHECKSUM */
    169 
    170         /* ネットワークバッファ長を調整する。*/
    171         output->len = (uint16_t)(IF_IP_UDP_HDR_SIZE + cep->snd_len);
    172 
    173         /* ネットワーク層 (IP) の出力関数を呼び出す。*/
    174         if ((error = IP_OUTPUT(output, TMO_UDP_OUTPUT)) != E_OK)
    175                 goto err_ret;
    176 
    177 
    178         NET_COUNT_MIB(udp_stats.udpOutDatagrams, 1);
    179 
    180         if (IS_PTR_DEFINED(cep->callback)) {
    181 
    182                 if (error == E_OK)
    183                         error = cep->snd_len;
    184 
    185 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    186 
    187                 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)error);
    188 
    189 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    190 
    191                 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error);
    192 
    193 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    194 
    195                 }
    196         else
    197                 syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
    198         cep->snd_p_dstaddr = NULL;
    199         return;
    200 
    201 err_ret:
    202         NET_COUNT_UDP(net_count_udp.out_err_packets, 1);
    203         if (IS_PTR_DEFINED(cep->callback)) {
    204 
    205 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    206 
    207                 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)E_NOMEM);
    208 
    209 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    210 
    211                 error = E_NOMEM;
    212                 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error);
    213 
    214 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    215 
    216                 }
    217         else
    218                 syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
    219         cep->snd_p_dstaddr = NULL;
    220         return;
    221         }
     114 *  IPv6 と IPv4 で引数が異なる関数のコンパイル
     115 */
     116
     117#undef  IN_GET_DATAGRAM
     118
     119#if defined(_IP6_CFG)
     120
     121#define UDP_OUTPUT              udp6_output
     122#define GET_UDP_CEPID           GET_UDP6_CEPID
     123#define T_UDP_CEP               T_UDP6_CEP
     124#define API_PROTO               API_PROTO_IPV6
     125
     126#if defined(_IP4_CFG)
     127#define IN_GET_DATAGRAM         inn_get_datagram
     128#else
     129#define IN_GET_DATAGRAM         in6_get_datagram
     130#endif
     131
     132#include <netinet/udpn_output.c>
     133
     134#undef  UDP_OUTPUT
     135#undef  GET_UDP_CEPID
     136#undef  T_UDP_CEP
     137#undef  API_PROTO
     138#undef  IN_GET_DATAGRAM
     139
     140#endif  /* of #if defined(_IP6_CFG)  */
     141
     142#if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0
     143
     144#define UDP_OUTPUT              udp4_output
     145#define GET_UDP_CEPID           GET_UDP4_CEPID
     146#define T_UDP_CEP               T_UDP4_CEP
     147#define API_PROTO               API_PROTO_IPV4
     148
     149#define IN_GET_DATAGRAM         in4_get_datagram
     150
     151#include <netinet/udpn_output.c>
     152
     153#endif  /* of #if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0 */
    222154
    223155/*
     
    236168
    237169
    238 #if defined(SUPPORT_INET6) && !defined(SUPPORT_TCP)
     170#if defined(_IP6_CFG) && !defined(SUPPORT_TCP)
    239171
    240172        /* IPv6 のステートレス・アドレス自動設定を実行する。*/
    241173        in6_if_up(IF_GET_IFNET());
    242174
    243 #endif  /* of #if defined(SUPPORT_INET6) && !defined(SUPPORT_TCP) */
     175#endif  /* of #if defined(_IP6_CFG) && !defined(SUPPORT_TCP) */
    244176
    245177        while (true) {
     
    248180                syscall(wai_sem(SEM_UDP_POST_OUTPUT));
    249181
    250                 for (ix = tmax_udp_ccepid; ix -- > 0; ) {
    251 
    252                         if (udp_cep[ix].flags & UDP_CEP_FLG_POST_OUTPUT) {
    253                                 udp_cep[ix].flags &= ~UDP_CEP_FLG_POST_OUTPUT;
    254                                 udp_output(&udp_cep[ix]);
     182#if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0
     183
     184                for (ix = tmax_udp6_cepid; ix -- > 0; ) {
     185
     186                        if (udp6_cep[ix].flags & UDP_CEP_FLG_POST_OUTPUT) {
     187                                udp6_cep[ix].flags &= ~UDP_CEP_FLG_POST_OUTPUT;
     188                                udp6_output(&udp6_cep[ix]);
    255189                                }
    256190                        }
     191
     192#endif  /* of #if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0 */
     193
     194#if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0
     195
     196                for (ix = tmax_udp4_cepid; ix -- > 0; ) {
     197
     198                        if (udp4_cep[ix].flags & UDP_CEP_FLG_POST_OUTPUT) {
     199                                udp4_cep[ix].flags &= ~UDP_CEP_FLG_POST_OUTPUT;
     200                                udp4_output(&udp4_cep[ix]);
     201                                }
     202                        }
     203
     204#endif  /* of #if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0 */
     205
    257206                }
    258207        }
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_subr.c

    r321 r331  
    22 *  TINET (UDP/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 *
     
    7171#include <kernel.h>
    7272#include <sil.h>
     73#include <t_syslog.h>
    7374#include "kernel_cfg.h"
     75#include "tinet_cfg.h"
    7476
    7577#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8082#include <t_services.h>
    8183#include "kernel_id.h"
     84#include "tinet_id.h"
    8285
    8386#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9194#include <net/ethernet.h>
    9295#include <net/net.h>
     96#include <net/net_endian.h>
    9397#include <net/net_buf.h>
    9498#include <net/net_count.h>
     
    96100
    97101#include <netinet/in.h>
    98 #include <netinet6/in6.h>
    99102#include <netinet/in_var.h>
    100103#include <netinet/in_itron.h>
     
    102105#include <netinet/ip_var.h>
    103106#include <netinet/ip_icmp.h>
    104 #include <netinet6/in6_var.h>
    105 #include <netinet/ip6.h>
    106 #include <netinet6/ip6_var.h>
    107 #include <netinet6/nd6.h>
    108 #include <netinet/icmp6.h>
    109107#include <netinet/udp.h>
    110108#include <netinet/udp_var.h>
     109#include <netinet/ip_igmp.h>
     110
     111#include <net/if_var.h>
    111112
    112113#ifdef SUPPORT_UDP
     
    116117 */
    117118
     119#if (defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0) || (defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0)
     120
    118121static uint16_t udp_port_auto = UDP_PORT_FIRST_AUTO;    /* 自動割り当て番号     */
    119122
     123#endif  /* of #if (defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0) || (defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0) */
     124
    120125/*
    121  *  udp_alloc_auto_port -- 自動割り当てポート番号を設定する。
     126 *  IPv6 と IPv4 で引数が異なる関数のコンパイル
    122127 */
    123128
    124 ER
    125 udp_alloc_auto_port (T_UDP_CEP *cep)
    126 {
    127         int_t   ix;
    128         uint16_t        portno, portno_start;
     129#if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0
    129130
    130         portno_start = udp_port_auto;
    131         do {
    132                 portno = udp_port_auto ++;
    133                 if (udp_port_auto > UDP_PORT_LAST_AUTO)
    134                         udp_port_auto = UDP_PORT_FIRST_AUTO;
     131#if defined(_IP4_CFG) && defined(API_CFG_IP4MAPPED_ADDR)
    135132
    136                 syscall(wai_sem(SEM_UDP_CEP));
    137                 for (ix = tmax_udp_ccepid; ix -- > 0; ) {
    138                         if (VALID_UDP_CEP(&udp_cep[ix]) && udp_cep[ix].myaddr.portno == portno) {
    139                                 portno = UDP_PORTANY;
    140                                 break;
    141                                 }
    142                         }
     133#define UDP_IS_DSTADDR_ACCEPT   udpn_is_dstaddr_accept
    143134
    144                 if (portno != UDP_PORTANY) {
    145                         cep->myaddr.portno = portno;
    146                         syscall(sig_sem(SEM_UDP_CEP));
    147                         return E_OK;
    148                         }
    149                 syscall(sig_sem(SEM_UDP_CEP));
     135#else   /* of #if defined(_IP4_CFG) */
    150136
    151                 } while (portno_start != udp_port_auto);
     137#define UDP_IS_DSTADDR_ACCEPT   udp6_is_dstaddr_accept
    152138
    153         return E_NOID;
    154         }
     139#endif  /* of #if defined(_IP4_CFG) */
    155140
    156 /*
    157  *  udp_alloc_port -- 指定されたポート番号を設定する。
    158  */
     141#define UDP_SEND_DATA           udp6_send_data
     142#define UDP_CAN_SND             udp6_can_snd
     143#define UDP_CAN_RCV             udp6_can_rcv
     144#define UDP_ALLOC_AUTO_PORT     udp6_alloc_auto_port
     145#define UDP_ALLOC_PORT          udp6_alloc_port
     146#define UDP_FIND_CEP            udp6_find_cep
     147#define UDP_NOTIFY              udp6_notify
     148#define TMAX_UDP_CEPID          tmax_udp6_cepid
     149#define UDP_CEP                 udp6_cep
     150#define T_UDP_CEP               T_UDP6_CEP
     151#define T_IPEP                  T_IPV6EP
     152#define API_PROTO               API_PROTO_IPV6
    159153
    160 ER
    161 udp_alloc_port (T_UDP_CEP *cep, uint16_t portno)
    162 {
    163         int_t   ix;
     154#include <netinet6/udp6_subr.c>
     155#include <netinet/udpn_subr.c>
    164156
    165         syscall(wai_sem(SEM_UDP_CEP));
    166         for (ix = tmax_udp_ccepid; ix -- > 0; )
    167                 if (VALID_UDP_CEP(&udp_cep[ix]) && udp_cep[ix].myaddr.portno == portno) {
    168                         syscall(sig_sem(SEM_UDP_CEP));
    169                         return E_PAR;
    170                         }
    171         cep->myaddr.portno = portno;
    172         syscall(sig_sem(SEM_UDP_CEP));
    173         return E_OK;
    174         }
     157#undef  UDP_SEND_DATA
     158#undef  UDP_CAN_SND
     159#undef  UDP_CAN_RCV
     160#undef  UDP_ALLOC_AUTO_PORT
     161#undef  UDP_ALLOC_PORT
     162#undef  UDP_FIND_CEP
     163#undef  UDP_NOTIFY
     164#undef  UDP_IS_DSTADDR_ACCEPT
     165#undef  TMAX_UDP_CEPID
     166#undef  UDP_CEP
     167#undef  T_UDP_CEP
     168#undef  T_IPEP
     169#undef  API_PROTO
     170
     171#endif  /* of #if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0 */
     172
     173#if defined(_IP4_CFG) && ( (TNUM_UDP4_CEPID > 0) || \
     174                          ((TNUM_UDP6_CEPID > 0) && defined(API_CFG_IP4MAPPED_ADDR)))
     175
     176#define UDP_IS_DSTADDR_ACCEPT   udp4_is_dstaddr_accept
     177
     178#define UDP_SEND_DATA           udp4_send_data
     179#define UDP_CAN_SND             udp4_can_snd
     180#define UDP_CAN_RCV             udp4_can_rcv
     181#define UDP_ALLOC_AUTO_PORT     udp4_alloc_auto_port
     182#define UDP_ALLOC_PORT          udp4_alloc_port
     183#define UDP_FIND_CEP            udp4_find_cep
     184#define UDP_NOTIFY              udp4_notify
     185#define TMAX_UDP_CEPID          tmax_udp4_cepid
     186#define T_UDP_CEP               T_UDP4_CEP
     187#define UDP_CEP                 udp4_cep
     188#define T_IPEP                  T_IPV4EP
     189#define API_PROTO               API_PROTO_IPV4
     190
     191#include <netinet/udp4_subr.c>
     192#include <netinet/udpn_subr.c>
     193
     194#endif  /* of #if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0 */
    175195
    176196#endif  /* of #ifdef SUPPORT_UDP */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq.c

    r321 r331  
    22 *  TINET (UDP/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 *
     
    7878#include <kernel.h>
    7979#include <sil.h>
     80#include "tinet_cfg.h"
    8081
    8182#endif  /* of #ifdef TARGET_KERNEL_ASP */
     
    8586#include <s_services.h>
    8687#include <t_services.h>
    87 #include "kernel_id.h"
     88#include "tinet_id.h"
    8889
    8990#endif  /* of #ifdef TARGET_KERNEL_JSP */
     
    9798#include <net/ethernet.h>
    9899#include <net/net.h>
     100#include <net/net_endian.h>
    99101#include <net/net_buf.h>
    100102#include <net/net_count.h>
     
    102104
    103105#include <netinet/in.h>
    104 #include <netinet6/in6.h>
    105106#include <netinet/in_var.h>
    106107#include <netinet/in_itron.h>
     
    108109#include <netinet/ip_var.h>
    109110#include <netinet/ip_icmp.h>
    110 #include <netinet6/in6_var.h>
    111 #include <netinet/ip6.h>
    112 #include <netinet6/ip6_var.h>
    113 #include <netinet6/nd6.h>
    114 #include <netinet/icmp6.h>
    115111#include <netinet/udp.h>
    116112#include <netinet/udp_var.h>
     113#include <netinet/ip_igmp.h>
    117114
    118115#ifdef SUPPORT_UDP
    119 
    120 /*
    121  *  IPv4 と IPv6 の切り替えマクロ
    122  */
    123 
    124 #if defined(SUPPORT_INET4)
    125 
    126 #define UDP_CRE_CEP     udp_cre_cep
    127 #define UDP_SND_DAT     udp_snd_dat
    128 #define UDP_RCV_DAT     udp_rcv_dat
    129 
    130 #endif  /* of #if defined(SUPPORT_INET4) */
    131 
    132 #if defined(SUPPORT_INET6)
    133 
    134 #define UDP_CRE_CEP     udp6_cre_cep
    135 #define UDP_SND_DAT     udp6_snd_dat
    136 #define UDP_RCV_DAT     udp6_rcv_dat
    137 
    138 #endif  /* of #if defined(SUPPORT_INET6) */
    139116
    140117/*
     
    158135#endif  /* of #ifndef UDP_CFG_LIBRARY */
    159136
    160 #ifdef __udp_send_data
    161 
    162 /*
    163  *  udp_send_data -- パケット送信の主要部
    164  */
    165 
    166 ER_UINT
    167 udp_send_data (T_UDP_CEP *cep, T_IPEP *p_dstaddr, void *data, int_t len, TMO tmout)
    168 {
    169         T_NET_BUF       *output;
    170         T_UDP_HDR       *udph;
    171         SYSTIM          before, after;
    172         ER              error = E_OK;
    173 
    174 #ifdef UDP_CFG_OUT_CHECKSUM
    175         uint16_t        sum;
    176 #endif  /* of #ifdef UDP_CFG_OUT_CHECKSUM */
    177 
    178         NET_COUNT_UDP(net_count_udp.out_octets,  len);
    179         NET_COUNT_UDP(net_count_udp.out_packets, 1);
    180 
    181         /* IP データグラム割り当ての時間を tmout から減ずる。*/
    182         if (!(tmout == TMO_POL || tmout == TMO_FEVR))
    183                 syscall(get_tim(&before));
    184 
    185         /* IP データグラムを割り当てる。*/
    186         if ((error = IN_GET_DATAGRAM(&output, (uint_t)(UDP_HDR_SIZE + len), 0,
    187                                      &p_dstaddr->ipaddr,
    188                                      &cep->myaddr.ipaddr,
    189                                      IPPROTO_UDP, IP_DEFTTL,
    190                                      NBA_SEARCH_ASCENT, tmout)) != E_OK)
    191                 goto err_ret;
    192 
    193         /* IP データグラム割り当ての時間を tmout から減ずる。*/
    194         if (!(tmout == TMO_POL || tmout == TMO_FEVR)) {
    195                 syscall(get_tim(&after));
    196                 if (after - before > tmout) {
    197                         syscall(rel_net_buf(output));
    198                         error = E_TMOUT;
    199                         goto err_ret;
    200                         }
    201                 tmout -= (TMO)(after - before);
    202                 }
    203 
    204         /* UDP ヘッダに情報を設定する。*/
    205         udph            = GET_UDP_HDR(output, IF_IP_UDP_HDR_OFFSET);
    206         udph->sport     = htons(cep->myaddr.portno);
    207         udph->dport     = htons(p_dstaddr->portno);
    208         udph->ulen      = htons(UDP_HDR_SIZE + len);
    209         udph->sum       = 0;
    210 
    211         /* データをコピーする。*/
    212         memcpy((void*)GET_UDP_SDU(output, IF_IP_UDP_HDR_OFFSET), data, (size_t)len);
    213 
    214 #ifdef UDP_CFG_OUT_CHECKSUM
    215 
    216         sum = IN_CKSUM(output, IPPROTO_UDP, IF_IP_UDP_HDR_OFFSET, (uint_t)(UDP_HDR_SIZE + len));
    217 
    218         /* 計算したチェックサムの値が 0 なら 0xffff を入れる。*/
    219         if (sum == 0)
    220                 sum = 0xffff;
    221         udph->sum = sum;
    222 
    223 #endif  /* of #ifdef UDP_CFG_OUT_CHECKSUM */
    224 
    225         /* ネットワークバッファ長を調整する。*/
    226         output->len = (uint16_t)(IF_IP_UDP_HDR_SIZE + len);
    227 
    228         /* ネットワーク層 (IP) の出力関数を呼び出す。*/
    229         if ((error = IP_OUTPUT(output, tmout)) == E_OK) {
    230                 NET_COUNT_MIB(udp_stats.udpOutDatagrams, 1);
    231                 cep->snd_tskid = TA_NULL;
    232                 return len;
    233                 }
    234 
    235 err_ret:
    236         NET_COUNT_UDP(net_count_udp.out_err_packets, 1);
    237         cep->snd_tskid = TA_NULL;
    238         return error;
    239         }
    240 
    241 #endif  /* of #ifdef __udp_send_data */
    242 
    243 /*
    244  *  udp_cre_cep -- UDP 通信端点の生成【拡張機能】
    245  */
    246 
    247 #ifdef __udp_cre_cep
    248 
    249 #ifdef UDP_CFG_EXTENTIONS
    250 
    251 ER
    252 UDP_CRE_CEP (ID cepid, T_UDP_CCEP *pk_ccep)
    253 {
    254         T_UDP_CEP       *cep;
    255         ER              error;
    256 
    257         /* UDP 通信端点 ID をチェックする。*/
    258         if (!VALID_UDP_CEPID(cepid))
    259                 return E_ID;
    260 
    261         /* pk_ccep が NULL ならエラー */
    262         if (pk_ccep == NULL)
    263                 return E_PAR;
    264 
    265         /* UDP 通信端点を得る。*/
    266         cep = GET_UDP_CEP(cepid);
    267 
    268         /* UDP 通信端点をチェックする。*/
    269         if (VALID_UDP_CEP(cep))
    270                 return E_OBJ;
    271 
    272         /* UDP 通信端点が、動的生成用でなければエラー */
    273         if (!DYNAMIC_UDP_CEP(cep))
    274                 return E_ID;
    275 
    276         /* 通信端点をロックする。*/
    277         syscall(wai_sem(cep->semid_lock));
    278 
    279         /*
    280          * UDP 通信端点をチェックする。生成済みであればエラー
    281          */
    282         if (VALID_UDP_CEP(cep))
    283                 error = E_OBJ;
    284         else {
    285 
    286                 /*
    287                  *  自ポート番号が UDP_PORTANY なら、自動で割り当てる。
    288                  */
    289                 if (pk_ccep->myaddr.portno == UDP_PORTANY)
    290                         error = udp_alloc_auto_port(cep);
    291                 else
    292                         error = udp_alloc_port(cep, pk_ccep->myaddr.portno);
    293                
    294                 if (error == E_OK) {
    295 
    296                         /* UDP 通信端点生成情報をコピーする。*/
    297                         cep->cepatr        = pk_ccep->cepatr;                   /* 通信端点属性               */
    298                         cep->myaddr.ipaddr = pk_ccep->myaddr.ipaddr;            /* 自分のアドレス      */
    299                         cep->callback      = (void*)pk_ccep->callback;          /* コールバック               */
    300 
    301                         /* UDP 通信端点を生成済みにする。*/
    302                         cep->flags |= UDP_CEP_FLG_VALID;
    303                         }
    304                 }
    305 
    306         /* 通信端点のロックを解除する。*/
    307         syscall(sig_sem(cep->semid_lock));
    308 
    309         return error;
    310         }
    311 
    312 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    313 
    314 #endif  /* of #ifdef __udp_cre_cep */
    315 
    316 /*
    317  *  udp_del_cep -- UDP 通信端点の削除【拡張機能】
    318  */
    319 
    320 #ifdef __udp_del_cep
    321 
    322 #ifdef UDP_CFG_EXTENTIONS
    323 
    324 ER
    325 udp_del_cep (ID cepid)
    326 {
    327         T_UDP_CEP       *cep;
    328         ER              error;
    329 
    330         /* UDP 通信端点 ID をチェックする。*/
    331         if (!VALID_UDP_CEPID(cepid))
    332                 return E_ID;
    333 
    334         /* UDP 通信端点を得る。*/
    335         cep = GET_UDP_CEP(cepid);
    336 
    337         /* UDP 通信端点をチェックする。*/
    338         if (!VALID_UDP_CEP(cep))
    339                 return E_NOEXS;
    340 
    341         /* UDP 通信端点が、動的生成用でなければエラー */
    342         if (!DYNAMIC_UDP_CEP(cep))
    343                 return E_ID;
    344 
    345         /* 通信端点をロックする。*/
    346         syscall(wai_sem(cep->semid_lock));
    347 
    348         /*
    349          * UDP 通信端点をチェックする。未生成の場合はエラー
    350          * ・未生成。
    351          */
    352         if (!VALID_UDP_CEP(cep))
    353                 error = E_NOEXS;
    354         else {
    355                 udp_can_snd(cep, E_DLT);
    356                 udp_can_rcv(cep, E_DLT);
    357 
    358                 /* UDP 通信端点を未生成にする。*/
    359                 cep->flags &= ~UDP_CEP_FLG_VALID;
    360                 error = E_OK;
    361                 }
    362 
    363         /* 通信端点のロックを解除する。*/
    364         syscall(sig_sem(cep->semid_lock));
    365 
    366         return error;
    367         }
    368 
    369 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    370 
    371 #endif  /* of #ifdef __udp_del_cep */
     137/*
     138 *  IPv6 と IPv4 で引数が異なる関数のコンパイル
     139 */
     140
     141#undef  IN_GET_DATAGRAM
     142#undef  IN_COPY_TO_HOST
     143
     144#if defined(SUPPORT_INET6) && TNUM_UDP6_CEPID > 0
     145
     146#define UDP_CANCEL_CEP          udp6_cancel_cep
     147#define UDP_DELETE_CEP          udp6_delete_cep
     148#define UDP_SET_OPTION          udp6_set_option
     149#define UDP_GET_OPTION          udp6_get_option
     150#define UDP_CRE_CEP             udp6_cre_cep
     151#define UDP_DEL_CEP             udp6_del_cep
     152#define UDP_SET_OPT             udp6_set_opt
     153#define UDP_GET_OPT             udp6_get_opt
     154#define UDP_SND_DAT             udp6_snd_dat
     155#define UDP_RCV_DAT             udp6_rcv_dat
     156#define UDP_CAN_SND             udp6_can_snd
     157#define UDP_CAN_RCV             udp6_can_rcv
     158#define UDP_ALLOC_AUTO_PORT     udp6_alloc_auto_port
     159#define UDP_ALLOC_PORT          udp6_alloc_port
     160#define UDP_SEND_DATA           udp6_send_data
     161#define VALID_UDP_CEPID         VALID_UDP6_CEPID
     162#define GET_UDP_CEP             GET_UDP6_CEP
     163#define GET_UDP_CEPID           GET_UDP6_CEPID
     164#define T_UDP_CEP               T_UDP6_CEP
     165#define T_UDPN_CCEP             T_UDP6_CCEP
     166#define T_IPEP                  T_IPV6EP
     167#define API_PROTO               API_PROTO_IPV6
     168
     169#if defined(_IP4_CFG)
     170#define IN_GET_DATAGRAM         inn_get_datagram
     171#define IN_COPY_TO_HOST         inn_copy_to_host
     172#else
     173#define IN_GET_DATAGRAM         in6_get_datagram
     174#define IN_COPY_TO_HOST         IN6_COPY_TO_HOST
     175#endif
     176
     177#include <netinet/udpn_usrreq.c>
     178
     179#undef  UDP_CANCEL_CEP
     180#undef  UDP_DELETE_CEP
     181#undef  UDP_SET_OPTION
     182#undef  UDP_GET_OPTION
     183#undef  UDP_CRE_CEP
     184#undef  UDP_DEL_CEP
     185#undef  UDP_SET_OPT
     186#undef  UDP_GET_OPT
     187#undef  UDP_SND_DAT
     188#undef  UDP_RCV_DAT
     189#undef  UDP_CAN_SND
     190#undef  UDP_CAN_RCV
     191#undef  UDP_ALLOC_AUTO_PORT
     192#undef  UDP_ALLOC_PORT
     193#undef  UDP_SEND_DATA
     194#undef  VALID_UDP_CEPID
     195#undef  GET_UDP_CEP
     196#undef  GET_UDP_CEPID
     197#undef  T_UDP_CEP
     198#undef  T_UDPN_CCEP
     199#undef  T_IPEP
     200#undef  API_PROTO
     201#undef  IN_GET_DATAGRAM
     202#undef  IN_COPY_TO_HOST
     203
     204#endif  /* of #if defined(SUPPORT_INET6) && TNUM_UDP6_CEPID > 0 */
     205
     206#if defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0
     207
     208#define UDP_CANCEL_CEP          udp4_cancel_cep
     209#define UDP_DELETE_CEP          udp4_delete_cep
     210#define UDP_SET_OPTION          udp4_set_option
     211#define UDP_GET_OPTION          udp4_get_option
     212#define UDP_CRE_CEP             udp_cre_cep
     213#define UDP_DEL_CEP             udp_del_cep
     214#define UDP_SET_OPT             udp_set_opt
     215#define UDP_GET_OPT             udp_get_opt
     216#define UDP_SND_DAT             udp_snd_dat
     217#define UDP_RCV_DAT             udp_rcv_dat
     218#define UDP_CAN_SND             udp4_can_snd
     219#define UDP_CAN_RCV             udp4_can_rcv
     220#define UDP_ALLOC_AUTO_PORT     udp4_alloc_auto_port
     221#define UDP_ALLOC_PORT          udp4_alloc_port
     222#define UDP_SEND_DATA           udp4_send_data
     223#define VALID_UDP_CEPID         VALID_UDP4_CEPID
     224#define GET_UDP_CEP             GET_UDP4_CEP
     225#define GET_UDP_CEPID           GET_UDP4_CEPID
     226#define T_UDP_CEP               T_UDP4_CEP
     227#define T_UDPN_CCEP             T_UDP_CCEP
     228#define T_IPEP                  T_IPV4EP
     229#define API_PROTO               API_PROTO_IPV4
     230
     231#define IN_COPY_TO_HOST         IN4_COPY_TO_HOST
     232#define IN_GET_DATAGRAM         in4_get_datagram
     233
     234#include <netinet/udpn_usrreq.c>
     235
     236#endif  /* of #if defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0 */
     237
     238#if defined(SUPPORT_INET6) && (defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0)
     239
     240/*
     241 *  udp_can_cep -- ペンディングしている処理のキャンセル【標準機能】
     242 */
    372243
    373244#ifdef __udp_can_cep
    374 
    375 /*
    376  *  udp_can_cep -- ペンディングしている処理のキャンセル【標準機能】
    377  */
    378245
    379246ER
    380247udp_can_cep (ID cepid, FN fncd)
    381248{
    382         T_UDP_CEP       *cep;
    383         ER              error = E_OK, snd_err, rcv_err;
    384 
    385         /* API 機能コードをチェックする。*/
    386         if (!VALID_TFN_UDP_CAN(fncd))
    387                 return E_PAR;
    388 
    389         /* UDP 通信端点 ID をチェックする。*/
    390         if (!VALID_UDP_CEPID(cepid))
     249        /* IPv6 用の UDP 通信端点 ID をチェックする。*/
     250        if (VALID_UDP6_CEPID(cepid)) {
     251
     252                /* UDP 通信端点を得てメイン関数を呼び出す。*/
     253                return udp6_cancel_cep(GET_UDP6_CEP(cepid), fncd);
     254                }
     255
     256        /* IPv4 用の UDP 通信端点 ID をチェックする。*/
     257        else if (VALID_UDP4_CEPID(cepid)) {
     258
     259                /* UDP 通信端点を得てメイン関数を呼び出す。*/
     260                return udp4_cancel_cep(GET_UDP4_CEP(cepid), fncd);
     261                }
     262
     263        else
    391264                return E_ID;
    392 
    393         /* UDP 通信端点を得る。*/
    394         cep = GET_UDP_CEP(cepid);
    395 
    396         /* UDP 通信端点をチェックする。*/
    397         if (!VALID_UDP_CEP(cep))
    398                 return E_NOEXS;
    399 
    400         /* 通信端点をロックする。*/
    401         syscall(wai_sem(cep->semid_lock));
    402 
    403         if (fncd == TFN_UDP_ALL) {      /* TFN_UDP_ALL の処理 */
    404 
    405                 snd_err = udp_can_snd(cep, E_RLWAI);
    406                 rcv_err = udp_can_rcv(cep, E_RLWAI);
    407 
    408                 /*
    409                  *  snd_err と rcv_err のどちらも EV_NOPND
    410                  *  なら、ペンディングしていないのでエラー
    411                  */
    412                 if (snd_err == EV_NOPND && rcv_err == EV_NOPND)
    413                         error = E_OBJ;
    414                 else {
    415                         if (snd_err == EV_NOPND)
    416                                 snd_err = E_OK;
    417                         if (rcv_err == EV_NOPND)
    418                                 rcv_err = E_OK;
    419 
    420                         if (snd_err != E_OK)
    421                                 error = snd_err;
    422                         else if (rcv_err != E_OK)
    423                                 error = rcv_err;
    424                         }
    425                 }
    426         else if (fncd == TFN_UDP_SND_DAT) {     /* 送信処理のキャンセル */
    427                 if ((error = udp_can_snd(cep, E_RLWAI)) == EV_NOPND)
    428                         error = E_OBJ;
    429                 }
    430         else if (fncd == TFN_UDP_RCV_DAT) {     /* 受信処理のキャンセル */
    431                 if ((error = udp_can_rcv(cep, E_RLWAI)) == EV_NOPND)
    432                         error = E_OBJ;
    433                 }
    434         else
    435                 error = E_PAR;
    436 
    437         /* 通信端点をロックを解除する。*/
    438         syscall(sig_sem(cep->semid_lock));
    439 
    440         return error;
    441265        }
    442266
    443267#endif  /* of #ifdef __udp_can_cep */
    444268
    445 /*
    446  *  udp_set_opt -- UDP 通信端点オプションの設定【拡張機能】
    447  *
    448  *  注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。
    449  */
    450 
    451 #ifdef __udp_set_opt
    452 
    453 #ifdef UDP_CFG_EXTENTIONS
    454 
    455 ER
    456 udp_set_opt (ID cepid, int_t optname, void *optval, int_t optlen)
    457 {
    458         T_UDP_CEP       *cep;
    459 
    460         /* UDP 通信端点 ID をチェックする。*/
    461         if (!VALID_UDP_CEPID(cepid))
    462                 return E_ID;
    463 
    464         /* UDP 通信端点を得る。*/
    465         cep = GET_UDP_CEP(cepid);
    466 
    467         /* UDP 通信端点をチェックする。*/
    468         if (!VALID_UDP_CEP(cep))
    469                 return E_NOEXS;
    470 
    471         return E_OK/*E_PAR*/;
    472         }
    473 
    474 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    475 
    476 #endif  /* of #ifdef __udp_set_opt */
    477 
    478 /*
    479  *  udp_get_opt -- UDP 通信端点オプションの設定【拡張機能】
    480  *
    481  *  注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。
    482  */
    483 
    484 #ifdef __udp_get_opt
    485 
    486 #ifdef UDP_CFG_EXTENTIONS
    487 
    488 ER
    489 udp_get_opt (ID cepid, int_t optname, void *optval, int_t optlen)
    490 {
    491         T_UDP_CEP       *cep;
    492 
    493         /* UDP 通信端点 ID をチェックする。*/
    494         if (!VALID_UDP_CEPID(cepid))
    495                 return E_ID;
    496 
    497         /* UDP 通信端点を得る。*/
    498         cep = GET_UDP_CEP(cepid);
    499 
    500         /* UDP 通信端点をチェックする。*/
    501         if (!VALID_UDP_CEP(cep))
    502                 return E_NOEXS;
    503 
    504         return E_OK/*E_PAR*/;
    505         }
    506 
    507 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    508 
    509 #endif  /* of #ifdef __udp_get_opt */
    510 
    511 #ifdef UDP_CFG_NON_BLOCKING
    512 
    513 #include "udp_usrreq_nblk.c"
    514 
    515 #else   /* of #ifdef UDP_CFG_NON_BLOCKING */
    516 
    517 #ifdef __udp_can_snd
    518 
    519 /*
    520  *  udp_can_snd -- ペンディングしている送信のキャンセル
    521  */
    522 
    523 ER
    524 udp_can_snd (T_UDP_CEP *cep, ER error)
    525 {
    526         if (cep->snd_tskid != TA_NULL) {        /* 非ノンブロッキングコールでペンディング中 */
    527 
    528 #ifdef UDP_CFG_EXTENTIONS
    529 
    530                 /* 待ち中に発生したエラー情報を設定する。*/
    531                 cep->error = error;
    532 
    533 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    534 
    535                 error = rel_wai(cep->snd_tskid);
    536                 cep->snd_tskid = TA_NULL;
    537                 }
    538         else                                    /* どちらでもないならペンディングしていない */
    539                 error = EV_NOPND;
    540 
    541         return error;
    542         }
    543 
    544 #endif  /* of #ifdef __udp_can_snd */
    545 
    546 #ifdef __udp_can_rcv
    547 
    548 /*
    549  *  udp_can_rcv -- ペンディングしている受信のキャンセル
    550  */
    551 
    552 ER
    553 udp_can_rcv (T_UDP_CEP *cep, ER error)
    554 {
    555         if (cep->rcv_tskid != TA_NULL) {        /* 非ノンブロッキングコールでペンディング中 */
    556 
    557 #ifdef UDP_CFG_EXTENTIONS
    558 
    559                 /* 待ち中に発生したエラー情報を設定する。*/
    560                 cep->error = error;
    561 
    562 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    563 
    564                 error = rel_wai(cep->rcv_tskid);
    565                 cep->rcv_tskid = TA_NULL;
    566                 }
    567         else                                    /* どちらでもないならペンディングしていない */
    568                 error = EV_NOPND;
    569 
    570         return error;
    571         }
    572 
    573 #endif  /* of #ifdef __udp_can_rcv */
    574 
    575 #ifdef __udp_snd_dat
    576 
    577 /*
    578  *  udp_snd_dat -- パケットの送信【標準機能】
    579  */
    580 
    581 ER_UINT
    582 UDP_SND_DAT (ID cepid, T_IPEP *p_dstaddr, void *data, int_t len, TMO tmout)
    583 {
    584         T_UDP_CEP       *cep;
    585         ER              error;
    586 
    587         /* p_dstaddr または data が NULL か、tmout が TMO_NBLK ならエラー */
    588         if (p_dstaddr == NULL || data == NULL || tmout == TMO_NBLK)
    589                 return E_PAR;
    590 
    591         /* データ長をチェックする。*/
    592         if (len < 0 || len + IP_HDR_SIZE + UDP_HDR_SIZE > IF_MTU)
    593                 return E_PAR;
    594 
    595         /* UDP 通信端点 ID をチェックする。*/
    596         if (!VALID_UDP_CEPID(cepid))
    597                 return E_ID;
    598 
    599         /* UDP 通信端点を得る。*/
    600         cep = GET_UDP_CEP(cepid);
    601 
    602         /* UDP 通信端点をチェックする。*/
    603         if (!VALID_UDP_CEP(cep))
    604                 return E_NOEXS;
    605 
    606         /*
    607          *  自ポート番号が UDP_PORTANY なら、自動で割り当てる。
    608          */
    609         if (cep->myaddr.portno == UDP_PORTANY) {
    610                 if ((error = udp_alloc_auto_port(cep)) != E_OK)
    611                         return error;
    612                 }
    613        
    614         /* 通信端点をロックする。*/
    615         syscall(wai_sem(cep->semid_lock));
    616 
    617         if (cep->snd_tskid != TA_NULL) {
    618 
    619                 /* 非ノンブロッキングコールでペンディング中 */
    620                 error = E_QOVR;
    621 
    622                 /* 通信端点をロックを解除する。*/
    623                 syscall(sig_sem(cep->semid_lock));
    624                 }
    625         else {
    626                 /* 現在のタスク識別子を記録する。*/
    627                 get_tid(&(cep->snd_tskid));
    628 
    629 #ifdef UDP_CFG_EXTENTIONS
    630 
    631                 /* 待ち中に発生したエラー情報をリセットする。*/
    632                 cep->error = E_OK;
    633 
    634 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    635 
    636                 /* 通信端点をロックを解除する。*/
    637                 syscall(sig_sem(cep->semid_lock));
    638 
    639                 /* パケットを送信する。*/
    640                 error = udp_send_data(cep, p_dstaddr, data, len, tmout);
    641 
    642 #ifdef UDP_CFG_EXTENTIONS
    643 
    644                 /* 待ち中に発生したエラー情報を返す。*/
    645                 if (error == E_RLWAI)
    646                         error = cep->error;
    647 
    648 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    649                 }
    650 
    651         return error;
    652         }
    653 
    654 #endif  /* of #ifdef __udp_snd_dat */
    655 
    656 #ifdef __udp_rcv_dat
    657 
    658 /*
    659  *  udp_rcv_dat -- パケットの受信【標準機能】
    660  */
    661 
    662 ER_UINT
    663 UDP_RCV_DAT (ID cepid, T_IPEP *p_dstaddr, void *data, int_t len, TMO tmout)
    664 {
    665         T_NET_BUF       *input;
    666         T_UDP_CEP       *cep;
    667         T_UDP_HDR       *udph;
    668         ER_UINT         error;
    669         uint_t          ulen, uhoff;
    670 
    671         /* p_dstaddr または data が NULL 、len < 0 か、tmout が TMO_NBLK ならエラー */
    672         if (p_dstaddr == NULL || data == NULL || len < 0 || tmout == TMO_NBLK)
    673                 return E_PAR;
    674 
    675         /* UDP 通信端点 ID をチェックする。*/
    676         if (!VALID_UDP_CEPID(cepid))
    677                 return E_ID;
    678 
    679         /* UDP 通信端点を得る。*/
    680         cep = GET_UDP_CEP(cepid);
    681 
    682         /* UDP 通信端点をチェックする。*/
    683         if (!VALID_UDP_CEP(cep))
    684                 return E_NOEXS;
    685 
    686         /* 通信端点をロックする。*/
    687         syscall(wai_sem(cep->semid_lock));
    688 
    689         if (cep->rcv_tskid != TA_NULL) {
    690 
    691                 /* 非ノンブロッキングコールでペンディング中 */
    692                 error = E_QOVR;
    693 
    694                 /* 通信端点をロックを解除する。*/
    695                 syscall(sig_sem(cep->semid_lock));
    696                 }
    697         else {
    698 
    699                 /* 現在のタスク識別子を記録する。*/
    700                 get_tid(&(cep->rcv_tskid));
    701 
    702 #ifdef UDP_CFG_EXTENTIONS
    703 
    704                 /* 待ち中に発生したエラー情報をリセットする。*/
    705                 cep->error = E_OK;
    706 
    707 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    708 
    709                 /* 通信端点をロックを解除する。*/
    710                 syscall(sig_sem(cep->semid_lock));
    711 
    712                 /* 入力があるまで待つ。*/
    713                 if (cep->cb_netbuf != NULL) {
    714 
    715                         /*
    716                          *  ここにくる場合は、コールバック関数の中から
    717                          *  udp_rcv_dat を呼び出していることになり、
    718                          *  すでに入力済みである。
    719                          */
    720                         input = cep->cb_netbuf;
    721                         cep->cb_netbuf = NULL;
    722                         }
    723                 else if ((error = trcv_dtq(cep->rcvqid, (intptr_t*)&input, tmout)) != E_OK) {
    724 
    725 #ifdef UDP_CFG_EXTENTIONS
    726 
    727                         /* 待ち中に発生したエラー情報を返す。*/
    728                         if (error == E_RLWAI)
    729                                 error = cep->error;
    730 
    731 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    732 
    733                         cep->rcv_tskid = TA_NULL;
    734                         return error;
    735                         }
    736 
    737                 /* p_dstaddr を設定する。*/
    738                 uhoff = (uint_t)GET_UDP_HDR_OFFSET(input);
    739                 udph = GET_UDP_HDR(input, uhoff);
    740                 p_dstaddr->portno = ntohs(udph->sport);
    741                 IN_COPY_TO_HOST(&p_dstaddr->ipaddr, &GET_IP_HDR(input)->src);
    742 
    743                 /* データをバッファに移す。*/
    744                 ulen = ntohs(udph->ulen);
    745                 if (ulen - UDP_HDR_SIZE > len)
    746                         error = E_BOVR;
    747                 else {
    748                         len   =    (uint_t)(ulen - UDP_HDR_SIZE);
    749                         error = (ER_UINT)(ulen - UDP_HDR_SIZE);
    750                         }
    751 
    752                 memcpy(data, GET_UDP_SDU(input, uhoff), (size_t)len);
    753 
    754                 syscall(rel_net_buf(input));
    755 
    756                 cep->rcv_tskid = TA_NULL;
    757                 }
    758 
    759         return error;
    760         }
    761 
    762 #endif  /* of #ifdef __udp_rcv_dat */
    763 
    764 #endif  /* of #ifdef UDP_CFG_NON_BLOCKING */
     269#endif  /* of #if defined(SUPPORT_INET6) && (defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0) */
    765270
    766271#endif  /* of #ifdef SUPPORT_UDP */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq_nblk.c

    r321 r331  
    22 *  TINET (UDP/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 */
     
    9496#include <net/ethernet.h>
    9597#include <net/net.h>
     98#include <net/net_endian.h>
    9699#include <net/net_buf.h>
    97100#include <net/net_count.h>
     
    99102
    100103#include <netinet/in.h>
    101 #include <netinet6/in6.h>
    102104#include <netinet/in_var.h>
    103105#include <netinet/in_itron.h>
     
    105107#include <netinet/ip_var.h>
    106108#include <netinet/ip_icmp.h>
    107 #include <netinet6/in6_var.h>
    108 #include <netinet/ip6.h>
    109 #include <netinet6/ip6_var.h>
    110 #include <netinet6/nd6.h>
    111 #include <netinet/icmp6.h>
    112109#include <netinet/udp.h>
    113110#include <netinet/udp_var.h>
    114111
    115112#ifdef SUPPORT_UDP
    116 
    117 /*
    118  *  IPv4 と IPv6 の切り替えマクロ
    119  */
    120 
    121 #if defined(SUPPORT_INET4)
    122 
    123 #define UDP_SND_DAT     udp_snd_dat
    124 #define UDP_RCV_DAT     udp_rcv_dat
    125 
    126 #endif  /* of #if defined(SUPPORT_INET4) */
    127 
    128 #if defined(SUPPORT_INET6)
    129 
    130 #define UDP_SND_DAT     udp6_snd_dat
    131 #define UDP_RCV_DAT     udp6_rcv_dat
    132 
    133 #endif  /* of #if defined(SUPPORT_INET6) */
    134113
    135114/*
     
    140119#ifndef UDP_CFG_LIBRARY
    141120
    142 #define __udp_can_snd
    143 #define __udp_can_rcv
    144 #define __udp_snd_dat
    145 #define __udp_rcv_dat
     121#define __udp_can_snd_nblk
     122#define __udp_can_rcv_nblk
     123#define __udp_snd_dat_nblk
     124#define __udp_rcv_dat_nblk
    146125
    147126#endif  /* of #ifndef UDP_CFG_LIBRARY */
     
    149128#ifdef UDP_CFG_NON_BLOCKING
    150129
    151 #ifdef __udp_can_snd
    152 
    153130/*
    154  *  udp_can_snd -- ペンディングしている送信のキャンセ
     131 *  IPv6 と IPv4 で引数が異なる関数のコンパイ
    155132 */
    156133
    157 ER
    158 udp_can_snd (T_UDP_CEP *cep, ER error)
    159 {
    160         if (cep->snd_p_dstaddr != NULL) {       /* ノンブロッキングコールでペンディング中 */
    161                 if (IS_PTR_DEFINED(cep->callback))
     134#undef  IN_COPY_TO_HOST
    162135
    163 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
     136#if defined(SUPPORT_INET6) && TNUM_UDP6_CEPID > 0
    164137
    165                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)error);
     138#define UDP_SND_DAT             udp6_snd_dat
     139#define UDP_RCV_DAT             udp6_rcv_dat
     140#define UDP_CAN_SND             udp6_can_snd
     141#define UDP_CAN_RCV             udp6_can_rcv
     142#define UDP_ALLOC_AUTO_PORT     udp6_alloc_auto_port
     143#define UDP_SEND_DATA           udp6_send_data
     144#define VALID_UDP_CEPID         VALID_UDP6_CEPID
     145#define GET_UDP_CEP             GET_UDP6_CEP
     146#define GET_UDP_CEPID           GET_UDP6_CEPID
     147#define T_UDP_CEP               T_UDP6_CEP
     148#define T_IPEP                  T_IPV6EP
     149#define API_PROTO               API_PROTO_IPV6
    166150
    167 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
     151#if defined(SUPPORT_INET4)
     152#define IN_COPY_TO_HOST         inn_copy_to_host
     153#else
     154#define IN_COPY_TO_HOST         IN6_COPY_TO_HOST
     155#endif
    168156
    169                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error);
     157#include <netinet/udpn_usrreq_nblk.c>
    170158
    171 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
     159#undef  UDP_SND_DAT
     160#undef  UDP_RCV_DAT
     161#undef  UDP_CAN_SND
     162#undef  UDP_CAN_RCV
     163#undef  UDP_ALLOC_AUTO_PORT
     164#undef  UDP_SEND_DATA
     165#undef  VALID_UDP_CEPID
     166#undef  GET_UDP_CEP
     167#undef  GET_UDP_CEPID
     168#undef  T_UDP_CEP
     169#undef  T_IPEP
     170#undef  API_PROTO
     171#undef  IN_COPY_TO_HOST
    172172
    173                 else
    174                         error = E_OBJ;
    175                 cep->snd_p_dstaddr = NULL;
    176                 }
    177         else if (cep->snd_tskid != TA_NULL) {   /* 非ノンブロッキングコールでペンディング中 */
     173#endif  /* of #if defined(SUPPORT_INET6) && TNUM_UDP6_CEPID > 0 */
    178174
    179 #ifdef UDP_CFG_EXTENTIONS
     175#if defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0
    180176
    181                 /* 待ち中に発生したエラー情報を設定する。*/
    182                 cep->error = error;
     177#define UDP_SND_DAT             udp_snd_dat
     178#define UDP_RCV_DAT             udp_rcv_dat
     179#define UDP_CAN_SND             udp4_can_snd
     180#define UDP_CAN_RCV             udp4_can_rcv
     181#define UDP_ALLOC_AUTO_PORT     udp4_alloc_auto_port
     182#define UDP_SEND_DATA           udp4_send_data
     183#define VALID_UDP_CEPID         VALID_UDP4_CEPID
     184#define GET_UDP_CEP             GET_UDP4_CEP
     185#define GET_UDP_CEPID           GET_UDP4_CEPID
     186#define T_UDP_CEP               T_UDP4_CEP
     187#define T_IPEP                  T_IPV4EP
     188#define API_PROTO               API_PROTO_IPV4
    183189
    184 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
     190#define IN_COPY_TO_HOST         IN4_COPY_TO_HOST
    185191
    186                 error = rel_wai(cep->snd_tskid);
    187                 cep->snd_tskid = TA_NULL;
    188                 }
    189         else                                    /* どちらでもないならペンディングしていない */
    190                 error = EV_NOPND;
     192#include <netinet/udpn_usrreq_nblk.c>
    191193
    192         return error;
    193         }
    194 
    195 #endif  /* of #ifdef __udp_can_snd */
    196 
    197 #ifdef __udp_can_rcv
    198 
    199 /*
    200  *  udp_can_rcv -- ペンディングしている受信のキャンセル
    201  */
    202 
    203 ER
    204 udp_can_rcv (T_UDP_CEP *cep, ER error)
    205 {
    206         if (cep->rcv_p_dstaddr != NULL) {       /* ノンブロッキングコールでペンディング中 */
    207                 if (IS_PTR_DEFINED(cep->callback))
    208 
    209 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14
    210 
    211                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)error);
    212 
    213 #else   /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    214 
    215                         (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)&error);
    216 
    217 #endif  /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
    218 
    219                 else
    220                         error = E_OBJ;
    221                 cep->rcv_p_dstaddr = NULL;
    222                 }
    223         else if (cep->rcv_tskid != TA_NULL) {   /* 非ノンブロッキングコールでペンディング中 */
    224 
    225 #ifdef UDP_CFG_EXTENTIONS
    226 
    227                 /* 待ち中に発生したエラー情報を設定する。*/
    228                 cep->error = error;
    229 
    230 #endif  /* of #ifdef UDP_CFG_EXTENTIONS */
    231 
    232                 error = rel_wai(cep->rcv_tskid);
    233                 cep->rcv_tskid = TA_NULL;
    234                 }
    235         else                                    /* どちらでもないならペンディングしていない */
    236                 error = EV_NOPND;
    237 
    238         return error;
    239         }
    240 
    241 #endif  /* of #ifdef __udp_can_rcv */
    242 
    243 #ifdef __udp_snd_dat
    244 
    245 /*
    246  *  udp_snd_dat -- パケットの送信【標準機能】
    247  */
    248 
    249 ER_UINT
    250 UDP_SND_DAT (ID cepid, T_IPEP *p_dstaddr, void *data, int_t len, TMO tmout)
    251 {
    252         T_UDP_CEP       *cep;
    253         ER              error;
    254 
    255         /* p_dstaddr または data が NULL ならエラー */
    256         if (p_dstaddr == NULL || data == NULL)
    257                 return E_PAR;
    258 
    259         /* データ長をチェックする。*/
    260         if (len < 0 || len + IP_HDR_SIZE + UDP_HDR_SIZE > IF_MTU)
    261                 return E_PAR;
    262 
    263         /* UDP 通信端点 ID をチェックする。*/
    264         if (!VALID_UDP_CEPID(cepid))
    265                 return E_ID;
    266 
    267         /* UDP 通信端点を得る。*/
    268         cep = GET_UDP_CEP(cepid);
    269 
    270         /* UDP 通信端点をチェックする。*/
    271         if (!VALID_UDP_CEP(cep))
    272                 return E_NOEXS;
    273 
    274         /*
    275          *  自ポート番号が UDP_PORTANY なら、自動で割り当てる。
    276          */
    277         if (cep->myaddr.portno == UDP_PORTANY) {
    278                 if ((error = udp_alloc_auto_port(cep)) != E_OK)
    279                         return error;
    280                 }
    281 
    282         /*
    283          * タイムアウトをチェックする。
    284          */
    285 
    286         if (tmout == TMO_NBLK) {        /* ノンブロッキングコール */
    287 
    288                 /* 通信端点をロックする。*/
    289                 syscall(wai_sem(cep->semid_lock));
    290 
    291                 if (cep->snd_p_dstaddr != NULL) {
    292 
    293                         /* ノンブロッキングコールでペンディング中 */
    294                         error = E_QOVR;
    295 
    296                         /* 通信端点をロックを解除する。*/
    297                         syscall(sig_sem(cep->semid_lock));
    298                         }
    299                 else if (cep->snd_tskid != TA_NULL) {
    300 
    301                         /* 非ノンブロッキングコールでペンディング中 */
    302                         error = E_OBJ;
    303 
    304                         /* 通信端点をロックを解除する。*/
    305                         syscall(sig_sem(cep->semid_lock));
    306                         }
    307                 else {
    308 
    309                         cep->snd_p_dstaddr = p_dstaddr;
    310                         cep->snd_data   = data;
    311                         cep->snd_len    = len;
    312 
    313                         /* 通信端点をロックを解除する。*/
    314                         syscall(sig_sem(cep->semid_lock));
    315 
    316                         cep->flags |= UDP_CEP_FLG_POST_OUTPUT;
    317                         sig_sem(SEM_UDP_POST_OUTPUT);
    318                         error = E_WBLK;
    319                         }
    320                 }
    321         else {                          /* 非ノンブロッキングコール */
    322        
    323                 /* 通信端点をロックする。*/
    324                 syscall(wai_sem(cep->semid_lock));
    325 
    326                 if (cep->snd_p_dstaddr != NULL) {
    327 
    328                         /* ノンブロッキングコールでペンディング中 */
    329                         error = E_OBJ;
    330 
    331                         /* 通信端点をロックを解除する。*/
    332                         syscall(sig_sem(cep->semid_lock));
    333                         }
    334                 else if (cep->snd_tskid != TA_NULL) {
    335 
    336                         /* 非ノンブロッキングコールでペンディング中 */
    337                         error = E_QOVR;
    338 
    339                         /* 通信端点をロックを解除する。*/
    340                         syscall(sig_sem(cep->semid_lock));
    341                         }
    342                 else {
    343 
    344                         /* 現在のタスク識別子を記録する。*/
    345                         get_tid(&(cep->snd_tskid));
    346 
    347                         /* 通信端点をロックを解除する。*/
    348                         syscall(sig_sem(cep->semid_lock));
    349 
    350                         /* パケットを送信する。*/
    351                         error = udp_send_data(cep, p_dstaddr, data, len, tmout);
    352                         }
    353                 }
    354 
    355         return error;
    356         }
    357 
    358 #endif  /* of #ifdef __udp_snd_dat */
    359 
    360 #ifdef __udp_rcv_dat
    361 
    362 /*
    363  *  udp_rcv_dat -- パケットの受信【標準機能】
    364  */
    365 
    366 ER_UINT
    367 UDP_RCV_DAT (ID cepid, T_IPEP *p_dstaddr, void *data, int_t len, TMO tmout)
    368 {
    369         T_NET_BUF       *input;
    370         T_UDP_CEP       *cep;
    371         T_UDP_HDR       *udph;
    372         ER_UINT         error;
    373         uint_t          ulen, uhoff;
    374 
    375         /* p_dstaddr または data が NULL か、len < 0 ならエラー */
    376         if (p_dstaddr == NULL || data == NULL || len < 0)
    377                 return E_PAR;
    378 
    379         /* UDP 通信端点 ID をチェックする。*/
    380         if (!VALID_UDP_CEPID(cepid))
    381                 return E_ID;
    382 
    383         /* UDP 通信端点を得る。*/
    384         cep = GET_UDP_CEP(cepid);
    385 
    386         /* UDP 通信端点をチェックする。*/
    387         if (!VALID_UDP_CEP(cep))
    388                 return E_NOEXS;
    389 
    390         /*
    391          * タイムアウトをチェックする。
    392          */
    393 
    394         if (tmout == TMO_NBLK) {        /* ノンブロッキングコール */
    395 
    396                 /* 通信端点をロックする。*/
    397                 syscall(wai_sem(cep->semid_lock));
    398 
    399                 if (cep->rcv_p_dstaddr != NULL)
    400 
    401                         /* ノンブロッキングコールでペンディング中 */
    402                         error = E_QOVR;
    403 
    404                 else if (cep->rcv_tskid != TA_NULL)
    405 
    406                         /* 非ノンブロッキングコールでペンディング中 */
    407                         error = E_OBJ;
    408                 else {
    409                         cep->rcv_p_dstaddr = p_dstaddr;
    410                         cep->rcv_data   = data;
    411                         cep->rcv_len    = len;
    412                         error = E_WBLK;
    413                         }
    414 
    415                 /* 通信端点をロックを解除する。*/
    416                 syscall(sig_sem(cep->semid_lock));
    417                 return error;
    418                 }
    419         else {                          /* 非ノンブロッキングコール */
    420 
    421                 /* 通信端点をロックする。*/
    422                 syscall(wai_sem(cep->semid_lock));
    423 
    424                 if (cep->rcv_p_dstaddr != NULL) {
    425 
    426                         /* ノンブロッキングコールでペンディング中 */
    427                         error = E_OBJ;
    428 
    429                         /* 通信端点をロックを解除する。*/
    430                         syscall(sig_sem(cep->semid_lock));
    431                         }
    432                 else if (cep->rcv_tskid != TA_NULL) {
    433 
    434                         /* 非ノンブロッキングコールでペンディング中 */
    435                         error = E_QOVR;
    436 
    437                         /* 通信端点をロックを解除する。*/
    438                         syscall(sig_sem(cep->semid_lock));
    439                         }
    440                 else {
    441 
    442                         /* 現在のタスク識別子を記録する。*/
    443                         get_tid(&(cep->rcv_tskid));
    444 
    445                         /* 通信端点をロックを解除する。*/
    446                         syscall(sig_sem(cep->semid_lock));
    447 
    448                         /* 入力があるまで待つ。*/
    449                         if (cep->cb_netbuf != NULL) {
    450 
    451                                 /*
    452                                  *  ここにくる場合は、コールバック関数の中から
    453                                  *  udp_rcv_dat を呼び出していることになり、
    454                                  *  すでに入力済みである。
    455                                  */
    456                                 input = cep->cb_netbuf;
    457                                 cep->cb_netbuf = NULL;
    458                                 }
    459                         else if ((error = trcv_dtq(cep->rcvqid, (intptr_t*)&input, tmout)) != E_OK) {
    460                                 cep->rcv_tskid = TA_NULL;
    461                                 return error;
    462                                 }
    463 
    464                         /* p_dstaddr を設定する。*/
    465                         uhoff = (uint_t)GET_UDP_HDR_OFFSET(input);
    466                         udph = GET_UDP_HDR(input, uhoff);
    467                         p_dstaddr->portno = ntohs(udph->sport);
    468                         IN_COPY_TO_HOST(&p_dstaddr->ipaddr, &GET_IP_HDR(input)->src);
    469 
    470                         /* データをバッファに移す。*/
    471                         ulen = ntohs(udph->ulen);
    472                         if (ulen - UDP_HDR_SIZE > len)
    473                                 error = E_BOVR;
    474                         else {
    475                                 len   =     (int_t)(ulen - UDP_HDR_SIZE);
    476                                 error = (ER_UINT)(ulen - UDP_HDR_SIZE);
    477                                 }
    478 
    479                         memcpy(data, GET_UDP_SDU(input, uhoff), (size_t)len);
    480 
    481                         syscall(rel_net_buf(input));
    482 
    483                         cep->rcv_tskid = TA_NULL;
    484                         }
    485                 return error;
    486                 }
    487         }
    488 
    489 #endif  /* of #ifdef __udp_rcv_dat */
     194#endif  /* of #if defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0 */
    490195
    491196#endif  /* of #ifdef UDP_CFG_NON_BLOCKING */
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_var.h

    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 */
    7676
    77 #define IP_UDP_HDR_SIZE                 (IP_HDR_SIZE + UDP_HDR_SIZE)
    78 #define IF_IP_UDP_HDR_SIZE              (IF_IP_HDR_SIZE + UDP_HDR_SIZE)
    79 #define IF_IP_UDP_HDR_OFFSET            (IF_IP_HDR_SIZE)
    80 
    8177#define GET_UDP_HDR(nbuf,uhoff)         ((T_UDP_HDR*)((uint8_t*)((nbuf)->buf) + uhoff))
     78#define GET_UDP_HDR_OFFSET(nbuf)        (GET_IF_IP_HDR_SIZE(nbuf))
    8279#define GET_UDP_SDU(nbuf,uhoff)         ((uint8_t*)((nbuf)->buf) + uhoff+ UDP_HDR_SIZE)
    8380
    84 #define GET_UDP_HDR_OFFSET(nbuf)        (GET_IF_IP_HDR_SIZE(nbuf))
    85 
    86 #define GET_IP_UDP_HDR_SIZE(nbuf)       (GET_IP_HDR_SIZE(GET_IP_HDR(nbuf)) + UDP_HDR_SIZE)
    87 #define GET_IF_IP_UDP_HDR_SIZE(nbuf)    (IF_HDR_SIZE + GET_IP_UDP_HDR_SIZE(nbuf))
     81#define IF_IP_UDP_HDR_SIZE(nbuf)        (IF_IP_HDR_SIZE(nbuf) + UDP_HDR_SIZE)
     82#define IF_IP_UDP_HDR_OFFSET(nbuf)      (IF_IP_HDR_SIZE(nbuf))
    8883
    8984/*
     
    9186 */
    9287
    93 #if defined(SUPPORT_INET4)
     88#if defined(_IP4_CFG)
    9489
    9590#define IP4_UDP_HDR_SIZE                IP_UDP_HDR_SIZE
     
    9893#define GET_IF_IP4_UDP_HDR_SIZE(nbuf)   GET_IF_IP_UDP_HDR_SIZE(nbuf)
    9994
    100 #endif  /* of #if defined(SUPPORT_INET4) */
     95#endif  /* of #if defined(_IP4_CFG) */
    10196
    10297/*
     
    110105 */
    111106
    112 
    113 /*
    114  *  IPv4 UDP 通信端点
    115  */
    116 typedef struct t_udp4_cep {
     107/* IPv6 用 UDP 通信端点 */
     108
     109typedef struct t_udp6_cep {
    117110
    118111        /*
     
    120113         */
    121114        ATR             cepatr;         /* UDP 通信端点属性           */
    122         T_IPV4EP        myaddr;         /* 自分のアドレス              */
     115        T_IPV6EP        myaddr;         /* 自分のアドレス              */
    123116        t_udp_callback  callback;       /* コールバック関数             */
    124117
     
    135128#ifdef UDP_CFG_NON_BLOCKING
    136129
    137         T_IPV4EP        *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/
    138         T_IPV4EP        *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/
     130        T_IPV6EP        *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/
     131        T_IPV6EP        *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/
    139132        void            *snd_data;      /* 送信データ領域の先頭アドレス       */
    140133        int_t           snd_len;        /* 送信データ領域の長さ           */
     
    148141#endif
    149142
    150         } T_UDP4_CEP;
    151 
    152 #if defined(SUPPORT_INET4)
    153 #define T_UDP_CEP       T_UDP4_CEP
    154 #endif
    155 
    156 /*
    157  *  IPv6 UDP 通信端点
    158  */
    159 
    160 typedef struct t_udp6_cep {
     143        } T_UDP6_CEP;
     144
     145/* IPv4 用 UDP 通信端点 */
     146
     147typedef struct t_udp4_cep {
    161148
    162149        /*
     
    164151         */
    165152        ATR             cepatr;         /* UDP 通信端点属性           */
    166         T_IPV6EP        myaddr;         /* 自分のアドレス              */
     153        T_IPV4EP        myaddr;         /* 自分のアドレス              */
    167154        t_udp_callback  callback;       /* コールバック関数             */
    168155
     
    179166#ifdef UDP_CFG_NON_BLOCKING
    180167
    181         T_IPV6EP        *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/
    182         T_IPV6EP        *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/
     168        T_IPV4EP        *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/
     169        T_IPV4EP        *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/
    183170        void            *snd_data;      /* 送信データ領域の先頭アドレス       */
    184171        int_t           snd_len;        /* 送信データ領域の長さ           */
     
    191178        ER              error;          /* 待ち中に発生したエラー  */
    192179#endif
    193 
    194         } T_UDP6_CEP;
    195 
    196 #if defined(SUPPORT_INET6)
     180#ifdef SUPPORT_IGMP
     181        bool_t igmp_loopback;
     182        uint8_t igmp_ttl;
     183        T_IN4_ADDR      igmp_mcaddr;    /*  */
     184#endif
     185        } T_UDP4_CEP;
     186
     187#if defined(_IP6_CFG)
     188
    197189#define T_UDP_CEP       T_UDP6_CEP
    198 #endif
     190
     191#else   /* of #if defined(_IP6_CFG) */
     192
     193#if defined(_IP4_CFG)
     194
     195#define T_UDP_CEP       T_UDP4_CEP
     196
     197#endif  /* of #if defined(_IP4_CFG) */
     198
     199#endif  /* of #if defined(_IP6_CFG) */
    199200
    200201/*
     
    210211 */
    211212
    212 #define TMIN_UDP_CEPID          1       /* UDP 通信端点 ID の最小値 */
    213 
    214 #ifdef SUPPORT_MIB
     213#define TMIN_UDP_CEPID          1                       /* UDP      通信端点 ID の最小値 */
     214#define TMIN_UDP6_CEPID         1                       /* UDP/IPv6 通信端点 ID の最小値 */
     215#define TMIN_UDP4_CEPID         (TNUM_UDP6_CEPID+1)     /* UDP/IPv4 通信端点 ID の最小値 */
    215216
    216217/*
     
    225226} T_UDP_STATS;
    226227
    227 #endif  /* of #ifdef SUPPORT_MIB */
    228 
    229228/*
    230229 *  関数シミュレーションマクロ
    231230 */
    232231
    233 #define VALID_UDP_CEPID(id)     (TMIN_UDP_CEPID<=(id)&&(id)<=tmax_udp_cepid)
    234 
    235 #define INDEX_UDP_CEP(id)       ((id)-TMIN_UDP_CEPID)
    236 
    237 #define GET_UDP_CEP(id)         (&(udp_cep[INDEX_UDP_CEP(id)]))
    238 
    239 #define GET_UDP_CEPID(cep)      ((ID)(((cep)-udp_cep)+TMIN_UDP_CEPID))
     232#define VALID_UDP6_CEPID(id)    (TMIN_UDP6_CEPID<=(id)&&(id)<=tmax_udp6_cepid)
     233#define VALID_UDP4_CEPID(id)    (TMIN_UDP4_CEPID<=(id)&&(id)<=tmax_udp4_cepid)
     234
     235#define INDEX_UDP6_CEP(id)      ((id)-TMIN_UDP6_CEPID)
     236#define INDEX_UDP4_CEP(id)      ((id)-TMIN_UDP4_CEPID)
     237
     238#define GET_UDP6_CEP(id)        (&(udp6_cep[INDEX_UDP6_CEP(id)]))
     239#define GET_UDP4_CEP(id)        (&(udp4_cep[INDEX_UDP4_CEP(id)]))
     240
     241#define GET_UDP6_CEPID(cep)     ((ID)(((cep)-udp6_cep)+TMIN_UDP6_CEPID))
     242#define GET_UDP4_CEPID(cep)     ((ID)(((cep)-udp4_cep)+TMIN_UDP4_CEPID))
    240243
    241244#define VALID_TFN_UDP_CAN(t)    ((t)==TFN_UDP_SND_DAT||(t)==TFN_UDP_RCV_DAT||\
     
    249252 */
    250253
    251 extern T_UDP_CEP udp_cep[];
     254extern T_UDP_STATS udp_stats;
     255
     256/* UDP 通信端点 */
     257
     258extern T_UDP6_CEP udp6_cep[];
     259extern T_UDP4_CEP udp4_cep[];
     260
     261#if defined(SUPPORT_INET6)
     262#define udp_cep udp6_cep
     263#elif defined(SUPPORT_INET4)
     264#define udp_cep udp4_cep
     265#endif
     266
    252267extern const ID tmax_udp_cepid;
    253268
    254 #ifdef SUPPORT_MIB
    255 
    256 extern T_UDP_STATS udp_stats;
    257 
    258 #endif  /* of #ifdef SUPPORT_MIB */
     269#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4)
     270extern const ID tmax_udp6_cepid;
     271extern const ID tmax_udp4_cepid;
     272#else
     273#define tmax_udp6_cepid tmax_udp_cepid
     274#define tmax_udp4_cepid tmax_udp_cepid
     275#endif
    259276
    260277/*
     
    269286 */
    270287
    271 extern uint_t udp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp);
    272 extern ER_UINT udp_send_data (T_UDP_CEP *cep, T_IPEP *p_dstaddr,
    273                               void *data, int_t len, TMO tmout);
    274 extern ER udp_can_snd (T_UDP_CEP *cep, ER error);
    275 extern ER udp_can_rcv (T_UDP_CEP *cep, ER error);
    276 extern ER udp_alloc_auto_port (T_UDP_CEP *cep);
    277 extern ER udp_alloc_port (T_UDP_CEP *cep, uint16_t portno);
     288/* IPv6 */
     289
     290extern uint_t udp6_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp);
     291extern ER_UINT udp6_send_data (T_UDP6_CEP *cep, T_IPV6EP *p_dstaddr,
     292                               void *data, int_t len, TMO tmout);
     293extern ER udp6_can_snd (T_UDP6_CEP *cep, ER error);
     294extern ER udp6_can_rcv (T_UDP6_CEP *cep, ER error);
     295extern ER udp6_alloc_auto_port (T_UDP6_CEP *cep);
     296extern ER udp6_alloc_port (T_UDP6_CEP *cep, uint16_t portno);
     297extern T_UDP6_CEP*udp6_find_cep (T_NET_BUF *input, uint_t off);
     298extern void udp6_notify (T_NET_BUF *input, ER error);
     299extern void udp6_input_select (T_UDP6_CEP *cep, T_NET_BUF *input, uint_t off);
     300
     301/* IPv4 */
     302
     303extern uint_t udp4_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp);
     304extern ER_UINT udp4_send_data (T_UDP4_CEP *cep, T_IPV4EP *p_dstaddr,
     305                               void *data, int_t len, TMO tmout);
     306extern ER udp4_can_snd (T_UDP4_CEP *cep, ER error);
     307extern ER udp4_can_rcv (T_UDP4_CEP *cep, ER error);
     308extern ER udp4_alloc_auto_port (T_UDP4_CEP *cep);
     309extern ER udp4_alloc_port (T_UDP4_CEP *cep, uint16_t portno);
     310extern T_UDP4_CEP*udp4_find_cep (T_NET_BUF *input, uint_t off);
     311extern void udp4_notify (T_NET_BUF *input, ER error);
     312extern void udp4_input_select (T_UDP4_CEP *cep, T_NET_BUF *input, uint_t off);
    278313
    279314/* ノンブロッキングコールを行う場合に組み込むタスク */
Note: See TracChangeset for help on using the changeset viewer.