11 #include <sys/socket.h> 13 #include <linux/netlink.h> 14 #include <linux/netfilter/nfnetlink.h> 15 #include <linux/netfilter/nf_tables.h> 17 #include <libmnl/libmnl.h> 18 #include <libnftnl/common.h> 19 #include <libnftnl/set.h> 24 static struct nlmsghdr *__nftnl_nlmsg_build_hdr(
char *buf, uint16_t type,
26 uint16_t flags, uint32_t seq,
32 nlh = mnl_nlmsg_put_header(buf);
33 nlh->nlmsg_type = type;
34 nlh->nlmsg_flags = NLM_F_REQUEST | flags;
37 nfh = mnl_nlmsg_put_extra_header(nlh,
sizeof(
struct nfgenmsg));
38 nfh->nfgen_family = family;
39 nfh->version = NFNETLINK_V0;
45 EXPORT_SYMBOL(nftnl_nlmsg_build_hdr);
46 struct nlmsghdr *nftnl_nlmsg_build_hdr(
char *buf, uint16_t type, uint16_t family,
47 uint16_t flags, uint32_t seq)
49 return __nftnl_nlmsg_build_hdr(buf, (NFNL_SUBSYS_NFTABLES << 8) | type,
50 family, flags, seq, 0);
53 EXPORT_SYMBOL(nftnl_parse_err_alloc);
54 struct nftnl_parse_err *nftnl_parse_err_alloc(
void)
56 struct nftnl_parse_err *err;
58 err = calloc(1,
sizeof(
struct nftnl_parse_err));
62 err->error = NFTNL_PARSE_EOPNOTSUPP;
67 EXPORT_SYMBOL(nftnl_parse_err_free);
68 void nftnl_parse_err_free(
struct nftnl_parse_err *err)
73 EXPORT_SYMBOL(nftnl_parse_perror);
74 int nftnl_parse_perror(
const char *msg,
struct nftnl_parse_err *err)
77 case NFTNL_PARSE_EBADINPUT:
78 return fprintf(stderr,
"%s: Bad input format in line %d column %d\n",
79 msg, err->line, err->column);
80 case NFTNL_PARSE_EMISSINGNODE:
81 return fprintf(stderr,
"%s: Node \"%s\" not found\n",
83 case NFTNL_PARSE_EBADTYPE:
84 return fprintf(stderr,
"%s: Invalid type in node \"%s\"\n",
86 case NFTNL_PARSE_EOPNOTSUPP:
87 return fprintf(stderr,
"%s: Operation not supported\n", msg);
89 return fprintf(stderr,
"%s: Undefined error\n", msg);
93 EXPORT_SYMBOL(nftnl_batch_begin);
94 struct nlmsghdr *nftnl_batch_begin(
char *buf, uint32_t seq)
96 return __nftnl_nlmsg_build_hdr(buf, NFNL_MSG_BATCH_BEGIN, AF_UNSPEC,
97 0, seq, NFNL_SUBSYS_NFTABLES);
100 EXPORT_SYMBOL(nftnl_batch_end);
101 struct nlmsghdr *nftnl_batch_end(
char *buf, uint32_t seq)
103 return __nftnl_nlmsg_build_hdr(buf, NFNL_MSG_BATCH_END, AF_UNSPEC,
104 0, seq, NFNL_SUBSYS_NFTABLES);
107 EXPORT_SYMBOL(nftnl_batch_is_supported);
108 int nftnl_batch_is_supported(
void)
110 struct mnl_socket *nl;
111 struct mnl_nlmsg_batch *b;
112 char buf[MNL_SOCKET_BUFFER_SIZE];
113 uint32_t seq = time(NULL), req_seq;
116 nl = mnl_socket_open(NETLINK_NETFILTER);
120 if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0)
123 b = mnl_nlmsg_batch_start(buf,
sizeof(buf));
125 nftnl_batch_begin(mnl_nlmsg_batch_current(b), seq++);
126 mnl_nlmsg_batch_next(b);
129 nftnl_set_nlmsg_build_hdr(mnl_nlmsg_batch_current(b),
130 NFT_MSG_NEWSET, AF_INET,
132 mnl_nlmsg_batch_next(b);
134 nftnl_batch_end(mnl_nlmsg_batch_current(b), seq++);
135 mnl_nlmsg_batch_next(b);
137 ret = mnl_socket_sendto(nl, mnl_nlmsg_batch_head(b),
138 mnl_nlmsg_batch_size(b));
142 mnl_nlmsg_batch_stop(b);
144 ret = mnl_socket_recvfrom(nl, buf,
sizeof(buf));
146 ret = mnl_cb_run(buf, ret, req_seq, mnl_socket_get_portid(nl),
151 ret = mnl_socket_recvfrom(nl, buf,
sizeof(buf));
153 mnl_socket_close(nl);
160 return (ret == -1 && errno == EINVAL) ? 1 : 0;
162 mnl_nlmsg_batch_stop(b);