xref: /aosp_15_r20/external/strace/tests-m32/test_netlink.h (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
2*cf84ac9aSAndroid Build Coastguard Worker #include "print_fields.h"
3*cf84ac9aSAndroid Build Coastguard Worker 
4*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
5*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
6*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
7*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
8*cf84ac9aSAndroid Build Coastguard Worker #include "netlink.h"
9*cf84ac9aSAndroid Build Coastguard Worker 
10*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NETLINK_(fd_, nlh0_,					\
11*cf84ac9aSAndroid Build Coastguard Worker 		      type_, type_str_,					\
12*cf84ac9aSAndroid Build Coastguard Worker 		      flags_, flags_str_,				\
13*cf84ac9aSAndroid Build Coastguard Worker 		      data_len_, src_, slen_, ...)			\
14*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
15*cf84ac9aSAndroid Build Coastguard Worker 		struct nlmsghdr *const TEST_NETLINK_nlh =		\
16*cf84ac9aSAndroid Build Coastguard Worker 			(nlh0_) - (slen_);				\
17*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int msg_len =				\
18*cf84ac9aSAndroid Build Coastguard Worker 			NLMSG_HDRLEN + (data_len_);			\
19*cf84ac9aSAndroid Build Coastguard Worker 									\
20*cf84ac9aSAndroid Build Coastguard Worker 		SET_STRUCT(struct nlmsghdr, TEST_NETLINK_nlh,		\
21*cf84ac9aSAndroid Build Coastguard Worker 			.nlmsg_len = msg_len,				\
22*cf84ac9aSAndroid Build Coastguard Worker 			.nlmsg_type = (type_),				\
23*cf84ac9aSAndroid Build Coastguard Worker 			.nlmsg_flags = (flags_)				\
24*cf84ac9aSAndroid Build Coastguard Worker 		);							\
25*cf84ac9aSAndroid Build Coastguard Worker 		memcpy(NLMSG_DATA(TEST_NETLINK_nlh), (src_), (slen_));	\
26*cf84ac9aSAndroid Build Coastguard Worker 									\
27*cf84ac9aSAndroid Build Coastguard Worker 		const char *const errstr =				\
28*cf84ac9aSAndroid Build Coastguard Worker 			sprintrc(sendto((fd_), TEST_NETLINK_nlh,	\
29*cf84ac9aSAndroid Build Coastguard Worker 					msg_len, MSG_DONTWAIT,		\
30*cf84ac9aSAndroid Build Coastguard Worker 					NULL, 0));			\
31*cf84ac9aSAndroid Build Coastguard Worker 									\
32*cf84ac9aSAndroid Build Coastguard Worker 		printf("sendto(%d, {{len=%u, type=%s"			\
33*cf84ac9aSAndroid Build Coastguard Worker 		       ", flags=%s, seq=0, pid=0}, ",			\
34*cf84ac9aSAndroid Build Coastguard Worker 		       (fd_), msg_len, (type_str_), (flags_str_));	\
35*cf84ac9aSAndroid Build Coastguard Worker 									\
36*cf84ac9aSAndroid Build Coastguard Worker 		{ __VA_ARGS__; }					\
37*cf84ac9aSAndroid Build Coastguard Worker 									\
38*cf84ac9aSAndroid Build Coastguard Worker 		printf("}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",		\
39*cf84ac9aSAndroid Build Coastguard Worker 		       msg_len, errstr);				\
40*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
41*cf84ac9aSAndroid Build Coastguard Worker 
42*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NETLINK(fd_, nlh0_, type_, flags_,				\
43*cf84ac9aSAndroid Build Coastguard Worker 		     data_len_, src_, slen_, ...)			\
44*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_((fd_), (nlh0_),					\
45*cf84ac9aSAndroid Build Coastguard Worker 		      (type_), #type_,					\
46*cf84ac9aSAndroid Build Coastguard Worker 		      (flags_), #flags_,				\
47*cf84ac9aSAndroid Build Coastguard Worker 		      (data_len_), (src_), (slen_), __VA_ARGS__)
48*cf84ac9aSAndroid Build Coastguard Worker 
49*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NETLINK_OBJECT_EX_(fd_, nlh0_,				\
50*cf84ac9aSAndroid Build Coastguard Worker 				type_, type_str_,			\
51*cf84ac9aSAndroid Build Coastguard Worker 				flags_, flags_str_,			\
52*cf84ac9aSAndroid Build Coastguard Worker 				obj_, fallback_func, ...)		\
53*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
54*cf84ac9aSAndroid Build Coastguard Worker 		char pattern[DEFAULT_STRLEN];				\
55*cf84ac9aSAndroid Build Coastguard Worker 		fill_memory_ex(pattern, sizeof(pattern),		\
56*cf84ac9aSAndroid Build Coastguard Worker 			       'a', 'z' - 'a' + 1);			\
57*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int plen =				\
58*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_) - 1 > DEFAULT_STRLEN		\
59*cf84ac9aSAndroid Build Coastguard Worker 			? DEFAULT_STRLEN : (int) sizeof(obj_) - 1;	\
60*cf84ac9aSAndroid Build Coastguard Worker 		/* len < sizeof(obj_) */				\
61*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
62*cf84ac9aSAndroid Build Coastguard Worker 			      (type_), (type_str_),			\
63*cf84ac9aSAndroid Build Coastguard Worker 			      (flags_), (flags_str_),			\
64*cf84ac9aSAndroid Build Coastguard Worker 			      plen, pattern, plen,			\
65*cf84ac9aSAndroid Build Coastguard Worker 			      (fallback_func)(pattern, plen));		\
66*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
67*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
68*cf84ac9aSAndroid Build Coastguard Worker 			      (type_), (type_str_),			\
69*cf84ac9aSAndroid Build Coastguard Worker 			      (flags_), (flags_str_),			\
70*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(obj_),				\
71*cf84ac9aSAndroid Build Coastguard Worker 			      pattern, plen,				\
72*cf84ac9aSAndroid Build Coastguard Worker 			      printf("%p",				\
73*cf84ac9aSAndroid Build Coastguard Worker 				     NLMSG_DATA(TEST_NETLINK_nlh)));	\
74*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
75*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
76*cf84ac9aSAndroid Build Coastguard Worker 			      (type_), (type_str_),			\
77*cf84ac9aSAndroid Build Coastguard Worker 			      (flags_), (flags_str_),			\
78*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(obj_),				\
79*cf84ac9aSAndroid Build Coastguard Worker 			      &(obj_), sizeof(obj_),			\
80*cf84ac9aSAndroid Build Coastguard Worker 			      __VA_ARGS__);				\
81*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NETLINK_OBJECT_EX(fd_, nlh0_,				\
84*cf84ac9aSAndroid Build Coastguard Worker 			       type_, flags_,				\
85*cf84ac9aSAndroid Build Coastguard Worker 			       obj_, fallback_func, ...)		\
86*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_OBJECT_EX_((fd_), (nlh0),				\
87*cf84ac9aSAndroid Build Coastguard Worker 				(type_), #type_,			\
88*cf84ac9aSAndroid Build Coastguard Worker 				(flags_), #flags_,			\
89*cf84ac9aSAndroid Build Coastguard Worker 				(obj_), (fallback_func), __VA_ARGS__)
90*cf84ac9aSAndroid Build Coastguard Worker 
91*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NETLINK_OBJECT(fd_, nlh0_,					\
92*cf84ac9aSAndroid Build Coastguard Worker 			    type_, flags_,				\
93*cf84ac9aSAndroid Build Coastguard Worker 			    obj_, ...)					\
94*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_OBJECT_EX_((fd_), (nlh0),				\
95*cf84ac9aSAndroid Build Coastguard Worker 				(type_), #type_,			\
96*cf84ac9aSAndroid Build Coastguard Worker 				(flags_), #flags_,			\
97*cf84ac9aSAndroid Build Coastguard Worker 				(obj_), print_quoted_hex, __VA_ARGS__)
98