* tests/netlink_netfilter.c: Include <netinet/in.h>, <arpa/inet.h>
and <linux/netfilter/nf_tables.h>.
Replace "netlink.h" with "test_netlink.h".
(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWTABLE): New macros.
(test_nlmsg_done, test_nfgenmsg): New functions.
(main): Use them.
---
 tests/netlink_netfilter.c | 115 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 113 insertions(+), 2 deletions(-)

diff --git a/tests/netlink_netfilter.c b/tests/netlink_netfilter.c
index db2622e..e2cecd6 100644
--- a/tests/netlink_netfilter.c
+++ b/tests/netlink_netfilter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 JingPiao Chen <chenjingp...@gmail.com>
+ * Copyright (c) 2018 Chen Jingpiao <chenjingp...@gmail.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,9 +32,21 @@
 # include <stdio.h>
 # include <string.h>
 # include <unistd.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
 # include <sys/socket.h>
-# include "netlink.h"
+# include "test_netlink.h"
 # include <linux/netfilter/nfnetlink.h>
+# ifdef HAVE_LINUX_NETFILTER_NF_TABLES_H
+#  include <linux/netfilter/nf_tables.h>
+# endif
+
+# ifndef NFNL_SUBSYS_NFTABLES
+#  define NFNL_SUBSYS_NFTABLES 10
+# endif
+# ifndef NFT_MSG_NEWTABLE
+#  define NFT_MSG_NEWTABLE 0
+# endif
 
 static void
 test_nlmsg_type(const int fd)
@@ -70,6 +82,103 @@ test_nlmsg_type(const int fd)
               fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
 }
 
+static void
+test_nlmsg_done(const int fd)
+{
+       void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+       const int num = 0xabcdefad;
+
+       TEST_NETLINK(fd, nlh0, NLMSG_DONE, NLM_F_REQUEST,
+                    sizeof(num), &num, sizeof(num),
+                    printf("%d", num));
+}
+
+static void
+test_nfgenmsg(const int fd)
+{
+       void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+
+       struct nfgenmsg msg = {
+               .nfgen_family = AF_UNIX,
+               .version = 0,
+               .res_id = NFNL_SUBSYS_NFTABLES
+       };
+
+       TEST_NETLINK_OBJECT_EX_(fd, nlh0,
+                               NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_NEWTABLE,
+                               "NFNL_SUBSYS_NFTABLES<<8|NFT_MSG_NEWTABLE",
+                               NLM_F_REQUEST, "NLM_F_REQUEST",
+                               msg, print_quoted_hex,
+                               printf("{nfgen_family=AF_UNIX");
+# ifdef NFNETLINK_V0
+                               printf(", version=NFNETLINK_V0");
+# else
+                               printf(", version=%#x /* NFNETLINK_??? */",
+                                      msg.version);
+# endif
+                               printf(", res_id=NFNL_SUBSYS_NFTABLES"));
+
+       msg.res_id = htons(NFNL_SUBSYS_NFTABLES);
+       TEST_NETLINK_(fd, nlh0,
+                     NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_NEWTABLE,
+                     "NFNL_SUBSYS_NFTABLES<<8|NFT_MSG_NEWTABLE",
+                     NLM_F_REQUEST, "NLM_F_REQUEST",
+                     sizeof(msg), &msg, sizeof(msg),
+                     printf("{nfgen_family=AF_UNIX");
+# ifdef NFNETLINK_V0
+                     printf(", version=NFNETLINK_V0");
+# else
+                     printf(", version=%#x /* NFNETLINK_??? */", msg.version);
+# endif
+                     printf(", res_id=htons(NFNL_SUBSYS_NFTABLES)"));
+
+       msg.res_id = htons(0xabcd);
+       TEST_NETLINK_(fd, nlh0,
+                     NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_NEWTABLE,
+                     "NFNL_SUBSYS_NFTABLES<<8|NFT_MSG_NEWTABLE",
+                     NLM_F_REQUEST, "NLM_F_REQUEST",
+                     sizeof(msg), &msg, sizeof(msg),
+                     printf("{nfgen_family=AF_UNIX");
+# ifdef NFNETLINK_V0
+                     printf(", version=NFNETLINK_V0");
+# else
+                     printf(", version=%#x /* NFNETLINK_??? */", msg.version);
+# endif
+                     printf(", res_id=htons(%d)", 0xabcd));
+
+# ifdef NFNL_MSG_BATCH_BEGIN
+       msg.res_id = htons(NFNL_SUBSYS_NFTABLES);
+       TEST_NETLINK(fd, nlh0,
+                    NFNL_MSG_BATCH_BEGIN, NLM_F_REQUEST,
+                    sizeof(msg), &msg, sizeof(msg),
+                    printf("{nfgen_family=AF_UNIX");
+#  ifdef NFNETLINK_V0
+                    printf(", version=NFNETLINK_V0");
+#  else
+                    printf(", version=%#x /* NFNETLINK_??? */", msg.version);
+#  endif
+                    printf(", res_id=htons(%d)", NFNL_SUBSYS_NFTABLES));
+
+       char str_buf[NLMSG_ALIGN(sizeof(msg)) + 4];
+
+       msg.res_id = htons(0xabcd);
+       memcpy(str_buf, &msg, sizeof(msg));
+       memcpy(str_buf + NLMSG_ALIGN(sizeof(msg)), "1234", 4);
+
+       TEST_NETLINK(fd, nlh0,
+                    NFNL_MSG_BATCH_BEGIN, NLM_F_REQUEST,
+                    sizeof(str_buf), str_buf, sizeof(str_buf),
+                    printf("{nfgen_family=AF_UNIX");
+#  ifdef NFNETLINK_V0
+                    printf(", version=NFNETLINK_V0");
+#  else
+                    printf(", version=%#x /* NFNETLINK_??? */", msg.version);
+#  endif
+                    printf(", res_id=htons(%d)"
+                           ", \"\\x31\\x32\\x33\\x34\"", 0xabcd));
+# endif /* NFNL_MSG_BATCH_BEGIN */
+}
+
 int main(void)
 {
        skip_if_unavailable("/proc/self/fd/");
@@ -77,6 +186,8 @@ int main(void)
        int fd = create_nl_socket(NETLINK_NETFILTER);
 
        test_nlmsg_type(fd);
+       test_nlmsg_done(fd);
+       test_nfgenmsg(fd);
 
        printf("+++ exited with 0 +++\n");
 
-- 
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