Skip to content

Commit 3092f6f

Browse files
authored
Merge pull request wolfSSL#102 from danielinux/refactor-loopback
Fix loopback interface. Add new tests, remove deprecated tests.
2 parents 26dc833 + 943e370 commit 3092f6f

8 files changed

Lines changed: 599 additions & 76 deletions

File tree

.github/workflows/linux.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,18 @@ jobs:
9090
set -euo pipefail
9191
timeout --preserve-status 2m sudo LD_PRELOAD=$PWD/libwolfip.so ping -c 5 10.10.10.1
9292
93+
- name: Rebuild libwolfip.so with loopback enabled
94+
run: |
95+
set -euo pipefail
96+
rm -f libwolfip.so build/pie/wolfip.o
97+
make libwolfip.so EXTRA_CFLAGS="-DWOLFIP_ENABLE_LOOPBACK=1"
98+
99+
- name: Testing ICMP loopback smoke (no TUN/TAP)
100+
timeout-minutes: 2
101+
run: |
102+
set -euo pipefail
103+
timeout --preserve-status 2m sudo LD_PRELOAD=$PWD/libwolfip.so ping -4 -n -c 5 127.0.0.1
104+
93105
- name: Install check
94106
run: |
95107
sudo apt-get install -y check

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CC?=gcc
22
CFLAGS:=-Wall -Werror -Wextra -I. -D_GNU_SOURCE
33
CFLAGS+=-g -ggdb -Wdeclaration-after-statement
4+
CFLAGS+=$(EXTRA_CFLAGS)
45
LDFLAGS+=-pthread
56
# additional debug flags:
67
# CFLAGS+=-DDEBUG_TAP

src/test/test_wolfguard_loopback.c

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@
1616
#endif
1717

1818
#undef WOLFIP_MAX_INTERFACES
19-
#define WOLFIP_MAX_INTERFACES 2
19+
#define WOLFIP_MAX_INTERFACES 3
2020

2121
#include "check.h"
2222
#include "../../config.h"
2323

24+
#if WOLFIP_ENABLE_LOOPBACK
25+
#define TEST_PHYS_IF 1U
26+
#define TEST_WG_IF 2U
27+
#else
28+
#define TEST_PHYS_IF 0U
29+
#define TEST_WG_IF 1U
30+
#endif
31+
2432
/* Override after config.h */
2533
#undef MAX_UDPSOCKETS
2634
#define MAX_UDPSOCKETS 8
@@ -205,47 +213,47 @@ static void setup_loopback_stacks(uint64_t *now)
205213
/* ---- Stack A ---- */
206214
wolfIP_init(&stack_a);
207215

208-
/* Physical interface (non_ethernet, index 0) */
209-
ll = wolfIP_getdev_ex(&stack_a, 0);
216+
/* Physical interface (non_ethernet, index TEST_PHYS_IF). */
217+
ll = wolfIP_getdev_ex(&stack_a, TEST_PHYS_IF);
210218
ll->non_ethernet = 1;
211219
ll->poll = phys_a_poll;
212220
ll->send = phys_a_send;
213221
strncpy(ll->ifname, "eth_a", sizeof(ll->ifname) - 1);
214222

215-
wolfIP_ipconfig_set(&stack_a, MAKE_IP4(192,168,1,1),
216-
MAKE_IP4(255,255,255,0), 0);
223+
wolfIP_ipconfig_set_ex(&stack_a, TEST_PHYS_IF, MAKE_IP4(192,168,1,1),
224+
MAKE_IP4(255,255,255,0), 0);
217225

218226
/* wolfGuard on interface 1 (wg0) */
219-
ck_assert_int_eq(wolfguard_init(&wg_dev_a, &stack_a, 1, 51820), 0);
227+
ck_assert_int_eq(wolfguard_init(&wg_dev_a, &stack_a, TEST_WG_IF, 51820), 0);
220228

221229
/* Generate and set keys for A */
222230
wc_RNG_GenerateBlock(&test_rng, priv_a, WG_PRIVATE_KEY_LEN);
223231
ck_assert_int_eq(wolfguard_set_private_key(&wg_dev_a, priv_a), 0);
224232

