1*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
2*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
3*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
4*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_packet.h>
5*cf84ac9aSAndroid Build Coastguard Worker
6*cf84ac9aSAndroid Build Coastguard Worker static const char *errstr;
7*cf84ac9aSAndroid Build Coastguard Worker
8*cf84ac9aSAndroid Build Coastguard Worker static long
set_tpacket_req(int optname,void * optval,socklen_t len)9*cf84ac9aSAndroid Build Coastguard Worker set_tpacket_req(int optname, void *optval, socklen_t len)
10*cf84ac9aSAndroid Build Coastguard Worker {
11*cf84ac9aSAndroid Build Coastguard Worker long rc = setsockopt(-1, SOL_PACKET, optname, optval, len);
12*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
13*cf84ac9aSAndroid Build Coastguard Worker return rc;
14*cf84ac9aSAndroid Build Coastguard Worker }
15*cf84ac9aSAndroid Build Coastguard Worker
16*cf84ac9aSAndroid Build Coastguard Worker static void
test_tpacket_req(const int optname,const char * const optname_str)17*cf84ac9aSAndroid Build Coastguard Worker test_tpacket_req(const int optname, const char *const optname_str)
18*cf84ac9aSAndroid Build Coastguard Worker {
19*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_CONST_PTR(struct tpacket_req, tpreq);
20*cf84ac9aSAndroid Build Coastguard Worker socklen_t len;
21*cf84ac9aSAndroid Build Coastguard Worker
22*cf84ac9aSAndroid Build Coastguard Worker /* setsockopt with optname unknown */
23*cf84ac9aSAndroid Build Coastguard Worker set_tpacket_req(-1, NULL, 0);
24*cf84ac9aSAndroid Build Coastguard Worker printf("setsockopt(-1, SOL_PACKET, %#x /* PACKET_??? */, NULL, 0) = %s\n",
25*cf84ac9aSAndroid Build Coastguard Worker -1, errstr);
26*cf84ac9aSAndroid Build Coastguard Worker
27*cf84ac9aSAndroid Build Coastguard Worker /* classic setsockopt */
28*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(struct tpacket_req);
29*cf84ac9aSAndroid Build Coastguard Worker set_tpacket_req(optname, tpreq, len);
30*cf84ac9aSAndroid Build Coastguard Worker printf("setsockopt(-1, SOL_PACKET, %s, {tp_block_size=%u,"
31*cf84ac9aSAndroid Build Coastguard Worker " tp_block_nr=%u, tp_frame_size=%u, tp_frame_nr=%u}, %d) = %s\n",
32*cf84ac9aSAndroid Build Coastguard Worker optname_str, tpreq->tp_block_size, tpreq->tp_block_nr,
33*cf84ac9aSAndroid Build Coastguard Worker tpreq->tp_frame_size, tpreq->tp_frame_nr, len, errstr);
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard Worker /* setsockopt with optlen larger than usual */
36*cf84ac9aSAndroid Build Coastguard Worker len = len + 1;
37*cf84ac9aSAndroid Build Coastguard Worker set_tpacket_req(optname, tpreq, len);
38*cf84ac9aSAndroid Build Coastguard Worker printf("setsockopt(-1, SOL_PACKET, %s, %p,"
39*cf84ac9aSAndroid Build Coastguard Worker " %d) = %s\n", optname_str, tpreq, len, errstr);
40*cf84ac9aSAndroid Build Coastguard Worker }
41*cf84ac9aSAndroid Build Coastguard Worker
42*cf84ac9aSAndroid Build Coastguard Worker int
main(void)43*cf84ac9aSAndroid Build Coastguard Worker main(void)
44*cf84ac9aSAndroid Build Coastguard Worker {
45*cf84ac9aSAndroid Build Coastguard Worker test_tpacket_req(ARG_STR(PACKET_RX_RING));
46*cf84ac9aSAndroid Build Coastguard Worker #ifdef PACKET_TX_RING
47*cf84ac9aSAndroid Build Coastguard Worker test_tpacket_req(ARG_STR(PACKET_TX_RING));
48*cf84ac9aSAndroid Build Coastguard Worker #endif
49*cf84ac9aSAndroid Build Coastguard Worker
50*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
51*cf84ac9aSAndroid Build Coastguard Worker return 0;
52*cf84ac9aSAndroid Build Coastguard Worker }
53