[PATCH v2 3/3] tests: check decoding of ifaddrmsg netlink attributes

JingPiao Chen chenjingpiao at gmail.com
Tue Aug 22 06:45:49 UTC 2017


* 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





More information about the Strace-devel mailing list