225-
wolfIP_ipconfig_set_ex(&stack_a, 1, MAKE_IP4(10,0,0,1),
233+
wolfIP_ipconfig_set_ex(&stack_a, TEST_WG_IF, MAKE_IP4(10,0,0,1),
226234
MAKE_IP4(255,255,255,0), 0);
227235

228236
/* Stack B */
229237
wolfIP_init(&stack_b);
230238

231-
/* Physical interface (non_ethernet, index 0) */
232-
ll = wolfIP_getdev_ex(&stack_b, 0);
239+
/* Physical interface (non_ethernet, index TEST_PHYS_IF). */
240+
ll = wolfIP_getdev_ex(&stack_b, TEST_PHYS_IF);
233241
ll->non_ethernet = 1;
234242
ll->poll = phys_b_poll;
235243
ll->send = phys_b_send;
236244
strncpy(ll->ifname, "eth_b", sizeof(ll->ifname) - 1);
237245

238-
wolfIP_ipconfig_set(&stack_b, MAKE_IP4(192,168,1,2),
239-
MAKE_IP4(255,255,255,0), 0);
246+
wolfIP_ipconfig_set_ex(&stack_b, TEST_PHYS_IF, MAKE_IP4(192,168,1,2),
247+
MAKE_IP4(255,255,255,0), 0);
240248

241249
/* wolfGuard on interface 1 (wg0) */
242-
ck_assert_int_eq(wolfguard_init(&wg_dev_b, &stack_b, 1, 51820), 0);
250+
ck_assert_int_eq(wolfguard_init(&wg_dev_b, &stack_b, TEST_WG_IF, 51820), 0);
243251

244252
/* Generate and set keys for B */
245253
wc_RNG_GenerateBlock(&test_rng, priv_b, WG_PRIVATE_KEY_LEN);
246254
ck_assert_int_eq(wolfguard_set_private_key(&wg_dev_b, priv_b), 0);
247255

248-
wolfIP_ipconfig_set_ex(&stack_b, 1, MAKE_IP4(10,0,0,2),
256+
wolfIP_ipconfig_set_ex(&stack_b, TEST_WG_IF, MAKE_IP4(10,0,0,2),
249257
MAKE_IP4(255,255,255,0), 0);
250258

251259
/* Add peers (A knows B, B knows A) */
@@ -798,50 +806,50 @@ START_TEST(test_multi_peer)
798806

799807
/* Stack A (hub, 2 peers) */
800808
wolfIP_init(&stack_a);
801-
ll = wolfIP_getdev_ex(&stack_a, 0);
809+
ll = wolfIP_getdev_ex(&stack_a, TEST_PHYS_IF);
802810
ll->non_ethernet = 1;
803811
ll->poll = phys_a_poll_multi;
804812
ll->send = phys_a_send_multi;
805813
strncpy(ll->ifname, "eth_a", sizeof(ll->ifname) - 1);
806-
wolfIP_ipconfig_set(&stack_a, MAKE_IP4(192,168,1,1),
807-
MAKE_IP4(255,255,255,0), 0);
814+
wolfIP_ipconfig_set_ex(&stack_a, TEST_PHYS_IF, MAKE_IP4(192,168,1,1),
815+
MAKE_IP4(255,255,255,0), 0);
808816

809-
ck_assert_int_eq(wolfguard_init(&wg_dev_a, &stack_a, 1, 51820), 0);
817+
ck_assert_int_eq(wolfguard_init(&wg_dev_a, &stack_a, TEST_WG_IF, 51820), 0);
810818
wc_RNG_GenerateBlock(&test_rng, priv_a, WG_PRIVATE_KEY_LEN);
811819
ck_assert_int_eq(wolfguard_set_private_key(&wg_dev_a, priv_a), 0);
812-
wolfIP_ipconfig_set_ex(&stack_a, 1, MAKE_IP4(10,0,0,1),
820+
wolfIP_ipconfig_set_ex(&stack_a, TEST_WG_IF, MAKE_IP4(10,0,0,1),
813821
MAKE_IP4(255,0,0,0), 0);
814822

815823
/* Stack B */
816824
wolfIP_init(&stack_b);
817-
ll = wolfIP_getdev_ex(&stack_b, 0);
825+
ll = wolfIP_getdev_ex(&stack_b, TEST_PHYS_IF);
818826
ll->non_ethernet = 1;
819827
ll->poll = phys_b_poll;
820828
ll->send = phys_b_send;
821829
strncpy(ll->ifname, "eth_b", sizeof(ll->ifname) - 1);
822-
wolfIP_ipconfig_set(&stack_b, MAKE_IP4(192,168,1,2),
823-
MAKE_IP4(255,255,255,0), 0);
830+
wolfIP_ipconfig_set_ex(&stack_b, TEST_PHYS_IF, MAKE_IP4(192,168,1,2),
831+
MAKE_IP4(255,255,255,0), 0);
824832

825-
ck_assert_int_eq(wolfguard_init(&wg_dev_b, &stack_b, 1, 51820), 0);
833+
ck_assert_int_eq(wolfguard_init(&wg_dev_b, &stack_b, TEST_WG_IF, 51820), 0);
826834
wc_RNG_GenerateBlock(&test_rng, priv_b, WG_PRIVATE_KEY_LEN);
827835
ck_assert_int_eq(wolfguard_set_private_key(&wg_dev_b, priv_b), 0);
828-
wolfIP_ipconfig_set_ex(&stack_b, 1, MAKE_IP4(10,0,1,1),
836+
wolfIP_ipconfig_set_ex(&stack_b, TEST_WG_IF, MAKE_IP4(10,0,1,1),
829837
MAKE_IP4(255,255,255,0), 0);
830838

831839
/* Stack C */
832840
wolfIP_init(&stack_c);
833-
ll = wolfIP_getdev_ex(&stack_c, 0);
841+
ll = wolfIP_getdev_ex(&stack_c, TEST_PHYS_IF);
834842
ll->non_ethernet = 1;
835843
ll->poll = phys_c_poll;
836844
ll->send = phys_c_send;
837845
strncpy(ll->ifname, "eth_c", sizeof(ll->ifname) - 1);
838-
wolfIP_ipconfig_set(&stack_c, MAKE_IP4(192,168,1,3),
839-
MAKE_IP4(255,255,255,0), 0);
846+
wolfIP_ipconfig_set_ex(&stack_c, TEST_PHYS_IF, MAKE_IP4(192,168,1,3),
847+
MAKE_IP4(255,255,255,0), 0);
840848

841-
ck_assert_int_eq(wolfguard_init(&wg_dev_c, &stack_c, 1, 51820), 0);
849+
ck_assert_int_eq(wolfguard_init(&wg_dev_c, &stack_c, TEST_WG_IF, 51820), 0);
842850
wc_RNG_GenerateBlock(&test_rng, priv_c, WG_PRIVATE_KEY_LEN);
843851
ck_assert_int_eq(wolfguard_set_private_key(&wg_dev_c, priv_c), 0);
844-
wolfIP_ipconfig_set_ex(&stack_c, 1, MAKE_IP4(10,0,2,1),
852+
wolfIP_ipconfig_set_ex(&stack_c, TEST_WG_IF, MAKE_IP4(10,0,2,1),
845853
MAKE_IP4(255,255,255,0), 0);
846854

847855
/* Add peers */

src/test/unit/unit.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,10 @@ Suite *wolf_suite(void)
115115
#if WOLFIP_ENABLE_LOOPBACK
116116
tcase_add_test(tc_utils, test_wolfip_loopback_defaults);
117117
tcase_add_test(tc_utils, test_wolfip_loopback_send_paths);
118+
tcase_add_test(tc_utils, test_wolfip_loopback_poll_paths);
119+
tcase_add_test(tc_utils, test_wolfip_loopback_poll_keeps_pending_on_short_buffer);
118120
tcase_add_test(tc_utils, test_wolfip_loopback_send_drops_oversize);
119-
tcase_add_test(tc_utils, test_wolfip_loopback_send_null_container);
121+
tcase_add_test(tc_utils, test_wolfip_loopback_send_queue_full_returns_eagain);
120122
tcase_add_test(tc_utils, test_wolfip_loopback_send_rejects_null_args);
121123
#endif
122124
tcase_add_test(tc_utils, test_wolfip_send_port_unreachable_ignores_missing_link_sender);
@@ -770,7 +772,13 @@ Suite *wolf_suite(void)
770772
tcase_add_test(tc_proto, test_regression_syn_on_established_not_silently_processed);
771773
tcase_add_test(tc_proto, test_regression_syn_on_last_ack_not_silently_processed);
772774
tcase_add_test(tc_proto, test_regression_full_txbuf_still_sends_pure_ack);
773-
tcase_add_test(tc_proto, test_regression_loopback_immediate_pure_ack_uses_loopback_ll);
775+
tcase_add_test(tc_proto, test_regression_loopback_pure_ack_uses_deferred_buffer_until_poll);
776+
tcase_add_test(tc_proto, test_regression_loopback_pure_ack_drain_allows_next_send_cycle);
777+
tcase_add_test(tc_proto, test_regression_loopback_pure_ack_immediate_propagates_eagain_when_queue_full);
778+
tcase_add_test(tc_proto, test_regression_loopback_udp_tx_backpressure_retries_after_queue_drain);
779+
tcase_add_test(tc_proto, test_regression_ll_send_frame_returns_wolfip_error_codes);
780+
tcase_add_test(tc_proto, test_regression_loopback_ack_retry_pending_requeued_on_poll);
781+
tcase_add_test(tc_proto, test_regression_loopback_queue_full_pure_ack_backpressure_retry);
774782
tcase_add_test(tc_proto, test_regression_tcp_tx_desc_payload_len_keeps_descriptor_layout_sanity);
775783
tcase_add_test(tc_proto, test_regression_fast_recovery_cwnd_ssthresh_rfc5681);
776784
tcase_add_test(tc_proto, test_regression_paws_rejects_stale_timestamp);

src/test/unit/unit_esp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#undef WOLFIP_MAX_INTERFACES
2929
#define WOLFIP_MAX_INTERFACES 1
3030
#undef WOLFIP_ENABLE_LOOPBACK
31+
#define WOLFIP_ENABLE_LOOPBACK 0
3132

3233
#include "check.h"
3334
#include "../../../config.h"

0 commit comments

Comments
 (0)