@@ -3241,6 +3241,38 @@ START_TEST(test_tcp_rto_cb_last_ack_requeues_finack_and_arms_timer)
32413241}
32423242END_TEST
32433243
3244+ START_TEST (test_tcp_rto_cb_last_ack_full_txbuf_keeps_retry_budget )
3245+ {
3246+ struct wolfIP s ;
3247+ struct tsocket * ts ;
3248+
3249+ wolfIP_init (& s );
3250+ ts = & s .tcpsockets [0 ];
3251+ memset (ts , 0 , sizeof (* ts ));
3252+ ts -> proto = WI_IPPROTO_TCP ;
3253+ ts -> S = & s ;
3254+ ts -> sock .tcp .state = TCP_LAST_ACK ;
3255+ ts -> sock .tcp .rto = 100 ;
3256+ ts -> sock .tcp .ctrl_rto_retries = 2 ;
3257+ ts -> src_port = 12345 ;
3258+ ts -> dst_port = 5001 ;
3259+ ts -> local_ip = 0x0A000001U ;
3260+ ts -> remote_ip = 0x0A000002U ;
3261+ fifo_init (& ts -> sock .tcp .txbuf , ts -> txmem , TXBUF_SIZE );
3262+ ts -> sock .tcp .txbuf .head = 0 ;
3263+ ts -> sock .tcp .txbuf .tail = 0 ;
3264+ ts -> sock .tcp .txbuf .h_wrap = ts -> sock .tcp .txbuf .size ;
3265+
3266+ s .last_tick = 1000 ;
3267+ tcp_rto_cb (ts );
3268+
3269+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_retries , 2 );
3270+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_active , 1 );
3271+ ck_assert_int_ne (ts -> sock .tcp .tmr_rto , NO_TIMER );
3272+ ck_assert_uint_eq (find_timer_expiry (& s , ts -> sock .tcp .tmr_rto ), 1400U );
3273+ }
3274+ END_TEST
3275+
32443276START_TEST (test_tcp_ctrl_state_needs_rto_fin_wait_1_waits_for_payload_drain )
32453277{
32463278 struct wolfIP s ;
@@ -3333,6 +3365,39 @@ START_TEST(test_tcp_rto_cb_fin_wait_1_no_data_requeues_finack)
33333365}
33343366END_TEST
33353367
3368+ START_TEST (test_tcp_rto_cb_fin_wait_1_no_data_full_txbuf_keeps_retry_budget )
3369+ {
3370+ struct wolfIP s ;
3371+ struct tsocket * ts ;
3372+
3373+ wolfIP_init (& s );
3374+ ts = & s .tcpsockets [0 ];
3375+ memset (ts , 0 , sizeof (* ts ));
3376+ ts -> proto = WI_IPPROTO_TCP ;
3377+ ts -> S = & s ;
3378+ ts -> sock .tcp .state = TCP_FIN_WAIT_1 ;
3379+ ts -> sock .tcp .rto = 100 ;
3380+ ts -> sock .tcp .ctrl_rto_retries = 2 ;
3381+ ts -> src_port = 12345 ;
3382+ ts -> dst_port = 5001 ;
3383+ ts -> local_ip = 0x0A000001U ;
3384+ ts -> remote_ip = 0x0A000002U ;
3385+ ts -> sock .tcp .bytes_in_flight = 0 ;
3386+ fifo_init (& ts -> sock .tcp .txbuf , ts -> txmem , TXBUF_SIZE );
3387+ ts -> sock .tcp .txbuf .head = 0 ;
3388+ ts -> sock .tcp .txbuf .tail = 0 ;
3389+ ts -> sock .tcp .txbuf .h_wrap = ts -> sock .tcp .txbuf .size ;
3390+
3391+ s .last_tick = 1000 ;
3392+ tcp_rto_cb (ts );
3393+
3394+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_retries , 2 );
3395+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_active , 1 );
3396+ ck_assert_int_ne (ts -> sock .tcp .tmr_rto , NO_TIMER );
3397+ ck_assert_uint_eq (find_timer_expiry (& s , ts -> sock .tcp .tmr_rto ), 1400U );
3398+ }
3399+ END_TEST
3400+
33363401START_TEST (test_tcp_ack_fin_wait_1_ack_of_fin_moves_to_fin_wait_2_and_arms_timeout )
33373402{
33383403 struct wolfIP s ;
@@ -3990,6 +4055,66 @@ START_TEST(test_sock_close_tcp_fin_wait_1)
39904055}
39914056END_TEST
39924057
4058+ START_TEST (test_sock_close_tcp_established_full_txbuf_preserves_state )
4059+ {
4060+ struct wolfIP s ;
4061+ struct tsocket * ts ;
4062+ int sd ;
4063+
4064+ wolfIP_init (& s );
4065+ mock_link_init (& s );
4066+
4067+ sd = wolfIP_sock_socket (& s , AF_INET , IPSTACK_SOCK_STREAM , WI_IPPROTO_TCP );
4068+ ck_assert_int_gt (sd , 0 );
4069+ ts = & s .tcpsockets [SOCKET_UNMARK (sd )];
4070+ ts -> sock .tcp .state = TCP_ESTABLISHED ;
4071+ ts -> src_port = 12345 ;
4072+ ts -> dst_port = 5001 ;
4073+ ts -> local_ip = 0x0A000001U ;
4074+ ts -> remote_ip = 0x0A000002U ;
4075+ fifo_init (& ts -> sock .tcp .txbuf , ts -> txmem , TXBUF_SIZE );
4076+ ts -> sock .tcp .txbuf .head = 0 ;
4077+ ts -> sock .tcp .txbuf .tail = 0 ;
4078+ ts -> sock .tcp .txbuf .h_wrap = ts -> sock .tcp .txbuf .size ;
4079+
4080+ ck_assert_int_eq (wolfIP_sock_close (& s , sd ), - WOLFIP_EAGAIN );
4081+ ck_assert_int_eq (ts -> sock .tcp .state , TCP_ESTABLISHED );
4082+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_active , 0 );
4083+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_retries , 0 );
4084+ ck_assert_uint_eq (ts -> sock .tcp .tmr_rto , NO_TIMER );
4085+ }
4086+ END_TEST
4087+
4088+ START_TEST (test_sock_close_tcp_close_wait_full_txbuf_preserves_state )
4089+ {
4090+ struct wolfIP s ;
4091+ struct tsocket * ts ;
4092+ int sd ;
4093+
4094+ wolfIP_init (& s );
4095+ mock_link_init (& s );
4096+
4097+ sd = wolfIP_sock_socket (& s , AF_INET , IPSTACK_SOCK_STREAM , WI_IPPROTO_TCP );
4098+ ck_assert_int_gt (sd , 0 );
4099+ ts = & s .tcpsockets [SOCKET_UNMARK (sd )];
4100+ ts -> sock .tcp .state = TCP_CLOSE_WAIT ;
4101+ ts -> src_port = 12345 ;
4102+ ts -> dst_port = 5001 ;
4103+ ts -> local_ip = 0x0A000001U ;
4104+ ts -> remote_ip = 0x0A000002U ;
4105+ fifo_init (& ts -> sock .tcp .txbuf , ts -> txmem , TXBUF_SIZE );
4106+ ts -> sock .tcp .txbuf .head = 0 ;
4107+ ts -> sock .tcp .txbuf .tail = 0 ;
4108+ ts -> sock .tcp .txbuf .h_wrap = ts -> sock .tcp .txbuf .size ;
4109+
4110+ ck_assert_int_eq (wolfIP_sock_close (& s , sd ), - WOLFIP_EAGAIN );
4111+ ck_assert_int_eq (ts -> sock .tcp .state , TCP_CLOSE_WAIT );
4112+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_active , 0 );
4113+ ck_assert_uint_eq (ts -> sock .tcp .ctrl_rto_retries , 0 );
4114+ ck_assert_uint_eq (ts -> sock .tcp .tmr_rto , NO_TIMER );
4115+ }
4116+ END_TEST
4117+
39934118START_TEST (test_sock_close_tcp_fin_wait_1_repeated_close_keeps_fin_wait_2_path )
39944119{
39954120 struct wolfIP s ;
@@ -4751,13 +4876,12 @@ START_TEST(test_udp_try_recv_unmatched_nonlocal_dst_does_not_send_icmp)
47514876}
47524877END_TEST
47534878
4754- START_TEST (test_udp_try_recv_full_fifo_drop_does_not_set_readable_or_suppress_icmp )
4879+ START_TEST (test_udp_try_recv_full_fifo_drop_does_not_set_readable_or_send_icmp )
47554880{
47564881 struct wolfIP s ;
47574882 struct tsocket * ts ;
47584883 uint8_t udp_buf [sizeof (struct wolfIP_udp_datagram ) + 4 ];
47594884 struct wolfIP_udp_datagram * udp = (struct wolfIP_udp_datagram * )udp_buf ;
4760- struct wolfIP_icmp_dest_unreachable_packet * icmp ;
47614885 uint32_t local_ip = 0x0A000001U ;
47624886 uint32_t remote_ip = 0x0A000002U ;
47634887 uint8_t src_mac [6 ] = {0x20 , 0x21 , 0x22 , 0x23 , 0x24 , 0x25 };
@@ -4811,12 +4935,7 @@ START_TEST(test_udp_try_recv_full_fifo_drop_does_not_set_readable_or_suppress_ic
48114935 ck_assert_uint_eq (ts -> sock .udp .rxbuf .head , head_before );
48124936 ck_assert_uint_eq (ts -> sock .udp .rxbuf .tail , tail_before );
48134937 ck_assert_uint_eq (ts -> sock .udp .rxbuf .h_wrap , h_wrap_before );
4814- ck_assert_uint_eq (last_frame_sent_size ,
4815- sizeof (struct wolfIP_icmp_dest_unreachable_packet ));
4816-
4817- icmp = (struct wolfIP_icmp_dest_unreachable_packet * )last_frame_sent ;
4818- ck_assert_uint_eq (icmp -> type , 3U );
4819- ck_assert_uint_eq (icmp -> code , 3U );
4938+ ck_assert_uint_eq (last_frame_sent_size , 0U );
48204939}
48214940END_TEST
48224941
0 commit comments