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