Skip to content

Commit 494441f

Browse files
committed
Preserve socket events raised during poll callbacks
F/1161
1 parent 88646e3 commit 494441f

3 files changed

Lines changed: 56 additions & 3 deletions

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ Suite *wolf_suite(void)
117117
#endif
118118
tcase_add_test(tc_utils, test_wolfip_ipconfig_ex_per_interface);
119119
tcase_add_test(tc_utils, test_wolfip_poll_executes_timers_and_callbacks);
120+
tcase_add_test(tc_utils, test_wolfip_poll_preserves_tcp_events_raised_during_callback);
120121
tcase_add_test(tc_utils, test_filter_notify_tcp_metadata);
121122
tcase_add_test(tc_utils, test_filter_dispatch_no_callback);
122123
tcase_add_test(tc_utils, test_filter_dispatch_mask_not_set);

src/test/unit/unit_tests_api.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
static struct wolfIP *poll_rearm_stack;
2+
static int poll_rearm_cb_calls;
3+
static int poll_rearm_recv_len;
4+
5+
static void test_poll_rearm_tcp_cb(int sock_fd, uint16_t events, void *arg)
6+
{
7+
uint8_t buf[8];
8+
9+
(void)arg;
10+
poll_rearm_cb_calls++;
11+
ck_assert_ptr_nonnull(poll_rearm_stack);
12+
ck_assert_uint_eq(events & CB_EVENT_READABLE, CB_EVENT_READABLE);
13+
ck_assert_int_eq(wolfIP_sock_recvfrom(poll_rearm_stack, sock_fd, buf,
14+
(size_t)poll_rearm_recv_len, 0, NULL, NULL), poll_rearm_recv_len);
15+
}
16+
117
START_TEST(test_wolfip_poll_executes_timers_and_callbacks)
218
{
319
struct wolfIP s;
@@ -31,6 +47,39 @@ START_TEST(test_wolfip_poll_executes_timers_and_callbacks)
3147
}
3248
END_TEST
3349

50+
START_TEST(test_wolfip_poll_preserves_tcp_events_raised_during_callback)
51+
{
52+
struct wolfIP s;
53+
int tcp_sd;
54+
struct tsocket *ts;
55+
uint8_t payload[8] = {0};
56+
57+
wolfIP_init(&s);
58+
mock_link_init(&s);
59+
60+
tcp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_STREAM, WI_IPPROTO_TCP);
61+
ck_assert_int_gt(tcp_sd, 0);
62+
ts = &s.tcpsockets[SOCKET_UNMARK(tcp_sd)];
63+
ts->sock.tcp.state = TCP_ESTABLISHED;
64+
queue_init(&ts->sock.tcp.rxbuf, ts->rxmem, RXBUF_SIZE, 0);
65+
ck_assert_int_eq(queue_insert(&ts->sock.tcp.rxbuf, payload, 0, sizeof(payload)), 0);
66+
67+
poll_rearm_stack = &s;
68+
poll_rearm_cb_calls = 0;
69+
poll_rearm_recv_len = 4;
70+
wolfIP_register_callback(&s, tcp_sd, test_poll_rearm_tcp_cb, NULL);
71+
ts->events = CB_EVENT_READABLE;
72+
73+
(void)wolfIP_poll(&s, 100);
74+
ck_assert_int_eq(poll_rearm_cb_calls, 1);
75+
ck_assert_uint_eq(ts->events & CB_EVENT_READABLE, CB_EVENT_READABLE);
76+
77+
(void)wolfIP_poll(&s, 101);
78+
ck_assert_int_eq(poll_rearm_cb_calls, 2);
79+
ck_assert_uint_eq(ts->events & CB_EVENT_READABLE, 0U);
80+
}
81+
END_TEST
82+
3483
START_TEST(test_filter_notify_tcp_metadata)
3584
{
3685
struct wolfIP s;

src/wolfip.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6541,22 +6541,25 @@ int wolfIP_poll(struct wolfIP *s, uint64_t now)
65416541
for (i = 0; i < MAX_TCPSOCKETS; i++) {
65426542
struct tsocket *ts = &s->tcpsockets[i];
65436543
if ((ts->sock.tcp.state != TCP_CLOSED) && (ts->callback) && (ts->events)) {
6544-
ts->callback(i | MARK_TCP_SOCKET, ts->events, ts->callback_arg);
6544+
uint16_t events = ts->events;
65456545
ts->events = 0;
6546+
ts->callback(i | MARK_TCP_SOCKET, events, ts->callback_arg);
65466547
}
65476548
}
65486549
for (i = 0; i < MAX_UDPSOCKETS; i++) {
65496550
struct tsocket *ts = &s->udpsockets[i];
65506551
if ((ts->callback) && (ts->events)) {
6551-
ts->callback(i | MARK_UDP_SOCKET, ts->events, ts->callback_arg);
6552+
uint16_t events = ts->events;
65526553
ts->events = 0;
6554+
ts->callback(i | MARK_UDP_SOCKET, events, ts->callback_arg);
65536555
}
65546556
}
65556557
for (i = 0; i < MAX_ICMPSOCKETS; i++) {
65566558
struct tsocket *ts = &s->icmpsockets[i];
65576559
if ((ts->callback) && (ts->events)) {
6558-
ts->callback(i | MARK_ICMP_SOCKET, ts->events, ts->callback_arg);
6560+
uint16_t events = ts->events;
65596561
ts->events = 0;
6562+
ts->callback(i | MARK_ICMP_SOCKET, events, ts->callback_arg);
65606563
}
65616564
}
65626565

0 commit comments

Comments
 (0)