Skip to content

Commit a77fe9d

Browse files
committed
Addressed review
ICMP hard errors were closing TCP established connections. Also fix/split test case.
1 parent 1a79582 commit a77fe9d

3 files changed

Lines changed: 62 additions & 7 deletions

File tree

src/test/unit/unit.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,9 +696,10 @@ Suite *wolf_suite(void)
696696
tcase_add_test(tc_proto, test_icmp_input_echo_request_ip_filter_drop);
697697
tcase_add_test(tc_proto, test_icmp_input_echo_request_eth_filter_drop);
698698
tcase_add_test(tc_proto, test_icmp_input_filter_drop_receiving);
699-
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_closes_matching_tcp_socket);
699+
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_keeps_established_tcp_socket);
700700
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss);
701-
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_match_tcp_socket);
701+
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_closes_syn_sent_tcp_socket);
702+
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_keep_established_tcp_socket);
702703
tcase_add_test(tc_proto, test_udp_sendto_and_recvfrom);
703704
tcase_add_test(tc_proto, test_udp_sendto_respects_mtu_api);
704705
tcase_add_test(tc_proto, test_udp_recvfrom_sets_remote_ip);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,7 +2038,7 @@ START_TEST(test_icmp_input_filter_drop_receiving)
20382038
}
20392039
END_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
}
20892090
END_TEST
20902091

@@ -2142,7 +2143,57 @@ START_TEST(test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss)
21422143
}
21432144
END_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
}
22022254
END_TEST
22032255

src/wolfip.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2043,7 +2043,9 @@ static void icmp_try_deliver_tcp_error(struct wolfIP *s,
20432043
}
20442044
} else if (icmp->code == ICMP_PROT_UNREACH ||
20452045
icmp->code == ICMP_PORT_UNREACH) {
2046-
close_socket(t);
2046+
if (t->sock.tcp.state == TCP_SYN_SENT ||
2047+
t->sock.tcp.state == TCP_SYN_RCVD)
2048+
close_socket(t);
20472049
}
20482050
}
20492051
break;

0 commit comments

Comments
 (0)