xref: /aosp_15_r20/external/strace/tests-m32/net-packet_mreq.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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
packet_mreq_membership(int optname,void * optval,socklen_t len)9*cf84ac9aSAndroid Build Coastguard Worker packet_mreq_membership(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_packet_mreq(const int optname,const char * const optname_str)17*cf84ac9aSAndroid Build Coastguard Worker test_packet_mreq(const int optname, const char *const optname_str)
18*cf84ac9aSAndroid Build Coastguard Worker {
19*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(struct packet_mreq, pmreq);
20*cf84ac9aSAndroid Build Coastguard Worker 	socklen_t len = sizeof(struct packet_mreq);
21*cf84ac9aSAndroid Build Coastguard Worker 
22*cf84ac9aSAndroid Build Coastguard Worker 	/* setsockopt with optname unknown */
23*cf84ac9aSAndroid Build Coastguard Worker 	packet_mreq_membership(-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 	/* setsockopt with mr_type unknown */
28*cf84ac9aSAndroid Build Coastguard Worker 	pmreq->mr_ifindex = 0;
29*cf84ac9aSAndroid Build Coastguard Worker 	pmreq->mr_alen = ARRAY_SIZE(pmreq->mr_address);
30*cf84ac9aSAndroid Build Coastguard Worker 	packet_mreq_membership(optname, pmreq, len);
31*cf84ac9aSAndroid Build Coastguard Worker 	printf("setsockopt(-1, SOL_PACKET, %s, {mr_ifindex=%d,"
32*cf84ac9aSAndroid Build Coastguard Worker 	       " mr_type=%#x /* PACKET_MR_??? */, mr_alen=%d, mr_address=",
33*cf84ac9aSAndroid Build Coastguard Worker 	       optname_str, pmreq->mr_ifindex, pmreq->mr_type, pmreq->mr_alen);
34*cf84ac9aSAndroid Build Coastguard Worker 	for (unsigned int i = 0; i < ARRAY_SIZE(pmreq->mr_address); i++) {
35*cf84ac9aSAndroid Build Coastguard Worker 		printf("%02x", pmreq->mr_address[i]);
36*cf84ac9aSAndroid Build Coastguard Worker 	}
37*cf84ac9aSAndroid Build Coastguard Worker 	printf("}, %d) = %s\n", len, errstr);
38*cf84ac9aSAndroid Build Coastguard Worker 
39*cf84ac9aSAndroid Build Coastguard Worker 	/* setsockopt with mr_type unknown and mr_alen > sizeof(mr_address) */
40*cf84ac9aSAndroid Build Coastguard Worker 	pmreq->mr_alen = ARRAY_SIZE(pmreq->mr_address) + 1;
41*cf84ac9aSAndroid Build Coastguard Worker 	packet_mreq_membership(optname, pmreq, len);
42*cf84ac9aSAndroid Build Coastguard Worker 	printf("setsockopt(-1, SOL_PACKET, %s, {mr_ifindex=%d,"
43*cf84ac9aSAndroid Build Coastguard Worker 	       " mr_type=%#x /* PACKET_MR_??? */, mr_alen=%d, mr_address=",
44*cf84ac9aSAndroid Build Coastguard Worker 	       optname_str, pmreq->mr_ifindex, pmreq->mr_type, pmreq->mr_alen);
45*cf84ac9aSAndroid Build Coastguard Worker 	for (unsigned int i = 0; i < ARRAY_SIZE(pmreq->mr_address); i++) {
46*cf84ac9aSAndroid Build Coastguard Worker 		printf("%02x", pmreq->mr_address[i]);
47*cf84ac9aSAndroid Build Coastguard Worker 	}
48*cf84ac9aSAndroid Build Coastguard Worker 	printf("}, %d) = %s\n", len, errstr);
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker 	/* setsockopt with mr_type unknown and mr_alen < sizeof(mr_address) */
51*cf84ac9aSAndroid Build Coastguard Worker 	pmreq->mr_alen = ARRAY_SIZE(pmreq->mr_address) - 1;
52*cf84ac9aSAndroid Build Coastguard Worker 	packet_mreq_membership(optname, pmreq, len);
53*cf84ac9aSAndroid Build Coastguard Worker 	printf("setsockopt(-1, SOL_PACKET, %s, {mr_ifindex=%d,"
54*cf84ac9aSAndroid Build Coastguard Worker 	       " mr_type=%#x /* PACKET_MR_??? */, mr_alen=%d, mr_address=",
55*cf84ac9aSAndroid Build Coastguard Worker 	       optname_str, pmreq->mr_ifindex, pmreq->mr_type, pmreq->mr_alen);
56*cf84ac9aSAndroid Build Coastguard Worker 	for (unsigned int i = 0; i < pmreq->mr_alen; i++) {
57*cf84ac9aSAndroid Build Coastguard Worker 		printf("%02x", pmreq->mr_address[i]);
58*cf84ac9aSAndroid Build Coastguard Worker 	}
59*cf84ac9aSAndroid Build Coastguard Worker 	printf("}, %d) = %s\n", len, errstr);
60*cf84ac9aSAndroid Build Coastguard Worker 
61*cf84ac9aSAndroid Build Coastguard Worker 	/* setsockopt with valid mr_type */
62*cf84ac9aSAndroid Build Coastguard Worker 	pmreq->mr_alen = ARRAY_SIZE(pmreq->mr_address);
63*cf84ac9aSAndroid Build Coastguard Worker 	static const struct {
64*cf84ac9aSAndroid Build Coastguard Worker 		unsigned short type;
65*cf84ac9aSAndroid Build Coastguard Worker 		const char *const type_str;
66*cf84ac9aSAndroid Build Coastguard Worker 	} a[] = {
67*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PACKET_MR_MULTICAST) },
68*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PACKET_MR_PROMISC) },
69*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PACKET_MR_ALLMULTI) },
70*cf84ac9aSAndroid Build Coastguard Worker #ifdef PACKET_MR_UNICAST
71*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PACKET_MR_UNICAST) },
72*cf84ac9aSAndroid Build Coastguard Worker #endif
73*cf84ac9aSAndroid Build Coastguard Worker 	};
74*cf84ac9aSAndroid Build Coastguard Worker 
75*cf84ac9aSAndroid Build Coastguard Worker 	for (unsigned int i = 0; i < ARRAY_SIZE(a); i++) {
76*cf84ac9aSAndroid Build Coastguard Worker 		pmreq->mr_type = a[i].type;
77*cf84ac9aSAndroid Build Coastguard Worker 		packet_mreq_membership(optname, pmreq, len);
78*cf84ac9aSAndroid Build Coastguard Worker 		printf("setsockopt(-1, SOL_PACKET, %s, {mr_ifindex=%d,"
79*cf84ac9aSAndroid Build Coastguard Worker 		       " mr_type=%s, mr_alen=%d, mr_address=",
80*cf84ac9aSAndroid Build Coastguard Worker 		       optname_str, pmreq->mr_ifindex, a[i].type_str, pmreq->mr_alen);
81*cf84ac9aSAndroid Build Coastguard Worker 		for (unsigned int i = 0; i < pmreq->mr_alen; i++) {
82*cf84ac9aSAndroid Build Coastguard Worker 			printf("%02x", pmreq->mr_address[i]);
83*cf84ac9aSAndroid Build Coastguard Worker 		}
84*cf84ac9aSAndroid Build Coastguard Worker 		printf("}, %d) = %s\n", len, errstr);
85*cf84ac9aSAndroid Build Coastguard Worker 	}
86*cf84ac9aSAndroid Build Coastguard Worker 
87*cf84ac9aSAndroid Build Coastguard Worker 	/* setsockopt with optlen larger than usual */
88*cf84ac9aSAndroid Build Coastguard Worker 	len = len + 1;
89*cf84ac9aSAndroid Build Coastguard Worker 	packet_mreq_membership(optname, pmreq, len);
90*cf84ac9aSAndroid Build Coastguard Worker 	printf("setsockopt(-1, SOL_PACKET, %s, %p,"
91*cf84ac9aSAndroid Build Coastguard Worker 	       " %d) = %s\n", optname_str, pmreq, len, errstr);
92*cf84ac9aSAndroid Build Coastguard Worker }
93*cf84ac9aSAndroid Build Coastguard Worker 
94*cf84ac9aSAndroid Build Coastguard Worker int
main(void)95*cf84ac9aSAndroid Build Coastguard Worker main(void)
96*cf84ac9aSAndroid Build Coastguard Worker {
97*cf84ac9aSAndroid Build Coastguard Worker 	test_packet_mreq(ARG_STR(PACKET_ADD_MEMBERSHIP));
98*cf84ac9aSAndroid Build Coastguard Worker 	test_packet_mreq(ARG_STR(PACKET_DROP_MEMBERSHIP));
99*cf84ac9aSAndroid Build Coastguard Worker 
100*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
101*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
102*cf84ac9aSAndroid Build Coastguard Worker }
103