1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include <arpa/inet.h>
6
7#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
8
9static int cb(enum nf_conntrack_msg_type type,
10	      struct nf_expect *exp,
11	      void *data)
12{
13	char buf[1024];
14
15	nfexp_snprintf(buf, 1024, exp, NFCT_T_UNKNOWN, NFCT_O_DEFAULT, 0);
16	printf("%s\n", buf);
17
18	return NFCT_CB_CONTINUE;
19}
20
21int main(void)
22{
23	int ret;
24	struct nfct_handle *h;
25	struct nf_conntrack *master;
26	struct nf_expect *exp;
27
28	master = nfct_new();
29	if (!master) {
30		perror("nfct_new");
31		exit(EXIT_FAILURE);
32	}
33
34	nfct_set_attr_u8(master, ATTR_L3PROTO, AF_INET);
35	nfct_set_attr_u32(master, ATTR_IPV4_SRC, inet_addr("1.1.1.1"));
36	nfct_set_attr_u32(master, ATTR_IPV4_DST, inet_addr("2.2.2.2"));
37
38	nfct_set_attr_u8(master, ATTR_L4PROTO, IPPROTO_TCP);
39	nfct_set_attr_u16(master, ATTR_PORT_SRC, htons(10240));
40	nfct_set_attr_u16(master, ATTR_PORT_DST, htons(10241));
41
42	exp = nfexp_new();
43	if (!exp) {
44		perror("nfexp_new");
45		nfct_destroy(master);
46		exit(EXIT_FAILURE);
47	}
48
49	nfexp_set_attr(exp, ATTR_EXP_MASTER, master);
50
51	h = nfct_open(EXPECT, 0);
52	if (!h) {
53		perror("nfct_open");
54		nfct_destroy(master);
55		return -1;
56	}
57
58	nfexp_callback_register(h, NFCT_T_ALL, cb, NULL);
59	ret = nfexp_query(h, NFCT_Q_GET, exp);
60
61	printf("TEST: get expectation ");
62	if (ret == -1)
63		printf("(%d)(%s)\n", ret, strerror(errno));
64	else
65		printf("(OK)\n");
66
67	nfct_close(h);
68
69	nfct_destroy(master);
70
71	ret == -1 ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS);
72}
73