From: JingPiao Chen Date: Tue, 22 Aug 2017 06:45:49 +0000 (+0800) Subject: tests: check decoding of ifaddrmsg netlink attributes X-Git-Tag: v4.19~72 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc9fd5ffb9633a15b2753b2c812ce78b222cec7a;p=strace tests: check decoding of ifaddrmsg netlink attributes * tests/nlattr_ifaddrmsg.c: Include . (IFA_FLAGS, SET_IFA_FAMILY): New macros. (init_ifaddrmsg): Set ifaddrmsg.ifa_family field from ifa_family. (print_ifaddrmsg): Print ifaddrmsg.ifa_family field using ifa_family_str. (main): Check decoding of IFA_ADDRESS, IFA_CACHEINFO, and IFA_FLAGS. --- diff --git a/tests/nlattr_ifaddrmsg.c b/tests/nlattr_ifaddrmsg.c index 21a5a180..93fbef1b 100644 --- a/tests/nlattr_ifaddrmsg.c +++ b/tests/nlattr_ifaddrmsg.c @@ -29,12 +29,25 @@ #include "tests.h" #include +#include #include "test_nlattr.h" #ifdef HAVE_LINUX_IF_ADDR_H # include #endif #include +#define IFA_FLAGS 8 + +#define SET_IFA_FAMILY(af) \ + do { \ + ifa_family = af; \ + ifa_family_str = #af; \ + } \ + while (0) + +uint8_t ifa_family; +const char *ifa_family_str; + static void init_ifaddrmsg(struct nlmsghdr *const nlh, const unsigned int msg_len) { @@ -46,7 +59,7 @@ init_ifaddrmsg(struct nlmsghdr *const nlh, const unsigned int msg_len) struct ifaddrmsg *const msg = NLMSG_DATA(nlh); SET_STRUCT(struct ifaddrmsg, msg, - .ifa_family = AF_UNIX, + .ifa_family = ifa_family, .ifa_flags = IFA_F_SECONDARY, .ifa_scope = RT_SCOPE_UNIVERSE, .ifa_index = ifindex_lo() @@ -57,12 +70,12 @@ static void print_ifaddrmsg(const unsigned int msg_len) { printf("{len=%u, type=RTM_GETADDR, flags=NLM_F_DUMP" - ", seq=0, pid=0}, {ifa_family=AF_UNIX" + ", seq=0, pid=0}, {ifa_family=%s" ", ifa_prefixlen=0" ", ifa_flags=IFA_F_SECONDARY" ", ifa_scope=RT_SCOPE_UNIVERSE" ", ifa_index=" IFINDEX_LO_STR "}", - msg_len); + msg_len, ifa_family_str); } int @@ -77,6 +90,7 @@ main(void) static char pattern[4096]; fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1); + SET_IFA_FAMILY(AF_UNSPEC); const unsigned int nla_type = 0xffff & NLA_TYPE_MASK; char nla_type_str[256]; sprintf(nla_type_str, "%#x /* IFA_??? */", nla_type); @@ -86,6 +100,56 @@ main(void) 4, pattern, 4, print_quoted_hex(pattern, 4)); + TEST_NLATTR(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_ADDRESS, 4, pattern, 4, + print_quoted_hex(pattern, 4)); + + SET_IFA_FAMILY(AF_INET); + static const char address4[] = "12.34.56.78"; + struct in_addr a4; + + if (!inet_pton(AF_INET, address4, &a4)) + perror_msg_and_skip("inet_pton"); + + TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_ADDRESS, pattern, a4, + printf("%s", address4)); + + SET_IFA_FAMILY(AF_INET6); + static const char address6[] = "12:34:56:78:90:ab:cd:ef"; + struct in6_addr a6; + + if (!inet_pton(AF_INET6, address6, &a6)) + perror_msg_and_skip("inet_pton"); + + TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_ADDRESS, pattern, a6, + printf("%s", address6)); + + static const struct ifa_cacheinfo ci = { + .ifa_prefered = 0xabcdefac, + .ifa_valid = 0xbcdadbca, + .cstamp = 0xcdabedba, + .tstamp = 0xdebabdac + }; + TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_CACHEINFO, pattern, ci, + PRINT_FIELD_U("{", ci, ifa_prefered); + PRINT_FIELD_U(", ", ci, ifa_valid); + PRINT_FIELD_U(", ", ci, cstamp); + PRINT_FIELD_U(", ", ci, tstamp); + printf("}")); + + const uint32_t ifa_flags = IFA_F_SECONDARY | IFA_F_PERMANENT; + TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_FLAGS, pattern, ifa_flags, + printf("IFA_F_SECONDARY|IFA_F_PERMANENT")); + puts("+++ exited with 0 +++"); return 0; }