Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_input.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_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)
Note:
See TracChangeset
for help on using the changeset viewer.