Skip to content

Commit db50893

Browse files
committed
Fix initialization of SND_UNA to ISN
+ related test
1 parent cf05622 commit db50893

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

src/test/unit/unit.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3163,6 +3163,49 @@ START_TEST(test_sock_accept_starts_rto_timer)
31633163
}
31643164
END_TEST
31653165

3166+
START_TEST(test_sock_accept_initializes_snd_una)
3167+
{
3168+
struct wolfIP s;
3169+
int listen_sd;
3170+
int client_sd;
3171+
struct tsocket *listener;
3172+
struct tsocket *accepted;
3173+
struct wolfIP_sockaddr_in sin;
3174+
3175+
wolfIP_init(&s);
3176+
mock_link_init(&s);
3177+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
3178+
3179+
listen_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_STREAM, WI_IPPROTO_TCP);
3180+
ck_assert_int_gt(listen_sd, 0);
3181+
memset(&sin, 0, sizeof(sin));
3182+
sin.sin_family = AF_INET;
3183+
sin.sin_port = ee16(1234);
3184+
sin.sin_addr.s_addr = ee32(0x0A000001U);
3185+
ck_assert_int_eq(wolfIP_sock_bind(&s, listen_sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin)), 0);
3186+
ck_assert_int_eq(wolfIP_sock_listen(&s, listen_sd, 1), 0);
3187+
3188+
inject_tcp_syn(&s, TEST_PRIMARY_IF, 0x0A000001U, 1234);
3189+
listener = &s.tcpsockets[SOCKET_UNMARK(listen_sd)];
3190+
ck_assert_int_eq(listener->sock.tcp.state, TCP_SYN_RCVD);
3191+
3192+
/* Force a high ISN to exercise wrap-aware ordering. */
3193+
{
3194+
uint32_t isn = 0x80000000U;
3195+
listener->sock.tcp.seq = isn;
3196+
listener->sock.tcp.snd_una = isn;
3197+
}
3198+
3199+
client_sd = wolfIP_sock_accept(&s, listen_sd, NULL, NULL);
3200+
ck_assert_int_gt(client_sd, 0);
3201+
3202+
accepted = &s.tcpsockets[SOCKET_UNMARK(client_sd)];
3203+
ck_assert_uint_eq(accepted->sock.tcp.seq, (uint32_t)(0x80000000U + 1U));
3204+
ck_assert_uint_eq(accepted->sock.tcp.snd_una, 0x80000000U);
3205+
ck_assert_int_eq(tcp_seq_leq(accepted->sock.tcp.snd_una, accepted->sock.tcp.seq), 1);
3206+
}
3207+
END_TEST
3208+
31663209
START_TEST(test_sock_accept_synack_retransmission)
31673210
{
31683211
struct wolfIP s;
@@ -16947,6 +16990,7 @@ Suite *wolf_suite(void)
1694716990
tcase_add_test(tc_utils, test_sock_accept_listen_no_connection);
1694816991
tcase_add_test(tc_utils, test_sock_accept_bound_local_ip_no_match);
1694916992
tcase_add_test(tc_utils, test_sock_accept_starts_rto_timer);
16993+
tcase_add_test(tc_utils, test_sock_accept_initializes_snd_una);
1695016994
tcase_add_test(tc_utils, test_sock_accept_synack_retransmission);
1695116995
tcase_add_test(tc_utils, test_sock_accept_ack_transitions_to_established);
1695216996
tcase_add_test(tc_utils, test_sock_sendto_error_paths);

src/wolfip.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3795,6 +3795,7 @@ int wolfIP_sock_accept(struct wolfIP *s, int sockfd, struct wolfIP_sockaddr *add
37953795
newts->dst_port = ts->dst_port;
37963796
newts->sock.tcp.ack = ts->sock.tcp.ack;
37973797
newts->sock.tcp.seq = ts->sock.tcp.seq;
3798+
newts->sock.tcp.snd_una = newts->sock.tcp.seq;
37983799
newts->sock.tcp.last_ts = ts->sock.tcp.last_ts;
37993800
newts->sock.tcp.peer_rwnd = ts->sock.tcp.peer_rwnd;
38003801
newts->sock.tcp.cwnd = tcp_initial_cwnd(newts->sock.tcp.peer_rwnd);

0 commit comments

Comments
 (0)