You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
98 lines
2.9 KiB
#include "tests.h"
|
|
#include "print_fields.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <sys/socket.h>
|
|
#include "netlink.h"
|
|
|
|
#define TEST_NETLINK_(fd_, nlh0_, \
|
|
type_, type_str_, \
|
|
flags_, flags_str_, \
|
|
data_len_, src_, slen_, ...) \
|
|
do { \
|
|
struct nlmsghdr *const TEST_NETLINK_nlh = \
|
|
(nlh0_) - (slen_); \
|
|
const unsigned int msg_len = \
|
|
NLMSG_HDRLEN + (data_len_); \
|
|
\
|
|
SET_STRUCT(struct nlmsghdr, TEST_NETLINK_nlh, \
|
|
.nlmsg_len = msg_len, \
|
|
.nlmsg_type = (type_), \
|
|
.nlmsg_flags = (flags_) \
|
|
); \
|
|
memcpy(NLMSG_DATA(TEST_NETLINK_nlh), (src_), (slen_)); \
|
|
\
|
|
const char *const errstr = \
|
|
sprintrc(sendto((fd_), TEST_NETLINK_nlh, \
|
|
msg_len, MSG_DONTWAIT, \
|
|
NULL, 0)); \
|
|
\
|
|
printf("sendto(%d, {{len=%u, type=%s" \
|
|
", flags=%s, seq=0, pid=0}, ", \
|
|
(fd_), msg_len, (type_str_), (flags_str_)); \
|
|
\
|
|
{ __VA_ARGS__; } \
|
|
\
|
|
printf("}, %u, MSG_DONTWAIT, NULL, 0) = %s\n", \
|
|
msg_len, errstr); \
|
|
} while (0)
|
|
|
|
#define TEST_NETLINK(fd_, nlh0_, type_, flags_, \
|
|
data_len_, src_, slen_, ...) \
|
|
TEST_NETLINK_((fd_), (nlh0_), \
|
|
(type_), #type_, \
|
|
(flags_), #flags_, \
|
|
(data_len_), (src_), (slen_), __VA_ARGS__)
|
|
|
|
#define TEST_NETLINK_OBJECT_EX_(fd_, nlh0_, \
|
|
type_, type_str_, \
|
|
flags_, flags_str_, \
|
|
obj_, fallback_func, ...) \
|
|
do { \
|
|
char pattern[DEFAULT_STRLEN]; \
|
|
fill_memory_ex(pattern, sizeof(pattern), \
|
|
'a', 'z' - 'a' + 1); \
|
|
const unsigned int plen = \
|
|
sizeof(obj_) - 1 > DEFAULT_STRLEN \
|
|
? DEFAULT_STRLEN : (int) sizeof(obj_) - 1; \
|
|
/* len < sizeof(obj_) */ \
|
|
TEST_NETLINK_((fd_), (nlh0_), \
|
|
(type_), (type_str_), \
|
|
(flags_), (flags_str_), \
|
|
plen, pattern, plen, \
|
|
(fallback_func)(pattern, plen)); \
|
|
/* short read of sizeof(obj_) */ \
|
|
TEST_NETLINK_((fd_), (nlh0_), \
|
|
(type_), (type_str_), \
|
|
(flags_), (flags_str_), \
|
|
sizeof(obj_), \
|
|
pattern, plen, \
|
|
printf("%p", \
|
|
NLMSG_DATA(TEST_NETLINK_nlh))); \
|
|
/* sizeof(obj_) */ \
|
|
TEST_NETLINK_((fd_), (nlh0_), \
|
|
(type_), (type_str_), \
|
|
(flags_), (flags_str_), \
|
|
sizeof(obj_), \
|
|
&(obj_), sizeof(obj_), \
|
|
__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define TEST_NETLINK_OBJECT_EX(fd_, nlh0_, \
|
|
type_, flags_, \
|
|
obj_, fallback_func, ...) \
|
|
TEST_NETLINK_OBJECT_EX_((fd_), (nlh0), \
|
|
(type_), #type_, \
|
|
(flags_), #flags_, \
|
|
(obj_), (fallback_func), __VA_ARGS__)
|
|
|
|
#define TEST_NETLINK_OBJECT(fd_, nlh0_, \
|
|
type_, flags_, \
|
|
obj_, ...) \
|
|
TEST_NETLINK_OBJECT_EX_((fd_), (nlh0), \
|
|
(type_), #type_, \
|
|
(flags_), #flags_, \
|
|
(obj_), print_quoted_hex, __VA_ARGS__)
|