@@ -6098,6 +6098,56 @@ START_TEST(test_raw_socket_sendto_short_addrlen_returns_einval)
60986098}
60996099END_TEST
61006100
6101+ START_TEST (test_raw_socket_sendto_wrong_family_returns_einval )
6102+ {
6103+ struct wolfIP s ;
6104+ int sd ;
6105+ struct wolfIP_sockaddr_in sin ;
6106+ uint8_t payload [4 ] = {0xDE , 0xAD , 0xBE , 0xEF };
6107+
6108+ wolfIP_init (& s );
6109+ mock_link_init (& s );
6110+ wolfIP_ipconfig_set (& s , 0x0A000001U , 0xFFFFFF00U , 0 );
6111+
6112+ sd = wolfIP_sock_socket (& s , AF_INET , IPSTACK_SOCK_RAW , WI_IPPROTO_UDP );
6113+ ck_assert_int_ge (sd , 0 );
6114+
6115+ memset (& sin , 0 , sizeof (sin ));
6116+ sin .sin_family = AF_PACKET ;
6117+ sin .sin_addr .s_addr = ee32 (0x0A000002U );
6118+
6119+ ck_assert_int_eq (wolfIP_sock_sendto (& s , sd , payload , sizeof (payload ), 0 ,
6120+ (struct wolfIP_sockaddr * )& sin , sizeof (sin )),
6121+ - WOLFIP_EINVAL );
6122+ }
6123+ END_TEST
6124+
6125+ START_TEST (test_raw_socket_sendto_payload_too_large_for_ip_header_returns_einval )
6126+ {
6127+ struct wolfIP s ;
6128+ int sd ;
6129+ struct wolfIP_sockaddr_in sin ;
6130+ uint8_t payload [LINK_MTU ];
6131+ size_t len = (size_t )(LINK_MTU - ETH_HEADER_LEN - IP_HEADER_LEN + 1 );
6132+
6133+ wolfIP_init (& s );
6134+ mock_link_init (& s );
6135+ wolfIP_ipconfig_set (& s , 0x0A000001U , 0xFFFFFF00U , 0 );
6136+
6137+ sd = wolfIP_sock_socket (& s , AF_INET , IPSTACK_SOCK_RAW , WI_IPPROTO_UDP );
6138+ ck_assert_int_ge (sd , 0 );
6139+
6140+ memset (& sin , 0 , sizeof (sin ));
6141+ sin .sin_family = AF_INET ;
6142+ sin .sin_addr .s_addr = ee32 (0x0A000002U );
6143+ memset (payload , 0xAA , len );
6144+
6145+ ck_assert_int_eq (wolfIP_sock_sendto (& s , sd , payload , len , 0 ,
6146+ (struct wolfIP_sockaddr * )& sin , sizeof (sin )),
6147+ - WOLFIP_EINVAL );
6148+ }
6149+ END_TEST
6150+
61016151START_TEST (test_getsockopt_invalid_fd_returns_einval )
61026152{
61036153 struct wolfIP s ;
@@ -6176,12 +6226,12 @@ START_TEST(test_packet_socket_recv_frame)
61766226 ll = wolfIP_getdev_ex (& s , TEST_PRIMARY_IF );
61776227 ck_assert_ptr_nonnull (ll );
61786228
6179- sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ETH_TYPE_IP );
6229+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 ( ETH_TYPE_IP ) );
61806230 ck_assert_int_ge (sd , 0 );
61816231
61826232 memset (& bind_sll , 0 , sizeof (bind_sll ));
61836233 bind_sll .sll_family = AF_PACKET ;
6184- bind_sll .sll_protocol = ETH_TYPE_IP ;
6234+ bind_sll .sll_protocol = ee16 ( ETH_TYPE_IP ) ;
61856235 bind_sll .sll_ifindex = TEST_PRIMARY_IF ;
61866236 bind_sll .sll_halen = 6 ;
61876237 ck_assert_int_eq (wolfIP_sock_bind (& s , sd ,
@@ -6190,7 +6240,7 @@ START_TEST(test_packet_socket_recv_frame)
61906240 memset (frame , 0 , sizeof (frame_buf ));
61916241 memcpy (frame -> dst , ll -> mac , 6 );
61926242 memcpy (frame -> src , "\xaa\xbb\xcc\xdd\xee\xff" , 6 );
6193- frame -> type = ETH_TYPE_IP ;
6243+ frame -> type = ee16 ( ETH_TYPE_IP ) ;
61946244 memcpy (frame -> data , payload , sizeof (payload ));
61956245
61966246 wolfIP_recv_ex (& s , TEST_PRIMARY_IF , frame ,
@@ -6229,12 +6279,12 @@ START_TEST(test_packet_socket_send_frame)
62296279 ll = wolfIP_getdev_ex (& s , TEST_PRIMARY_IF );
62306280 ck_assert_ptr_nonnull (ll );
62316281
6232- sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ETH_TYPE_IP );
6282+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 ( ETH_TYPE_IP ) );
62336283 ck_assert_int_ge (sd , 0 );
62346284
62356285 memset (& bind_sll , 0 , sizeof (bind_sll ));
62366286 bind_sll .sll_family = AF_PACKET ;
6237- bind_sll .sll_protocol = ETH_TYPE_IP ;
6287+ bind_sll .sll_protocol = ee16 ( ETH_TYPE_IP ) ;
62386288 bind_sll .sll_ifindex = TEST_PRIMARY_IF ;
62396289 bind_sll .sll_halen = 6 ;
62406290 memset (bind_sll .sll_addr , 0xFF , 6 );
@@ -6243,15 +6293,15 @@ START_TEST(test_packet_socket_send_frame)
62436293
62446294 memset (& sll , 0 , sizeof (sll ));
62456295 sll .sll_family = AF_PACKET ;
6246- sll .sll_protocol = ETH_TYPE_IP ;
6296+ sll .sll_protocol = ee16 ( ETH_TYPE_IP ) ;
62476297 sll .sll_ifindex = TEST_PRIMARY_IF ;
62486298 sll .sll_halen = 6 ;
62496299 memset (sll .sll_addr , 0xFF , 6 );
62506300
62516301 memset (frame_buf , 0 , sizeof (frame_buf ));
62526302 memcpy (ethf -> dst , "\xff\xff\xff\xff\xff\xff" , 6 );
62536303 memcpy (ethf -> src , "\x00\x00\x00\x00\x00\x01" , 6 );
6254- ethf -> type = ETH_TYPE_IP ;
6304+ ethf -> type = ee16 ( ETH_TYPE_IP ) ;
62556305 memset (ethf -> data , 0xAB , 8 );
62566306
62576307 ck_assert_int_eq (wolfIP_sock_sendto (& s , sd , frame_buf , sizeof (frame_buf ), 0 ,
@@ -6266,7 +6316,7 @@ START_TEST(test_packet_socket_send_frame)
62666316 ck_assert_uint_eq (desc -> len , sizeof (frame_buf ));
62676317 ck_assert_mem_eq (queued -> dst , "\xff\xff\xff\xff\xff\xff" , 6 );
62686318 ck_assert_mem_eq (queued -> src , ll -> mac , 6 );
6269- ck_assert_uint_eq (queued -> type , ETH_TYPE_IP );
6319+ ck_assert_uint_eq (queued -> type , ee16 ( ETH_TYPE_IP ) );
62706320 ck_assert_mem_eq (queued -> data , ethf -> data , 8 );
62716321 }
62726322 ck_assert_uint_eq (ps -> if_idx , TEST_PRIMARY_IF );
@@ -6277,6 +6327,54 @@ START_TEST(test_packet_socket_send_frame)
62776327}
62786328END_TEST
62796329
6330+ START_TEST (test_packet_socket_sendto_wrong_family_returns_einval )
6331+ {
6332+ #if WOLFIP_PACKET_SOCKETS
6333+ struct wolfIP s ;
6334+ int sd ;
6335+ struct wolfIP_sockaddr_ll sll ;
6336+ uint8_t frame_buf [ETH_HEADER_LEN + 8 ];
6337+
6338+ wolfIP_init (& s );
6339+ mock_link_init (& s );
6340+
6341+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 (ETH_TYPE_IP ));
6342+ ck_assert_int_ge (sd , 0 );
6343+
6344+ memset (& sll , 0 , sizeof (sll ));
6345+ sll .sll_family = AF_INET ;
6346+ sll .sll_protocol = ee16 (ETH_TYPE_IP );
6347+
6348+ memset (frame_buf , 0xAB , sizeof (frame_buf ));
6349+ ck_assert_int_eq (wolfIP_sock_sendto (& s , sd , frame_buf , sizeof (frame_buf ), 0 ,
6350+ (struct wolfIP_sockaddr * )& sll , sizeof (sll )),
6351+ - WOLFIP_EINVAL );
6352+ #else
6353+ ck_abort_msg ("WOLFIP_PACKET_SOCKETS disabled" );
6354+ #endif
6355+ }
6356+ END_TEST
6357+
6358+ START_TEST (test_packet_socket_setsockopt_rejected )
6359+ {
6360+ #if WOLFIP_PACKET_SOCKETS
6361+ struct wolfIP s ;
6362+ int sd ;
6363+ int one = 1 ;
6364+
6365+ wolfIP_init (& s );
6366+ mock_link_init (& s );
6367+
6368+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 (ETH_TYPE_IP ));
6369+ ck_assert_int_ge (sd , 0 );
6370+ ck_assert_int_eq (wolfIP_sock_setsockopt (& s , sd , WOLFIP_SOL_IP , WOLFIP_IP_RECVTTL ,
6371+ & one , sizeof (one )), - WOLFIP_EINVAL );
6372+ #else
6373+ ck_abort_msg ("WOLFIP_PACKET_SOCKETS disabled" );
6374+ #endif
6375+ }
6376+ END_TEST
6377+
62806378START_TEST (test_packet_socket_recv_wrong_proto_ignored )
62816379{
62826380#if WOLFIP_PACKET_SOCKETS
@@ -6292,7 +6390,7 @@ START_TEST(test_packet_socket_recv_wrong_proto_ignored)
62926390 ll = wolfIP_getdev_ex (& s , TEST_PRIMARY_IF );
62936391 ck_assert_ptr_nonnull (ll );
62946392
6295- sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ETH_TYPE_IP );
6393+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 ( ETH_TYPE_IP ) );
62966394 ck_assert_int_ge (sd , 0 );
62976395
62986396 memset (frame , 0 , sizeof (frame_buf ));
@@ -6325,14 +6423,14 @@ START_TEST(test_packet_socket_recv_other_interface_ignored)
63256423 mock_link_init (& s );
63266424 mock_link_init_idx (& s , TEST_SECOND_IF , other_mac );
63276425
6328- sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ETH_TYPE_IP );
6426+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 ( ETH_TYPE_IP ) );
63296427 ck_assert_int_ge (sd , 0 );
63306428
63316429 {
63326430 struct wolfIP_sockaddr_ll bind_sll ;
63336431 memset (& bind_sll , 0 , sizeof (bind_sll ));
63346432 bind_sll .sll_family = AF_PACKET ;
6335- bind_sll .sll_protocol = ETH_TYPE_IP ;
6433+ bind_sll .sll_protocol = ee16 ( ETH_TYPE_IP ) ;
63366434 bind_sll .sll_ifindex = TEST_PRIMARY_IF ;
63376435 bind_sll .sll_halen = 6 ;
63386436 ck_assert_int_eq (wolfIP_sock_bind (& s , sd ,
@@ -6342,7 +6440,7 @@ START_TEST(test_packet_socket_recv_other_interface_ignored)
63426440 memset (frame , 0 , sizeof (frame_buf ));
63436441 memcpy (frame -> dst , other_mac , 6 );
63446442 memcpy (frame -> src , "\xaa\xbb\xcc\xdd\xee\xff" , 6 );
6345- frame -> type = ETH_TYPE_IP ;
6443+ frame -> type = ee16 ( ETH_TYPE_IP ) ;
63466444 memset (frame -> data , 0xBB , 6 );
63476445
63486446 wolfIP_recv_ex (& s , TEST_SECOND_IF , frame , (uint32_t )(ETH_HEADER_LEN + 6 ));
@@ -6543,6 +6641,31 @@ START_TEST(test_raw_socket_recv_uses_ip_total_length)
65436641}
65446642END_TEST
65456643
6644+ START_TEST (test_raw_socket_recv_oversize_drops_frame )
6645+ {
6646+ struct wolfIP s ;
6647+ int sd ;
6648+ struct rawsocket * rs ;
6649+ uint8_t pkt [IP_HEADER_LEN + 8 ];
6650+ uint8_t rxbuf [4 ];
6651+
6652+ wolfIP_init (& s );
6653+ mock_link_init (& s );
6654+
6655+ sd = wolfIP_sock_socket (& s , AF_INET , IPSTACK_SOCK_RAW , WI_IPPROTO_UDP );
6656+ ck_assert_int_ge (sd , 0 );
6657+ rs = & s .rawsockets [SOCKET_UNMARK (sd )];
6658+
6659+ memset (pkt , 0 , sizeof (pkt ));
6660+ pkt [0 ] = 0x45 ;
6661+ ck_assert_int_eq (fifo_push (& rs -> rxbuf , pkt , sizeof (pkt )), 0 );
6662+
6663+ ck_assert_int_eq (wolfIP_sock_recvfrom (& s , sd , rxbuf , sizeof (rxbuf ), 0 , NULL , NULL ),
6664+ - WOLFIP_EINVAL );
6665+ ck_assert_ptr_eq (fifo_peek (& rs -> rxbuf ), NULL );
6666+ }
6667+ END_TEST
6668+
65466669START_TEST (test_udp_short_frame_does_not_overread )
65476670{
65486671 struct wolfIP s ;
@@ -6591,13 +6714,13 @@ START_TEST(test_packet_socket_recvfrom_null_addrlen_rejected)
65916714 wolfIP_init (& s );
65926715 mock_link_init (& s );
65936716
6594- sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ETH_TYPE_IP );
6717+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 ( ETH_TYPE_IP ) );
65956718 ck_assert_int_ge (sd , 0 );
65966719
65976720 memset (frame , 0 , sizeof (frame_buf ));
65986721 memcpy (frame -> dst , s .ll_dev [TEST_PRIMARY_IF ].mac , 6 );
65996722 memcpy (frame -> src , "\xaa\xbb\xcc\xdd\xee\xff" , 6 );
6600- frame -> type = ETH_TYPE_IP ;
6723+ frame -> type = ee16 ( ETH_TYPE_IP ) ;
66016724 memset (frame -> data , 0xAA , 4 );
66026725
66036726 wolfIP_recv_ex (& s , TEST_PRIMARY_IF , frame , (uint32_t )sizeof (frame_buf ));
@@ -6610,6 +6733,37 @@ START_TEST(test_packet_socket_recvfrom_null_addrlen_rejected)
66106733}
66116734END_TEST
66126735
6736+ START_TEST (test_packet_socket_recv_oversize_drops_frame )
6737+ {
6738+ #if WOLFIP_PACKET_SOCKETS
6739+ struct wolfIP s ;
6740+ int sd ;
6741+ struct packetsocket * ps ;
6742+ uint8_t record [1 + ETH_HEADER_LEN + 8 ];
6743+ struct wolfIP_eth_frame * frame = (struct wolfIP_eth_frame * )(record + 1 );
6744+ uint8_t rxbuf [4 ];
6745+
6746+ wolfIP_init (& s );
6747+ mock_link_init (& s );
6748+
6749+ sd = wolfIP_sock_socket (& s , AF_PACKET , IPSTACK_SOCK_RAW , ee16 (ETH_TYPE_IP ));
6750+ ck_assert_int_ge (sd , 0 );
6751+ ps = & s .packetsockets [SOCKET_UNMARK (sd )];
6752+
6753+ memset (record , 0 , sizeof (record ));
6754+ record [0 ] = (uint8_t )TEST_PRIMARY_IF ;
6755+ frame -> type = ee16 (ETH_TYPE_IP );
6756+ ck_assert_int_eq (fifo_push (& ps -> rxbuf , record , sizeof (record )), 0 );
6757+
6758+ ck_assert_int_eq (wolfIP_sock_recvfrom (& s , sd , rxbuf , sizeof (rxbuf ), 0 , NULL , NULL ),
6759+ - WOLFIP_EINVAL );
6760+ ck_assert_ptr_eq (fifo_peek (& ps -> rxbuf ), NULL );
6761+ #else
6762+ ck_abort_msg ("WOLFIP_PACKET_SOCKETS disabled" );
6763+ #endif
6764+ }
6765+ END_TEST
6766+
66136767START_TEST (test_packet_socket_close_clears_entry )
66146768{
66156769#if WOLFIP_PACKET_SOCKETS
0 commit comments