@@ -2038,7 +2038,7 @@ START_TEST(test_icmp_input_filter_drop_receiving)
20382038}
20392039END_TEST
20402040
2041- START_TEST (test_icmp_input_dest_unreach_port_unreachable_closes_matching_tcp_socket )
2041+ START_TEST (test_icmp_input_dest_unreach_port_unreachable_keeps_established_tcp_socket )
20422042{
20432043 struct wolfIP s ;
20442044 struct tsocket * ts ;
@@ -2084,7 +2084,8 @@ START_TEST(test_icmp_input_dest_unreach_port_unreachable_closes_matching_tcp_soc
20842084
20852085 icmp_input (& s , TEST_PRIMARY_IF , (struct wolfIP_ip_packet * )& icmp , frame_len );
20862086
2087- ck_assert_uint_eq (ts -> proto , 0U );
2087+ ck_assert_uint_eq (ts -> proto , WI_IPPROTO_TCP );
2088+ ck_assert_int_eq (ts -> sock .tcp .state , TCP_ESTABLISHED );
20882089}
20892090END_TEST
20902091
@@ -2142,7 +2143,57 @@ START_TEST(test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss)
21422143}
21432144END_TEST
21442145
2145- START_TEST (test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_match_tcp_socket )
2146+ START_TEST (test_icmp_input_dest_unreach_port_unreachable_closes_syn_sent_tcp_socket )
2147+ {
2148+ struct wolfIP s ;
2149+ struct tsocket * ts ;
2150+ struct wolfIP_icmp_dest_unreachable_packet icmp ;
2151+ struct wolfIP_tcp_wire_prefix * orig ;
2152+ uint32_t frame_len ;
2153+
2154+ wolfIP_init (& s );
2155+ mock_link_init (& s );
2156+ wolfIP_ipconfig_set (& s , 0x0A000001U , 0xFFFFFF00U , 0 );
2157+
2158+ ts = & s .tcpsockets [0 ];
2159+ memset (ts , 0 , sizeof (* ts ));
2160+ ts -> proto = WI_IPPROTO_TCP ;
2161+ ts -> S = & s ;
2162+ ts -> sock .tcp .state = TCP_SYN_SENT ;
2163+ ts -> local_ip = 0x0A000001U ;
2164+ ts -> remote_ip = 0x0A000002U ;
2165+ ts -> src_port = 1234 ;
2166+ ts -> dst_port = 4321 ;
2167+
2168+ memset (& icmp , 0 , sizeof (icmp ));
2169+ icmp .ip .src = ee32 (0x0A0000FEU );
2170+ icmp .ip .dst = ee32 (ts -> local_ip );
2171+ icmp .ip .ttl = 64 ;
2172+ icmp .ip .proto = WI_IPPROTO_ICMP ;
2173+ icmp .ip .len = ee16 (IP_HEADER_LEN + ICMP_DEST_UNREACH_SIZE );
2174+ icmp .type = ICMP_DEST_UNREACH ;
2175+ icmp .code = ICMP_PORT_UNREACH ;
2176+
2177+ orig = (struct wolfIP_tcp_wire_prefix * )icmp .orig_packet ;
2178+ orig -> ip .ver_ihl = 0x45 ;
2179+ orig -> ip .proto = WI_IPPROTO_TCP ;
2180+ orig -> ip .src = ee32 (ts -> local_ip );
2181+ orig -> ip .dst = ee32 (ts -> remote_ip );
2182+ orig -> ip .len = ee16 (IP_HEADER_LEN + 8U );
2183+ orig -> src_port = ee16 (ts -> src_port );
2184+ orig -> dst_port = ee16 (ts -> dst_port );
2185+
2186+ icmp .csum = ee16 (icmp_checksum ((struct wolfIP_icmp_packet * )& icmp ,
2187+ ICMP_DEST_UNREACH_SIZE ));
2188+ frame_len = (uint32_t )(ETH_HEADER_LEN + IP_HEADER_LEN + ICMP_DEST_UNREACH_SIZE );
2189+
2190+ icmp_input (& s , TEST_PRIMARY_IF , (struct wolfIP_ip_packet * )& icmp , frame_len );
2191+
2192+ ck_assert_uint_eq (ts -> proto , 0U );
2193+ }
2194+ END_TEST
2195+
2196+ START_TEST (test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_keep_established_tcp_socket )
21462197{
21472198 struct wolfIP s ;
21482199 struct tsocket * ts ;
@@ -2197,7 +2248,8 @@ START_TEST(test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_match
21972248
21982249 icmp_input (& s , TEST_PRIMARY_IF , (struct wolfIP_ip_packet * )icmp , frame_len );
21992250
2200- ck_assert_uint_eq (ts -> proto , 0U );
2251+ ck_assert_uint_eq (ts -> proto , WI_IPPROTO_TCP );
2252+ ck_assert_int_eq (ts -> sock .tcp .state , TCP_ESTABLISHED );
22012253}
22022254END_TEST
22032255
0 commit comments