@@ -2961,6 +2961,134 @@ START_TEST(test_non_ethernet_recv_oversize_dropped)
29612961}
29622962END_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+
29643092START_TEST (test_forward_packet_filter_drop_udp_icmp )
29653093{
29663094 struct wolfIP s ;
0 commit comments