libnftnl 1.2.9
nft-set-test.c
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * (C) 2013 by Ana Rey Botello <anarey@gmail.com>
4 */
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <netinet/in.h>
10#include <linux/netfilter/nf_tables.h>
11
12#include <libnftnl/set.h>
13
14static int test_ok = 1;
15
16static void print_err(const char *msg)
17{
18 test_ok = 0;
19 printf("\033[31mERROR:\e[0m %s\n", msg);
20}
21
22static void cmp_nftnl_set(struct nftnl_set *a, struct nftnl_set *b)
23{
24 const uint8_t *data_a, *data_b;
25 uint32_t datalen_a, datalen_b;
26
27 if (strcmp(nftnl_set_get_str(a, NFTNL_SET_TABLE),
28 nftnl_set_get_str(b, NFTNL_SET_TABLE)) != 0)
29 print_err("Set table mismatches");
30 if (strcmp(nftnl_set_get_str(a, NFTNL_SET_NAME),
31 nftnl_set_get_str(b, NFTNL_SET_NAME)) != 0)
32 print_err("Set name mismatches");
33 if (nftnl_set_get_u32(a, NFTNL_SET_FLAGS) !=
34 nftnl_set_get_u32(b, NFTNL_SET_FLAGS))
35 print_err("Set flags mismatches");
36 if (nftnl_set_get_u32(a, NFTNL_SET_KEY_TYPE) !=
37 nftnl_set_get_u32(b, NFTNL_SET_KEY_TYPE))
38 print_err("Set key-type mismatches");
39 if (nftnl_set_get_u32(a, NFTNL_SET_KEY_LEN) !=
40 nftnl_set_get_u32(b, NFTNL_SET_KEY_LEN))
41 print_err("Set key-len mismatches");
42 if (nftnl_set_get_u32(a, NFTNL_SET_DATA_TYPE) !=
43 nftnl_set_get_u32(b, NFTNL_SET_DATA_TYPE))
44 print_err("Set data-type mismatches");
45 if (nftnl_set_get_u32(a, NFTNL_SET_DATA_LEN) !=
46 nftnl_set_get_u32(b, NFTNL_SET_DATA_LEN))
47 print_err("Set data-len mismatches");
48 if (strcmp(nftnl_set_get_str(a, NFTNL_SET_USERDATA),
49 nftnl_set_get_str(b, NFTNL_SET_USERDATA)) != 0)
50 print_err("Set userdata mismatches");
51
52 data_a = nftnl_set_get_data(a, NFTNL_SET_DESC_CONCAT, &datalen_a);
53 data_b = nftnl_set_get_data(b, NFTNL_SET_DESC_CONCAT, &datalen_b);
54 if (datalen_a != datalen_b ||
55 memcmp(data_a, data_b, datalen_a))
56 print_err("Set desc concat mismatches");
57}
58
59int main(int argc, char *argv[])
60{
61 struct nftnl_set *a, *b = NULL;
62 uint8_t field_lengths[16];
63 char buf[4096];
64 struct nlmsghdr *nlh;
65
66 a = nftnl_set_alloc();
67 b = nftnl_set_alloc();
68 if (a == NULL || b == NULL)
69 print_err("OOM");
70
71 nftnl_set_set_str(a, NFTNL_SET_TABLE, "test-table");
72 nftnl_set_set_str(a, NFTNL_SET_NAME, "test-name");
73 nftnl_set_set_u32(a, NFTNL_SET_FLAGS, 0x12345678);
74 nftnl_set_set_u32(a, NFTNL_SET_KEY_TYPE, 0x12345678);
75 nftnl_set_set_u32(a, NFTNL_SET_KEY_LEN, 0x12345678);
76 nftnl_set_set_u32(a, NFTNL_SET_DATA_TYPE, 0x12345678);
77 nftnl_set_set_u32(a, NFTNL_SET_DATA_LEN, 0x12345678);
78 nftnl_set_set_u32(a, NFTNL_SET_FAMILY, 0x12345678);
79 nftnl_set_set_str(a, NFTNL_SET_USERDATA, "testing user data");
80
81 memset(field_lengths, 0xff, sizeof(field_lengths));
82 if (!nftnl_set_set_data(a, NFTNL_SET_DESC_CONCAT, field_lengths, 17))
83 print_err("oversized NFTNL_SET_DESC_CONCAT data accepted");
84 if (nftnl_set_set_data(a, NFTNL_SET_DESC_CONCAT, field_lengths, 16))
85 print_err("setting NFTNL_SET_DESC_CONCAT failed");
86
87
88 /* cmd extracted from include/linux/netfilter/nf_tables.h */
89 nlh = nftnl_nlmsg_build_hdr(buf, NFT_MSG_NEWSET, AF_INET, 0, 1234);
90 nftnl_set_nlmsg_build_payload(nlh, a);
91
92 if (nftnl_set_nlmsg_parse(nlh, b) < 0)
93 print_err("parsing problems");
94
95 cmp_nftnl_set(a,b);
96
97 nftnl_set_free(a); nftnl_set_free(b);
98
99 if (!test_ok)
100 exit(EXIT_FAILURE);
101
102 printf("%s: \033[32mOK\e[0m\n", argv[0]);
103 return EXIT_SUCCESS;
104}