Skip to content

Commit 96a8d8d

Browse files
committed
Added tests for non-Ethernet receive framing path
1 parent fa94e4b commit 96a8d8d

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

src/test/unit/unit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ Suite *wolf_suite(void)
374374
tcase_add_test(tc_utils, test_ll_send_frame_drops_oversize);
375375
tcase_add_test(tc_utils, test_ll_helpers_invalid_inputs);
376376
tcase_add_test(tc_utils, test_non_ethernet_recv_oversize_dropped);
377+
tcase_add_test(tc_utils, test_non_ethernet_recv_wrapper_delivers_udp_and_skips_eth_filter);
378+
tcase_add_test(tc_utils, test_non_ethernet_recv_ex_wrapper_delivers_udp_on_second_if);
377379
#endif
378380
tcase_add_test(tc_utils, test_dns_format_ptr_name);
379381
tcase_add_test(tc_utils, test_dns_skip_and_copy_name);

src/test/unit/unit_tests_tcp_ack.c

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2961,6 +2961,134 @@ START_TEST(test_non_ethernet_recv_oversize_dropped)
29612961
}
29622962
END_TEST
29632963

2964+
START_TEST(test_non_ethernet_recv_wrapper_delivers_udp_and_skips_eth_filter)
2965+
{
2966+
struct wolfIP s;
2967+
int udp_sd;
2968+
struct tsocket *ts;
2969+
struct wolfIP_ll_dev *ll;
2970+
struct wolfIP_sockaddr_in sin;
2971+
struct wolfIP_sockaddr_in from;
2972+
uint8_t raw[IP_HEADER_LEN + UDP_HEADER_LEN + 4];
2973+
uint8_t payload[4] = {1, 2, 3, 4};
2974+
uint8_t udp_buf[sizeof(struct wolfIP_udp_datagram) + sizeof(payload)];
2975+
struct wolfIP_udp_datagram *udp = (struct wolfIP_udp_datagram *)udp_buf;
2976+
uint8_t rxbuf[sizeof(payload)];
2977+
socklen_t from_len = sizeof(from);
2978+
int ret;
2979+
2980+
wolfIP_init(&s);
2981+
mock_link_init(&s);
2982+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
2983+
2984+
ll = wolfIP_getdev_ex(&s, TEST_PRIMARY_IF);
2985+
ck_assert_ptr_nonnull(ll);
2986+
ll->non_ethernet = 1;
2987+
2988+
filter_block_reason = WOLFIP_FILT_RECEIVING;
2989+
wolfIP_filter_set_callback(test_filter_cb_block, NULL);
2990+
wolfIP_filter_set_eth_mask(WOLFIP_FILT_MASK(WOLFIP_FILT_RECEIVING));
2991+
2992+
udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
2993+
ck_assert_int_gt(udp_sd, 0);
2994+
memset(&sin, 0, sizeof(sin));
2995+
sin.sin_family = AF_INET;
2996+
sin.sin_port = ee16(1234);
2997+
sin.sin_addr.s_addr = ee32(0x0A000001U);
2998+
ck_assert_int_eq(wolfIP_sock_bind(&s, udp_sd,
2999+
(struct wolfIP_sockaddr *)&sin, sizeof(sin)), 0);
3000+
ts = &s.udpsockets[SOCKET_UNMARK(udp_sd)];
3001+
3002+
memset(udp_buf, 0, sizeof(udp_buf));
3003+
udp->ip.ver_ihl = 0x45;
3004+
udp->ip.ttl = 64;
3005+
udp->ip.proto = WI_IPPROTO_UDP;
3006+
udp->ip.len = ee16(IP_HEADER_LEN + UDP_HEADER_LEN + sizeof(payload));
3007+
udp->ip.src = ee32(0x0A000002U);
3008+
udp->ip.dst = ee32(0x0A000001U);
3009+
udp->src_port = ee16(5678);
3010+
udp->dst_port = ee16(1234);
3011+
udp->len = ee16(UDP_HEADER_LEN + sizeof(payload));
3012+
memcpy(udp->data, payload, sizeof(payload));
3013+
fix_udp_checksums(udp);
3014+
memcpy(raw, udp_buf + ETH_HEADER_LEN, sizeof(raw));
3015+
3016+
wolfIP_recv(&s, raw, (uint32_t)sizeof(raw));
3017+
3018+
memset(&from, 0, sizeof(from));
3019+
ret = wolfIP_sock_recvfrom(&s, udp_sd, rxbuf, sizeof(rxbuf), 0,
3020+
(struct wolfIP_sockaddr *)&from, &from_len);
3021+
ck_assert_int_eq(ret, (int)sizeof(payload));
3022+
ck_assert_mem_eq(rxbuf, payload, sizeof(payload));
3023+
ck_assert_uint_eq(from.sin_addr.s_addr, ee32(0x0A000002U));
3024+
ck_assert_uint_eq(from.sin_port, ee16(5678));
3025+
ck_assert_ptr_eq(fifo_peek(&ts->sock.udp.rxbuf), NULL);
3026+
3027+
wolfIP_filter_set_callback(NULL, NULL);
3028+
wolfIP_filter_set_eth_mask(0);
3029+
}
3030+
END_TEST
3031+
3032+
START_TEST(test_non_ethernet_recv_ex_wrapper_delivers_udp_on_second_if)
3033+
{
3034+
struct wolfIP s;
3035+
int udp_sd;
3036+
struct wolfIP_ll_dev *ll;
3037+
struct wolfIP_sockaddr_in sin;
3038+
struct wolfIP_sockaddr_in from;
3039+
uint8_t raw[IP_HEADER_LEN + UDP_HEADER_LEN + 4];
3040+
uint8_t payload[4] = {9, 8, 7, 6};
3041+
uint8_t udp_buf[sizeof(struct wolfIP_udp_datagram) + sizeof(payload)];
3042+
struct wolfIP_udp_datagram *udp = (struct wolfIP_udp_datagram *)udp_buf;
3043+
uint8_t rxbuf[sizeof(payload)];
3044+
socklen_t from_len = sizeof(from);
3045+
int ret;
3046+
3047+
wolfIP_init(&s);
3048+
mock_link_init(&s);
3049+
mock_link_init_idx(&s, TEST_SECOND_IF, NULL);
3050+
s.ipconf[TEST_SECOND_IF].ip = 0x0A000101U;
3051+
s.ipconf[TEST_SECOND_IF].mask = 0xFFFFFF00U;
3052+
3053+
ll = wolfIP_getdev_ex(&s, TEST_SECOND_IF);
3054+
ck_assert_ptr_nonnull(ll);
3055+
ll->non_ethernet = 1;
3056+
3057+
udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
3058+
ck_assert_int_gt(udp_sd, 0);
3059+
memset(&sin, 0, sizeof(sin));
3060+
sin.sin_family = AF_INET;
3061+
sin.sin_port = ee16(2345);
3062+
sin.sin_addr.s_addr = ee32(0x0A000101U);
3063+
ck_assert_int_eq(wolfIP_sock_bind(&s, udp_sd,
3064+
(struct wolfIP_sockaddr *)&sin, sizeof(sin)), 0);
3065+
3066+
memset(udp_buf, 0, sizeof(udp_buf));
3067+
udp->ip.ver_ihl = 0x45;
3068+
udp->ip.ttl = 64;
3069+
udp->ip.proto = WI_IPPROTO_UDP;
3070+
udp->ip.len = ee16(IP_HEADER_LEN + UDP_HEADER_LEN + sizeof(payload));
3071+
udp->ip.src = ee32(0x0A000102U);
3072+
udp->ip.dst = ee32(0x0A000101U);
3073+
udp->src_port = ee16(6789);
3074+
udp->dst_port = ee16(2345);
3075+
udp->len = ee16(UDP_HEADER_LEN + sizeof(payload));
3076+
memcpy(udp->data, payload, sizeof(payload));
3077+
fix_udp_checksums(udp);
3078+
memcpy(raw, udp_buf + ETH_HEADER_LEN, sizeof(raw));
3079+
3080+
wolfIP_recv_ex(&s, TEST_SECOND_IF, raw, (uint32_t)sizeof(raw));
3081+
3082+
memset(&from, 0, sizeof(from));
3083+
ret = wolfIP_sock_recvfrom(&s, udp_sd, rxbuf, sizeof(rxbuf), 0,
3084+
(struct wolfIP_sockaddr *)&from, &from_len);
3085+
ck_assert_int_eq(ret, (int)sizeof(payload));
3086+
ck_assert_mem_eq(rxbuf, payload, sizeof(payload));
3087+
ck_assert_uint_eq(from.sin_addr.s_addr, ee32(0x0A000102U));
3088+
ck_assert_uint_eq(from.sin_port, ee16(6789));
3089+
}
3090+
END_TEST
3091+
29643092
START_TEST(test_forward_packet_filter_drop_udp_icmp)
29653093
{
29663094
struct wolfIP s;

0 commit comments

Comments
 (0)