Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_subr.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.