* 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 | 65 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 62 insertions(+), 3 deletions(-)

diff --git a/tests/nlattr_ifaddrmsg.c b/tests/nlattr_ifaddrmsg.c
index 21a5a18..5ae02c2 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,51 @@ main(void)
                     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(fd, nlh0, hdrlen,
+                   init_ifaddrmsg, print_ifaddrmsg,
+                   IFA_ADDRESS, sizeof(a4), &a4, sizeof(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(fd, nlh0, hdrlen,
+                   init_ifaddrmsg, print_ifaddrmsg,
+                   IFA_ADDRESS, sizeof(a6), &a6, sizeof(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

Reply via email to