53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
#include "tests.h"
 | 
						|
#include <stdio.h>
 | 
						|
#include <sys/socket.h>
 | 
						|
#include <linux/if_packet.h>
 | 
						|
 | 
						|
static const char *errstr;
 | 
						|
 | 
						|
static long
 | 
						|
set_tpacket_req(int optname, void *optval, socklen_t len)
 | 
						|
{
 | 
						|
	long rc = setsockopt(-1, SOL_PACKET, optname, optval, len);
 | 
						|
	errstr = sprintrc(rc);
 | 
						|
	return rc;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
test_tpacket_req(const int optname, const char *const optname_str)
 | 
						|
{
 | 
						|
	TAIL_ALLOC_OBJECT_CONST_PTR(struct tpacket_req, tpreq);
 | 
						|
	socklen_t len;
 | 
						|
 | 
						|
	/* setsockopt with optname unknown */
 | 
						|
	set_tpacket_req(-1, NULL, 0);
 | 
						|
	printf("setsockopt(-1, SOL_PACKET, %#x /* PACKET_??? */, NULL, 0) = %s\n",
 | 
						|
	       -1, errstr);
 | 
						|
 | 
						|
	/* classic setsockopt */
 | 
						|
	len = sizeof(struct tpacket_req);
 | 
						|
	set_tpacket_req(optname, tpreq, len);
 | 
						|
	printf("setsockopt(-1, SOL_PACKET, %s, {tp_block_size=%u,"
 | 
						|
	       " tp_block_nr=%u, tp_frame_size=%u, tp_frame_nr=%u}, %d) = %s\n",
 | 
						|
	       optname_str, tpreq->tp_block_size, tpreq->tp_block_nr,
 | 
						|
	       tpreq->tp_frame_size, tpreq->tp_frame_nr, len, errstr);
 | 
						|
 | 
						|
	/* setsockopt with optlen larger than usual */
 | 
						|
	len = len + 1;
 | 
						|
	set_tpacket_req(optname, tpreq, len);
 | 
						|
	printf("setsockopt(-1, SOL_PACKET, %s, %p,"
 | 
						|
	       " %d) = %s\n", optname_str, tpreq, len, errstr);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main(void)
 | 
						|
{
 | 
						|
	test_tpacket_req(ARG_STR(PACKET_RX_RING));
 | 
						|
#ifdef PACKET_TX_RING
 | 
						|
	test_tpacket_req(ARG_STR(PACKET_TX_RING));
 | 
						|
#endif
 | 
						|
 | 
						|
	puts("+++ exited with 0 +++");
 | 
						|
	return 0;
 | 
						|
}
 |