forked from wolfSSL/wolfip
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunit.c
More file actions
812 lines (795 loc) · 54.2 KB
/
unit.c
File metadata and controls
812 lines (795 loc) · 54.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
#include "unit_shared.c"
#include "unit_tests_fifo.c"
#include "unit_tests_api.c"
#include "unit_tests_dns_dhcp.c"
#include "unit_tests_tcp_ack.c"
#include "unit_tests_tcp_flow.c"
#include "unit_tests_proto.c"
Suite *wolf_suite(void)
{
Suite *s;
TCase *tc_core, *tc_proto, *tc_utils, *tc_wolfssl;
s = suite_create("wolfIP");
tc_core = tcase_create("Core");
tc_utils = tcase_create("Utils");
tc_proto = tcase_create("Protocols");
tc_wolfssl = tcase_create("wolfSSL-IO");
tcase_add_test(tc_core, test_fifo_init);
tcase_add_test(tc_core, test_fifo_peek_wraps_tail_when_head_lt_tail);
tcase_add_test(tc_core, test_fifo_peek_no_wrap_when_space_available);
tcase_add_test(tc_core, test_fifo_next_wraps_on_hwrap);
tcase_add_test(tc_core, test_fifo_pop_aligns_tail_to_head_returns_null);
tcase_add_test(tc_core, test_fifo_pop_wraps_tail_when_head_lt_tail);
tcase_add_test(tc_core, test_fifo_pop_no_wrap_when_space_available);
tcase_add_test(tc_core, test_fifo_peek_empty_unaligned_tail);
tcase_add_test(tc_core, test_fifo_len_empty_unaligned_tail);
tcase_add_test(tc_core, test_fifo_pop_empty_unaligned_tail);
tcase_add_test(tc_core, test_fifo_push_pop_odd_sizes_drains_cleanly);
tcase_add_test(tc_core, test_fifo_full_wrap_does_not_appear_empty_or_discard_packets);
tcase_add_test(tc_core, test_fifo_next_stops_at_aligned_head_when_head_unaligned);
tcase_add_test(tc_core, test_fifo_full_wrap_next_iterates_all_entries_without_loss);
tcase_add_test(tc_core, test_fifo_wrap_full_pop_then_refill_keeps_order_without_drops);
tcase_add_test(tc_core, test_fifo_wrap_flag_transitions_push_pop_around_boundary);
tcase_add_test(tc_core, test_fifo_wrap_flag_repeated_flips_keep_data_consistent);
tcase_add_test(tc_core, test_fifo_wrap_flag_transitions_with_odd_payload_sizes);
tcase_add_test(tc_core, test_fifo_wrap_flag_repeated_flips_with_odd_payload_sizes);
tcase_add_test(tc_core, test_fifo_push_and_pop);
tcase_add_test(tc_core, test_fifo_push_and_pop_multiple);
tcase_add_test(tc_core, test_fifo_pop_success);
tcase_add_test(tc_core, test_fifo_pop_empty);
tcase_add_test(tc_core, test_fifo_push_full);
tcase_add_test(tc_core, test_fifo_can_push_len_null_and_oversized);
tcase_add_test(tc_core, test_fifo_can_push_len_head_tail_equal_with_wrap);
tcase_add_test(tc_core, test_fifo_can_push_len_wrap_tail_too_small_rejects);
tcase_add_test(tc_core, test_fifo_can_push_len_wrap_to_zero_then_accepts);
tcase_add_test(tc_core, test_fifo_can_push_len_head_at_wrap_boundary);
tcase_add_test(tc_core, test_fifo_push_wrap);
tcase_add_test(tc_core, test_fifo_push_wrap_multiple);
tcase_add_test(tc_core, test_fifo_push_wrap_tail_equals_needed);
tcase_add_test(tc_core, test_fifo_can_push_len_wrap_tail_equals_needed);
tcase_add_test(tc_core, test_fifo_space_wrap_sets_hwrap);
tcase_add_test(tc_core, test_fifo_space_wrap_returns_zero);
tcase_add_test(tc_core, test_fifo_peek_wrap_to_start);
tcase_add_test(tc_core, test_fifo_len_with_hwrap);
tcase_add_test(tc_core, test_fifo_peek_aligns_tail);
tcase_add_test(tc_core, test_fifo_next_wraps_to_start);
tcase_add_test(tc_core, test_fifo_space_head_lt_tail);
tcase_add_test(tc_core, test_fifo_space_with_hwrap);
tcase_add_test(tc_core, test_fifo_space_hwrap_head_hits_wrap);
tcase_add_test(tc_core, test_fifo_space_hwrap_head_ge_tail_returns_zero);
tcase_add_test(tc_core, test_fifo_next_hits_hwrap);
tcase_add_test(tc_core, test_fifo_push_no_contiguous_space_even_with_space);
tcase_add_test(tc_core, test_fifo_next_aligned_len_exceeds_size_returns_null);
tcase_add_test(tc_core, test_fifo_len_tail_gt_head_no_hwrap);
tcase_add_test(tc_core, test_fifo_pop_wrap_to_start);
tcase_add_test(tc_core, test_fifo_next_success);
tcase_add_test(tc_core, test_fifo_next_empty_fifo);
tcase_add_test(tc_core, test_fifo_next_end_of_fifo);
tcase_add_test(tc_core, test_queue_init);
tcase_add_test(tc_core, test_queue_space_empty);
tcase_add_test(tc_core, test_queue_len_empty);
tcase_add_test(tc_core, test_queue_partial_fill);
tcase_add_test(tc_core, test_queue_wrap_around);
tcase_add_test(tc_core, test_queue_insert_empty);
tcase_add_test(tc_core, test_queue_insert_sequential);
tcase_add_test(tc_core, test_queue_insert_negative_diff);
tcase_add_test(tc_core, test_queue_insert_wraparound_contiguous_and_old_rejected);
tcase_add_test(tc_core, test_queue_insert_pos_gt_size);
tcase_add_test(tc_core, test_queue_insert_ancient_data);
tcase_add_test(tc_core, test_queue_insert_wrap);
tcase_add_test(tc_core, test_queue_space_wrap);
tcase_add_test(tc_core, test_queue_insert_len_gt_size);
tcase_add_test(tc_core, test_queue_insert_len_gt_space);
tcase_add_test(tc_core, test_queue_insert_len_gt_size_returns_error);
tcase_add_test(tc_core, test_queue_pop);
tcase_add_test(tc_core, test_queue_pop_wraparound);
tcase_add_test(tc_core, test_queue_insert_updates_head_when_pos_plus_len_gt_head);
tcase_add_test(tc_core, test_queue_insert_no_head_update_when_pos_plus_len_le_head);
tcase_add_test(tc_core, test_queue_full_state_not_empty_and_drains_data);
tcase_add_test(tc_utils, test_insert_timer);
tcase_add_test(tc_utils, test_timer_insert_skips_zero_head);
tcase_add_test(tc_utils, test_timer_cancel_existing_and_missing);
tcase_add_test(tc_utils, test_pop_timer);
tcase_add_test(tc_utils, test_is_timer_expired);
tcase_add_test(tc_utils, test_cancel_timer);
tcase_add_test(tc_utils, test_timer_pop_skips_zero_expires);
tcase_add_test(tc_utils, test_timer_pop_reorders_heap);
tcase_add_test(tc_utils, test_timer_pop_right_child_swap);
tcase_add_test(tc_utils, test_timer_pop_break_when_root_small);
tcase_add_test(tc_utils, test_is_timer_expired_skips_zero_head);
tcase_add_test(tc_utils, test_wolfip_getdev_ex_api);
tcase_add_test(tc_utils, test_wolfip_ll_frame_mtu_enforces_minimum);
tcase_add_test(tc_utils, test_transport_capacity_helpers_cover_guard_paths);
tcase_add_test(tc_utils, test_tx_has_writable_space_icmp_accepts_minimal_packet);
tcase_add_test(tc_utils, test_wolfip_if_for_local_ip_single_interface_falls_back_to_zero);
tcase_add_test(tc_utils, test_wolfip_mtu_set_get_api);
tcase_add_test(tc_utils, test_wolfip_ll_at_and_ipconf_at_invalid);
tcase_add_test(tc_utils, test_ip_is_local_conf_variants);
#if WOLFIP_ENABLE_LOOPBACK
tcase_add_test(tc_utils, test_wolfip_loopback_defaults);
tcase_add_test(tc_utils, test_wolfip_loopback_send_paths);
tcase_add_test(tc_utils, test_wolfip_loopback_send_drops_oversize);
tcase_add_test(tc_utils, test_wolfip_loopback_send_null_container);
tcase_add_test(tc_utils, test_wolfip_loopback_send_rejects_null_args);
#endif
tcase_add_test(tc_utils, test_wolfip_send_port_unreachable_ignores_missing_link_sender);
tcase_add_test(tc_utils, test_wolfip_send_port_unreachable_non_ethernet_skips_eth_filter);
tcase_add_test(tc_utils, test_tcp_adv_win_clamps_and_applies_window_scale);
tcase_add_test(tc_utils, test_tcp_segment_acceptable_zero_window_and_overlap_cases);
tcase_add_test(tc_utils, test_tcp_segment_acceptable_counts_syn_in_segment_length);
tcase_add_test(tc_utils, test_wolfip_ipconfig_ex_per_interface);
tcase_add_test(tc_utils, test_wolfip_poll_executes_timers_and_callbacks);
tcase_add_test(tc_utils, test_wolfip_poll_drains_all_expired_timers_in_one_pass);
tcase_add_test(tc_utils, test_wolfip_poll_preserves_tcp_events_raised_during_callback);
tcase_add_test(tc_utils, test_wolfip_poll_limits_device_drain_to_poll_budget);
tcase_add_test(tc_utils, test_filter_notify_tcp_metadata);
tcase_add_test(tc_utils, test_filter_dispatch_no_callback);
tcase_add_test(tc_utils, test_filter_dispatch_mask_not_set);
tcase_add_test(tc_utils, test_filter_dispatch_lock_blocks);
tcase_add_test(tc_utils, test_filter_dispatch_meta_null_initializes);
tcase_add_test(tc_utils, test_filter_socket_event_unknown_proto);
tcase_add_test(tc_utils, test_filter_socket_event_null_socket_uses_primary_defaults);
tcase_add_test(tc_utils, test_filter_socket_event_proto_variants);
tcase_add_test(tc_utils, test_filter_setters_and_get_mask);
tcase_add_test(tc_utils, test_sock_socket_errors);
tcase_add_test(tc_utils, test_sock_socket_udp_protocol_zero);
tcase_add_test(tc_utils, test_sock_socket_full_tables);
tcase_add_test(tc_utils, test_filter_mask_for_proto_variants);
tcase_add_test(tc_utils, test_filter_dispatch_paths);
tcase_add_test(tc_utils, test_sock_wrappers_basic);
tcase_add_test(tc_utils, test_sock_error_paths);
tcase_add_test(tc_utils, test_sock_name_and_opt_errors);
tcase_add_test(tc_utils, test_inline_helpers);
tcase_add_test(tc_utils, test_sock_bind_wrong_family);
tcase_add_test(tc_utils, test_sock_bind_invalid_fd);
tcase_add_test(tc_utils, test_sock_bind_tcp_state_not_closed);
tcase_add_test(tc_utils, test_sock_bind_tcp_filter_blocks);
tcase_add_test(tc_utils, test_sock_bind_udp_src_port_nonzero);
tcase_add_test(tc_utils, test_sock_bind_udp_filter_blocks);
tcase_add_test(tc_utils, test_sock_bind_icmp_success);
tcase_add_test(tc_utils, test_sock_connect_wrong_family);
tcase_add_test(tc_utils, test_sock_accept_error_paths);
tcase_add_test(tc_utils, test_sock_accept_non_tcp_socket_sets_addrlen);
tcase_add_test(tc_utils, test_sock_accept_null_addr_with_addrlen);
tcase_add_test(tc_utils, test_sock_recvfrom_short_addrlen);
tcase_add_test(tc_utils, test_sock_recvfrom_udp_short_addrlen);
tcase_add_test(tc_utils, test_sock_recvfrom_icmp_short_addrlen);
tcase_add_test(tc_utils, test_sock_recvfrom_udp_fifo_alignment);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_close_wait_sets_readable);
tcase_add_test(tc_utils, test_sock_recvfrom_udp_readable_stays_when_queue_nonempty);
tcase_add_test(tc_utils, test_sock_bind_non_local_ip_fails);
tcase_add_test(tc_utils, test_sock_connect_bad_addrlen);
tcase_add_test(tc_utils, test_sock_connect_tcp_bad_addrlen);
tcase_add_test(tc_utils, test_sock_connect_invalid_args);
tcase_add_test(tc_utils, test_sock_connect_invalid_tcp_fd);
tcase_add_test(tc_utils, test_sock_connect_udp_invalid_fd);
tcase_add_test(tc_utils, test_sock_connect_udp_wrong_family);
tcase_add_test(tc_utils, test_sock_connect_udp_short_addrlen);
tcase_add_test(tc_utils, test_sock_connect_icmp_invalid_fd);
tcase_add_test(tc_utils, test_sock_connect_udp_sets_local_ip_from_conf);
tcase_add_test(tc_utils, test_sock_connect_udp_falls_back_to_primary);
tcase_add_test(tc_utils, test_sock_connect_udp_primary_missing);
tcase_add_test(tc_utils, test_sock_connect_udp_bound_local_ip_no_match);
tcase_add_test(tc_utils, test_sock_connect_udp_bound_local_ip_match);
tcase_add_test(tc_utils, test_sock_connect_icmp_sets_local_ip_from_conf);
tcase_add_test(tc_utils, test_sock_connect_icmp_bound_local_ip_match);
tcase_add_test(tc_utils, test_sock_connect_icmp_wrong_family);
tcase_add_test(tc_utils, test_sock_connect_icmp_local_ip_pre_set);
tcase_add_test(tc_utils, test_sock_connect_icmp_conf_null);
tcase_add_test(tc_utils, test_sock_connect_icmp_falls_back_to_primary);
tcase_add_test(tc_utils, test_sock_connect_icmp_primary_ip_any);
tcase_add_test(tc_utils, test_sock_connect_icmp_primary_ip_fallback);
tcase_add_test(tc_utils, test_sock_connect_tcp_established_returns_zero);
tcase_add_test(tc_utils, test_sock_connect_tcp_bound_local_ip_match);
tcase_add_test(tc_utils, test_sock_connect_tcp_bound_local_ip_no_match);
tcase_add_test(tc_utils, test_sock_connect_tcp_filter_blocks);
tcase_add_test(tc_utils, test_sock_connect_tcp_local_ip_from_conf);
tcase_add_test(tc_utils, test_sock_connect_tcp_local_ip_from_primary);
tcase_add_test(tc_utils, test_sock_connect_tcp_primary_ip_fallback);
tcase_add_test(tc_utils, test_sock_connect_tcp_conf_null_primary_null);
tcase_add_test(tc_utils, test_sock_connect_tcp_state_not_closed);
tcase_add_test(tc_utils, test_sock_accept_negative_fd);
tcase_add_test(tc_utils, test_sock_accept_invalid_tcp_fd);
tcase_add_test(tc_utils, test_sock_accept_success_sets_addr);
tcase_add_test(tc_utils, test_sock_accept_no_available_socket);
tcase_add_test(tc_utils, test_sock_accept_no_free_socket_syn_rcvd);
tcase_add_test(tc_utils, test_sock_accept_listen_no_connection);
tcase_add_test(tc_utils, test_sock_accept_bound_local_ip_no_match);
tcase_add_test(tc_utils, test_sock_accept_starts_rto_timer);
tcase_add_test(tc_utils, test_sock_accept_initializes_snd_una);
tcase_add_test(tc_utils, test_sock_accept_clones_half_open_state_and_queues_synack);
tcase_add_test(tc_utils, test_sock_accept_synack_retransmission);
tcase_add_test(tc_utils, test_sock_accept_synack_window_not_scaled);
tcase_add_test(tc_utils, test_sock_accept_ack_transitions_to_established);
tcase_add_test(tc_utils, test_sock_sendto_error_paths);
tcase_add_test(tc_utils, test_sock_sendto_null_buf_or_len_zero);
tcase_add_test(tc_utils, test_sock_sendto_tcp_not_established);
tcase_add_test(tc_utils, test_sock_sendto_tcp_close_wait_allowed);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_states);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_close_wait_empty_returns_zero);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_close_wait_with_data);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_established_sets_readable);
tcase_add_test(tc_utils, test_sock_recvfrom_tcp_established_no_remaining_data);
tcase_add_test(tc_utils, test_tcp_recv_does_not_cancel_rto_timer);
tcase_add_test(tc_utils, test_sock_recvfrom_invalid_socket_ids);
tcase_add_test(tc_utils, test_sock_recvfrom_non_socket);
tcase_add_test(tc_utils, test_sock_recvfrom_icmp_success);
#ifdef DEBUG_UDP
tcase_add_test(tc_utils, test_wolfip_print_udp_short_len_no_oob);
#endif
tcase_add_test(tc_utils, test_sock_recvfrom_icmp_readable_stays_when_queue_nonempty);
tcase_add_test(tc_utils, test_sock_opts_unknown_level);
tcase_add_test(tc_utils, test_sock_opts_sol_ip_unknown_optname);
tcase_add_test(tc_utils, test_sock_setsockopt_recvttl);
tcase_add_test(tc_utils, test_sock_setsockopt_invalid_socket);
tcase_add_test(tc_utils, test_sock_setsockopt_recvttl_invalid_params);
tcase_add_test(tc_utils, test_sock_getsockopt_recvttl_enabled_state);
tcase_add_test(tc_utils, test_sock_getsockopt_invalid_socket);
tcase_add_test(tc_utils, test_sock_can_read_write_paths);
tcase_add_test(tc_utils, test_sock_getsockopt_recvttl_invalid_params);
tcase_add_test(tc_utils, test_sock_get_recv_ttl_invalid_socket);
tcase_add_test(tc_utils, test_sock_accept_wrong_state);
tcase_add_test(tc_utils, test_sock_get_recv_ttl_disabled);
tcase_add_test(tc_utils, test_sock_get_recv_ttl_null);
tcase_add_test(tc_utils, test_sock_connect_tcp_states);
tcase_add_test(tc_utils, test_sock_listen_errors);
tcase_add_test(tc_utils, test_sock_getpeername_errors);
tcase_add_test(tc_utils, test_sock_getsockname_errors);
tcase_add_test(tc_utils, test_sock_getsockname_null_addr);
tcase_add_test(tc_utils, test_sock_getsockname_invalid_socket_ids);
tcase_add_test(tc_utils, test_sock_getsockname_icmp_success);
tcase_add_test(tc_utils, test_register_callback_variants);
tcase_add_test(tc_utils, test_sock_connect_udp_bound_ip_not_local);
tcase_add_test(tc_utils, test_sock_connect_udp_bound_ip_success);
tcase_add_test(tc_utils, test_sock_connect_udp_primary_fallback);
tcase_add_test(tc_utils, test_sock_connect_icmp_primary_fallback);
tcase_add_test(tc_utils, test_sock_connect_tcp_filter_drop);
tcase_add_test(tc_utils, test_sock_connect_tcp_src_port_low);
tcase_add_test(tc_utils, test_sock_connect_tcp_initial_seq_randomized);
tcase_add_test(tc_utils, test_sock_connect_tcp_txbuf_full_does_not_enter_syn_sent);
tcase_add_test(tc_utils, test_sock_sendto_more_error_paths);
tcase_add_test(tc_utils, test_sock_sendto_udp_no_dest);
tcase_add_test(tc_utils, test_sock_sendto_udp_sets_dest_and_assigns);
tcase_add_test(tc_utils, test_sock_sendto_udp_addrlen_short);
tcase_add_test(tc_utils, test_sock_sendto_udp_len_too_large);
tcase_add_test(tc_utils, test_sock_sendto_udp_fifo_full);
tcase_add_test(tc_utils, test_sock_sendto_icmp_len_invalid);
tcase_add_test(tc_utils, test_sock_sendto_icmp_fifo_full);
tcase_add_test(tc_utils, test_sock_sendto_icmp_addrlen_short);
tcase_add_test(tc_utils, test_sock_sendto_icmp_remote_zero);
tcase_add_test(tc_utils, test_sock_sendto_icmp_assigns_src_port_and_sets_echo_id);
tcase_add_test(tc_utils, test_sock_sendto_invalid_socket_ids);
tcase_add_test(tc_utils, test_sock_sendto_non_socket_returns_minus_one);
tcase_add_test(tc_utils, test_sock_sendto_udp_remote_ip_zero);
tcase_add_test(tc_utils, test_sock_sendto_udp_primary_ip_fallback);
tcase_add_test(tc_utils, test_sock_sendto_udp_zero_port_in_addr);
tcase_add_test(tc_utils, test_sock_sendto_udp_src_port_low_adjusts);
tcase_add_test(tc_utils, test_sock_sendto_udp_local_ip_conf_null);
tcase_add_test(tc_utils, test_sock_sendto_udp_local_ip_from_primary);
tcase_add_test(tc_utils, test_sock_sendto_tcp_txbuf_full);
tcase_add_test(tc_utils, test_sock_sendto_tcp_partial_send_only);
tcase_add_test(tc_utils, test_sock_sendto_tcp_multiple_segments_flags);
tcase_add_test(tc_utils, test_sock_sendto_udp_fifo_push_fails_returns_eagain);
tcase_add_test(tc_utils, test_sock_sendto_icmp_fifo_push_fails_returns_eagain);
tcase_add_test(tc_utils, test_sock_sendto_icmp_src_port_zero_random_zero_sets_one);
tcase_add_test(tc_utils, test_sock_sendto_icmp_non_echo_no_set_id);
tcase_add_test(tc_utils, test_sock_sendto_icmp_local_ip_from_primary);
tcase_add_test(tc_utils, test_sock_sendto_icmp_local_ip_pre_set);
tcase_add_test(tc_utils, test_sock_sendto_icmp_conf_null_primary_null);
tcase_add_test(tc_utils, test_sock_recvfrom_icmp_paths);
tcase_add_test(tc_utils, test_sock_recvfrom_udp_payload_too_long);
tcase_add_test(tc_utils, test_sock_recvfrom_icmp_payload_too_long);
tcase_add_test(tc_utils, test_sock_accept_success);
tcase_add_test(tc_utils, test_sock_accept_synack_rto_txbuf_full_does_not_consume_retry);
tcase_add_test(tc_utils, test_sock_accept_ack_with_payload_completes_handshake);
tcase_add_test(tc_utils, test_sock_accept_ack_at_snd_nxt_completes_handshake);
tcase_add_test(tc_utils, test_sock_accept_ack_psh_with_payload_completes_handshake);
tcase_add_test(tc_utils, test_sock_accept_filtered_out);
tcase_add_test(tc_utils, test_poll_tcp_ack_only_skips_send);
tcase_add_test(tc_utils, test_poll_tcp_send_on_arp_hit);
tcase_add_test(tc_utils, test_poll_tcp_residual_window_gates_data_segment);
tcase_add_test(tc_utils, test_poll_tcp_residual_window_allows_exact_fit);
tcase_add_test(tc_utils, test_poll_tcp_zero_window_arms_persist);
tcase_add_test(tc_utils, test_tcp_persist_start_stops_when_window_reopens_or_no_unsent_payload);
tcase_add_test(tc_utils, test_tcp_persist_helpers_ignore_non_tcp_and_null_inputs);
tcase_add_test(tc_utils, test_tcp_has_pending_unsent_payload_ignores_zero_ip_len_ack_only_desc);
tcase_add_test(tc_utils, test_tcp_initial_cwnd_caps_to_iw10_and_half_rwnd);
tcase_add_test(tc_utils, test_tcp_persist_cb_sends_one_byte_probe);
tcase_add_test(tc_utils, test_tcp_zero_wnd_probe_rejects_invalid_inputs_and_empty_payload);
tcase_add_test(tc_utils, test_tcp_zero_wnd_probe_skips_ack_only_segment);
tcase_add_test(tc_utils, test_tcp_zero_wnd_probe_selects_middle_byte_at_snd_una);
tcase_add_test(tc_utils, test_tcp_persist_probe_byte_matches_snd_una_offset);
tcase_add_test(tc_utils, test_tcp_zero_wnd_probe_arp_miss_requests_resolution);
tcase_add_test(tc_utils, test_tcp_rto_cb_marks_snd_una_payload_for_retransmit);
tcase_add_test(tc_utils, test_tcp_rto_cb_clears_bookkeeping_when_no_payload_pending);
tcase_add_test(tc_utils, test_tcp_rto_cb_closes_socket_when_backoff_exhausted);
tcase_add_test(tc_utils, test_tcp_input_window_reopen_stops_persist);
tcase_add_test(tc_utils, test_tcp_persist_cb_stops_when_state_invalid);
tcase_add_test(tc_utils, test_tcp_persist_cb_stops_when_window_reopens);
tcase_add_test(tc_utils, test_poll_tcp_arp_request_on_miss);
tcase_add_test(tc_utils, test_poll_udp_send_on_arp_hit);
tcase_add_test(tc_utils, test_poll_udp_send_on_arp_miss_requests_arp_and_retains_queue);
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_hit);
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_miss_requests_arp_and_retains_queue);
tcase_add_test(tc_utils, test_dhcp_timer_cb_paths);
tcase_add_test(tc_utils, test_regression_dhcp_lease_expiry_deconfigures_address);
tcase_add_test(tc_utils, test_dhcp_timer_cb_send_failure_does_not_consume_retry_budget);
tcase_add_test(tc_utils, test_dhcp_client_init_and_bound);
tcase_add_test(tc_utils, test_dhcp_client_init_bind_failure_closes_socket);
tcase_add_test(tc_utils, test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline);
tcase_add_test(tc_utils, test_dhcp_send_request_rebinding_broadcasts_to_lease_expiry);
tcase_add_test(tc_utils, test_dhcp_send_request_send_failure_retries_next_tick);
tcase_add_test(tc_utils, test_dhcp_send_discover_send_failure_retries_next_tick);
tcase_add_test(tc_utils, test_dhcp_messages_set_secs_from_process_start);
tcase_add_test(tc_utils, test_dhcp_poll_offer_and_ack);
tcase_add_test(tc_utils, test_dhcp_poll_renewing_ack_binds_client);
tcase_add_test(tc_utils, test_dhcp_poll_rebinding_ack_binds_client);
tcase_add_test(tc_utils, test_regression_dhcp_nak_deconfigures_address_during_renew_and_rebind);
tcase_add_test(tc_utils, test_dns_callback_ptr_response);
tcase_add_test(tc_utils, test_udp_try_recv_short_frame);
tcase_add_test(tc_utils, test_udp_try_recv_filter_drop);
tcase_add_test(tc_utils, test_udp_try_recv_dhcp_running_local_zero);
tcase_add_test(tc_utils, test_udp_try_recv_short_expected_len);
tcase_add_test(tc_utils, test_udp_try_recv_len_below_header_rejected);
tcase_add_test(tc_utils, test_udp_try_recv_conf_null);
tcase_add_test(tc_utils, test_udp_try_recv_remote_ip_matches_local_ip);
tcase_add_test(tc_utils, test_udp_try_recv_unmatched_port_sends_icmp_unreachable);
tcase_add_test(tc_utils, test_udp_try_recv_unmatched_nonlocal_dst_does_not_send_icmp);
tcase_add_test(tc_utils, test_udp_try_recv_full_fifo_drop_does_not_set_readable_or_send_icmp);
tcase_add_test(tc_utils, test_dns_callback_bad_flags);
tcase_add_test(tc_utils, test_dns_callback_truncated_response_aborts_query);
tcase_add_test(tc_utils, test_dns_callback_bad_name);
tcase_add_test(tc_utils, test_dns_callback_short_header_ignored);
tcase_add_test(tc_utils, test_dns_callback_wrong_id_ignored);
tcase_add_test(tc_utils, test_dns_callback_non_in_a_answer_ignored);
tcase_add_test(tc_utils, test_dns_callback_non_in_ptr_answer_ignored);
tcase_add_test(tc_utils, test_dns_callback_malformed_compressed_name_aborts_query);
tcase_add_test(tc_utils, test_dns_callback_abort_clears_query_state);
tcase_add_test(tc_utils, test_dns_abort_query_null_noop);
tcase_add_test(tc_utils, test_tcp_input_ttl_zero_local_ack_still_processes);
tcase_add_test(tc_utils, test_dns_callback_bad_rr_rdlen);
tcase_add_test(tc_utils, test_dhcp_parse_offer_no_match);
tcase_add_test(tc_utils, test_dhcp_parse_ack_invalid);
tcase_add_test(tc_utils, test_dhcp_parse_offer_short_len_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_truncated_option_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_len_lt_four_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_ignores_short_unknown_option);
tcase_add_test(tc_utils, test_dhcp_parse_offer_ignores_zero_len_unknown_option);
tcase_add_test(tc_utils, test_dhcp_parse_offer_missing_server_id_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_missing_end_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_msg_type_len_ne_1_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_truncated_option_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_ignores_short_unknown_option);
tcase_add_test(tc_utils, test_dhcp_parse_ack_msg_type_len_ne_1_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_len_lt_four_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_ignores_zero_len_unknown_option);
tcase_add_test(tc_utils, test_dhcp_parse_ack_missing_server_id_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_missing_end_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_bad_magic_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_bad_magic_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_offer_rejects_boot_request_op);
tcase_add_test(tc_utils, test_dhcp_parse_ack_rejects_boot_request_op);
tcase_add_test(tc_utils, test_dhcp_parse_offer_zero_len_option_rejected);
tcase_add_test(tc_utils, test_dhcp_parse_ack_zero_len_option_rejected);
tcase_add_test(tc_utils, test_dhcp_poll_no_data_and_wrong_state);
tcase_add_test(tc_utils, test_dhcp_callback_null_and_off_state);
#if WOLFIP_ENABLE_FORWARDING
tcase_add_test(tc_utils, test_forward_prepare_paths);
tcase_add_test(tc_utils, test_forward_prepare_loopback_no_ll);
tcase_add_test(tc_utils, test_forward_packet_invalid_if);
tcase_add_test(tc_utils, test_forward_packet_no_send);
tcase_add_test(tc_utils, test_forward_packet_filter_drop);
tcase_add_test(tc_utils, test_forward_packet_send_paths);
tcase_add_test(tc_utils, test_forward_packet_filter_drop_udp_icmp);
tcase_add_test(tc_utils, test_ll_send_frame_non_ethernet_strips);
tcase_add_test(tc_utils, test_ll_send_frame_non_ethernet_short_len);
tcase_add_test(tc_utils, test_ll_send_frame_drops_oversize);
tcase_add_test(tc_utils, test_ll_helpers_invalid_inputs);
tcase_add_test(tc_utils, test_non_ethernet_recv_oversize_dropped);
tcase_add_test(tc_utils, test_non_ethernet_recv_wrapper_delivers_udp_and_skips_eth_filter);
tcase_add_test(tc_utils, test_non_ethernet_recv_ex_wrapper_delivers_udp_on_second_if);
#endif
tcase_add_test(tc_utils, test_dns_format_ptr_name);
tcase_add_test(tc_utils, test_dns_skip_and_copy_name);
tcase_add_test(tc_utils, test_sock_opts_and_names);
tcase_add_test(tc_utils, test_dns_send_query_errors);
tcase_add_test(tc_utils, test_dns_schedule_timer_initial_jitter_and_cancel);
tcase_add_test(tc_utils, test_dns_schedule_timer_caps_large_retry_shift);
tcase_add_test(tc_utils, test_dns_send_query_schedules_timeout);
tcase_add_test(tc_utils, test_dns_send_query_send_failure_clears_outstanding_state);
tcase_add_test(tc_utils, test_dns_resend_query_uses_stored_query_buffer);
tcase_add_test(tc_utils, test_dns_resend_query_fails_without_valid_socket);
tcase_add_test(tc_utils, test_dns_resend_query_fails_without_cached_query_buffer);
tcase_add_test(tc_utils, test_dns_resend_query_fails_with_null_stack);
tcase_add_test(tc_utils, test_dns_abort_query_clears_timer_and_query_state);
tcase_add_test(tc_utils, test_dns_timeout_retries_then_aborts_and_allows_new_query);
tcase_add_test(tc_utils, test_dns_send_query_invalid_name);
tcase_add_test(tc_utils, test_dns_wrapper_apis);
tcase_add_test(tc_utils, test_wolfip_static_instance_apis);
tcase_add_test(tc_utils, test_wolfip_ip_is_multicast_variants);
tcase_add_test(tc_utils, test_wolfip_ip_is_broadcast_variants);
tcase_add_test(tc_utils, test_wolfip_ip_is_broadcast_skips_unsuitable_configs);
tcase_add_test(tc_utils, test_wolfip_ip_is_broadcast_skips_zero_mask);
tcase_add_test(tc_utils, test_tcp_rto_cb_resets_flags_and_arms_timer);
tcase_add_test(tc_utils, test_tcp_rto_cb_no_pending_resets_backoff);
tcase_add_test(tc_utils, test_tcp_rto_cb_skips_unsent_desc);
tcase_add_test(tc_utils, test_tcp_rto_cb_does_not_signal_writable_for_zero_ip_len_ack_only_desc);
tcase_add_test(tc_utils, test_tcp_rto_cb_non_tcp_noop);
tcase_add_test(tc_utils, test_tcp_rto_cb_non_established_noop);
tcase_add_test(tc_utils, test_tcp_rto_cb_syn_sent_requeues_syn_and_arms_timer);
tcase_add_test(tc_utils, test_tcp_input_synack_cancels_control_rto);
tcase_add_test(tc_utils, test_tcp_rto_cb_last_ack_requeues_finack_and_arms_timer);
tcase_add_test(tc_utils, test_tcp_rto_cb_last_ack_full_txbuf_keeps_retry_budget);
tcase_add_test(tc_utils, test_tcp_ctrl_state_needs_rto_fin_wait_1_waits_for_payload_drain);
tcase_add_test(tc_utils, test_tcp_rto_cb_fin_wait_1_with_data_uses_data_recovery);
tcase_add_test(tc_utils, test_tcp_rto_cb_fin_wait_1_no_data_requeues_finack);
tcase_add_test(tc_utils, test_tcp_rto_cb_fin_wait_1_no_data_full_txbuf_keeps_retry_budget);
tcase_add_test(tc_utils, test_tcp_ack_fin_wait_1_ack_of_fin_moves_to_fin_wait_2_and_arms_timeout);
tcase_add_test(tc_utils, test_tcp_ack_closing_ack_of_fin_moves_to_time_wait_and_stops_timer);
tcase_add_test(tc_utils, test_tcp_rto_cb_control_retry_cap_closes_socket);
tcase_add_test(tc_utils, test_tcp_rto_cb_cancels_existing_timer);
tcase_add_test(tc_utils, test_tcp_rto_cb_clears_sack_and_marks_lowest_only);
tcase_add_test(tc_utils, test_tcp_rto_cb_ssthresh_uses_inflight_not_cwnd);
tcase_add_test(tc_utils, test_tcp_rto_cb_ssthresh_floor_two_mss);
tcase_add_test(tc_utils, test_tcp_rto_cb_fallback_marks_lowest_sent_when_no_snd_una_cover);
tcase_add_test(tc_utils, test_sock_close_udp_icmp);
tcase_add_test(tc_utils, test_sock_close_invalid_fds);
tcase_add_test(tc_utils, test_sock_close_tcp_fin_wait_1);
tcase_add_test(tc_utils, test_sock_close_tcp_established_full_txbuf_preserves_state);
tcase_add_test(tc_utils, test_sock_close_tcp_close_wait_full_txbuf_preserves_state);
tcase_add_test(tc_utils, test_sock_close_tcp_other_state_closes);
tcase_add_test(tc_utils, test_sock_close_tcp_cancels_rto_timer);
tcase_add_test(tc_utils, test_sock_close_tcp_closed_returns_minus_one);
tcase_add_test(tc_utils, test_tcp_syn_sent_to_established);
tcase_add_test(tc_utils, test_tcp_input_syn_sent_unexpected_flags);
tcase_add_test(tc_utils, test_tcp_input_syn_sent_synack_transitions);
tcase_add_test(tc_utils, test_tcp_input_syn_sent_synack_invalid_ack_rejected);
tcase_add_test(tc_utils, test_tcp_input_syn_listen_does_not_scale_syn_window);
tcase_add_test(tc_utils, test_tcp_input_syn_sent_does_not_scale_synack_window);
tcase_add_test(tc_utils, test_tcp_parse_sack_wraparound_block_accepted);
tcase_add_test(tc_utils, test_tcp_parse_options_stops_on_truncated_or_invalid_option_length);
tcase_add_test(tc_utils, test_tcp_parse_options_returns_when_frame_has_no_option_bytes);
tcase_add_test(tc_utils, test_tcp_parse_options_parses_and_clamps_mixed_options);
tcase_add_test(tc_utils, test_tcp_parse_options_parses_mss_sack_permitted_timestamp_and_two_sack_blocks);
tcase_add_test(tc_utils, test_tcp_parse_options_ignores_unknown_option_kinds);
tcase_add_test(tc_utils, test_tcp_parse_options_caps_sack_block_count);
tcase_add_test(tc_utils, test_tcp_parse_options_ignores_known_kinds_with_wrong_lengths);
tcase_add_test(tc_utils, test_tcp_input_rst_bad_seq_ignored);
tcase_add_test(tc_utils, test_tcp_input_rst_seq_in_window_sends_ack);
tcase_add_test(tc_utils, test_tcp_input_rst_seq_in_scaled_window_sends_ack);
tcase_add_test(tc_utils, test_tcp_input_rst_out_of_window_does_not_update_peer_rwnd);
tcase_add_test(tc_utils, test_tcp_input_out_of_window_payload_not_cached);
tcase_add_test(tc_utils, test_tcp_input_rst_exact_seq_closes);
tcase_add_test(tc_utils, test_tcp_input_syn_listen_mismatch);
tcase_add_test(tc_utils, test_tcp_input_syn_rcvd_ack_established);
tcase_add_test(tc_utils, test_tcp_input_syn_rcvd_ack_invalid_ack_rejected);
tcase_add_test(tc_utils, test_tcp_input_syn_rcvd_ack_invalid_seq_rejected);
tcase_add_test(tc_utils, test_tcp_input_filter_drop);
tcase_add_test(tc_utils, test_tcp_input_port_mismatch_skips_socket);
tcase_add_test(tc_utils, test_tcp_input_remote_ip_mismatch_skips_socket);
tcase_add_test(tc_utils, test_tcp_input_local_ip_mismatch_preserves_if_idx);
tcase_add_test(tc_utils, test_tcp_input_unmatched_ack_sends_rst);
tcase_add_test(tc_utils, test_tcp_input_unmatched_ack_nonlocal_dst_does_not_send_rst);
tcase_add_test(tc_utils, test_tcp_input_unmatched_syn_sends_rst_ack);
tcase_add_test(tc_utils, test_tcp_input_unmatched_rst_is_discarded);
tcase_add_test(tc_utils, test_tcp_input_syn_bound_ip_mismatch);
tcase_add_test(tc_utils, test_tcp_input_syn_rcvd_ack_wrong_flags);
tcase_add_test(tc_utils, test_tcp_input_close_wait_processes_ack);
tcase_add_test(tc_utils, test_tcp_input_closing_processes_ack);
tcase_add_test(tc_utils, test_tcp_input_established_ack_only_returns);
tcase_add_test(tc_utils, test_tcp_input_syn_dst_not_local);
tcase_add_test(tc_utils, test_tcp_input_syn_dst_outside_subnet);
tcase_add_test(tc_utils, test_tcp_input_listen_dst_match_false);
tcase_add_test(tc_utils, test_tcp_input_established_fin_sets_close_wait);
tcase_add_test(tc_utils, test_tcp_input_established_fin_with_payload_queues);
tcase_add_test(tc_utils, test_tcp_input_established_fin_payload_out_of_order_no_transition);
tcase_add_test(tc_utils, test_tcp_input_established_fin_out_of_order_no_transition);
tcase_add_test(tc_utils, test_tcp_rst_closes_socket);
tcase_add_test(tc_utils, test_tcp_rst_ignored_in_listen);
tcase_add_test(tc_utils, test_tcp_rst_syn_rcvd_returns_to_listen);
tcase_add_test(tc_utils, test_tcp_fin_wait_1_to_closing);
tcase_add_test(tc_utils, test_tcp_last_ack_closes_socket);
tcase_add_test(tc_utils, test_tcp_last_ack_partial_ack_keeps_socket_and_timer);
tcase_add_test(tc_utils, test_tcp_ack_acks_data_and_sets_writable);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_resend_clears_sent);
tcase_add_test(tc_utils, test_tcp_ack_discards_zero_len_segment);
tcase_add_test(tc_utils, test_tcp_ack_closes_last_ack_socket);
tcase_add_test(tc_utils, test_tcp_ack_last_seq_match_no_close);
tcase_add_test(tc_utils, test_tcp_ack_fresh_desc_updates_rtt_existing);
tcase_add_test(tc_utils, test_tcp_ack_retransmitted_desc_skips_rtt_update);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_zero_len_segment_large_ack);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_seq_match_large_seg_len);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_clears_sent_flag);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_discards_zero_len_segment);
tcase_add_test(tc_utils, test_tcp_ack_cwnd_count_wrap);
tcase_add_test(tc_utils, test_tcp_ack_updates_rtt_and_cwnd);
tcase_add_test(tc_utils, test_tcp_ack_uses_interface_mss_for_cwnd_growth);
tcase_add_test(tc_utils, test_tcp_ack_last_seq_not_last_ack_state);
tcase_add_test(tc_utils, test_tcp_ack_no_progress_when_ack_far_ahead);
tcase_add_test(tc_utils, test_tcp_ack_coarse_rtt_sets_writable);
tcase_add_test(tc_utils, test_tcp_ack_coarse_rtt_across_low32_wrap);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_clears_sent_large_seg_len);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_discards_zero_len_segment_far_ack);
tcase_add_test(tc_utils, test_tcp_ack_duplicate_ssthresh_min);
tcase_add_test(tc_utils, test_tcp_ack_progress_resets_rto_recovery_state);
tcase_add_test(tc_utils, test_tcp_ack_cwnd_grows_when_payload_acked_is_mss_minus_options);
tcase_add_test(tc_utils, test_tcp_ack_inflight_deflate_sets_writable_without_acked_desc);
tcase_add_test(tc_utils, test_tcp_input_peer_rwnd_growth_sets_writable);
tcase_add_test(tc_utils, test_tcp_input_synack_negotiates_peer_mss);
tcase_add_test(tc_utils, test_tcp_connect_syn_advertises_interface_mss);
tcase_add_test(tc_utils, test_tcp_connect_syn_limits_options_to_small_mtu);
tcase_add_test(tc_utils, test_sock_sendto_tcp_respects_negotiated_peer_mss);
tcase_add_test(tc_utils, test_sock_sendto_tcp_defaults_to_rfc_mss_when_unset_by_peer);
tcase_add_test(tc_utils, test_sock_sendto_tcp_respects_interface_mtu);
tcase_add_test(tc_utils, test_tcp_recv_queues_payload_and_advances_ack);
tcase_add_test(tc_utils, test_tcp_recv_wrong_state_does_nothing);
tcase_add_test(tc_utils, test_tcp_recv_ack_mismatch_does_nothing);
tcase_add_test(tc_utils, test_tcp_recv_wrap_seq_ahead_not_trimmed);
tcase_add_test(tc_utils, test_tcp_recv_close_wait_ack_match);
tcase_add_test(tc_utils, test_tcp_recv_fin_wait_1_ack_match);
tcase_add_test(tc_utils, test_tcp_recv_fin_wait_2_ack_match);
tcase_add_test(tc_utils, test_tcp_recv_queue_full_sends_ack);
tcase_add_test(tc_utils, test_tcp_process_ts_uses_ecr);
tcase_add_test(tc_utils, test_tcp_rto_update_second_sample_rfc6298);
tcase_add_test(tc_utils, test_tcp_process_ts_nop_then_ts);
tcase_add_test(tc_utils, test_tcp_process_ts_skips_unknown_option);
tcase_add_test(tc_utils, test_tcp_process_ts_no_ecr);
tcase_add_test(tc_utils, test_tcp_process_ts_updates_rtt_when_set);
tcase_add_test(tc_utils, test_tcp_send_syn_advertises_sack_permitted);
tcase_add_test(tc_utils, test_tcp_build_ack_options_does_not_write_past_returned_len);
tcase_add_test(tc_utils, test_tcp_build_ack_options_omits_ts_when_not_negotiated);
tcase_add_test(tc_utils, test_icmp_sendto_respects_bound_local_ip_interface);
tcase_add_test(tc_utils, test_icmp_sendto_respects_mtu_api);
tcase_add_test(tc_utils, test_tcp_sort_sack_blocks_swaps_out_of_order);
tcase_add_test(tc_utils, test_tcp_sort_sack_blocks_wrap_order);
tcase_add_test(tc_utils, test_tcp_merge_sack_blocks_adjacent_and_disjoint);
tcase_add_test(tc_utils, test_tcp_merge_sack_blocks_wrap_order);
tcase_add_test(tc_utils, test_tcp_recv_tracks_holes_and_sack_blocks);
tcase_add_test(tc_utils, test_tcp_rebuild_rx_sack_right_edge_wraps);
tcase_add_test(tc_utils, test_tcp_consume_ooo_wrap_trim_and_promote);
tcase_add_test(tc_utils, test_tcp_consume_ooo_wrap_drop_fully_acked);
tcase_add_test(tc_utils, test_tcp_ack_sack_early_retransmit_before_three_dupack);
tcase_add_test(tc_utils, test_tcp_input_listen_syn_without_sack_disables_sack);
tcase_add_test(tc_utils, test_tcp_input_listen_syn_arms_control_rto);
tcase_add_test(tc_utils, test_tcp_input_syn_sent_synack_without_sack_disables_sack);
tcase_add_test(tc_utils, test_tcp_recv_partial_hole_fill_consumes_stored_ooo);
tcase_add_test(tc_utils, test_tcp_ack_ignores_sack_when_not_negotiated);
tcase_add_test(tc_utils, test_tcp_ack_malformed_sack_does_not_early_retransmit);
tcase_add_test(tc_utils, test_tcp_ack_early_retransmit_once_per_ack);
tcase_add_test(tc_utils, test_tcp_ack_no_sack_requires_three_dupacks);
tcase_add_test(tc_utils, test_tcp_ack_no_sack_three_dupacks_with_zero_rwnd_triggers_retransmit);
tcase_add_test(tc_utils, test_tcp_ack_wraparound_delta_reduces_inflight);
tcase_add_test(tc_utils, test_tcp_ack_wraparound_delta_saturates_inflight);
tcase_add_test(tc_utils, test_tcp_mark_unsacked_for_retransmit_wrap_seg_end);
tcase_add_test(tc_utils, test_tcp_mark_unsacked_retransmits_partially_acked_segment);
tcase_add_test(tc_utils, test_tcp_mark_unsacked_rescans_after_clearing_stale_sack);
tcase_add_test(tc_utils, test_tcp_mark_unsacked_ignores_zero_ip_len_unsent_ack_only_desc);
tcase_add_test(tc_utils, test_tcp_ack_sack_blocks_clamped_and_dropped);
tcase_add_test(tc_utils, test_tcp_recv_ooo_capacity_limit);
tcase_add_test(tc_utils, test_tcp_recv_overlapping_ooo_segments_coalesce_on_consume);
tcase_add_test(tc_utils, test_tcp_input_syn_with_sack_option_enables_sack);
tcase_add_test(tc_utils, test_tcp_input_syn_with_sack_option_respects_local_sack_offer);
tcase_add_test(tc_utils, test_tcp_input_iplen_too_big);
tcase_add_test(tc_utils, test_tcp_checksum_valid_passes);
tcase_add_test(tc_utils, test_tcp_checksum_invalid_rejected);
tcase_add_test(tc_utils, test_udp_checksum_valid_passes);
tcase_add_test(tc_utils, test_udp_checksum_invalid_rejected);
tcase_add_test(tc_utils, test_udp_checksum_zero_accepted);
tcase_add_test(tc_utils, test_udp_connected_rejects_wrong_source_ip);
tcase_add_test(tc_utils, test_ip_checksum_invalid_rejected);
tcase_add_test(tc_utils, test_ip_checksum_valid_passes);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_2_fin_sets_ack);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_2_fin_out_of_order_no_transition);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_2_ack_with_payload_receives);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_2_fin_with_payload_queues);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_2_fin_payload_ack_mismatch_no_transition);
tcase_add_test(tc_utils, test_tcp_sock_close_state_transitions);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_1_fin_with_payload_returns);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_1_fin_out_of_order_no_transition);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_1_fin_payload_out_of_order_no_transition);
tcase_add_test(tc_utils, test_tcp_input_fin_wait_1_fin_payload_ack_mismatch_no_transition);
tcase_add_test(tc_utils, test_tcp_input_header_len_below_min_dropped);
tcase_add_test(tc_utils, test_socket_from_fd_invalid);
tcase_add_test(tc_utils, test_socket_from_fd_valid);
tcase_add_test(tc_utils, test_sock_close_tcp_fin_wait_1_repeated_close_keeps_fin_wait_2_path);
tcase_add_test(tc_proto, test_arp_request_basic);
tcase_add_test(tc_proto, test_arp_request_throttle);
tcase_add_test(tc_proto, test_arp_request_target_ip);
tcase_add_test(tc_proto, test_arp_request_handling);
tcase_add_test(tc_proto, test_arp_reply_handling);
tcase_add_test(tc_proto, test_arp_reply_unsolicited_does_not_overwrite_existing);
tcase_add_test(tc_proto, test_arp_reply_with_pending_request_updates);
tcase_add_test(tc_proto, test_arp_request_refreshes_existing_entry);
tcase_add_test(tc_proto, test_arp_request_refreshes_timestamp_on_same_mac);
tcase_add_test(tc_proto, test_arp_lookup_success);
tcase_add_test(tc_proto, test_arp_lookup_failure);
tcase_add_test(tc_proto, test_arp_lookup_expired_entry_rejected);
tcase_add_test(tc_proto, test_arp_reply_updates_expired_entry);
tcase_add_test(tc_proto, test_wolfip_recv_ex_multi_interface_arp_reply);
tcase_add_test(tc_proto, test_forward_prepare_null_args);
tcase_add_test(tc_proto, test_send_ttl_exceeded_filter_drop);
tcase_add_test(tc_proto, test_send_ttl_exceeded_ip_filter_drop);
tcase_add_test(tc_proto, test_send_ttl_exceeded_eth_filter_drop);
tcase_add_test(tc_proto, test_send_ttl_exceeded_no_send);
tcase_add_test(tc_proto, test_send_ttl_exceeded_non_ethernet_skips_eth_filter);
#if WOLFIP_ENABLE_FORWARDING
tcase_add_test(tc_proto, test_wolfip_forward_ttl_exceeded_short_len_does_not_send);
#endif
tcase_add_test(tc_proto, test_arp_request_filter_drop);
tcase_add_test(tc_proto, test_arp_request_invalid_interface);
tcase_add_test(tc_proto, test_arp_request_no_send_fn);
tcase_add_test(tc_proto, test_arp_reply_filter_drop);
tcase_add_test(tc_proto, test_arp_recv_invalid_iface);
tcase_add_test(tc_proto, test_arp_recv_filter_drop);
tcase_add_test(tc_proto, test_arp_queue_packet_invalid_args);
tcase_add_test(tc_proto, test_arp_queue_packet_reuses_existing_slot);
tcase_add_test(tc_proto, test_arp_queue_packet_same_dest_different_if);
tcase_add_test(tc_proto, test_arp_queue_packet_uses_empty_slot);
tcase_add_test(tc_proto, test_arp_queue_packet_drops_oversize_len);
tcase_add_test(tc_proto, test_arp_queue_packet_slot_fallback_zero);
tcase_add_test(tc_proto, test_arp_flush_pending_no_neighbor);
tcase_add_test(tc_proto, test_arp_flush_pending_len_zero_clears);
tcase_add_test(tc_proto, test_arp_flush_pending_null_stack);
tcase_add_test(tc_proto, test_arp_flush_pending_skips_non_matching);
tcase_add_test(tc_proto, test_arp_flush_pending_same_dest_if_idx_mismatch);
tcase_add_test(tc_proto, test_arp_flush_pending_truncates_len);
tcase_add_test(tc_proto, test_arp_flush_pending_processes_matching_entry);
tcase_add_test(tc_proto, test_arp_flush_pending_match_condition_false);
tcase_add_test(tc_proto, test_arp_queue_and_flush_matching_entry);
tcase_add_test(tc_proto, test_arp_flush_pending_loopback_match);
tcase_add_test(tc_proto, test_arp_store_neighbor_updates_existing);
tcase_add_test(tc_proto, test_arp_recv_reply_updates_existing_no_duplicate);
tcase_add_test(tc_proto, test_arp_store_neighbor_empty_slot);
tcase_add_test(tc_proto, test_arp_store_neighbor_same_ip_diff_if);
tcase_add_test(tc_proto, test_arp_pending_record_prefers_empty_slot);
tcase_add_test(tc_proto, test_arp_pending_match_and_clear_time_goes_back);
tcase_add_test(tc_proto, test_arp_store_neighbor_no_space);
tcase_add_test(tc_proto, test_arp_store_neighbor_null_stack);
tcase_add_test(tc_proto, test_arp_lookup_if_idx_mismatch);
tcase_add_test(tc_proto, test_arp_request_missing_conf);
tcase_add_test(tc_proto, test_arp_request_null_stack);
tcase_add_test(tc_proto, test_arp_recv_request_other_ip_no_reply);
tcase_add_test(tc_proto, test_arp_recv_null_stack);
tcase_add_test(tc_proto, test_arp_recv_request_sends_reply);
tcase_add_test(tc_proto, test_arp_recv_request_does_not_store_self_neighbor);
tcase_add_test(tc_proto, test_arp_recv_request_no_send_fn);
tcase_add_test(tc_proto, test_wolfip_if_for_local_ip_paths);
tcase_add_test(tc_proto, test_wolfip_if_for_local_ip_null_found);
tcase_add_test(tc_proto, test_wolfip_socket_if_idx_invalid);
tcase_add_test(tc_proto, test_icmp_try_recv_mismatch_paths);
tcase_add_test(tc_proto, test_icmp_try_recv_mismatch_local_ip);
tcase_add_test(tc_proto, test_icmp_try_recv_mismatch_src_port);
tcase_add_test(tc_proto, test_icmp_try_recv_mismatch_remote_ip);
tcase_add_test(tc_proto, test_icmp_try_recv_full_fifo_does_not_signal_readable);
tcase_add_test(tc_proto, test_wolfip_recv_on_not_for_us);
tcase_add_test(tc_proto, test_wolfip_recv_on_filter_drop_eth);
#if WOLFIP_ENABLE_FORWARDING
tcase_add_test(tc_proto, test_wolfip_recv_on_forward_ttl_exceeded);
tcase_add_test(tc_proto, test_wolfip_recv_on_forward_arp_queue);
tcase_add_test(tc_proto, test_wolfip_recv_on_forward_arp_hit_sends);
tcase_add_test(tc_proto, test_wolfip_forward_non_ethernet_in_to_ethernet_out);
tcase_add_test(tc_proto, test_wolfip_forward_ethernet_in_to_non_ethernet_out);
#endif
tcase_add_test(tc_proto, test_select_nexthop_variants);
tcase_add_test(tc_proto, test_route_for_ip_variants);
tcase_add_test(tc_proto, test_route_for_ip_dest_matches_iface_ip);
tcase_add_test(tc_proto, test_route_for_ip_matches_exact_ip_when_mask_is_zero);
tcase_add_test(tc_proto, test_route_for_ip_no_primary_index);
tcase_add_test(tc_proto, test_route_for_ip_null_stack);
tcase_add_test(tc_proto, test_route_for_ip_gw_and_nonloop_fallback);
tcase_add_test(tc_proto, test_inline_ip_helpers);
tcase_add_test(tc_proto, test_forward_interface_variants);
tcase_add_test(tc_proto, test_forward_interface_skips_ipaddr_any);
tcase_add_test(tc_proto, test_forward_interface_dest_is_local_ip);
tcase_add_test(tc_proto, test_forward_interface_short_circuit_cases);
tcase_add_test(tc_proto, test_ip_recv_forward_ttl_exceeded);
tcase_add_test(tc_proto, test_ip_recv_udp_with_ip_options_delivers_payload);
tcase_add_test(tc_proto, test_ip_recv_fragmented_udp_dropped);
tcase_add_test(tc_proto, test_ip_recv_forward_arp_queue_and_flush);
tcase_add_test(tc_proto, test_arp_flush_pending_ttl_expired);
tcase_add_test(tc_proto, test_wolfip_forwarding_basic);
tcase_add_test(tc_proto, test_wolfip_forwarding_ttl_expired);
tcase_add_test(tc_proto, test_forward_packet_ip_filter_drop);
tcase_add_test(tc_proto, test_forward_packet_eth_filter_drop);
tcase_add_test(tc_proto, test_loopback_dest_not_forwarded);
tcase_add_test(tc_proto, test_tcp_listen_rejects_wrong_interface);
tcase_add_test(tc_proto, test_tcp_listen_accepts_bound_interface);
tcase_add_test(tc_proto, test_tcp_listen_accepts_any_interface);
tcase_add_test(tc_proto, test_sock_connect_selects_local_ip_multi_if);
tcase_add_test(tc_proto, test_icmp_socket_send_recv);
tcase_add_test(tc_proto, test_icmp_input_echo_reply_queues);
tcase_add_test(tc_proto, test_icmp_input_echo_request_reply_sent);
tcase_add_test(tc_proto, test_icmp_input_echo_request_bad_checksum_dropped);
tcase_add_test(tc_proto, test_icmp_input_echo_request_odd_len_reply_checksum);
tcase_add_test(tc_proto, test_icmp_input_echo_request_dhcp_running_no_reply);
tcase_add_test(tc_proto, test_icmp_input_echo_request_broadcast_no_reply);
tcase_add_test(tc_proto, test_icmp_input_echo_request_directed_broadcast_no_reply);
tcase_add_test(tc_proto, test_icmp_input_echo_request_filter_drop);
tcase_add_test(tc_proto, test_icmp_input_echo_request_ip_filter_drop);
tcase_add_test(tc_proto, test_icmp_input_echo_request_eth_filter_drop);
tcase_add_test(tc_proto, test_icmp_input_filter_drop_receiving);
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_keeps_established_tcp_socket);
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss);
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_closes_syn_sent_tcp_socket);
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_keep_established_tcp_socket);
tcase_add_test(tc_proto, test_udp_sendto_and_recvfrom);
tcase_add_test(tc_proto, test_udp_sendto_respects_mtu_api);
tcase_add_test(tc_proto, test_udp_recvfrom_sets_remote_ip);
tcase_add_test(tc_proto, test_udp_recvfrom_null_src_addr_len);
tcase_add_test(tc_proto, test_udp_recvfrom_preserves_remote_ip);
tcase_add_test(tc_proto, test_udp_recvfrom_null_addrlen);
tcase_add_test(tc_proto, test_udp_recvfrom_src_equals_local_ip_does_not_persist_remote);
tcase_add_test(tc_proto, test_dns_query_and_callback_a);
tcase_add_test(tc_proto, test_dhcp_option_u32_macros_round_trip_wire_order);
tcase_add_test(tc_proto, test_dhcp_parse_offer_and_ack);
tcase_add_test(tc_proto, test_dhcp_schedule_lease_timer_defaults_t1_t2);
tcase_add_test(tc_proto, test_dhcp_schedule_lease_timer_small_lease_clamps_t1_t2);
tcase_add_test(tc_proto, test_dhcp_parse_offer_defaults_mask_when_missing);
tcase_add_test(tc_proto, test_dhcp_parse_offer_rejects_mismatched_xid);
tcase_add_test(tc_proto, test_dhcp_parse_ack_rejects_mismatched_xid);
tcase_add_test(tc_proto, test_tcp_handshake_and_fin_close_wait);
tcase_add_test(tc_proto, test_regression_snd_una_initialized_on_syn_rcvd);
tcase_add_test(tc_proto, test_regression_duplicate_syn_rejected_on_established);
tcase_add_test(tc_proto, test_regression_timer_heap_insert_bounded_by_max_timers);
tcase_add_test(tc_proto, test_regression_icmp_inflated_ip_len);
tcase_add_test(tc_proto, test_regression_udp_inflated_udp_len);
tcase_add_test(tc_proto, test_regression_udp_len_below_header_discards_and_unblocks);
tcase_add_test(tc_proto, test_regression_udp_payload_exceeds_buffer_discards_and_unblocks);
tcase_add_test(tc_proto, test_regression_icmp_payload_exceeds_buffer_discards_and_unblocks);
tcase_add_test(tc_proto, test_regression_tcp_ip_len_below_ip_header);
tcase_add_test(tc_proto, test_regression_syn_on_established_not_silently_processed);
tcase_add_test(tc_proto, test_regression_syn_on_last_ack_not_silently_processed);
tcase_add_test(tc_proto, test_regression_full_txbuf_still_sends_pure_ack);
tcase_add_test(tc_proto, test_regression_loopback_immediate_pure_ack_uses_loopback_ll);
tcase_add_test(tc_proto, test_regression_tcp_tx_desc_payload_len_keeps_descriptor_layout_sanity);
tcase_add_test(tc_proto, test_regression_fast_recovery_cwnd_ssthresh_rfc5681);
tcase_add_test(tc_proto, test_regression_paws_rejects_stale_timestamp);
tcase_add_test(tc_proto, test_regression_paws_accepts_wrapped_newer_timestamp);
tcase_add_test(tc_proto, test_regression_dhcp_nak_restarts_configuration);
tcase_add_test(tc_proto, test_regression_dhcp_boot_request_nak_ignored);
tcase_add_test(tc_proto, test_regression_dns_rcode_error_aborts_query);
tcase_add_test(tc_proto, test_regression_udp_checksum_zero_substituted_with_ffff);
tcase_add_test(tc_proto, test_regression_last_ack_rejects_out_of_window_segment);
tcase_add_test(tc_proto, test_regression_dns_id_never_zero);
tcase_add_test(tc_proto, test_tcp_input_listen_synack_sends_rst_and_stays_listen);
tcase_add_test(tc_proto, test_tcp_input_listen_accept_final_ack_does_not_send_rst);
tcase_add_test(tc_utils, test_transport_checksum);
tcase_add_test(tc_utils, test_iphdr_set_checksum);
tcase_add_test(tc_utils, test_eth_output_add_header);
tcase_add_test(tc_utils, test_eth_output_add_header_invalid_if);
tcase_add_test(tc_utils, test_ip_output_add_header);
tcase_add_test(tc_utils, test_ip_output_add_header_icmp);
tcase_add_test(tc_utils, test_regression_icmp_ip_len_below_header);
tcase_add_test(tc_wolfssl, test_wolfssl_io_ctx_registers_callbacks);
tcase_add_test(tc_wolfssl, test_wolfssl_io_setio_success);
tcase_add_test(tc_wolfssl, test_wolfssl_io_setio_invalid_ssl);
tcase_add_test(tc_wolfssl, test_wolfssl_io_setio_invalid_ctx);
tcase_add_test(tc_wolfssl, test_wolfssl_io_setio_invalid_fd);
tcase_add_test(tc_wolfssl, test_wolfssl_io_setio_no_stack);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_behaviors);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_invalid_desc);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_fragmented_sequence);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_respects_buffer_size);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_want_read_keeps_buffer);
tcase_add_test(tc_wolfssl, test_wolfssl_io_recv_alternating_eagain_short_reads);
tcase_add_test(tc_wolfssl, test_wolfssl_io_send_behaviors);
tcase_add_test(tc_wolfssl, test_wolfssl_io_send_invalid_desc);
tcase_add_test(tc_wolfssl, test_wolfssl_io_send_want_write_keeps_buffer);
suite_add_tcase(s, tc_core);
suite_add_tcase(s, tc_utils);
suite_add_tcase(s, tc_proto);
suite_add_tcase(s, tc_wolfssl);
return s;
}
int main(void)
{
int n_fail = 0;
Suite *s;
SRunner *sr;
s = wolf_suite();
sr = srunner_create(s);
srunner_run_all(sr, CK_NORMAL);
n_fail = srunner_ntests_failed(sr);
srunner_free(sr);
return (n_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}