* tests/nlattr_ifaddrmsg.c: Include <arpa/inet.h>. (IFA_FLAGS, SET_IFA_FAMILY): New macros. (init_ifaddrmsg): Set ifaddrmsg.ifa_family field. (print_ifaddrmsg): Print ifaddrmsg.ifa_family field use %s format. (main): Check decoding of IFA_ADDRESS, IFA_CACHEINFO and IFA_FLAGS. --- tests/nlattr_ifaddrmsg.c | 70 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 3 deletions(-)
diff --git a/tests/nlattr_ifaddrmsg.c b/tests/nlattr_ifaddrmsg.c index 21a5a18..42ddf15 100644 --- a/tests/nlattr_ifaddrmsg.c +++ b/tests/nlattr_ifaddrmsg.c @@ -29,12 +29,25 @@ #include "tests.h" #include <stdio.h> +#include <arpa/inet.h> #include "test_nlattr.h" #ifdef HAVE_LINUX_IF_ADDR_H # include <linux/if_addr.h> #endif #include <linux/rtnetlink.h> +#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)); + + const char address[] = "12.34.56.78"; + struct in_addr a4; + SET_IFA_FAMILY(AF_INET); + + if (!inet_pton(AF_INET, address, &a4)) + perror_msg_and_skip("inet_pton"); + + TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, + init_ifaddrmsg, print_ifaddrmsg, + IFA_ADDRESS, pattern, a4, + printf("%s", address)); + + SET_IFA_FAMILY(AF_INET6); + 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; } -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel