Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- 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 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 102 102 #define _IP_ICMP6_H_ 103 103 104 #ifdef SUPPORT_INET6105 106 104 /* 107 105 * ICMPv6 ヘッダ … … 117 115 uint8_t data8[4]; 118 116 } data; 119 } __attribute__((packed, aligned(2))) T_ICMP6_HDR;117 } __attribute__((packed, aligned(2))) T_ICMP6_HDR; 120 118 121 119 #define icmp6_data32 data.data32 … … 133 131 #define GET_ICMP6_SDU(nbuf,ihoff) ((uint8_t*)((nbuf)->buf) + ihoff + ICMP6_HDR_SIZE) 134 132 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) 136 134 #define GET_IF_IP6_ICMP6_HDR_SIZE(nbuf) (IF_HDR_SIZE + GET_IP6_ICMP6_HDR_SIZE(nbuf)) 137 135 … … 218 216 T_IN6_ADDR target; 219 217 /* この後にオプションが続く */ 220 } __attribute__((packed, aligned(2)))T_NEIGHBOR_SOLICIT_HDR;218 } T_NEIGHBOR_SOLICIT_HDR; 221 219 222 220 #define NEIGHBOR_SOLICIT_HDR_SIZE (sizeof(T_NEIGHBOR_SOLICIT_HDR)) … … 230 228 231 229 #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) 233 231 #define GET_IF_IP6_NEIGHBOR_SOLICIT_HDR_SIZE(nbuf) \ 234 232 (GET_IP6_NEIGHBOR_SOLICIT_HDR_SIZE(nbuf) + IF_HDR_SIZE) … … 242 240 T_IN6_ADDR target; 243 241 /* この後にオプションが続く */ 244 } __attribute__((packed, aligned(2))) T_NEIGHBOR_ADVERT_HDR;242 } __attribute__((packed, aligned(2))) T_NEIGHBOR_ADVERT_HDR; 245 243 246 244 /* ICMP6 ヘッダのデータ部の定義 */ … … 261 259 262 260 #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) 264 262 #define GET_IF_IP6_NEIGHBOR_ADVERT_HDR_SIZE(nbuf) \ 265 263 (GET_IP6_NEIGHBOR_ADVERT_HDR_SIZE(nbuf) + IF_HDR_SIZE) … … 285 283 /* 286 284 * ルータ通知 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 287 289 */ 288 290 … … 292 294 uint32_t retransmit; /* [ms] 近隣要請送信間隔 */ 293 295 /* この後にオプションが続く */ 294 } __attribute__((packed, aligned(2))) T_ROUTER_ADVERT_HDR;296 } __attribute__((packed, aligned(2))) T_ROUTER_ADVERT_HDR; 295 297 296 298 /* ICMP6 ヘッダのデータ部の定義 */ … … 311 313 312 314 #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) 314 316 #define GET_IF_IP6_ROUTER_ADVERT_HDR_SIZE(nbuf) \ 315 317 (GET_IP6_ROUTER_ADVERT_HDR_SIZE(nbuf) + IF_HDR_SIZE) … … 324 326 325 327 /* 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 /* 326 339 * ルータ要請 327 340 */ … … 329 342 typedef struct t_router_solicit_hdr { 330 343 T_ICMP6_HDR hdr; 331 } __attribute__((packed, aligned(2))) T_ROUTER_SOLICIT_HDR;344 } __attribute__((packed, aligned(2))) T_ROUTER_SOLICIT_HDR; 332 345 333 346 /* ICMP6 ヘッダのデータ部の定義 */ … … 347 360 348 361 #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) 350 363 #define GET_IF_IP6_ROUTER_SOLICIT_HDR_SIZE(nbuf) \ 351 364 (GET_IP6_ROUTER_SOLICIT_HDR_SIZE(nbuf) + IF_HDR_SIZE) … … 360 373 T_ICMP6_HDR hdr; 361 374 T_IN6_ADDR target; 362 } __attribute__((packed, aligned(2))) T_NEIGHBOR_HDR;375 } __attribute__((packed, aligned(2))) T_NEIGHBOR_HDR; 363 376 364 377 /* 近隣探索オプションヘッダ */ … … 367 380 uint8_t type; /* オプションタイプ */ 368 381 uint8_t len; /* オプション長、単位は 8 バイト */ 369 } __attribute__((packed, aligned(2))) T_ND_OPT_HDR;382 } __attribute__((packed, aligned(2))) T_ND_OPT_HDR; 370 383 371 384 #define ND_OPT_HDR_SIZE (sizeof(T_ND_OPT_HDR)) … … 393 406 uint32_t reserved; 394 407 T_IN6_ADDR prefix; /* プレフィックス */ 395 } __attribute__((packed, aligned(2))) T_ND_OPT_PREFIX_INFO;408 } __attribute__((packed, aligned(2))) T_ND_OPT_PREFIX_INFO; 396 409 397 410 #define ND_OPT_PI_FLAG_ONLINK UINT_C(0x80) /* オンリンクプレフィックス */ … … 405 418 uint16_t reserved; 406 419 uint32_t mtu; /* MTU */ 407 } __attribute__((packed, aligned(2))) T_ND_OPT_MTU_HDR;420 } __attribute__((packed, aligned(2))) T_ND_OPT_MTU_HDR; 408 421 409 422 /* … … 416 429 T_IN6_ADDR dst; /* 向け直しの終点アドレス */ 417 430 /* この後にオプションが続く */ 418 } __attribute__((packed, aligned(2))) T_ND_REDIRECT_HDR;431 } __attribute__((packed, aligned(2))) T_ND_REDIRECT_HDR; 419 432 420 433 #define ND_REDIRECT_HDR_SIZE (sizeof(T_ND_REDIRECT_HDR)) … … 480 493 #endif /* of #ifdef ICMP_CFG_CALLBACK_ECHO_REPLY */ 481 494 482 #endif /* of #ifdef SUPPORT_INET6 */483 484 495 #endif /* of #ifndef _IP_ICMP6_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/icmp_var.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 94 94 #include <net/if_arp.h> 95 95 #include <net/net.h> 96 #include <net/net_endian.h> 96 97 #include <net/net_buf.h> 97 98 #include <net/net_var.h> … … 106 107 #include <net/if_var.h> 107 108 108 #if defined( SUPPORT_INET4) && defined(SUPPORT_ETHER)109 #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) 109 110 110 111 /* … … 118 119 */ 119 120 120 static T_ARP_ENTRY *arp_lookup (T_IN4_ADDR addr, bool_t create);121 121 static void in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input); 122 122 static void arp_timer (void *ignore); 123 123 124 124 /* 125 * in_arpinput -- TCP/IP 用 ARP の入力関数 126 */ 127 128 static void 129 in_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 223 reply: 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 249 err_ret: 250 NET_COUNT_ARP(net_count_arp.in_err_packets, 1); 251 buf_rel: 252 syscall(rel_net_buf(input)); 253 } 254 255 /* 256 * arp_timer -- ARP キャッシュの更新 257 */ 258 259 static void 260 arp_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 /* 125 285 * arp_lookup -- ARP キャッシュの探索と登録 126 286 * … … 128 288 */ 129 289 130 staticT_ARP_ENTRY *290 T_ARP_ENTRY * 131 291 arp_lookup (T_IN4_ADDR addr, bool_t create) 132 292 { … … 170 330 171 331 /* 172 * in_arpinput -- TCP/IP 用 ARP の入力関数173 */174 175 static void176 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_DUPLICATED207 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 else214 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 * 解決も行っているが、本実装では、自分以外の IP231 * アドレスの解決は行わない。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 else263 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 void302 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 /*327 332 * arp_request -- MAC アドレス解決要求 328 333 */ … … 359 364 /* イーサネット ARP ヘッダを設定する。*/ 360 365 et_arph = GET_ETHER_ARP_HDR(arp_req); 361 src = IF_GET_IFNET()->in _ifaddr.addr;366 src = IF_GET_IFNET()->in4_ifaddr.addr; 362 367 memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN); 363 368 memset(et_arph->thost, 0, ETHER_ADDR_LEN); … … 444 449 */ 445 450 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)) { 447 452 memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN); 448 453 return true; … … 504 509 eaddr->lladdr[1] = UINT_C(0x00); 505 510 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); 509 514 } 510 515 #endif /* ETHER_CFG_MULTICAST */ 511 516 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 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 36 36 */ 37 37 38 #if def SUPPORT_ETHER38 #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) 39 39 40 40 /* ARP キャッシュ更新用セマフォ */ … … 42 42 CRE_SEM(SEM_ARP_CACHE_LOCK, { TA_TPRI, 1, 1 }); 43 43 44 #endif /* of #if def SUPPORT_ETHER*/44 #endif /* of #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 106 106 */ 107 107 108 extern T_ARP_ENTRY *arp_lookup (T_IN4_ADDR addr, bool_t create); 108 109 extern ER arp_request (T_IF_ADDR *ifaddr, T_IN4_ADDR dst); 109 110 extern void arp_input (T_IF_ADDR *ifaddr, T_NET_BUF *input); -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 73 73 #include <tinet_kernel_defs.h> 74 74 75 #include <netinet/in4.h> 75 76 #include <netinet6/in6.h> 76 77 … … 79 80 */ 80 81 81 #define TINET_PRVER UINT_C(0x10 54) /* TINET のバージョン番号 */82 #define TINET_PRVER UINT_C(0x1070) /* TINET のバージョン番号 */ 82 83 83 84 /* … … 92 93 #define IPPROTO_HOPOPTS UINT_C(0) /* IPv6 中継点 (Hop-by-Hop) オプション */ 93 94 #define IPPROTO_ICMP UINT_C(1) /* ICMP */ 95 #define IPPROTO_IGMP UINT_C(2) /* IGMP */ 94 96 #define IPPROTO_TCP UINT_C(6) /* TCP */ 95 97 #define IPPROTO_UDP UINT_C(17) /* UDP */ … … 107 109 108 110 /* 109 * IPv4 アドレス111 * ポートの長さ 110 112 */ 111 113 112 /* 前方参照 */113 114 #ifndef T_IN4_ADDR_DEFINED115 116 typedef uint32_t T_IN4_ADDR;117 118 #define T_IN4_ADDR_DEFINED119 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 4136 114 #define PORT_NUM_LEN 2 137 115 … … 152 130 153 131 /* 154 * IP アドレスの定義132 * API IPプロトコルの指定 155 133 */ 156 134 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' 193 138 194 139 /* 195 * 動的生成用 TCP 通信端点140 * 動的生成用 TCP/IPv6 通信端点 196 141 */ 197 142 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 208 144 209 145 /* 210 * 動的生成用 TCP 受付口 146 * バイトオーダ関数の定義 147 * 148 * tinet/net/net.h でもバイトオーダの定義を行っているが、 149 * tinet/net/net.h をインクルードしない 150 * アプリケーションプログラム用に 151 * ターゲット依存しないバイトオーダ関数を定義する。 211 152 */ 212 153 213 #if defined( SUPPORT_INET4)154 #if defined(_NET_CFG_BYTE_ORDER) 214 155 215 typedef struct t_tcp_crep { 216 /* 標準 */ 217 ATR repatr; /* 受付口属性 */ 218 T_IPV4EP myaddr; /* 自分のアドレス */ 219 /* 実装依存 */ 220 } T_TCP_CREP; 156 /* tinet/net/net.h をインクルードしている。*/ 221 157 222 #e ndif /* of #if defined(SUPPORT_INET4) */158 #else /* of #if defined(_NET_CFG_BYTE_ORDER) */ 223 159 224 /* 225 * 動的生成用 UDP 通信端点 226 */ 160 extern uint16_t ntohs (uint16_t net); 161 extern uint16_t htons (uint16_t host); 162 extern uint32_t ntohl (uint32_t net); 163 extern uint32_t htonl (uint32_t host); 227 164 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)) 229 169 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) */ 259 171 260 172 /* … … 264 176 extern const char *in_strtfn (FN fncd); 265 177 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 276 178 #endif /* of #ifndef _IN_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_itron.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_rename.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 66 66 #define tcp_drop _tinet_tcp_drop 67 67 #define tcp_respond _tinet_tcp_respond 68 #define tcp_set_header _tinet_tcp_set_header69 68 #define tcp_get_segment _tinet_tcp_get_segment 70 69 #define tcp_rexmt_val _tinet_tcp_rexmt_val 71 70 #define tcp_init_cep _tinet_tcp_init_cep 72 71 #define tcp_notify _tinet_tcp_notify 73 #define tcp_find_cep _tinet_tcp_find_cep74 72 #define tcp_alloc_auto_port _tinet_tcp_alloc_auto_port 75 73 #define tcp_alloc_port _tinet_tcp_alloc_port … … 83 81 #define tcp_output_trace _tinet_tcp_output_trace 84 82 #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 85 88 86 89 /* netinet/tcp_subr_cs.c */ … … 136 139 /* tcp_cfg.c */ 137 140 138 #define tcp_rep _tinet_tcp_rep 141 #define tcp6_rep _tinet_tcp6_rep 142 #define tcp4_rep _tinet_tcp4_rep 139 143 #define tcp_cep _tinet_tcp_cep 140 144 #define tcp_twcep _tinet_tcp_twcep … … 146 150 /* netinet/udp_input.c */ 147 151 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 149 158 150 159 /* netinet/udp_subr.c */ 151 160 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 154 169 155 170 /* netinet/udp_usrreq.c */ … … 164 179 /* udp_cfg.c */ 165 180 166 #define udp_cep _tinet_udp_cep 181 #define udp6_cep _tinet_udp6_cep 182 #define udp4_cep _tinet_udp4_cep 167 183 #define tmax_udp_cepid _tinet_tmax_udp_cepid 168 184 #define tmax_udp_ccepid _tinet_tmax_udp_cepid /* TINET 1.3 との互換性のための定義 */ … … 188 204 /* netinet/in_subr.c */ 189 205 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 190 220 #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 191 230 #define in4_get_datagram _tinet_in4_get_datagram 231 #define in4_is_dstaddr_accept _tinet_in4_is_dstaddr_accept 192 232 #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 197 234 #define in4_ifawithifp _tinet_in4_ifawithifp 198 #define in_cksum _tinet_in_cksum199 #define in_cksum_carry _tinet_in_cksum_carry200 #define in_cksum_sum _tinet_in_cksum_sum201 #define in_rtnewentry _tinet_in_rtnewentry202 #define in_rtinit _tinet_in_rtinit203 #define in_rttimer _tinet_in_rttimer204 235 205 236 /* netinet/if_ether.c */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/in_subr.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #include <kernel.h> 72 72 #include <sil.h> 73 #include <t_syslog.h>74 73 #include "kernel_cfg.h" 75 74 … … 91 90 #include <net/if_ppp.h> 92 91 #include <net/ethernet.h> 93 #include <net/ppp_ipcp.h>94 92 #include <net/net.h> 93 #include <net/net_endian.h> 95 94 #include <net/net_var.h> 96 95 #include <net/net_buf.h> … … 98 97 99 98 #include <netinet/in.h> 100 #include <netinet6/in6.h>101 99 #include <netinet/in_var.h> 102 #include <netinet/in_itron.h>103 100 #include <netinet/ip.h> 104 101 #include <netinet/ip_var.h> 105 #include <netinet/ tcp_timer.h>102 #include <netinet/in_itron.h> 106 103 107 104 #include <net/if_var.h> 108 105 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 117 uint32_t 118 in_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 144 uint32_t 145 in_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 161 typedef struct t_strtfn { 162 FN fncd; /* API 機能コード */ 163 const char *str; /* 文字表現 */ 164 } T_STRTFN; 165 166 const 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 197 const char * 198 in_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 アドレスを文字列に変換する。 125 213 */ 126 214 127 215 char * 128 ip 2str (char *buf, const T_IN4_ADDR *ipaddr)216 ipv42str (char *buf, const T_IN4_ADDR *ipaddr) 129 217 { 130 218 static char addr_sbuf[NUM_IPV4ADDR_STR_BUFF][sizeof("123.123.123.123")]; … … 153 241 } 154 242 155 /* 156 * in4_set_header -- IPv4 ヘッダを設定する。 243 #endif /* of #if defined(_IP4_CFG) */ 244 245 /* 246 * in6_is_addr_ipv4mapped -- IPv4 射影アドレスである事を検査する。 247 */ 248 249 bool_t 250 in6_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 261 static void 262 ip6_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 275 static void 276 ip4_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 289 void 290 ip_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 304 void 305 ip_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 326 bool_t 327 inn_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 349 bool_t 350 inn_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 367 void 368 inn_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 データグラムを獲得し、ヘッダを設定する。 157 379 */ 158 380 159 381 ER 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); 382 inn_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 } 179 397 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 406 T_IN6_ADDR * 407 inn_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 425 bool_t 426 inn_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 229 454 230 455 uint16_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 */ 456 ntohs (uint16_t net) 457 { 458 return net; 459 } 261 460 262 461 uint16_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 */ 462 htons (uint16_t host) 463 { 464 return host; 465 } 527 466 528 467 uint32_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); 468 ntohl (uint32_t net) 469 { 470 return net; 471 } 472 473 uint32_t 474 htonl (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 481 uint16_t 482 ntohs (uint16_t net) 483 { 484 return NET_REV_ENDIAN_HWORD(net); 485 } 486 487 uint16_t 488 htons (uint16_t host) 489 { 490 return NET_REV_ENDIAN_HWORD(host); 491 } 492 493 uint32_t 494 ntohl (uint32_t net) 495 { 496 return NET_REV_ENDIAN_WORD(net); 497 } 498 499 uint32_t 500 htonl (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 542 509 #endif /* #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN */ 543 510 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 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #define _IN_VAR_H_ 72 72 73 #if defined(SUPPORT_INET6) 74 73 #include <netinet/in4_var.h> 75 74 #include <netinet6/in6_var.h> 76 77 #endif /* of #if defined(SUPPORT_INET6) */78 75 79 76 /* … … 102 99 103 100 /* 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_ENTRY129 130 #define NUM_STATIC_ROUTE_ENTRY NUM_ROUTE_ENTRY131 #define NUM_REDIRECT_ROUTE_ENTRY 0132 #define T_RT_ENTRY T_IN_RTENTRY133 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 /*143 101 * ルーティングエントリ状態フラグ 144 102 */ … … 151 109 */ 152 110 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) 157 176 #define IN_GET_DATAGRAM(nbuf,len,maxlen, dst,src,proto,ttl,nbatr,tmout) \ 158 177 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 187 192 188 193 /* 189 194 * 関数 190 195 */ 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); 196 extern bool_t inn_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_NET_BUF *nbuf); 197 extern bool_t inn_is_addr_multicast (T_IN6_ADDR *addr); 198 extern bool_t inn_are_net_srcaddr_equal (T_IN6_ADDR *ipaddr, T_NET_BUF *nbuf); 199 extern void inn_copy_to_host (T_IN6_ADDR *dst, T_NET_BUF *nbuf); 200 extern 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); 203 extern T_IN6_ADDR *inn_addrwithifp (T_IFNET *ifp, T_IN6_ADDR *src, T_IN6_ADDR *dst); 204 205 #endif /* of #ifndef _MACRO_ONLY */ 246 206 247 207 #endif /* of #ifndef _IN_VAR_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip.cfg
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 36 36 */ 37 37 38 #if defined( SUPPORT_INET4)38 #if defined(_IP4_CFG) 39 39 40 40 #ifdef IP4_CFG_FRAGMENT … … 46 46 #endif /* of #ifdef IP4_CFG_FRAGMENT */ 47 47 48 #if NUM_ REDIRECT_ROUTE_ENTRY > 048 #if NUM_IN4_REDIRECT_ROUTE_ENTRY > 0 49 49 50 50 /* ルーティング表(向け直し)*/ 51 51 52 CRE_SEM(SEM_IN _ROUTING_TBL, { TA_TPRI, 1, 1 });52 CRE_SEM(SEM_IN4_ROUTING_TBL, { TA_TPRI, 1, 1 }); 53 53 54 #endif /* of #if NUM_ REDIRECT_ROUTE_ENTRY > 0 */54 #endif /* of #if NUM_IN4_REDIRECT_ROUTE_ENTRY > 0 */ 55 55 56 #endif /* of #if defined( SUPPORT_INET4) */56 #endif /* of #if defined(_IP4_CFG) */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #define _IP4_H_ 72 72 73 #include <netinet/ip6.h> 74 73 75 /* 74 76 * IPv4 の定義、RFC791 参照 … … 134 136 /* IPv4 と IPv6 をコンパイル時に選択するためのマクロ */ 135 137 136 #if defined(SUPPORT_INET4)138 #if !defined(_IP6_CFG) && defined(_IP4_CFG) 137 139 138 140 #define IP_HDR_SIZE IP4_HDR_SIZE … … 140 142 #define IP_DEFTTL IP4_DEFTTL 141 143 142 #endif /* of #if defined(SUPPORT_INET4) */144 #endif /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) */ 143 145 144 146 #endif /* of #ifndef _IP4_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip6.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 102 102 #define _IP6_H_ 103 103 104 #ifdef SUPPORT_INET6105 106 104 /* 107 105 * IPv6 の定義、RFC2460 参照 … … 262 260 263 261 /* 264 * IPv 4 と IPv6をコンパイル時に選択するためのマクロ262 * IPv6 と IPv4 をコンパイル時に選択するためのマクロ 265 263 */ 266 264 … … 273 271 /* ルータ通知を受信する場合は、通知された値 */ 274 272 275 #define IP _DEFTTL ip6_defhlim273 #define IP6_DEFTTL ip6_defhlim 276 274 277 275 #else /* #if NUM_ND6_DEF_RTR_ENTRY > 0 */ … … 279 277 /* ルータ通知を受信しない場合の値は既定値 */ 280 278 281 #define IP _DEFTTL IPV6_DEFHLIM279 #define IP6_DEFTTL IPV6_DEFHLIM 282 280 283 281 #endif /* #if NUM_ND6_DEF_RTR_ENTRY > 0 */ 282 283 /* IPv4 と IPv6 をコンパイル時に選択するためのマクロ */ 284 285 #ifdef _IP6_CFG 284 286 285 287 #define IP_HDR_SIZE IP6_HDR_SIZE 286 288 #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 */ 289 292 290 293 #endif /* of #ifndef _IP6_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 76 76 #include <t_syslog.h> 77 77 #include "kernel_cfg.h" 78 #include "tinet_cfg.h" 78 79 79 80 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 83 84 #include <s_services.h> 84 85 #include <t_services.h> 86 #include "tinet_id.h" 85 87 86 88 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 95 97 #include <net/ppp_ipcp.h> 96 98 #include <net/net.h> 99 #include <net/net_endian.h> 97 100 #include <net/net_buf.h> 98 101 #include <net/net_timer.h> … … 106 109 #include <netinet/icmp_var.h> 107 110 #include <netinet/tcp.h> 108 #include <netinet/tcp_timer.h>109 111 #include <netinet/tcp_var.h> 112 #include <netinet/udp_var.h> 113 114 #include <net/if_var.h> 115 116 #if defined(_IP4_CFG) 110 117 111 118 /* … … 130 137 static void icmp_unreach (T_NET_BUF *input, uint_t ihoff); 131 138 139 #if defined(NUM_REDIRECT_ROUTE_ENTRY) 132 140 #if NUM_REDIRECT_ROUTE_ENTRY > 0 133 141 … … 135 143 136 144 #endif /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */ 145 #endif /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */ 137 146 138 147 /* … … 147 156 T_IP4_HDR *ip4h; 148 157 T_ICMP4_HDR *icmp4h; 149 T_I N4_ADDR addr;158 T_IFNET *ifp = IF_GET_IFNET(); 150 159 151 160 NET_COUNT_MIB(icmp_stats.icmpInEchos, 1); 152 161 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 } 177 194 } 178 195 … … 212 229 code = GET_ICMP4_HDR(input, ihoff)->code; 213 230 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) { 217 234 218 235 memcpy(GET_IP4_HDR(input), ip4h, input->len - (IP4_HDR_SIZE + ICMP4_HDR_SIZE)); 219 236 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 */ 223 251 224 252 } … … 227 255 } 228 256 257 #if defined(NUM_REDIRECT_ROUTE_ENTRY) 229 258 #if NUM_REDIRECT_ROUTE_ENTRY > 0 230 259 … … 264 293 265 294 #endif /* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */ 295 #endif /* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */ 266 296 267 297 /* … … 314 344 case ICMP4_ECHO_REPLY: 315 345 316 #if def ICMP_CFG_CALLBACK_ECHO_REPLY346 #if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY) 317 347 318 348 icmp_echo_reply(input, *offp); 319 349 320 #endif /* of #if def ICMP_CFG_CALLBACK_ECHO_REPLY*/350 #endif /* of #if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY) */ 321 351 322 352 break; … … 326 356 case ICMP4_REDIRECT: 327 357 358 #if defined(NUM_REDIRECT_ROUTE_ENTRY) 328 359 #if NUM_REDIRECT_ROUTE_ENTRY > 0 329 360 … … 338 369 339 370 #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) */ 340 377 341 378 break; … … 371 408 372 409 ip4h = GET_IP4_HDR(input); 373 ip4hl = GET_IP4_HDR_SIZE(i p4h);410 ip4hl = GET_IP4_HDR_SIZE(input); 374 411 375 412 /* 送信用の IP データグラムを獲得する。*/ … … 378 415 else 379 416 len = 8; 380 417 381 418 saddr = ntohl(ip4h->src); 382 419 if (in4_get_datagram(&output, (uint_t)(ICMP4_HDR_SIZE + ip4hl + len), 0, … … 417 454 418 455 #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 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #define _IP_ICMP_H_ 72 72 73 #include <netinet/icmp6.h> 74 73 75 /* 74 76 * ICMP ヘッダの定義、RFC 792 … … 96 98 #define GET_ICMP4_SDU(nbuf,ihoff) ((uint8_t*)((nbuf)->buf) + ihoff + ICMP4_HDR_SIZE) 97 99 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)) 99 101 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) 101 103 #define GET_IF_IP4_ICMP4_HDR_SIZE(nbuf) (IF_HDR_SIZE + GET_IP4_ICMP4_HDR_SIZE(nbuf)) 102 104 -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_input.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 77 77 #include <t_syslog.h> 78 78 #include "kernel_cfg.h" 79 #include "tinet_cfg.h" 79 80 80 81 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 85 86 #include <t_services.h> 86 87 #include "kernel_id.h" 88 #include "tinet_id.h" 87 89 88 90 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 97 99 #include <net/ppp_ipcp.h> 98 100 #include <net/net.h> 101 #include <net/net_endian.h> 99 102 #include <net/net_buf.h> 100 103 #include <net/net_count.h> … … 107 110 #include <netinet/ip_icmp.h> 108 111 #include <netinet/tcp.h> 109 #include <netinet/tcp_timer.h>110 112 #include <netinet/tcp_var.h> 111 113 #include <netinet/udp.h> 112 114 #include <netinet/udp_var.h> 115 #include <netinet/ip_igmp.h> 113 116 114 117 #if defined(SUPPORT_IPSEC) … … 122 125 123 126 #include <net/if_var.h> 127 128 #if defined(_IP4_CFG) 124 129 125 130 /* … … 345 350 ip_remove_options (T_NET_BUF *nbuf) 346 351 { 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)); 354 361 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); 357 364 } 358 365 … … 389 396 } 390 397 391 ip4h 392 hlen = GET_IP4_HDR_SIZE(i p4h);398 ip4h = GET_IP4_HDR(input); 399 hlen = GET_IP4_HDR_SIZE(input); 393 400 394 401 /* バージョンをチェックする。*/ … … 429 436 /* 送信元アドレスをチェックする。*/ 430 437 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; 432 439 433 440 #ifdef SUPPORT_LOOP … … 441 448 #else /* of #ifdef SUPPORT_LOOP */ 442 449 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) { 444 451 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1); 445 452 NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1); … … 459 466 */ 460 467 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)))) { 464 473 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1); 465 474 NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1); 466 475 goto buf_rel; 467 476 } 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 468 486 469 487 #else /* of #ifdef DHCP_CFG */ 470 488 471 489 #if defined(ETHER_CFG_MULTICAST) 472 if (!(dst == ifp->in _ifaddr.addr || dst == bc ||490 if (!(dst == ifp->in4_ifaddr.addr || dst == bc || 473 491 dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY || 474 492 IN4_IS_ADDR_MULTICAST(dst))) { … … 478 496 } 479 497 #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)) { 482 500 NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1); 483 501 NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1); … … 525 543 switch (ip4h->proto) { 526 544 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) 536 546 case IPPROTO_TCP: 537 547 NET_COUNT_MIB(ip_stats.ipInDelivers, 1); … … 539 549 return; 540 550 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 */ 542 561 543 562 case IPPROTO_ICMP: … … 546 565 return; 547 566 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 */ 548 575 549 576 #if defined(SUPPORT_IPSEC) … … 560 587 561 588 /* ローカル IP アドレスに届いたデータグラムのみ ICMP エラーを通知する。*/ 562 if (dst == ifp->in _ifaddr.addr) {589 if (dst == ifp->in4_ifaddr.addr) { 563 590 T_IN4_ADDR src; 564 591 … … 578 605 syscall(rel_net_buf(input)); 579 606 } 607 608 #endif /* of #if defined(_IP4_CFG) */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_output.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 93 93 #include <net/ppp.h> 94 94 #include <net/net.h> 95 #include <net/net_endian.h> 95 96 #include <net/net_buf.h> 96 97 #include <net/net_count.h> … … 104 105 #include <netinet6/ipsec.h> 105 106 #endif 107 108 #if defined(_IP4_CFG) 106 109 107 110 static uint16_t frag_id = 0; … … 221 224 222 225 len = ntohs(ip4h->len); 223 off = hlen = GET_IP4_HDR_SIZE( ip4h);226 off = hlen = GET_IP4_HDR_SIZE(output); 224 227 while (off < len) { 225 228 if (off + (IF_MTU - IP4_HDR_SIZE) < len) … … 245 248 fip4h->id = htons(frag_id); 246 249 fip4h->sum = 0; 247 fip4h->sum = in_cksum(fip4h, GET_IP4_HDR_SIZE(f ip4h));250 fip4h->sum = in_cksum(fip4h, GET_IP4_HDR_SIZE(frag)); 248 251 249 252 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(fip4h->len)); … … 279 282 frag_id ++; 280 283 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)); 282 285 283 286 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(ip4h->len)); … … 301 304 frag_id ++; 302 305 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)); 304 307 305 308 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(ip4h->len)); … … 327 330 return error; 328 331 } 332 333 #endif /* of #if defined(_IP4_CFG) */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_var.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #define _IP_VAR_H_ 72 72 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> 87 75 88 76 /* … … 90 78 */ 91 79 92 # if defined(SUPPORT_INET4)80 #define GET_IP_VER(nbuf) (*(uint8_t*)((nbuf)->buf+IF_HDR_SIZE)>>4) 93 81 94 # define T_TCP_IP_Q_HDR T_TCP_IP4_Q_HDR82 #if defined(_IP6_CFG) 95 83 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) 97 136 98 137 #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) 100 142 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) 104 146 105 # define SET_IP_SDU_SIZE(iph,len) SET_IP4_SDU_SIZE(iph,len)147 #else /* of #if defined(_IP4_CFG) */ 106 148 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." 110 150 111 #endif /* of #if defined( SUPPORT_INET4) */151 #endif /* of #if defined(_IP4_CFG) */ 112 152 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) */ 278 154 279 155 #endif /* of #ifndef _IP_VAR_H_ */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp.cfg
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_fsm.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_input.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 95 95 #include <net/ethernet.h> 96 96 #include <net/net.h> 97 #include <net/net_endian.h> 97 98 #include <net/net_var.h> 98 99 #include <net/net_buf.h> … … 102 103 #include <netinet/in.h> 103 104 #include <netinet/in_var.h> 104 #include <netinet6/in6.h>105 #include <netinet6/in6_var.h>106 #include <netinet6/nd6.h>107 105 #include <netinet/in_itron.h> 108 106 #include <netinet/ip.h> 109 107 #include <netinet/ip_var.h> 110 #include <netinet/ip6.h>111 #include <netinet6/ip6_var.h>112 108 #include <netinet/ip_icmp.h> 113 109 #include <netinet/tcp.h> 114 #include <netinet/tcp_timer.h>115 110 #include <netinet/tcp_var.h> 116 111 #include <netinet/tcp_fsm.h> 117 112 #include <netinet/tcp_seq.h> 113 #include <netinet/tcp_timer.h> 118 114 119 115 #ifdef SUPPORT_TCP … … 139 135 static void close_connection (T_TCP_CEP *cep, bool_t *needoutput); 140 136 static void set_rexmt_timer (T_TCP_CEP *cep, T_TCP_TIME rtt); 141 static uint8_t reassemble 137 static uint8_t reassemble (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, uint8_t flags); 142 138 static ER drop_after_ack (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff); 143 139 static ER listening (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, T_TCP_SEQ iss); … … 147 143 static void trim_length (T_TCP_HDR *tcph, T_TCP_CEP *cep); 148 144 static void parse_option (T_TCP_HDR *tcph, T_TCP_CEP *cep); 149 static bool_t update_wnd 145 static bool_t update_wnd (T_TCP_HDR *tcph, T_TCP_CEP *cep); 150 146 static 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 > 0153 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 void204 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 */238 147 239 148 /* … … 421 330 422 331 /* TCP ヘッダの位置を保存する。*/ 423 GET_TCP_IP_Q_HDR(input)->thoff = thoff;332 SET_IP_TCP_Q_HDR_OFFSET(input, thoff); 424 333 425 334 /* SDU のオフセット(元はウィンドサイズ)をリセットする。*/ … … 448 357 listening (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, T_TCP_SEQ iss) 449 358 { 450 T_IP_HDR *iph;451 359 T_TCP_HDR *tcph; 452 360 453 iph = GET_IP_HDR(input);454 361 tcph = GET_TCP_HDR(input, thoff); 455 362 … … 473 380 return RET_DROP; 474 381 475 #if defined(SUPPORT_INET4)476 477 #ifdef SUPPORT_LOOP478 479 382 /* 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)) 488 386 return RET_DROP; 489 387 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 521 388 /* 相手のアドレスを記録する。*/ 522 IN_COPY_TO_HOST(&cep->dstaddr.ipaddr, &iph->src);389 IN_COPY_TO_HOST(&cep->dstaddr.ipaddr, input); 523 390 cep->dstaddr.portno = tcph->sport; 524 391 … … 919 786 cep->rep = NULL; 920 787 788 #if defined(_IP6_CFG) && defined(_IP4_CFG) 789 cep->rep4 = NULL; 790 #endif 791 921 792 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_ESTABLISHED)); 922 793 … … 926 797 927 798 /* 相手のアドレスをコピーする。*/ 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 928 811 *cep->p_dstaddr = cep->dstaddr; 812 813 #endif /* of #if defined(_IP6_CFG) && defined(_IP4_CFG) */ 929 814 930 815 if (IS_PTR_DEFINED(cep->callback)) { … … 1369 1254 case TCP_FSM_ESTABLISHED: /* コネクション開設完了 */ 1370 1255 cep->fsm_state = TCP_FSM_CLOSE_WAIT; 1256 syscall(set_flg(cep->snd_flgid, TCP_CEP_EVT_RWBUF_READY)); 1371 1257 break; 1372 1258 … … 1421 1307 { 1422 1308 T_NET_BUF *input = *inputp; 1423 T_IP_HDR *iph;1424 1309 T_TCP_HDR *tcph; 1425 1310 T_TCP_CEP *cep = NULL; … … 1442 1327 1443 1328 /* ヘッダ長をチェックする。*/ 1444 if (input->len < IF_IP_TCP_HDR_SIZE ) {1329 if (input->len < IF_IP_TCP_HDR_SIZE(input)) { 1445 1330 NET_COUNT_TCP(net_count_tcp[NC_TCP_RECV_BAD_HEADERS], 1); 1446 1331 goto drop; 1447 1332 } 1448 1333 1449 iph = GET_IP_HDR(input);1450 1334 tcph = GET_TCP_HDR(input, *offp); 1451 1335 … … 1487 1371 * 状態が Time Wait 中の CEP を探索する。 1488 1372 */ 1489 twcep = tcp_find_twcep( &iph->dst, tcph->dport, &iph->src, tcph->sport);1373 twcep = tcp_find_twcep(input, *offp); 1490 1374 if (twcep != NULL) { 1491 1375 … … 1510 1394 else 1511 1395 /* 標準の TCP 通信端点を得る。*/ 1512 cep = tcp_find_cep( &iph->dst, tcph->dport, &iph->src, tcph->sport);1396 cep = tcp_find_cep(input, *offp); 1513 1397 1514 1398 #else /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */ 1515 1399 1516 1400 /* TCP 通信端点を得る。*/ 1517 cep = tcp_find_cep( &iph->dst, tcph->dport, &iph->src, tcph->sport);1401 cep = tcp_find_cep(input, *offp); 1518 1402 1519 1403 #endif /* of #if defined(NUM_TCP_TW_CEP_ENTRY) && NUM_TCP_TW_CEP_ENTRY > 0 */ … … 1894 1778 */ 1895 1779 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)) 1897 1781 goto drop; 1898 1782 … … 1907 1791 rbfree = cep->rbufsz - cep->rwbuf_count; 1908 1792 1909 if (tcph->flags & TCP_FLG_ACK) {1793 if (tcph->flags & TCP_FLG_ACK) 1910 1794 tcp_respond(input, cep, 0, tcph->ack, rbfree, TCP_FLG_RST); 1911 }1912 1795 else { 1913 1796 if (tcph->flags & TCP_FLG_SYN) -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_output.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 93 93 #include <net/ethernet.h> 94 94 #include <net/net.h> 95 #include <net/net_endian.h> 96 #include <net/net_var.h> 95 97 #include <net/net_buf.h> 96 98 #include <net/net_timer.h> … … 98 100 99 101 #include <netinet/in.h> 100 #include <netinet6/in6.h>101 102 #include <netinet/in_var.h> 102 103 #include <netinet/in_itron.h> 103 104 #include <netinet/ip.h> 104 105 #include <netinet/ip_var.h> 105 #include <netinet6/in6_var.h>106 #include <netinet/ip6.h>107 #include <netinet6/ip6_var.h>108 106 #include <netinet/tcp.h> 109 #include <netinet/tcp_timer.h>110 107 #include <netinet/tcp_var.h> 111 108 #include <netinet/tcp_fsm.h> 112 109 #include <netinet/tcp_seq.h> 110 #include <netinet/tcp_timer.h> 113 111 114 112 #ifdef SUPPORT_TCP … … 150 148 T_NET_BUF *output; 151 149 T_TCP_HDR *tcph; 152 uint_t optlen ;150 uint_t optlen, hdr_offset; 153 151 ER error; 154 152 … … 210 208 */ 211 209 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(), 214 212 NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) { 215 213 if (cep->timer[TCP_TIM_REXMT] == 0) … … 222 220 223 221 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(), 226 224 NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) { 227 225 if (cep->timer[TCP_TIM_REXMT] == 0) … … 247 245 */ 248 246 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(), 251 249 NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) { 252 250 if (cep->timer[TCP_TIM_REXMT] == 0) … … 258 256 #else /* of #if defined(TCP_CFG_SWBUF_CSAVE_ONLY) */ 259 257 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(), 262 260 NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF)) != E_OK) { 263 261 if (cep->timer[TCP_TIM_REXMT] == 0) … … 272 270 * 本実装では、最大セグメントサイズのみ設定する。 273 271 */ 272 hdr_offset = IF_IP_TCP_HDR_OFFSET(output); 274 273 if (flags & TCP_FLG_SYN) { 275 274 cep->snd_nxt = cep->iss; … … 277 276 #ifdef TCP_CFG_OPT_MSS 278 277 279 optp = GET_TCP_OPT(output, IF_IP_TCP_HDR_OFFSET);278 optp = GET_TCP_OPT(output, hdr_offset); 280 279 *optp ++ = TCP_OPT_MAXSEG; 281 280 *optp ++ = TCP_OPT_LEN_MAXSEG; … … 324 323 } 325 324 326 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET);325 tcph = GET_TCP_HDR(output, hdr_offset); 327 326 328 327 /* … … 379 378 */ 380 379 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); 383 381 384 382 /* ネットワークバッファ長を調整する。*/ 385 output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE 2(output, IF_IP_TCP_HDR_OFFSET) + len);383 output->len = (uint16_t)(GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset) + len); 386 384 387 385 /* … … 490 488 * ・動的な通信端点の生成・削除機能 491 489 */ 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; 494 491 495 492 return error; … … 864 861 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 865 862 866 if ((error = tcp _get_segment(&cep->swbufq, cep, 0,867 (uint_t) 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, 869 866 (ATR)(NBA_SEARCH_DESCENT | 870 867 NBA_RESERVE_TCP | … … 888 885 len = TCP_GET_SWBUF_ADDR(cep, cep->snd_p_buf); 889 886 887 /* コールバック関数を呼び出す。*/ 890 888 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 891 892 /* コールバック関数を呼び出す。*/893 889 (*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 898 891 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); 899 900 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 892 #endif 901 893 902 894 … … 924 916 /* フラグを、送信可能に設定し、強制的に送信する。*/ 925 917 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR | TCP_CEP_FLG_POST_OUTPUT; 918 919 /* コールバック関数を呼び出す。*/ 926 920 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 927 928 /* コールバック関数を呼び出す。*/929 921 (*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 934 923 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); 935 936 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 924 #endif 937 925 938 926 … … 999 987 tcp_init(); 1000 988 1001 #ifdef SUPPORT_INET6989 #ifdef _IP6_CFG 1002 990 1003 991 /* IPv6 のステートレス・アドレス自動設定を実行する。*/ 1004 992 in6_if_up(IF_GET_IFNET()); 1005 993 1006 #endif /* of #ifdef SUPPORT_INET6*/994 #endif /* of #ifdef _IP6_CFG */ 1007 995 1008 996 while (true) { … … 1083 1071 1084 1072 if (IS_PTR_DEFINED(cep->callback)) 1085 1086 1073 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1087 1088 1074 (*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 1092 1076 (*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 1096 1078 else 1097 1079 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_seq.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 96 96 #include <net/if_loop.h> 97 97 #include <net/ethernet.h> 98 #include <net/if_arp.h>99 #include <net/ppp_ipcp.h>100 98 #include <net/net.h> 99 #include <net/net_endian.h> 101 100 #include <net/net_var.h> 102 101 #include <net/net_buf.h> … … 105 104 106 105 #include <netinet/in.h> 107 #include <netinet6/in6.h>108 #include <netinet6/in6_var.h>109 106 #include <netinet/in_var.h> 107 #include <netinet/in_itron.h> 110 108 #include <netinet/ip.h> 111 109 #include <netinet/ip_var.h> 112 #include <netinet/ip6.h>113 #include <netinet6/ip6_var.h>114 #include <netinet6/nd6.h>115 110 #include <netinet/tcp.h> 116 #include <netinet/tcp_timer.h>117 111 #include <netinet/tcp_var.h> 118 112 #include <netinet/tcp_fsm.h> 119 113 #include <netinet/tcp_seq.h> 120 #include <netinet/ in_itron.h>114 #include <netinet/tcp_timer.h> 121 115 122 116 #ifdef SUPPORT_TCP … … 147 141 148 142 static 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 154 T_TCP_TWCEP tcp_twcep[NUM_TCP_TW_CEP_ENTRY]; 155 156 /* 157 * tcp_move_twcep -- 必要な情報を Time Wait 用 TCP 通信端点に移して、 158 * 標準の TCP 通信端点を開放する。 159 */ 160 161 void 162 tcp_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 200 T_TCP_TWCEP* 201 tcp_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 230 T_TCP_CEP* 231 tcp_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 310 bool_t 311 tcp_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 } 149 347 150 348 /* … … 162 360 163 361 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; 165 363 syscall(rel_net_buf(q)); 166 364 } … … 184 382 tcp_port_auto = TCP_PORT_FIRST_AUTO; 185 383 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; ) { 189 388 190 389 #ifdef TCP_CFG_EXTENTIONS 191 390 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) { 193 392 portno = TCP_PORTANY; 194 393 break; … … 197 396 #else /* of #ifdef TCP_CFG_EXTENTIONS */ 198 397 199 if (tcp _rep[ix].myaddr.portno == portno) {398 if (tcp6_rep[ix].myaddr.portno == portno) { 200 399 portno = TCP_PORTANY; 201 400 break; … … 206 405 } 207 406 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) */ 209 435 210 436 if (portno != TCP_PORTANY) { … … 273 499 SYSTIM now; 274 500 275 #ifdef SUPPORT_ETHER276 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 288 501 syscall(get_tim(&now)); 289 502 net_srand(now); 290 291 #endif /* of #ifdef SUPPORT_ETHER */292 293 503 tcp_iss = net_rand(); 294 504 } … … 319 529 * ・送受信ウィンドバッファの省コピー機能 320 530 * ・動的な通信端点の生成・削除機能 531 * ・通信端点のネットワーク層プロトコル 321 532 */ 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; 324 534 325 535 #ifdef TCP_CFG_NON_BLOCKING … … 341 551 /* TCP 通信端点からTCP 受付口を解放する。*/ 342 552 cep->rep = NULL; 553 554 #if defined(_IP6_CFG) && defined(_IP4_CFG) 555 cep->rep4 = NULL; 556 #endif 557 343 558 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)E_CLS); 344 559 break; … … 397 612 /* TCP 通信端点から TCP 受付口を解放する。*/ 398 613 cep->rep = NULL; 614 615 #if defined(_IP6_CFG) && defined(_IP4_CFG) 616 cep->rep4 = NULL; 617 #endif 618 399 619 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)E_CLS); 400 620 break; … … 431 651 432 652 case TFN_TCP_ACP_CEP: 653 433 654 /* TCP 通信端点からTCP 受付口を解放する。*/ 434 655 cep->rep = NULL; 656 657 #if defined(_IP6_CFG) && defined(_IP4_CFG) 658 cep->rep4 = NULL; 659 #endif 660 661 /* 接続エラーを設定する。*/ 435 662 len = E_CLS; 436 663 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len); … … 489 716 490 717 case TFN_TCP_CON_CEP: 491 /* TCP 通信端点から TCP 受付口を解放する。*/ 718 719 /* TCP 通信端点からTCP 受付口を解放する。*/ 492 720 cep->rep = NULL; 721 722 #if defined(_IP6_CFG) && defined(_IP4_CFG) 723 cep->rep4 = NULL; 724 #endif 725 726 /* 接続エラーを設定する。*/ 493 727 len = E_CLS; 494 728 (*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len); … … 589 823 sig_sem(SEM_TCP_POST_OUTPUT); 590 824 } 591 else 825 else { 592 826 cep = tcp_close(cep); 827 } 593 828 return cep; 594 829 } … … 602 837 T_TCP_SEQ ack, T_TCP_SEQ seq, uint_t rbfree, uint8_t flags) 603 838 { 604 T_IP_HDR *iph;605 839 T_TCP_HDR *tcph; 606 840 uint_t win = 0; 841 uint_t hdr_offset; 607 842 608 843 if ((flags & TCP_FLG_RST) == 0) … … 614 849 */ 615 850 if (output != NULL) { 616 T_IN_ADDR ipaddr; 617 uint16_t portno; 851 uint16_t portno; 618 852 619 853 /* … … 626 860 } 627 861 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) 636 865 637 866 /* トラヒッククラスとフローラベルをクリアする。*/ 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) */ 641 870 642 871 /* 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)); 646 875 647 876 /* ポート番号を交換する。*/ … … 658 887 return; 659 888 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(), 662 891 NBA_SEARCH_ASCENT, TMO_TCP_GET_NET_BUF) != E_OK) 663 892 return; 664 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET );893 tcph = GET_TCP_HDR(output, IF_IP_TCP_HDR_OFFSET(output)); 665 894 flags |= TCP_FLG_ACK; 666 895 } … … 675 904 * チェックサムを設定する。 676 905 */ 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)); 679 909 680 910 /* ネットワークバッファ長を調整する。*/ 681 output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE 2(output, IF_IP_TCP_HDR_OFFSET);911 output->len = (uint16_t)GET_IF_IP_TCP_HDR_SIZE(output, hdr_offset); 682 912 683 913 #ifdef TCP_CFG_TRACE … … 690 920 IP_OUTPUT(output, TMO_TCP_OUTPUT); 691 921 } 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 709 923 /* 710 924 * tcp_get_segment -- TCP セグメントを獲得し、ヘッダを設定する。 … … 712 926 * 戻り値 エラーコード 713 927 * optlen オプションサイズ、4 オクテット単位 928 * maxlen 最大セグメントサイズ(IF/IP/TCP ヘッダサイズを含まない) 714 929 * len TCP SDU サイズ 715 930 */ … … 719 934 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout) 720 935 { 936 T_TCP_HDR *tcph; 721 937 ER error; 722 938 … … 728 944 &cep->myaddr.ipaddr, 729 945 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 972 ER 973 tcpn_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) { 730 986 syslog(LOG_WARNING, "[TCP] NET BUF busy, len:%4d, CEP: %d.", 731 987 (uint16_t)(TCP_HDR_SIZE + optlen + len), GET_TCP_CEPID(cep)); … … 734 990 735 991 /* 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; 737 999 738 1000 return E_OK; … … 761 1023 error = E_OBJ; 762 1024 else { 763 1025 /* コールバック関数を呼び出す。*/ 764 1026 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 765 766 /* コールバック関数を呼び出す。*/767 1027 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); 768 769 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 770 771 /* コールバック関数を呼び出す。*/ 1028 #else 772 1029 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error); 773 774 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 775 1030 #endif 776 1031 error = E_WBLK; 777 1032 } … … 798 1053 error = E_OBJ; 799 1054 else { 800 1055 error = E_OBJ; 1056 1057 /* コールバック関数を呼び出す。*/ 801 1058 #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 810 1061 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)&error); 811 812 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 813 1062 #endif 814 1063 error = E_WBLK; 815 1064 } … … 859 1108 *error = E_OBJ; 860 1109 else { 1110 /* コールバック関数を呼び出す。*/ 861 1111 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 862 863 /* コールバック関数を呼び出す。*/864 1112 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)*error); 865 866 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 867 868 /* コールバック関数を呼び出す。*/ 1113 #else 869 1114 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); 870 871 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 872 1115 #endif 873 1116 *error = E_WBLK; 874 1117 } … … 900 1143 *error = E_OBJ; 901 1144 else { 902 1145 *error = E_OBJ; 1146 1147 /* コールバック関数を呼び出す。*/ 903 1148 #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 912 1151 (*cep->callback)(GET_TCP_CEPID(cep), fncd, (void*)error); 913 914 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 915 1152 #endif 916 1153 *error = E_WBLK; 917 1154 } … … 961 1198 * 受信ウィンドバッファキューのネットワークバッファを解放する。 962 1199 */ 963 #ifdef TCP_CFG_RWBUF_CSAVE964 #endif965 1200 syscall(wai_sem(cep->semid_lock)); 966 1201 TCP_FREE_RWBUFQ(cep); … … 971 1206 } 972 1207 } 973 else 1208 else { 974 1209 syscall(clr_flg(cep->rcv_flgid, (FLGPTN)(~TCP_CEP_EVT_RWBUF_READY))); 1210 } 975 1211 976 1212 return E_OK; … … 994 1230 while (cep->reassq != NULL) { 995 1231 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)); 997 1233 if (qhdr->seq != cep->rcv_nxt) 998 1234 break; … … 1005 1241 1006 1242 /* データを受信ウィンドバッファに書き込む。*/ 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))); 1008 1244 } 1009 1245 } … … 1028 1264 1029 1265 /* TCP ヘッダの位置を保存する。*/ 1030 GET_TCP_IP_Q_HDR(input)->thoff = thoff;1266 SET_IP_TCP_Q_HDR_OFFSET(input, thoff); 1031 1267 1032 1268 /* … … 1035 1271 * このとき、IP のオプション(拡張ヘッダ)と TCP のオプションは削除する。 1036 1272 */ 1037 len = IF_IP_TCP_HDR_SIZE + inqhdr->slen;1273 len = IF_IP_TCP_HDR_SIZE(input) + inqhdr->slen; 1038 1274 1039 1275 if (len <= MAX_TCP_REALLOC_SIZE) { … … 1080 1316 */ 1081 1317 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)); 1083 1319 if (SEQ_GT(qhdr->seq, inqhdr->seq)) 1084 1320 break; … … 1106 1342 */ 1107 1343 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)); 1109 1345 len = qhdr->seq + qhdr->slen - inqhdr->seq; 1110 1346 if (len > 0) { … … 1169 1405 */ 1170 1406 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)); 1172 1408 len = inqhdr->seq + inqhdr->slen - qhdr->seq; 1173 1409 if (len <= 0) … … 1201 1437 nq = qhdr->next; 1202 1438 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; 1204 1440 else 1205 1441 cep->reassq = nq; … … 1213 1449 } 1214 1450 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; 1217 1453 } 1218 1454 … … 1243 1479 tcp_init_cep (T_TCP_CEP *cep) 1244 1480 { 1481 1245 1482 #ifdef TCP_CFG_RWBUF_CSAVE 1246 1483 /* … … 1255 1492 #endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */ 1256 1493 1494 1257 1495 memset((uint8_t*)cep + offsetof(T_TCP_CEP, timer), 0, 1258 1496 sizeof(T_TCP_CEP) - offsetof(T_TCP_CEP, timer)); … … 1273 1511 * ・送受信ウィンドバッファの省コピー機能 1274 1512 * ・動的な通信端点の生成・削除機能 1513 * ・通信端点のネットワーク層プロトコル 1275 1514 */ 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; 1278 1516 1279 1517 /* セマフォを初期化する。*/ 1280 sig_sem 1518 sig_sem(cep->semid_lock); 1281 1519 1282 1520 /* フラグを初期化する。*/ … … 1292 1530 tcp_notify (T_NET_BUF *input, ER error) 1293 1531 { 1294 T_IP_HDR *iph;1295 T_TCP_HDR *tcph;1296 1532 T_TCP_CEP *cep; 1297 1533 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) { 1302 1535 1303 1536 /* … … 1328 1561 1329 1562 /* 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 /*1367 1563 * tcp_lock_cep -- TCP 通信端点をロックする。 1368 1564 */ … … 1377 1573 1378 1574 /* TCP 通信端点 ID をチェックする。*/ 1379 if (!VA ID_TCP_CEPID(cepid))1575 if (!VALID_TCP_CEPID(cepid)) 1380 1576 return E_ID; 1381 1577 … … 1424 1620 1425 1621 #ifdef TCP_CFG_TRACE 1622 1623 /* 1624 * トレース出力に用いるシリアルポート番号 1625 */ 1426 1626 1427 1627 #ifndef CONSOLE_PORTID … … 1624 1824 { 1625 1825 SYSTIM time; 1626 T_IP_HDR *iph;1627 1826 T_TCP_HDR *tcph; 1628 1827 char buf[9]; … … 1632 1831 return; 1633 1832 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) */ 1635 1844 1636 1845 if (!(TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY || cep->dstaddr.ipaddr == TCP_CFG_TRACE_IPV4_RADDR)) 1637 1846 return; 1638 1847 1639 #endif /* of #if defined(SUPPORT_INET4) */ 1848 #endif /* of #if defined(_IP6_CFG) */ 1849 1850 #endif /* of #if defined(_IP4_CFG) */ 1640 1851 1641 1852 syscall(wai_sem(SEM_TCP_TRACE)); 1642 1853 syscall(get_tim(&time)); 1643 iph = GET_IP_HDR(output);1644 1854 tcph = GET_TCP_HDR(output, GET_TCP_HDR_OFFSET(output)); 1645 1855 if (time > 99999999) … … 1648 1858 trace_printf(CONSOLE_PORTID, "=O%6d.%03d", time / 1000, time % 1000); 1649 1859 if (cep == NULL) 1650 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:----- ");1860 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:--------"); 1651 1861 else 1652 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%0 5x",1862 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%08x", 1653 1863 GET_TCP_CEPID(cep), 1654 1864 tcp_strfsm[cep->fsm_state], cep->flags); … … 1663 1873 trace_printf(CONSOLE_PORTID, " w:%5d l:%4d>\n", 1664 1874 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)); 1666 1876 syscall(sig_sem(SEM_TCP_TRACE)); 1667 1877 } … … 1677 1887 { 1678 1888 SYSTIM time; 1679 T_IP_HDR *iph;1680 1889 T_TCP_HDR *tcph; 1681 1890 char buf[9]; … … 1685 1894 return; 1686 1895 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) */ 1688 1907 1689 1908 if (!(TCP_CFG_TRACE_IPV4_RADDR == IPV4_ADDRANY || cep->dstaddr.ipaddr == TCP_CFG_TRACE_IPV4_RADDR)) 1690 1909 return; 1691 1910 1692 #endif /* of #if defined(SUPPORT_INET4) */ 1911 #endif /* of #if defined(_IP6_CFG) */ 1912 1913 #endif /* of #if defined(_IP4_CFG) */ 1693 1914 1694 1915 syscall(wai_sem(SEM_TCP_TRACE)); 1695 1916 syscall(get_tim(&time)); 1696 iph = GET_IP_HDR(input);1697 1917 tcph = GET_TCP_HDR(input, GET_TCP_HDR_OFFSET(input)); 1698 1918 if (time > 99999999) … … 1701 1921 trace_printf(CONSOLE_PORTID, "<I%6d.%03d", time / 1000, time % 1000); 1702 1922 if (cep == NULL) 1703 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:----- ");1923 trace_printf(CONSOLE_PORTID, "=c:-- s:-- f:--------"); 1704 1924 else 1705 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%0 5x",1925 trace_printf(CONSOLE_PORTID, "=c:%2d s:%s f:%08x", 1706 1926 GET_TCP_CEPID(cep), 1707 1927 tcp_strfsm[cep->fsm_state], cep->flags); … … 1712 1932 trace_printf(CONSOLE_PORTID, " a:%10u s:%10u", tcph->ack, tcph->seq); 1713 1933 trace_printf(CONSOLE_PORTID, " w:%5d l:%4d=\n", 1714 tcph->win, GET_IP_SDU_SIZE(i ph) - TCP_HDR_LEN(tcph->doff));1934 tcph->win, GET_IP_SDU_SIZE(input) - TCP_HDR_LEN(tcph->doff)); 1715 1935 syscall(sig_sem(SEM_TCP_TRACE)); 1716 1936 } -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr_cs.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 95 95 #include <net/ethernet.h> 96 96 #include <net/if_arp.h> 97 #include <net/ppp_ipcp.h>98 97 #include <net/net.h> 98 #include <net/net_endian.h> 99 99 #include <net/net_var.h> 100 100 #include <net/net_buf.h> … … 103 103 104 104 #include <netinet/in.h> 105 #include <netinet6/in6.h>106 #include <netinet6/in6_var.h>107 105 #include <netinet/in_var.h> 106 #include <netinet/in_itron.h> 108 107 #include <netinet/ip.h> 109 108 #include <netinet/ip_var.h> 110 #include <netinet/ip6.h>111 #include <netinet6/ip6_var.h>112 #include <netinet6/nd6.h>113 109 #include <netinet/tcp.h> 114 #include <netinet/tcp_timer.h>115 110 #include <netinet/tcp_var.h> 116 111 #include <netinet/tcp_fsm.h> 117 112 #include <netinet/tcp_seq.h> 118 #include <netinet/ in_itron.h>113 #include <netinet/tcp_timer.h> 119 114 120 115 #ifdef SUPPORT_TCP … … 122 117 #ifdef TCP_CFG_SWBUF_CSAVE 123 118 124 #ifndef TCP_CFG_SWBUF_CSAVE_ONLY 119 #ifdef TCP_CFG_SWBUF_CSAVE_ONLY 120 121 #else /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */ 125 122 126 123 /* … … 242 239 } 243 240 244 #endif /* of #if ndef TCP_CFG_SWBUF_CSAVE_ONLY */241 #endif /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */ 245 242 246 243 /* … … 270 267 { 271 268 ER_UINT error; 269 uint_t hdr_size = IF_IP_TCP_NET_HDR_SIZE(&cep->dstaddr.ipaddr); 272 270 273 271 /* 通信端点をロックする。*/ 274 272 syscall(wai_sem(cep->semid_lock)); 275 273 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) { 278 275 279 276 /* … … 291 288 * 空きサイズを 4 オクテット境界に調整する。 292 289 */ 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); 294 291 295 292 if (len > cep->sbufsz - cep->swbuf_count) 296 293 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); 299 296 300 297 /* 送信ウインドサイズによりサイズを調整する。*/ … … 315 312 316 313 /* ネットワークバッファ長と 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); 319 316 320 317 /* フラグを、送信可能に設定する。*/ … … 324 321 else { /* 送信ウインドバッファが不正 */ 325 322 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); 327 324 328 325 /* 送信ウィンドバッファキューのネットワークバッファを解放する。*/ … … 348 345 int_t win; 349 346 350 351 347 /* 送信ウィンドバッファが割当て済みで、空きがあれば終了する。*/ 352 348 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)) 354 350 return E_OK; 355 351 … … 423 419 424 420 /* ネットワークバッファを獲得する。*/ 425 if ((error = tcp _get_segment(&cep->swbufq, cep, 0,421 if ((error = tcpn_get_segment(&cep->swbufq, cep, 0, 426 422 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, 428 424 NBA_SEARCH_DESCENT, tmout)) != E_OK) 429 425 return error; … … 463 459 * 空きサイズを 4 オクテット境界に調整する。 464 460 */ 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); 466 462 467 463 /* 送信ウインドサイズによりサイズを調整する。*/ … … 508 504 509 505 /* ネットワークバッファ長と 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); 512 508 513 509 /* tcp_get_buf の割当て長をリセットする。*/ … … 573 569 { 574 570 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); 576 572 } 577 573 … … 590 586 591 587 /* 送信ウインドバッファのアドレスを設定する。*/ 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)); 593 589 594 590 /* フラグを、ネットワークバッファ割当て済みに設定する。*/ … … 664 660 #ifdef TCP_CFG_RWBUF_CSAVE 665 661 666 #ifndef TCP_CFG_RWBUF_CSAVE_ONLY 662 #ifdef TCP_CFG_RWBUF_CSAVE_ONLY 663 664 #else /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */ 667 665 668 666 /* … … 736 734 } 737 735 738 #endif /* of #if ndef TCP_CFG_RWBUF_CSAVE_ONLY */736 #endif /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */ 739 737 740 738 /* … … 753 751 if (cep->rwbufq != NULL) { 754 752 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)); 756 754 cep->rwbuf_count -= len; 757 755 … … 796 794 */ 797 795 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)); 799 797 800 798 /* … … 808 806 809 807 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, 811 809 (size_t)blen); 812 810 … … 850 848 851 849 /* 受信ウィンドバッファのデータのアドレスの先頭を設定する。*/ 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; 854 852 855 853 /* 受信ウィンドバッファのデータ長を計算する。*/ … … 880 878 if (cep->rwbuf_count == 0 && cep->reassq == NULL) { 881 879 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; 883 881 884 882 #ifdef TCP_CFG_RWBUF_CSAVE_MAX_QUEUES … … 961 959 nextp = &cep->rwbufq; 962 960 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; 964 962 *nextp = input; 965 963 … … 984 982 int_t len; 985 983 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)); 987 985 len = qhdr->slen; 988 986 … … 999 997 /* 受信ウィンドバッファのアドレスを返す。*/ 1000 998 *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; 1002 1000 1003 1001 if (IS_PTR_DEFINED(cep->callback)) 1004 1002 1005 1003 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1006 1007 1004 (*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 1011 1006 (*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 1015 1008 else 1016 1009 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); … … 1053 1046 1054 1047 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1055 1056 1048 (*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 1060 1050 (*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 1064 1052 else 1065 1053 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 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 95 95 #include <net/ethernet.h> 96 96 #include <net/if_arp.h> 97 #include <net/ppp_ipcp.h>98 97 #include <net/net.h> 98 #include <net/net_endian.h> 99 99 #include <net/net_var.h> 100 100 #include <net/net_buf.h> … … 103 103 104 104 #include <netinet/in.h> 105 #include <netinet6/in6.h>106 #include <netinet6/in6_var.h>107 105 #include <netinet/in_var.h> 106 #include <netinet/in_itron.h> 108 107 #include <netinet/ip.h> 109 108 #include <netinet/ip_var.h> 110 #include <netinet/ip6.h>111 #include <netinet6/ip6_var.h>112 #include <netinet6/nd6.h>113 109 #include <netinet/tcp.h> 114 #include <netinet/tcp_timer.h>115 110 #include <netinet/tcp_var.h> 116 111 #include <netinet/tcp_fsm.h> 117 112 #include <netinet/tcp_seq.h> 118 #include <netinet/ in_itron.h>113 #include <netinet/tcp_timer.h> 119 114 120 115 #ifdef SUPPORT_TCP … … 134 129 { 135 130 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); 136 133 137 134 /* 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) { 139 136 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); 145 142 146 143 /* 通信端点をロックする。*/ … … 222 219 223 220 if (IS_PTR_DEFINED(cep->callback)) 221 224 222 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 225 226 223 (*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 230 225 (*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 234 227 else 235 228 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); … … 268 261 269 262 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 270 271 263 (*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 275 265 (*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 279 267 else 280 268 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); … … 628 616 629 617 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 630 631 618 (*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 635 620 (*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 639 622 else 640 623 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); … … 680 663 681 664 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 682 683 665 (*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 687 667 (*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 691 669 else 692 670 syslog(LOG_WARNING, "[TCP] no call back, CEP: %d.", GET_TCP_CEPID(cep)); -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_timer.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 91 91 #include <net/if_loop.h> 92 92 #include <net/ethernet.h> 93 #include <net/net .h>93 #include <net/net_endian.h> 94 94 #include <net/net_var.h> 95 #include <net/net_buf.h>96 95 #include <net/net_timer.h> 97 96 98 97 #include <netinet/in.h> 99 98 #include <netinet/in_var.h> 100 #include <netinet6/in6.h>101 #include <netinet6/in6_var.h>102 99 #include <netinet/ip.h> 103 #include <netinet/ip6.h>104 100 #include <netinet/tcp.h> 105 #include <netinet/tcp_timer.h>106 101 #include <netinet/tcp_var.h> 107 102 #include <netinet/tcp_fsm.h> 108 103 #include <netinet/tcp_seq.h> 104 #include <netinet/tcp_timer.h> 109 105 110 106 #ifdef SUPPORT_TCP -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_timer.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 73 73 /* TCP タイマ変数 */ 74 74 75 #define NUM_TCP_TIMERS 4 /* TCP のタイマ数 */75 //#define NUM_TCP_TIMERS 4 /* TCP のタイマ数 */ 76 76 77 77 #define TCP_TIM_REXMT 0 /* 再送タイマ */ … … 135 135 #define TCP_MAX_REXMT_SHIFT 12 /* 最大再送回数 */ 136 136 137 /* TCP タイマ値の型 */138 139 typedef int16_t T_TCP_TIME;140 141 137 /* 142 138 * 関数 -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_usrreq.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 75 75 #include <sil.h> 76 76 #include "kernel_cfg.h" 77 #include "tinet_cfg.h" 77 78 78 79 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 83 84 #include <t_services.h> 84 85 #include "kernel_id.h" 86 #include "tinet_id.h" 85 87 86 88 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 93 95 #include <net/if_loop.h> 94 96 #include <net/ethernet.h> 95 #include <net/ppp_ipcp.h>96 97 #include <net/net.h> 98 #include <net/net_endian.h> 97 99 #include <net/net_var.h> 98 100 #include <net/net_buf.h> … … 102 104 #include <netinet/in.h> 103 105 #include <netinet/in_var.h> 104 #include <netinet6/in6.h>105 #include <netinet6/in6_var.h>106 106 #include <netinet/in_itron.h> 107 107 #include <netinet/ip.h> 108 108 #include <netinet/ip_var.h> 109 #include <netinet/ip6.h>110 #include <netinet6/ip6_var.h>111 109 #include <netinet/tcp.h> 112 #include <netinet/tcp_timer.h>113 110 #include <netinet/tcp_var.h> 114 111 #include <netinet/tcp_fsm.h> 115 112 #include <netinet/tcp_seq.h> 113 #include <netinet/tcp_timer.h> 116 114 117 115 #include <net/if_var.h> 118 116 119 117 #ifdef SUPPORT_TCP 120 121 /*122 * IPv4 と IPv6 の切り替えマクロ123 */124 125 #if defined(SUPPORT_INET4)126 127 #define TCP_CRE_REP tcp_cre_rep128 #define TCP_ACP_CEP tcp_acp_cep129 #define TCP_CON_CEP tcp_con_cep130 131 #endif /* of #if defined(SUPPORT_INET4) */132 133 #if defined(SUPPORT_INET6)134 135 #define TCP_CRE_REP tcp6_cre_rep136 #define TCP_ACP_CEP tcp6_acp_cep137 #define TCP_CON_CEP tcp6_con_cep138 139 #endif /* of #if defined(SUPPORT_INET6) */140 118 141 119 /* … … 169 147 170 148 /* 171 * tcp_cre_rep -- TCP 受付口の生成【拡張機能】 172 */ 173 174 #ifdef __tcp_cre_rep 175 176 #ifdef TCP_CFG_EXTENTIONS 177 178 ER 179 TCP_CRE_REP (ID repid, T_TCP_CREP *pk_crep) 180 { 181 T_TCP_REP *rep; 182 ER error; 183 184 /* TCP 受付口 ID をチェックする。*/ 185 if (!VAID_TCP_REPID(repid)) 186 return E_ID; 187 188 /* pk_crep が NULL ならエラー */ 189 if (pk_crep == NULL) 190 return E_PAR; 191 192 /* TCP 受付口を得る。*/ 193 rep = GET_TCP_REP(repid); 194 195 /* TCP 受付口が、動的生成用でなければエラー */ 196 if (!DYNAMIC_TCP_REP(rep)) 197 return E_ID; 198 199 /* 受付口をロックする。*/ 200 syscall(wai_sem(rep->semid_lock)); 201 202 /* 203 * TCP 受付口をチェックする。生成済みであればエラー 204 */ 205 if (VALID_TCP_REP(rep)) 206 error = E_OBJ; 207 else { 208 209 /* TCP 受付口生成情報をコピーする。*/ 210 rep->repatr = pk_crep->repatr; /* 受付口属性 */ 211 rep->myaddr = pk_crep->myaddr; /* 自分のアドレス */ 212 213 /* TCP 受付口を生成済みにする。*/ 214 rep->flags |= TCP_REP_FLG_VALID; 215 error = E_OK; 216 } 217 218 /* 受付口のロックを解除する。*/ 219 syscall(sig_sem(rep->semid_lock)); 220 221 return error; 222 } 223 224 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 225 226 #endif /* of #ifdef __tcp_cre_cep */ 227 228 #ifdef __tcp_del_rep 229 230 #ifdef TCP_CFG_EXTENTIONS 231 232 /* 233 * tcp_find_cep_rep -- TCP 受付口をリンクしている TCP 通信端点を得る。 234 */ 235 236 static T_TCP_CEP* 237 tcp_find_cep_rep (T_TCP_REP* rep) 238 { 239 T_TCP_CEP* cep; 240 241 for (cep = &tcp_cep[tmax_tcp_cepid]; cep -- != tcp_cep; ) { 242 if (cep->rep == rep) 243 return cep; 244 } 245 246 return NULL; 247 } 248 249 /* 250 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 251 */ 252 253 254 ER 255 tcp_del_rep (ID repid) 256 { 257 T_TCP_CEP *cep; 258 T_TCP_REP *rep; 259 ER error = E_OK; 260 261 /* TCP 受付口 ID をチェックする。*/ 262 if (!VAID_TCP_REPID(repid)) 263 return E_ID; 264 265 /* TCP 受付口を得る。*/ 266 rep = GET_TCP_REP(repid); 267 268 /* TCP 受付口が、動的生成用でなければエラー */ 269 if (!DYNAMIC_TCP_REP(rep)) 270 return E_ID; 271 272 /* 受付口をロックする。*/ 273 syscall(wai_sem(rep->semid_lock)); 274 275 /* TCP 受付口をチェックする。未生成の場合はエラー */ 276 if (!VALID_TCP_REP(rep)) 277 error = E_NOEXS; 278 else { 279 if ((cep = tcp_find_cep_rep(rep)) != NULL) { 280 /* 281 * すでに受動オープンしているとき 282 *(tcp_acp_cep が呼ばれているとき)は、 283 * tcp_acp_cep を終了させる。 284 */ 285 286 /* 通信端点をロックする。*/ 287 syscall(wai_sem(cep->semid_lock)); 288 289 /* 290 * 通信端点から受付口を解放し、 291 * イベントフラグをクローズに設定する。 292 */ 293 cep->rep = NULL; 294 cep->fsm_state = TCP_FSM_CLOSED; 295 cep->error = E_DLT; 296 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 297 298 #ifdef TCP_CFG_NON_BLOCKING 299 300 if (cep->rcv_nblk_tfn != TFN_TCP_UNDEF) { 301 if (IS_PTR_DEFINED(cep->callback)) { 302 303 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 304 305 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)E_DLT); 306 307 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 308 309 ER error = E_DLT; 310 311 (*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&error); 312 313 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 314 315 } 316 else 317 error = E_OBJ; 318 cep->rcv_nblk_tfn = TFN_TCP_UNDEF; 319 } 320 321 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 322 323 cep->rcv_tskid = TA_NULL; 324 cep->rcv_tfn = TFN_TCP_UNDEF; 325 326 /* 通信端点のロックを解除する。*/ 327 syscall(sig_sem(cep->semid_lock)); 328 329 } 330 else 331 error = E_OK; 332 333 /* TCP 受付口を未生成にする。*/ 334 rep->flags &= ~TCP_REP_FLG_VALID; 335 } 336 337 /* 受付口のロックを解除する。*/ 338 syscall(sig_sem(rep->semid_lock)); 339 340 return error; 341 } 342 343 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 344 345 #endif /* of #ifdef __tcp_del_rep */ 346 347 /* 348 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 349 */ 350 351 #ifdef __tcp_cre_cep 352 353 #ifdef TCP_CFG_EXTENTIONS 354 355 ER 356 tcp_cre_cep (ID cepid, T_TCP_CCEP *pk_ccep) 357 { 358 T_TCP_CEP *cep; 359 ER error; 360 361 /* TCP 通信端点 ID をチェックする。*/ 362 if (!VAID_TCP_CEPID(cepid)) 363 return E_ID; 364 365 /* pk_ccep が NULL ならエラー */ 366 if (pk_ccep == NULL) 367 return E_PAR; 368 369 /* TCP 通信端点を得る。*/ 370 cep = GET_TCP_CEP(cepid); 371 372 /* TCP 通信端点が、動的生成用でなければエラー */ 373 if (!DYNAMIC_TCP_CEP(cep)) 374 return E_ID; 375 376 /* 通信端点をロックする。*/ 377 syscall(wai_sem(cep->semid_lock)); 378 379 /* 380 * TCP 通信端点をチェックする。生成済みであればエラー 381 */ 382 if (VALID_TCP_CEP(cep)) 383 error = E_OBJ; 384 else { 385 386 /* TCP 通信端点生成情報をコピーする。*/ 387 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 388 cep->sbuf = pk_ccep->sbuf; /* 送信用ウィンドバッファ */ 389 cep->sbufsz = pk_ccep->sbufsz; /* 送信用ウィンドバッファサイズ */ 390 cep->rbuf = pk_ccep->rbuf; /* 受信用ウィンドバッファ */ 391 cep->rbufsz = pk_ccep->rbufsz; /* 受信用ウィンドバッファサイズ */ 392 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 393 394 /* TCP 通信端点を生成済みにする。*/ 395 cep->flags |= TCP_CEP_FLG_VALID; 396 error = E_OK; 397 } 398 399 /* 通信端点のロックを解除する。*/ 400 syscall(sig_sem(cep->semid_lock)); 401 402 return error; 403 } 404 405 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 406 407 #endif /* of #ifdef __tcp_cre_cep */ 408 409 /* 410 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 411 */ 412 413 #ifdef __tcp_del_cep 414 415 #ifdef TCP_CFG_EXTENTIONS 416 417 ER 418 tcp_del_cep (ID cepid) 419 { 420 T_TCP_CEP *cep; 421 ER error; 422 423 /* TCP 通信端点 ID をチェックする。*/ 424 if (!VAID_TCP_CEPID(cepid)) 425 return E_ID; 426 427 /* TCP 通信端点を得る。*/ 428 cep = GET_TCP_CEP(cepid); 429 430 /* TCP 通信端点が、動的生成用でなければエラー */ 431 if (!DYNAMIC_TCP_CEP(cep)) 432 return E_ID; 433 434 /* 通信端点をロックする。*/ 435 syscall(wai_sem(cep->semid_lock)); 436 437 /* 438 * TCP 通信端点をチェックする。以下の場合はエラー 439 * ・未生成。 440 * ・使用中。 441 */ 442 if (!VALID_TCP_CEP(cep)) 443 error = E_NOEXS; 444 else if (cep->fsm_state != TCP_FSM_CLOSED) 445 error = E_OBJ; 446 else { 447 448 /* TCP 通信端点を未生成にする。*/ 449 cep->flags &= ~TCP_CEP_FLG_VALID; 450 error = E_OK; 451 } 452 453 /* 通信端点のロックを解除する。*/ 454 syscall(sig_sem(cep->semid_lock)); 455 456 return error; 457 } 458 459 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 460 461 #endif /* of #ifdef __tcp_del_cep */ 462 463 #ifdef TCP_CFG_PASSIVE_OPEN 464 465 /* 466 * tcp_acp_cep -- 接続要求待ち (受動オープン)【標準機能】 467 */ 468 469 #ifdef __tcp_acp_cep 470 471 ER 472 TCP_ACP_CEP (ID cepid, ID repid, T_IPEP *p_dstaddr, TMO tmout) 473 { 474 T_TCP_REP *rep; 475 T_TCP_CEP *cep; 476 ER error; 477 FLGPTN flag; 478 479 /* TCP 受付口をチェックする。*/ 480 if (!VAID_TCP_REPID(repid)) 481 return E_ID; 482 483 #ifdef TCP_CFG_NON_BLOCKING 484 485 /* p_dstaddr が NULL ならエラー */ 486 if (p_dstaddr == NULL) 487 return E_PAR; 488 489 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 490 491 /* p_dstaddr が NULL か、tmout が TMO_NBLK ならエラー */ 492 if (p_dstaddr == NULL || tmout == TMO_NBLK) 493 return E_PAR; 494 495 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 496 497 /* 498 * CEP をロックし、API 機能コードとタスク識別子を記録する。 499 * すでに記録されていれば、ペンディング中なのでエラー 500 */ 501 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_ACP_CEP)) != E_OK) 502 return error; 503 504 /* CEP の FSM がクローズ状態でなければエラー。*/ 505 if (cep->fsm_state != TCP_FSM_CLOSED) { 506 error = E_OBJ; 507 goto err_ret; 508 } 509 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 510 511 /* TCP 通信端点を初期化する。*/ 512 tcp_init_cep(cep); 513 514 /* TCP 受付口を得る。*/ 515 rep = GET_TCP_REP(repid); 516 517 #ifdef TCP_CFG_EXTENTIONS 518 519 /* TCP 受付口をロックする。*/ 520 syscall(wai_sem(rep->semid_lock)); 521 522 /* TCP 受付口をチェックする。*/ 523 if (!VALID_TCP_REP(rep)) { 524 syscall(sig_sem(rep->semid_lock)); 525 error = E_NOEXS; 526 goto err_ret; 527 } 528 529 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 530 531 /* TCP 通信端点にTCP受付口を記録する。*/ 532 cep->rep = rep; 533 534 #ifdef TCP_CFG_EXTENTIONS 535 536 /* TCP 受付口のロックを解除する。*/ 537 syscall(sig_sem(rep->semid_lock)); 538 539 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 540 541 /* TCP 受付口のアドレスをコピーする。*/ 542 cep->myaddr = rep->myaddr; 543 544 /* 通信端点を設定する。*/ 545 cep->fsm_state = TCP_FSM_LISTEN; 546 547 #ifdef TCP_CFG_NON_BLOCKING 548 549 /* タイムアウトをチェックする。*/ 550 if (tmout == TMO_NBLK) { 551 /* ノンブロッキングコール */ 552 cep->p_dstaddr = p_dstaddr; 553 cep->rcv_nblk_tfn = TFN_TCP_ACP_CEP; 554 return E_WBLK; 555 } 556 else { 557 558 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 559 560 /* 561 * FSM が ESTABLISHED になるまで待つ。 562 * FSM が CLOSED になった場合は、エラーが発生したことを意味している。 563 */ 564 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | 565 TCP_CEP_EVT_ESTABLISHED), TWF_ORW, &flag, tmout); 566 if (error == E_OK) { 567 if (cep->error != E_OK) 568 error = cep->error; 569 else if (cep->fsm_state == TCP_FSM_CLOSED) 570 error = E_TMOUT; 571 } 572 573 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_ESTABLISHED))); 574 575 if (error == E_OK) { 576 /* 相手のアドレスをコピーする。*/ 577 *p_dstaddr = cep->dstaddr; 578 } 579 else { 580 /* 581 * 通信端点から受付口を解放し、 582 * イベントフラグをクローズに設定する。 583 */ 584 cep->rep = NULL; 585 cep->fsm_state = TCP_FSM_CLOSED; 586 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 587 } 588 589 #ifdef TCP_CFG_NON_BLOCKING 590 591 } 592 593 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 594 595 err_ret: 596 cep->rcv_tskid = TA_NULL; 597 cep->rcv_tfn = TFN_TCP_UNDEF; 598 return error; 599 } 600 601 #endif /* of #ifdef __tcp_acp_cep */ 602 603 #endif /* of #ifdef TCP_CFG_PASSIVE_OPEN */ 604 605 /* 606 * tcp_con_cep -- 接続要求 (能動オープン)【標準機能】 607 */ 608 609 #ifdef __tcp_con_cep 610 611 ER 612 TCP_CON_CEP (ID cepid, T_IPEP *p_myaddr, T_IPEP *p_dstaddr, TMO tmout) 613 { 614 T_TCP_CEP *cep; 615 ER error; 616 FLGPTN flag; 617 618 #ifdef TCP_CFG_NON_BLOCKING 619 620 /* 621 * p_dstaddr または p_myaddr が NULL か、 622 * あて先がマルチキャストアドレスならエラー 623 */ 624 if (p_myaddr == NULL || p_dstaddr == NULL || IN_IS_ADDR_MULTICAST(&p_dstaddr->ipaddr)) 625 return E_PAR; 626 627 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 628 629 /* 630 * p_dstaddr または p_myaddr が NULL 、 631 * あて先がマルチキャストアドレスか、 632 * tmout が TMO_NBLK ならエラー 633 */ 634 if (p_myaddr == NULL || p_dstaddr == NULL || 635 IN_IS_ADDR_MULTICAST(&p_dstaddr->ipaddr) || tmout == TMO_NBLK) 636 return E_PAR; 637 638 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 639 640 /* 641 * CEP をロックし、API 機能コードとタスク識別子を記録する。 642 * すでに記録されていれば、ペンディング中なのでエラー 643 */ 644 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_CON_CEP)) != E_OK) 645 return error; 646 647 /* CEP の FSM がクローズ状態でなければエラー。*/ 648 if (cep->fsm_state != TCP_FSM_CLOSED) { 649 error = E_OBJ; 650 goto err_ret; 651 } 652 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_CLOSED))); 653 654 /* シーケンス番号を初期化する。*/ 655 if (tcp_iss == 0) 656 tcp_init_iss(); 657 658 /* 通信端点を初期化する。*/ 659 tcp_init_cep(cep); 660 661 /* 662 * p_myaddr が NADR (-1) ではなく、自 IP アドレスが ANY でなければ、 663 * 指定された IP アドレスを割り当てる。 664 */ 665 if (p_myaddr != NADR && !IN_IS_ADDR_ANY(&p_myaddr->ipaddr)) 666 cep->myaddr.ipaddr = p_myaddr->ipaddr; 667 else { 668 T_IN_IFADDR *ia; 669 670 if ((ia = IN_IFAWITHIFP(IF_GET_IFNET(), &p_dstaddr->ipaddr)) == NULL) { 671 error = E_PAR; 672 goto err_ret; 673 } 674 cep->myaddr.ipaddr = ia->addr; 675 } 676 677 /* 通信端点を設定する。*/ 678 cep->fsm_state = TCP_FSM_SYN_SENT; 679 cep->dstaddr = *p_dstaddr; 680 cep->iss = tcp_iss; 681 cep->timer[TCP_TIM_KEEP] = TCP_TVAL_KEEP_INIT; 682 tcp_iss += TCP_ISS_INCR() / 2; 683 init_send_seq(cep); 684 685 #ifdef TCP_CFG_NON_BLOCKING 686 687 /* タイムアウトをチェックする。*/ 688 if (tmout == TMO_NBLK) { 689 /* ノンブロッキングコール */ 690 cep->p_dstaddr = p_dstaddr; 691 cep->p_myaddr = p_myaddr; 692 cep->snd_nblk_tfn = TFN_TCP_CON_CEP; 693 694 /* コネクションの開設をポストする。*/ 695 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 696 sig_sem(SEM_TCP_POST_OUTPUT); 697 return E_WBLK; 698 } 699 else { 700 701 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 702 703 /* 704 * p_myaddr が NADR (-1) か、 705 * 自ポート番号が TCP_PORTANY なら、自動で割り当てる。 706 */ 707 if (p_myaddr == NADR || p_myaddr->portno == TCP_PORTANY) 708 tcp_alloc_auto_port(cep); 709 else if ((error = tcp_alloc_port(cep, p_myaddr->portno)) != E_OK) 710 goto err_ret; 711 712 /* コネクションの開設をポストする。*/ 713 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 714 sig_sem(SEM_TCP_POST_OUTPUT); 715 716 /* 717 * イベントが ESTABLISHED になるまで待つ。 718 * イベントが CLOSED になった場合は、何らかのエラーが発生したか、 719 * 接続要求が拒否されたことを意味している。 720 */ 721 error = twai_flg(cep->est_flgid, (TCP_CEP_EVT_CLOSED | 722 TCP_CEP_EVT_ESTABLISHED), TWF_ORW, &flag, tmout); 723 if (error == E_OK) { 724 if (cep->error != E_OK) 725 error = cep->error; 726 else if (cep->fsm_state == TCP_FSM_CLOSED) 727 error = E_CLS; 728 } 729 730 syscall(clr_flg(cep->est_flgid, (FLGPTN)(~TCP_CEP_EVT_ESTABLISHED))); 731 732 if (error != E_OK) { 733 /* 734 * 通信端点から受付口を解放し、 735 * イベントフラグをクローズに設定する。 736 */ 737 cep->rep = NULL; 738 cep->fsm_state = TCP_FSM_CLOSED; 739 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); 740 } 741 742 #ifdef TCP_CFG_NON_BLOCKING 743 744 } 745 746 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 747 748 err_ret: 749 cep->snd_tskid = TA_NULL; 750 cep->snd_tfn = TFN_TCP_UNDEF; 751 return error; 752 } 753 754 #endif /* of #ifdef __tcp_con_cep */ 149 * IPv6 と IPv4 で引数が異なる関数のコンパイル 150 */ 151 152 #if defined(SUPPORT_INET6) 153 154 #define T_IPEP T_IPV6EP 155 #define TCP_ACP_CEP tcp6_acp_cep 156 #define TCP_CON_CEP tcp6_con_cep 157 #define TCP_FIND_CEP_REP tcp6_find_cep_rep 158 159 #if defined(SUPPORT_INET4) 160 161 #undef T_TCP_REP 162 #define T_TCP_REP T_TCP6_REP 163 164 #endif /* of #if defined(SUPPORT_INET4) */ 165 166 #define TCP_CRE_REP tcp6_cre_rep 167 #define TCP_DEL_REP_BODY tcp6_del_rep_body 168 #define GET_TCP_REP GET_TCP6_REP 169 #define VALID_TCP_REPID VALID_TCP6_REPID 170 #define T_TCPN_CREP T_TCP6_CREP 171 #define API_PROTO API_PROTO_IPV6 172 173 #include <netinet/tcpn_usrreq.c> 174 175 #undef T_IPEP 176 #undef TCP_ACP_CEP 177 #undef TCP_CON_CEP 178 #undef TCP_FIND_CEP_REP 179 180 #undef TCP_CRE_REP 181 #undef TCP_DEL_REP_BODY 182 #undef GET_TCP_REP 183 #undef VALID_TCP_REPID 184 #undef T_TCPN_CREP 185 #undef API_PROTO 186 187 #endif /* of #if defined(SUPPORT_INET6) */ 188 189 #if defined(SUPPORT_INET4) 190 191 #define T_IPEP T_IPV4EP 192 #define TCP_ACP_CEP tcp_acp_cep 193 #define TCP_CON_CEP tcp_con_cep 194 #define TCP_FIND_CEP_REP tcp4_find_cep_rep 195 196 #if defined(SUPPORT_INET6) 197 198 #undef T_TCP_REP 199 #define T_TCP_REP T_TCP4_REP 200 201 #endif /* of #if defined(SUPPORT_INET6) */ 202 203 #define TCP_CRE_REP tcp_cre_rep 204 #define TCP_DEL_REP_BODY tcp4_del_rep_body 205 #define GET_TCP_REP GET_TCP4_REP 206 #define VALID_TCP_REPID VALID_TCP4_REPID 207 #define T_TCPN_CREP T_TCP_CREP 208 #define API_PROTO API_PROTO_IPV4 209 210 #include <netinet/tcpn_usrreq.c> 211 212 #endif /* of #if defined(SUPPORT_INET4) */ 755 213 756 214 #ifdef __tcp_cls_cep … … 904 362 * ・動的な通信端点の生成・削除機能 905 363 */ 906 cep->flags &= (TCP_CEP_FLG_WBCS_NBUF_REQ | TCP_CEP_FLG_WBCS_MASK | 907 TCP_CEP_FLG_DYNAMIC | TCP_CEP_FLG_VALID); 364 cep->flags &= TCP_CEP_FLG_NOT_CLEAR; 908 365 909 366 /* … … 1025 482 sig_sem(SEM_TCP_POST_OUTPUT); 1026 483 484 /* コールバック関数を呼び出す。*/ 1027 485 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1028 1029 /* コールバック関数を呼び出す。*/1030 486 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)error); 1031 1032 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1033 1034 /* コールバック関数を呼び出す。*/ 487 #else 1035 488 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_DAT, (void*)&error); 1036 1037 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1038 489 #endif 1039 490 error = E_WBLK; 1040 491 goto err_ret; … … 1082 533 1083 534 #endif /* of #ifdef __tcp_snd_dat */ 1084 1085 #ifdef __tcp_snd_oob1086 1087 #ifdef TCP_CFG_EXTENTIONS1088 1089 /*1090 * tcp_snd_oob -- 緊急データの送信【拡張機能】1091 */1092 1093 ER_UINT1094 tcp_snd_oob (ID cepid, void *data, int_t len, TMO tmout)1095 {1096 T_TCP_CEP *cep;1097 ER_UINT error;1098 1099 #ifdef TCP_CFG_NON_BLOCKING1100 1101 /* data が NULL か、len < 0 ならエラー */1102 if (data == NULL || len < 0)1103 return E_PAR;1104 1105 #else /* of #ifdef TCP_CFG_NON_BLOCKING */1106 1107 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */1108 if (data == NULL || len < 0 || tmout == TMO_NBLK)1109 return E_PAR;1110 1111 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1112 1113 /*1114 * CEP をロックし、API 機能コードとタスク識別子を記録する。1115 * すでに記録されていれば、ペンディング中なのでエラー1116 */1117 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK)1118 return error;1119 1120 /* 送信できるか、通信端点の状態を見る。*/1121 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK)1122 goto err_ret;1123 1124 #ifdef TCP_CFG_NON_BLOCKING1125 1126 /* タイムアウトをチェックする。*/1127 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */1128 1129 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/1130 if (!TCP_IS_SWBUF_FULL(cep)) {1131 1132 /* 送信ウィンドバッファにデータを書き込む。*/1133 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len);1134 1135 /* 送信緊急ポインタを設定する。*/1136 cep->snd_up = cep->snd_una + cep->swbuf_count;1137 1138 /* 出力をポストする。*/1139 cep->flags |= TCP_CEP_FLG_POST_OUTPUT;1140 sig_sem(SEM_TCP_POST_OUTPUT);1141 1142 #ifdef TCP_CFG_NON_BLOCKING_COMPAT141143 1144 /* コールバック関数を呼び出す。*/1145 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error);1146 1147 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */1148 1149 /* コールバック関数を呼び出す。*/1150 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)&error);1151 1152 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */1153 1154 error = E_WBLK;1155 goto err_ret;1156 }1157 else {1158 cep->snd_data = data;1159 cep->snd_len = len;1160 cep->snd_nblk_tfn = TFN_TCP_SND_OOB;1161 TCP_ALLOC_SWBUF(cep);1162 1163 return E_WBLK;1164 }1165 }1166 else { /* 非ノンブロッキングコール */1167 1168 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1169 1170 /* 送信ウィンドバッファが空くのを待つ。*/1171 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK)1172 goto err_ret;1173 1174 /* 送信ウィンドバッファにデータを書き込む。*/1175 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) {1176 1177 /* 送信緊急ポインタを設定する。*/1178 cep->snd_up = cep->snd_una + cep->swbuf_count;1179 1180 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/1181 if (TCP_IS_SWBUF_FULL(cep))1182 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR;1183 1184 /* 出力をポストする。*/1185 cep->flags |= TCP_CEP_FLG_POST_OUTPUT;1186 sig_sem(SEM_TCP_POST_OUTPUT);1187 }1188 1189 #ifdef TCP_CFG_NON_BLOCKING1190 1191 }1192 1193 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */1194 1195 err_ret:1196 cep->snd_tskid = TA_NULL;1197 cep->snd_tfn = TFN_TCP_UNDEF;1198 return error;1199 }1200 1201 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1202 1203 #endif /* of #ifdef __tcp_snd_oob */1204 535 1205 536 #ifdef __tcp_get_buf … … 1250 581 error = TCP_GET_SWBUF_ADDR(cep, p_buf); 1251 582 583 /* コールバック関数を呼び出す。*/ 1252 584 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1253 1254 /* コールバック関数を呼び出す。*/1255 585 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)error); 1256 1257 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1258 1259 /* コールバック関数を呼び出す。*/ 586 #else 1260 587 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_GET_BUF, (void*)&error); 1261 1262 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1263 588 #endif 1264 589 error = E_WBLK; 1265 590 goto err_ret; … … 1401 726 len = TCP_READ_RWBUF(cep, data, (uint_t)len); 1402 727 728 /* コールバック関数を呼び出す。*/ 1403 729 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1404 1405 730 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_DAT, (void*)(uint32_t)len); 1406 1407 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1408 731 #else 1409 732 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_DAT, (void*)&len); 1410 1411 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1412 733 #endif 1413 734 error = E_WBLK; 1414 735 goto err_ret; … … 1449 770 1450 771 #endif /* of #ifdef __tcp_rcv_dat */ 1451 1452 #ifdef __tcp_rcv_oob1453 1454 #ifdef TCP_CFG_EXTENTIONS1455 1456 /*1457 * tcp_rcv_oob -- 緊急データの受信【拡張機能】1458 *1459 * 注意: 送信側が複数オクテットのデータを送信しても、1460 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。1461 */1462 1463 ER_UINT1464 tcp_rcv_oob (ID cepid, void *data, int_t len)1465 {1466 T_TCP_CEP *cep;1467 uint8_t *urg;1468 1469 /* TCP 通信端点 ID をチェックする。*/1470 if (!VAID_TCP_CEPID(cepid))1471 return E_ID;1472 1473 /* data が NULL か、len < 0 ならエラー */1474 if (data == NULL || len < 0)1475 return E_PAR;1476 1477 /* TCP 通信端点を得る。*/1478 cep = GET_TCP_CEP(cepid);1479 1480 /* 受信できるか、通信端点の状態を見る。*/1481 /* 受信できるか、fsm_state を見る。*/1482 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state))1483 return E_OBJ;1484 1485 /*1486 * 緊急データ入りのセグメントの TCP ヘッダが1487 * 設定されていなければ、緊急データを受信していない。1488 */1489 if (cep->urg_tcph == NULL)1490 return E_OBJ;1491 1492 /* len == 0 ならバッファオーバーフロー */1493 if (len == 0)1494 return E_BOVR;1495 1496 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/1497 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET;1498 *(uint8_t*)data = *urg;1499 1500 /* 読み取ったデータから後ろの SDU を前に詰める。*/1501 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1);1502 1503 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/1504 cep->urg_tcph = NULL;1505 1506 return 1;1507 }1508 1509 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1510 1511 #endif /* of #ifdef __tcp_rcv_oob */1512 772 1513 773 #ifdef __tcp_rcv_buf … … 1559 819 error = TCP_GET_RWBUF_ADDR(cep, p_buf); 1560 820 821 /* コールバック関数を呼び出す。*/ 1561 822 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1562 1563 /* コールバック関数を呼び出す。*/1564 823 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)error); 1565 1566 #else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1567 1568 /* コールバック関数を呼び出す。*/ 824 #else 1569 825 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_RCV_BUF, (void*)&error); 1570 1571 #endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */ 1572 826 #endif 1573 827 error = E_WBLK; 1574 828 goto err_ret; … … 1705 959 1706 960 case TFN_TCP_CON_CEP: 1707 /* 通信端点から受付口を解放する。*/ 961 /* 962 * 通信端点から受付口を解放し、 963 * イベントフラグをクローズに設定する。 964 */ 1708 965 cep->rep = NULL; 966 967 #if defined(_IP6_CFG) && defined(_IP4_CFG) 968 cep->rep4 = NULL; 969 #endif 970 1709 971 cep->fsm_state = TCP_FSM_CLOSED; 1710 972 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); … … 1800 1062 */ 1801 1063 cep->rep = NULL; 1064 1065 #if defined(_IP6_CFG) && defined(_IP4_CFG) 1066 cep->rep4 = NULL; 1067 #endif 1068 1802 1069 cep->fsm_state = TCP_FSM_CLOSED; 1803 1070 syscall(set_flg(cep->est_flgid, TCP_CEP_EVT_CLOSED)); … … 1866 1133 1867 1134 /* TCP 通信端点 ID をチェックする。*/ 1868 if (!VA ID_TCP_CEPID(cepid))1135 if (!VALID_TCP_CEPID(cepid)) 1869 1136 return E_ID; 1870 1137 … … 1914 1181 #endif /* of #ifdef __tcp_can_cep */ 1915 1182 1183 #ifdef TCP_CFG_EXTENTIONS 1184 1185 #ifdef __tcp_cre_cep 1186 1187 /* 1188 * tcp_cre_cep -- TCP 通信端点の生成【拡張機能】 1189 */ 1190 1191 ER 1192 tcp_cre_cep (ID cepid, T_TCP_CCEP *pk_ccep) 1193 { 1194 T_TCP_CEP *cep; 1195 ER error; 1196 1197 /* TCP 通信端点 ID をチェックする。*/ 1198 if (!VALID_TCP_CEPID(cepid)) 1199 return E_ID; 1200 1201 /* pk_ccep が NULL ならエラー */ 1202 if (pk_ccep == NULL) 1203 return E_PAR; 1204 1205 /* TCP 通信端点を得る。*/ 1206 cep = GET_TCP_CEP(cepid); 1207 1208 /* TCP 通信端点が、動的生成用でなければエラー */ 1209 if (!DYNAMIC_TCP_CEP(cep)) 1210 return E_ID; 1211 1212 /* 通信端点をロックする。*/ 1213 syscall(wai_sem(cep->semid_lock)); 1214 1215 /* 1216 * TCP 通信端点をチェックする。生成済みであればエラー 1217 */ 1218 if (VALID_TCP_CEP(cep)) 1219 error = E_OBJ; 1220 else { 1221 1222 /* TCP 通信端点生成情報をコピーする。*/ 1223 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 1224 cep->sbuf = pk_ccep->sbuf; /* 送信用ウィンドバッファ */ 1225 cep->sbufsz = pk_ccep->sbufsz; /* 送信用ウィンドバッファサイズ */ 1226 cep->rbuf = pk_ccep->rbuf; /* 受信用ウィンドバッファ */ 1227 cep->rbufsz = pk_ccep->rbufsz; /* 受信用ウィンドバッファサイズ */ 1228 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 1229 1230 /* TCP 通信端点を生成済みにする。*/ 1231 cep->flags |= TCP_CEP_FLG_VALID; 1232 error = E_OK; 1233 } 1234 1235 /* 通信端点のロックを解除する。*/ 1236 syscall(sig_sem(cep->semid_lock)); 1237 1238 return error; 1239 } 1240 1241 #endif /* of #ifdef __tcp_cre_cep */ 1242 1243 /* 1244 * tcp_del_cep -- TCP 通信端点の削除【拡張機能】 1245 */ 1246 1247 #ifdef __tcp_del_cep 1248 1249 ER 1250 tcp_del_cep (ID cepid) 1251 { 1252 T_TCP_CEP *cep; 1253 ER error; 1254 1255 /* TCP 通信端点 ID をチェックする。*/ 1256 if (!VALID_TCP_CEPID(cepid)) 1257 return E_ID; 1258 1259 /* TCP 通信端点を得る。*/ 1260 cep = GET_TCP_CEP(cepid); 1261 1262 /* TCP 通信端点が、動的生成用でなければエラー */ 1263 if (!DYNAMIC_TCP_CEP(cep)) 1264 return E_ID; 1265 1266 /* 通信端点をロックする。*/ 1267 syscall(wai_sem(cep->semid_lock)); 1268 1269 /* 1270 * TCP 通信端点をチェックする。以下の場合はエラー 1271 * ・未生成。 1272 * ・使用中。 1273 */ 1274 if (!VALID_TCP_CEP(cep)) 1275 error = E_NOEXS; 1276 else if (cep->fsm_state != TCP_FSM_CLOSED) 1277 error = E_OBJ; 1278 else { 1279 1280 /* TCP 通信端点を未生成にする。*/ 1281 cep->flags &= ~TCP_CEP_FLG_VALID; 1282 error = E_OK; 1283 } 1284 1285 /* 通信端点のロックを解除する。*/ 1286 syscall(sig_sem(cep->semid_lock)); 1287 1288 return error; 1289 } 1290 1291 #endif /* of #ifdef __tcp_del_cep */ 1292 1293 #ifdef __tcp_snd_oob 1294 1295 /* 1296 * tcp_snd_oob -- 緊急データの送信【拡張機能】 1297 */ 1298 1299 ER_UINT 1300 tcp_snd_oob (ID cepid, void *data, int_t len, TMO tmout) 1301 { 1302 T_TCP_CEP *cep; 1303 ER_UINT error; 1304 1305 #ifdef TCP_CFG_NON_BLOCKING 1306 1307 /* data が NULL か、len < 0 ならエラー */ 1308 if (data == NULL || len < 0) 1309 return E_PAR; 1310 1311 #else /* of #ifdef TCP_CFG_NON_BLOCKING */ 1312 1313 /* data が NULL、len < 0 か、tmout が TMO_NBLK ならエラー */ 1314 if (data == NULL || len < 0 || tmout == TMO_NBLK) 1315 return E_PAR; 1316 1317 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1318 1319 /* 1320 * CEP をロックし、API 機能コードとタスク識別子を記録する。 1321 * すでに記録されていれば、ペンディング中なのでエラー 1322 */ 1323 if ((error = tcp_lock_cep(cepid, &cep, TFN_TCP_SND_OOB)) != E_OK) 1324 return error; 1325 1326 /* 送信できるか、通信端点の状態を見る。*/ 1327 if ((error = tcp_can_send_more(cep, TFN_TCP_SND_OOB, tmout)) != E_OK) 1328 goto err_ret; 1329 1330 #ifdef TCP_CFG_NON_BLOCKING 1331 1332 /* タイムアウトをチェックする。*/ 1333 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 1334 1335 /* 送信ウィンドバッファに空きがあればコールバック関数を呼び出す。*/ 1336 if (!TCP_IS_SWBUF_FULL(cep)) { 1337 1338 /* 送信ウィンドバッファにデータを書き込む。*/ 1339 error = TCP_WRITE_SWBUF(cep, data, (uint_t)len); 1340 1341 /* 送信緊急ポインタを設定する。*/ 1342 cep->snd_up = cep->snd_una + cep->swbuf_count; 1343 1344 /* 出力をポストする。*/ 1345 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1346 sig_sem(SEM_TCP_POST_OUTPUT); 1347 1348 /* コールバック関数を呼び出す。*/ 1349 #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 1350 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)error); 1351 #else 1352 (*cep->callback)(GET_TCP_CEPID(cep), TFN_TCP_SND_OOB, (void*)&error); 1353 #endif 1354 error = E_WBLK; 1355 goto err_ret; 1356 } 1357 else { 1358 cep->snd_data = data; 1359 cep->snd_len = len; 1360 cep->snd_nblk_tfn = TFN_TCP_SND_OOB; 1361 TCP_ALLOC_SWBUF(cep); 1362 1363 return E_WBLK; 1364 } 1365 } 1366 else { /* 非ノンブロッキングコール */ 1367 1368 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1369 1370 /* 送信ウィンドバッファが空くのを待つ。*/ 1371 if ((error = TCP_WAIT_SWBUF(cep, tmout)) != E_OK) 1372 goto err_ret; 1373 1374 /* 送信ウィンドバッファにデータを書き込む。*/ 1375 if ((error = TCP_WRITE_SWBUF(cep, data, (uint_t)len)) > 0) { 1376 1377 /* 送信緊急ポインタを設定する。*/ 1378 cep->snd_up = cep->snd_una + cep->swbuf_count; 1379 1380 /* データを送信する。送信ウィンドバッファがフルのときは強制的に送信する。*/ 1381 if (TCP_IS_SWBUF_FULL(cep)) 1382 cep->flags |= TCP_CEP_FLG_FORCE | TCP_CEP_FLG_FORCE_CLEAR; 1383 1384 /* 出力をポストする。*/ 1385 cep->flags |= TCP_CEP_FLG_POST_OUTPUT; 1386 sig_sem(SEM_TCP_POST_OUTPUT); 1387 } 1388 1389 #ifdef TCP_CFG_NON_BLOCKING 1390 1391 } 1392 1393 #endif /* of #ifdef TCP_CFG_NON_BLOCKING */ 1394 1395 err_ret: 1396 cep->snd_tskid = TA_NULL; 1397 cep->snd_tfn = TFN_TCP_UNDEF; 1398 return error; 1399 } 1400 1401 #endif /* of #ifdef __tcp_snd_oob */ 1402 1403 #ifdef __tcp_rcv_oob 1404 1405 /* 1406 * tcp_rcv_oob -- 緊急データの受信【拡張機能】 1407 * 1408 * 注意: 送信側が複数オクテットのデータを送信しても、 1409 * 緊急ポインタが指す 1 オクテットのデータのみ受信する。 1410 */ 1411 1412 ER_UINT 1413 tcp_rcv_oob (ID cepid, void *data, int_t len) 1414 { 1415 T_TCP_CEP *cep; 1416 uint8_t *urg; 1417 1418 /* TCP 通信端点 ID をチェックする。*/ 1419 if (!VALID_TCP_CEPID(cepid)) 1420 return E_ID; 1421 1422 /* data が NULL か、len < 0 ならエラー */ 1423 if (data == NULL || len < 0) 1424 return E_PAR; 1425 1426 /* TCP 通信端点を得る。*/ 1427 cep = GET_TCP_CEP(cepid); 1428 1429 /* 受信できるか、通信端点の状態を見る。*/ 1430 /* 受信できるか、fsm_state を見る。*/ 1431 if (!TCP_FSM_CAN_RECV_MORE(cep->fsm_state)) 1432 return E_OBJ; 1433 1434 /* 1435 * 緊急データ入りのセグメントの TCP ヘッダが 1436 * 設定されていなければ、緊急データを受信していない。 1437 */ 1438 if (cep->urg_tcph == NULL) 1439 return E_OBJ; 1440 1441 /* len == 0 ならバッファオーバーフロー */ 1442 if (len == 0) 1443 return E_BOVR; 1444 1445 /* 緊急ポインタが指す 1 オクテットのデータを読み取る。*/ 1446 urg = (uint8_t*)cep->urg_tcph + TCP_DATA_OFF(cep->urg_tcph->doff) + cep->urg_tcph->urp + TCP_CFG_URG_OFFSET; 1447 *(uint8_t*)data = *urg; 1448 1449 /* 読み取ったデータから後ろの SDU を前に詰める。*/ 1450 memcpy(urg, urg + 1, cep->urg_tcph->sum - (cep->urg_tcph->urp + TCP_CFG_URG_OFFSET) - 1); 1451 1452 /* tcp_rcv_oob() が呼出されたこと知らせるために、NULL を設定する。*/ 1453 cep->urg_tcph = NULL; 1454 1455 return 1; 1456 } 1457 1458 #endif /* of #ifdef __tcp_rcv_oob */ 1459 1460 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 1461 1462 #ifdef TCP_CFG_EXTENTIONS 1463 1464 #ifdef __tcp_del_rep 1465 1466 /* 1467 * tcp_del_rep -- TCP 受付口の削除【拡張機能】 1468 */ 1469 1470 #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 1471 1472 #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 1473 1474 ER 1475 tcp_del_rep (ID repid) 1476 { 1477 1478 /* 1479 * TCP 受付口 ID をチェックする。 1480 * IPv6 用 TCP 受付口であれば、 1481 * IPv6 用の「TCP 受付口の削除関数(本体)」を呼出す。 1482 */ 1483 //NET_DEBUG_TCP3("tcp_del_rep1[r=%d,n=%d,x=%d]\n", 1484 // repid, TMIN_TCP6_REPID, tmax_tcp6_repid); 1485 //NET_DEBUG_TCP3("tcp_del_rep2[r=%d,n=%d,x=%d]\n", 1486 // repid, TMIN_TCP4_REPID, tmax_tcp4_repid); 1487 if (VALID_TCP6_REPID(repid)) 1488 return tcp6_del_rep_body(repid); 1489 1490 /* 1491 * TCP 受付口 ID をチェックする。 1492 * IPv4 用 TCP 受付口であれば、 1493 * IPv4 用の「TCP 受付口の削除関数(本体)」を呼出す。 1494 */ 1495 else if (VALID_TCP4_REPID(repid)) 1496 return tcp4_del_rep_body(repid); 1497 else 1498 return E_ID; 1499 1500 } 1501 1502 #else /* of #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 */ 1503 1504 ER 1505 tcp_del_rep (ID repid) 1506 { 1507 1508 /* TCP 受付口 ID をチェックする。*/ 1509 if (VALID_TCP6_REPID(repid)) 1510 return tcp6_del_rep_body(repid); 1511 else 1512 return E_ID; 1513 1514 } 1515 1516 #endif /* of #if defined(SUPPORT_INET4) && TNUM_TCP4_REPID > 0 */ 1517 1518 #else /* of #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 */ 1519 1520 ER 1521 tcp_del_rep (ID repid) 1522 { 1523 1524 /* TCP 受付口 ID をチェックする。*/ 1525 if (VALID_TCP4_REPID(repid)) 1526 return tcp4_del_rep_body(repid); 1527 else 1528 return E_ID; 1529 1530 } 1531 1532 #endif /* of #if defined(SUPPORT_INET6) && TNUM_TCP6_REPID > 0 */ 1533 1534 #endif /* of #ifdef __tcp_del_rep */ 1535 1916 1536 /* 1917 1537 * tcp_set_opt -- TCP 通信端点オプションの設定【拡張機能】 … … 1922 1542 #ifdef __tcp_set_opt 1923 1543 1924 #ifdef TCP_CFG_EXTENTIONS1925 1926 1544 ER 1927 1545 tcp_set_opt (ID cepid, int_t optname, void *optval, int_t optlen) … … 1930 1548 1931 1549 /* TCP 通信端点 ID をチェックする。*/ 1932 if (!VA ID_TCP_CEPID(cepid))1550 if (!VALID_TCP_CEPID(cepid)) 1933 1551 return E_ID; 1934 1552 … … 1943 1561 } 1944 1562 1945 #endif /* of #ifdef TCP_CFG_EXTENTIONS */1946 1947 1563 #endif /* of #ifdef __tcp_set_opt */ 1948 1564 … … 1955 1571 #ifdef __tcp_get_opt 1956 1572 1957 #ifdef TCP_CFG_EXTENTIONS1958 1959 1573 ER 1960 1574 tcp_get_opt (ID cepid, int_t optname, void *optval, int_t optlen) … … 1963 1577 1964 1578 /* TCP 通信端点 ID をチェックする。*/ 1965 if (!VA ID_TCP_CEPID(cepid))1579 if (!VALID_TCP_CEPID(cepid)) 1966 1580 return E_ID; 1967 1581 … … 1976 1590 } 1977 1591 1592 #endif /* of #ifdef __tcp_get_opt */ 1593 1978 1594 #endif /* of #ifdef TCP_CFG_EXTENTIONS */ 1979 1595 1980 #endif /* of #ifdef __tcp_get_opt */1981 1982 1596 #endif /* of #ifdef SUPPORT_TCP */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_var.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 75 75 */ 76 76 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 82 77 #define GET_TCP_HDR(nbuf,thoff) ((T_TCP_HDR*)((uint8_t*)((nbuf)->buf) + thoff)) 83 78 #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_SIZE 2(nbuf,thoff))79 #define GET_TCP_SDU(nbuf,thoff) ((uint8_t*)((nbuf)->buf) + thoff + GET_TCP_HDR_SIZE(nbuf,thoff)) 85 80 86 81 #define GET_TCP_HDR_OFFSET(nbuf) (GET_IF_IP_HDR_SIZE(nbuf)) 87 82 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)) 93 92 94 93 /* … … 96 95 */ 97 96 98 #if defined(SUPPORT_INET4)97 #if !defined(_IP6_CFG) && defined(_IP4_CFG) 99 98 100 99 #define IP4_TCP_HDR_SIZE IP_TCP_HDR_SIZE 101 100 #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) */ 106 105 107 106 /* … … 110 109 111 110 #define TMIN_TCP_CREPID TMIN_TCP_REPID 111 #define TNUM_TCP_CREPID TNUM_TCP_REPID 112 112 113 #define TMIN_TCP_CCEPID TMIN_TCP_CEPID 113 #define TNUM_TCP_CREPID TNUM_TCP_REPID114 114 #define TNUM_TCP_CCEPID TNUM_TCP_CEPID 115 115 … … 121 121 122 122 /* 123 * TCP で使用する変数の型の定義 124 */ 125 126 typedef uint32_t T_TCP_SEQ; 127 typedef uint16_t T_TCP_SEG; 128 typedef uint16_t T_TCP_WND; 129 typedef int16_t T_TCP_TIME; 130 131 /* 132 * TCP タイマ変数 133 */ 134 135 #define NUM_TCP_TIMERS 4 /* TCP のタイマ数 */ 136 137 /* 123 138 * TCP 受付口 124 139 */ 125 140 141 /* IPv6 用 TCP 受付口 */ 142 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 126 158 /* IPv4 用 TCP 受付口 */ 159 127 160 typedef struct t_tcp4_rep { 128 161 … … 140 173 } T_TCP4_REP; 141 174 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 159 183 #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 165 190 166 191 /* … … 175 200 */ 176 201 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 204 typedef struct t_net_buf T_NET_BUF; 205 206 #define T_NET_BUF_DEFINED 207 208 #endif /* of #ifndef T_NET_BUF_DEFINED */ 209 210 typedef struct t_tcp_cep { 185 211 186 212 /* … … 232 258 #ifdef TCP_CFG_NON_BLOCKING 233 259 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 236 268 int16_t snd_nblk_tfn; /* 送信動作中の API 機能コード */ 237 269 int16_t rcv_nblk_tfn; /* 受信動作中の API 機能コード */ … … 247 279 #ifdef TCP_CFG_SWBUF_CSAVE 248 280 T_NET_BUF *swbufq; /* 送信ウィンドバッファキュー */ 249 #endif /* of #ifdef TCP_CFG_SWBUF_CSAVE */281 #endif 250 282 251 283 /* … … 254 286 255 287 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; /* 自分のアドレス */ 259 290 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 260 312 261 313 #ifdef TCP_CFG_RWBUF_CSAVE 262 314 T_NET_BUF *rwbufq; /* 受信ウィンドバッファキュー */ 263 #endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */315 #endif 264 316 265 317 #ifdef TCP_CFG_EXTENTIONS … … 298 350 299 351 #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 364 typedef struct t_tcp_twcep { 309 365 int_t rbufsz; /* 受信用ウィンドバッファサイズ */ 310 366 T_TCP_TIME timer_2msl; /* 2MSL タイマ */ 311 T_IP V4EPdstaddr; /* 相手のアドレス */312 T_IP V4EPmyaddr; /* 自分のアドレス */367 T_IPEP dstaddr; /* 相手のアドレス */ 368 T_IPEP myaddr; /* 自分のアドレス */ 313 369 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */ 314 370 /* 確認された最大送信 SEQ */ … … 316 372 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */ 317 373 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; 473 377 474 378 #define T_TCP_CEP_DEFINED … … 478 382 */ 479 383 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 を元に戻す。*/ 495 400 496 401 /* 送受信ウィンドバッファの省コピー機能 */ 497 #define TCP_CEP_FLG_WBCS_NBUF_REQ ULONG_C(0x 00080000) /* ネットワークバッファ割当て要求*/498 #define TCP_CEP_FLG_WBCS_MASK ULONG_C(0x 00070000) /* マスク */402 #define TCP_CEP_FLG_WBCS_NBUF_REQ ULONG_C(0x80000000) /* ネットワークバッファ割当て要求*/ 403 #define TCP_CEP_FLG_WBCS_MASK ULONG_C(0x70000000) /* マスク */ 499 404 #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) 507 416 508 417 /* … … 513 422 #define TCP_CEP_EVT_CLOSED ULONG_C(0x00000002) /* 未使用状態 */ 514 423 #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) /* 送信ウィンドバッファデータあり*/ 516 425 #define TCP_CEP_EVT_ALL ULONG_C(0xffffffff) /* 全イベント */ 517 426 … … 571 480 572 481 #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))574 482 575 483 /* … … 577 485 */ 578 486 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 の最小値 */ 582 496 583 497 /* 584 498 * 制御セグメント(データなし)サイズのネットワークバッファ 585 499 */ 500 501 #if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE) 586 502 587 503 typedef struct t_net_buf_cseg { … … 599 515 } T_NET_BUF_CSEG; 600 516 601 # ifdef SUPPORT_MIB517 #endif /* of #if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE) */ 602 518 603 519 /* … … 618 534 } T_TCP_STATS; 619 535 620 #endif /* of #ifdef SUPPORT_MIB */621 622 536 /* 623 537 * 関数シミュレーションマクロ 624 538 */ 625 539 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) 630 569 #define INDEX_TCP_CEP(id) ((id)-TMIN_TCP_CEPID) 631 570 632 #define GET_TCP_REP(id) (&(tcp_rep[INDEX_TCP_REP(id)]))633 571 #define GET_TCP_CEP(id) (&(tcp_cep[INDEX_TCP_CEP(id)])) 634 572 635 #define GET_TCP_REPID(rep) ((ID)(((rep)-tcp_rep)+TMIN_TCP_REPID))636 573 #define GET_TCP_CEPID(cep) ((ID)(((cep)-tcp_cep)+TMIN_TCP_CEPID)) 637 574 #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) 638 580 639 581 #define IS_TFN_TCP_RCV(t) ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_RCV_DAT||\ … … 651 593 #define VALID_URG_POINTER(urg) (TCP_CFG_URG_OFFSET==0||urg!=0) 652 594 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_EXTENTIONS657 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 668 595 /* 669 596 * 全域変数 670 597 */ 671 598 672 extern T_TCP_REP tcp_rep[]; 599 extern uint8_t tcp_initialized; 600 601 extern T_TCP_STATS tcp_stats; 602 603 /* TCP 受付口 */ 604 605 extern T_TCP6_REP tcp6_rep[]; 606 extern 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 614 extern const ID tmax_tcp_repid; 615 616 #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) 617 extern const ID tmax_tcp6_repid; 618 extern 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 673 626 extern T_TCP_CEP tcp_cep[]; 674 extern uint8_t tcp_initialized;675 extern const ID tmax_tcp_repid; 627 extern T_TCP_TWCEP tcp_twcep[]; 628 676 629 extern 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) 632 extern const ID tmax_tcp6_cepid; 633 extern 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 684 638 685 639 /* … … 866 820 extern void tcp_respond (T_NET_BUF *nbuf, T_TCP_CEP *cep, 867 821 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);869 822 extern ER tcp_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep, 870 823 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout); 824 extern 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); 871 826 extern void tcp_init_cep (T_TCP_CEP *cep); 872 827 extern void tcp_notify (T_NET_BUF *input, int code); … … 876 831 extern void tcp_alloc_auto_port (T_TCP_CEP *cep); 877 832 extern ER tcp_alloc_port (T_TCP_CEP *cep, uint16_t portno); 878 extern void tcp_move_twcep (T_TCP_CEP *cep);879 833 extern ER tcp_lock_cep (ID cepid, T_TCP_CEP **p_cep, FN tfn); 880 834 extern void tcp_free_reassq (T_TCP_CEP *cep); … … 885 839 extern ER tcp_wait_rwbuf (T_TCP_CEP *cep, TMO tmout); 886 840 extern T_TCP_CEP *tcp_user_closed (T_TCP_CEP *cep); 841 extern T_TCP_CEP *tcp_find_cep (T_NET_BUF *input, uint_t off); 842 extern T_TCP_TWCEP*tcp_find_twcep (T_NET_BUF *input, uint_t off); 843 extern bool_t tcp_is_addr_accept (T_NET_BUF *input, uint_t off); 844 extern void tcp_move_twcep (T_TCP_CEP *cep); 887 845 888 846 /* … … 974 932 975 933 /* 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 /*986 934 * TCP ヘッダのトレース出力機能用関数 987 935 */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp.cfg
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_input.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 72 72 #include <sil.h> 73 73 #include <t_syslog.h> 74 #include "tinet_cfg.h" 74 75 75 76 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 79 80 #include <s_services.h> 80 81 #include <t_services.h> 81 #include " kernel_id.h"82 #include "tinet_id.h" 82 83 83 84 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 92 93 #include <net/ppp_ipcp.h> 93 94 #include <net/net.h> 95 #include <net/net_endian.h> 94 96 #include <net/net_buf.h> 95 97 #include <net/net_count.h> … … 97 99 #include <netinet/in.h> 98 100 #include <netinet/in_var.h> 99 #include <netinet6/in6.h>100 #include <netinet6/in6_var.h>101 101 #include <netinet/in_itron.h> 102 102 #include <netinet/ip.h> 103 103 #include <netinet/ip_var.h> 104 #include <netinet/ip6.h>105 #include <netinet6/ip6_var.h>106 104 #include <netinet/ip_icmp.h> 107 #include <netinet/icmp6.h>108 109 105 #include <netinet/udp.h> 110 106 #include <netinet/udp_var.h> … … 124 120 #endif /* of #ifdef SUPPORT_MIB */ 125 121 126 #if defined(SUPPORT_INET4)127 128 #ifdef DHCP_CFG129 130 122 /* 131 * udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。 132 * 133 * DHCP_CFG が定義されているときは、以下のデータグラムを受信する。 134 * 135 * ・あて先アドレスがブロードキャスト 136 * ・ローカルアドレスが未定義 123 * IPv6 と IPv4 で引数が異なる関数のコンパイル 137 124 */ 138 125 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 143 127 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 151 129 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 153 137 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 161 143 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> 167 146 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 175 155 176 #e lse /* of #ifdef DHCP_CFG*/156 #endif /* of #if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0 */ 177 157 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))) 185 160 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 190 169 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> 197 172 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 */ 378 174 379 175 #endif /* of #ifdef SUPPORT_UDP */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_output.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 73 73 #include <t_syslog.h> 74 74 #include "kernel_cfg.h" 75 #include "tinet_cfg.h" 75 76 76 77 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 81 82 #include <t_services.h> 82 83 #include "kernel_id.h" 84 #include "tinet_id.h" 83 85 84 86 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 92 94 #include <net/ethernet.h> 93 95 #include <net/net.h> 96 #include <net/net_endian.h> 94 97 #include <net/net_buf.h> 95 98 #include <net/net_count.h> 96 99 97 100 #include <netinet/in.h> 98 #include <netinet6/in6.h>99 101 #include <netinet/in_var.h> 100 102 #include <netinet/in_itron.h> … … 102 104 #include <netinet/ip_var.h> 103 105 #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>109 106 #include <netinet/udp.h> 110 107 #include <netinet/udp_var.h> … … 115 112 116 113 /* 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 */ 222 154 223 155 /* … … 236 168 237 169 238 #if defined( SUPPORT_INET6) && !defined(SUPPORT_TCP)170 #if defined(_IP6_CFG) && !defined(SUPPORT_TCP) 239 171 240 172 /* IPv6 のステートレス・アドレス自動設定を実行する。*/ 241 173 in6_if_up(IF_GET_IFNET()); 242 174 243 #endif /* of #if defined( SUPPORT_INET6) && !defined(SUPPORT_TCP) */175 #endif /* of #if defined(_IP6_CFG) && !defined(SUPPORT_TCP) */ 244 176 245 177 while (true) { … … 248 180 syscall(wai_sem(SEM_UDP_POST_OUTPUT)); 249 181 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]); 255 189 } 256 190 } 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 257 206 } 258 207 } -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_subr.c
r321 r331 2 2 * TINET (UDP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 71 71 #include <kernel.h> 72 72 #include <sil.h> 73 #include <t_syslog.h> 73 74 #include "kernel_cfg.h" 75 #include "tinet_cfg.h" 74 76 75 77 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 80 82 #include <t_services.h> 81 83 #include "kernel_id.h" 84 #include "tinet_id.h" 82 85 83 86 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 91 94 #include <net/ethernet.h> 92 95 #include <net/net.h> 96 #include <net/net_endian.h> 93 97 #include <net/net_buf.h> 94 98 #include <net/net_count.h> … … 96 100 97 101 #include <netinet/in.h> 98 #include <netinet6/in6.h>99 102 #include <netinet/in_var.h> 100 103 #include <netinet/in_itron.h> … … 102 105 #include <netinet/ip_var.h> 103 106 #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>109 107 #include <netinet/udp.h> 110 108 #include <netinet/udp_var.h> 109 #include <netinet/ip_igmp.h> 110 111 #include <net/if_var.h> 111 112 112 113 #ifdef SUPPORT_UDP … … 116 117 */ 117 118 119 #if (defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0) || (defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0) 120 118 121 static uint16_t udp_port_auto = UDP_PORT_FIRST_AUTO; /* 自動割り当て番号 */ 119 122 123 #endif /* of #if (defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0) || (defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0) */ 124 120 125 /* 121 * udp_alloc_auto_port -- 自動割り当てポート番号を設定する。126 * IPv6 と IPv4 で引数が異なる関数のコンパイル 122 127 */ 123 128 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 129 130 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) 135 132 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 143 134 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) */ 150 136 151 } while (portno_start != udp_port_auto); 137 #define UDP_IS_DSTADDR_ACCEPT udp6_is_dstaddr_accept 152 138 153 return E_NOID; 154 } 139 #endif /* of #if defined(_IP4_CFG) */ 155 140 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 159 153 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> 164 156 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 */ 175 195 176 196 #endif /* of #ifdef SUPPORT_UDP */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq.c
r321 r331 2 2 * TINET (UDP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 78 78 #include <kernel.h> 79 79 #include <sil.h> 80 #include "tinet_cfg.h" 80 81 81 82 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 85 86 #include <s_services.h> 86 87 #include <t_services.h> 87 #include " kernel_id.h"88 #include "tinet_id.h" 88 89 89 90 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 97 98 #include <net/ethernet.h> 98 99 #include <net/net.h> 100 #include <net/net_endian.h> 99 101 #include <net/net_buf.h> 100 102 #include <net/net_count.h> … … 102 104 103 105 #include <netinet/in.h> 104 #include <netinet6/in6.h>105 106 #include <netinet/in_var.h> 106 107 #include <netinet/in_itron.h> … … 108 109 #include <netinet/ip_var.h> 109 110 #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>115 111 #include <netinet/udp.h> 116 112 #include <netinet/udp_var.h> 113 #include <netinet/ip_igmp.h> 117 114 118 115 #ifdef SUPPORT_UDP 119 120 /*121 * IPv4 と IPv6 の切り替えマクロ122 */123 124 #if defined(SUPPORT_INET4)125 126 #define UDP_CRE_CEP udp_cre_cep127 #define UDP_SND_DAT udp_snd_dat128 #define UDP_RCV_DAT udp_rcv_dat129 130 #endif /* of #if defined(SUPPORT_INET4) */131 132 #if defined(SUPPORT_INET6)133 134 #define UDP_CRE_CEP udp6_cre_cep135 #define UDP_SND_DAT udp6_snd_dat136 #define UDP_RCV_DAT udp6_rcv_dat137 138 #endif /* of #if defined(SUPPORT_INET6) */139 116 140 117 /* … … 158 135 #endif /* of #ifndef UDP_CFG_LIBRARY */ 159 136 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 */ 372 243 373 244 #ifdef __udp_can_cep 374 375 /*376 * udp_can_cep -- ペンディングしている処理のキャンセル【標準機能】377 */378 245 379 246 ER 380 247 udp_can_cep (ID cepid, FN fncd) 381 248 { 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 391 264 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_NOPND410 * なら、ペンディングしていないのでエラー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 else435 error = E_PAR;436 437 /* 通信端点をロックを解除する。*/438 syscall(sig_sem(cep->semid_lock));439 440 return error;441 265 } 442 266 443 267 #endif /* of #ifdef __udp_can_cep */ 444 268 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) */ 765 270 766 271 #endif /* of #ifdef SUPPORT_UDP */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq_nblk.c
r321 r331 2 2 * TINET (UDP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 75 75 #include <sil.h> 76 76 #include "kernel_cfg.h" 77 #include "tinet_cfg.h" 77 78 78 79 #endif /* of #ifdef TARGET_KERNEL_ASP */ … … 83 84 #include <t_services.h> 84 85 #include "kernel_id.h" 86 #include "tinet_id.h" 85 87 86 88 #endif /* of #ifdef TARGET_KERNEL_JSP */ … … 94 96 #include <net/ethernet.h> 95 97 #include <net/net.h> 98 #include <net/net_endian.h> 96 99 #include <net/net_buf.h> 97 100 #include <net/net_count.h> … … 99 102 100 103 #include <netinet/in.h> 101 #include <netinet6/in6.h>102 104 #include <netinet/in_var.h> 103 105 #include <netinet/in_itron.h> … … 105 107 #include <netinet/ip_var.h> 106 108 #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>112 109 #include <netinet/udp.h> 113 110 #include <netinet/udp_var.h> 114 111 115 112 #ifdef SUPPORT_UDP 116 117 /*118 * IPv4 と IPv6 の切り替えマクロ119 */120 121 #if defined(SUPPORT_INET4)122 123 #define UDP_SND_DAT udp_snd_dat124 #define UDP_RCV_DAT udp_rcv_dat125 126 #endif /* of #if defined(SUPPORT_INET4) */127 128 #if defined(SUPPORT_INET6)129 130 #define UDP_SND_DAT udp6_snd_dat131 #define UDP_RCV_DAT udp6_rcv_dat132 133 #endif /* of #if defined(SUPPORT_INET6) */134 113 135 114 /* … … 140 119 #ifndef UDP_CFG_LIBRARY 141 120 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 146 125 147 126 #endif /* of #ifndef UDP_CFG_LIBRARY */ … … 149 128 #ifdef UDP_CFG_NON_BLOCKING 150 129 151 #ifdef __udp_can_snd152 153 130 /* 154 * udp_can_snd -- ペンディングしている送信のキャンセル131 * IPv6 と IPv4 で引数が異なる関数のコンパイル 155 132 */ 156 133 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 162 135 163 #if def TCP_CFG_NON_BLOCKING_COMPAT14136 #if defined(SUPPORT_INET6) && TNUM_UDP6_CEPID > 0 164 137 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 166 150 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 168 156 169 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error); 157 #include <netinet/udpn_usrreq_nblk.c> 170 158 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 172 172 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 */ 178 174 179 #if def UDP_CFG_EXTENTIONS175 #if defined(SUPPORT_INET4) && TNUM_UDP4_CEPID > 0 180 176 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 183 189 184 # endif /* of #ifdef UDP_CFG_EXTENTIONS */190 #define IN_COPY_TO_HOST IN4_COPY_TO_HOST 185 191 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> 191 193 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 */ 490 195 491 196 #endif /* of #ifdef UDP_CFG_NON_BLOCKING */ -
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_var.h
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 75 75 */ 76 76 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 81 77 #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)) 82 79 #define GET_UDP_SDU(nbuf,uhoff) ((uint8_t*)((nbuf)->buf) + uhoff+ UDP_HDR_SIZE) 83 80 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)) 88 83 89 84 /* … … 91 86 */ 92 87 93 #if defined( SUPPORT_INET4)88 #if defined(_IP4_CFG) 94 89 95 90 #define IP4_UDP_HDR_SIZE IP_UDP_HDR_SIZE … … 98 93 #define GET_IF_IP4_UDP_HDR_SIZE(nbuf) GET_IF_IP_UDP_HDR_SIZE(nbuf) 99 94 100 #endif /* of #if defined( SUPPORT_INET4) */95 #endif /* of #if defined(_IP4_CFG) */ 101 96 102 97 /* … … 110 105 */ 111 106 112 113 /* 114 * IPv4 UDP 通信端点 115 */ 116 typedef struct t_udp4_cep { 107 /* IPv6 用 UDP 通信端点 */ 108 109 typedef struct t_udp6_cep { 117 110 118 111 /* … … 120 113 */ 121 114 ATR cepatr; /* UDP 通信端点属性 */ 122 T_IPV 4EP myaddr; /* 自分のアドレス */115 T_IPV6EP myaddr; /* 自分のアドレス */ 123 116 t_udp_callback callback; /* コールバック関数 */ 124 117 … … 135 128 #ifdef UDP_CFG_NON_BLOCKING 136 129 137 T_IPV 4EP *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/138 T_IPV 4EP *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/130 T_IPV6EP *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/ 131 T_IPV6EP *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/ 139 132 void *snd_data; /* 送信データ領域の先頭アドレス */ 140 133 int_t snd_len; /* 送信データ領域の長さ */ … … 148 141 #endif 149 142 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 147 typedef struct t_udp4_cep { 161 148 162 149 /* … … 164 151 */ 165 152 ATR cepatr; /* UDP 通信端点属性 */ 166 T_IPV 6EP myaddr; /* 自分のアドレス */153 T_IPV4EP myaddr; /* 自分のアドレス */ 167 154 t_udp_callback callback; /* コールバック関数 */ 168 155 … … 179 166 #ifdef UDP_CFG_NON_BLOCKING 180 167 181 T_IPV 6EP *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/182 T_IPV 6EP*rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/168 T_IPV4EP *snd_p_dstaddr; /* 送信相手のアドレスへのポインタ*/ 169 T_IPV4EP *rcv_p_dstaddr; /* 受信相手のアドレスへのポインタ*/ 183 170 void *snd_data; /* 送信データ領域の先頭アドレス */ 184 171 int_t snd_len; /* 送信データ領域の長さ */ … … 191 178 ER error; /* 待ち中に発生したエラー */ 192 179 #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 197 189 #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) */ 199 200 200 201 /* … … 210 211 */ 211 212 212 #define TMIN_UDP_CEPID 1 /* UDP通信端点 ID の最小値 */213 214 # ifdef SUPPORT_MIB213 #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 の最小値 */ 215 216 216 217 /* … … 225 226 } T_UDP_STATS; 226 227 227 #endif /* of #ifdef SUPPORT_MIB */228 229 228 /* 230 229 * 関数シミュレーションマクロ 231 230 */ 232 231 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)) 240 243 241 244 #define VALID_TFN_UDP_CAN(t) ((t)==TFN_UDP_SND_DAT||(t)==TFN_UDP_RCV_DAT||\ … … 249 252 */ 250 253 251 extern T_UDP_CEP udp_cep[]; 254 extern T_UDP_STATS udp_stats; 255 256 /* UDP 通信端点 */ 257 258 extern T_UDP6_CEP udp6_cep[]; 259 extern 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 252 267 extern const ID tmax_udp_cepid; 253 268 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) 270 extern const ID tmax_udp6_cepid; 271 extern 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 259 276 260 277 /* … … 269 286 */ 270 287 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 290 extern uint_t udp6_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp); 291 extern ER_UINT udp6_send_data (T_UDP6_CEP *cep, T_IPV6EP *p_dstaddr, 292 void *data, int_t len, TMO tmout); 293 extern ER udp6_can_snd (T_UDP6_CEP *cep, ER error); 294 extern ER udp6_can_rcv (T_UDP6_CEP *cep, ER error); 295 extern ER udp6_alloc_auto_port (T_UDP6_CEP *cep); 296 extern ER udp6_alloc_port (T_UDP6_CEP *cep, uint16_t portno); 297 extern T_UDP6_CEP*udp6_find_cep (T_NET_BUF *input, uint_t off); 298 extern void udp6_notify (T_NET_BUF *input, ER error); 299 extern void udp6_input_select (T_UDP6_CEP *cep, T_NET_BUF *input, uint_t off); 300 301 /* IPv4 */ 302 303 extern uint_t udp4_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp); 304 extern ER_UINT udp4_send_data (T_UDP4_CEP *cep, T_IPV4EP *p_dstaddr, 305 void *data, int_t len, TMO tmout); 306 extern ER udp4_can_snd (T_UDP4_CEP *cep, ER error); 307 extern ER udp4_can_rcv (T_UDP4_CEP *cep, ER error); 308 extern ER udp4_alloc_auto_port (T_UDP4_CEP *cep); 309 extern ER udp4_alloc_port (T_UDP4_CEP *cep, uint16_t portno); 310 extern T_UDP4_CEP*udp4_find_cep (T_NET_BUF *input, uint_t off); 311 extern void udp4_notify (T_NET_BUF *input, ER error); 312 extern void udp4_input_select (T_UDP4_CEP *cep, T_NET_BUF *input, uint_t off); 278 313 279 314 /* ノンブロッキングコールを行う場合に組み込むタスク */
Note:
See TracChangeset
for help on using the changeset viewer.