16#include <libmnl/libmnl.h>
18#include <libnftnl/common.h>
21#include <linux/netfilter.h>
22#include <linux/netfilter/nf_tables.h>
24static const char *
const nftnl_family_str[NFPROTO_NUMPROTO] = {
25 [NFPROTO_INET] =
"inet",
26 [NFPROTO_IPV4] =
"ip",
27 [NFPROTO_ARP] =
"arp",
28 [NFPROTO_NETDEV] =
"netdev",
29 [NFPROTO_BRIDGE] =
"bridge",
30 [NFPROTO_IPV6] =
"ip6",
33const char *nftnl_family2str(uint32_t family)
35 if (family >= NFPROTO_NUMPROTO || !nftnl_family_str[family])
38 return nftnl_family_str[family];
41const char *nftnl_verdict2str(uint32_t verdict)
71enum nftnl_cmd_type nftnl_flag2cmd(uint32_t flags)
73 if (flags & NFTNL_OF_EVENT_NEW)
75 else if (flags & NFTNL_OF_EVENT_DEL)
76 return NFTNL_CMD_DELETE;
78 return NFTNL_CMD_UNSPEC;
81int nftnl_fprintf(FILE *fp,
const void *obj, uint32_t cmd, uint32_t type,
83 int (*snprintf_cb)(
char *buf,
size_t bufsiz,
const void *obj,
84 uint32_t cmd, uint32_t type,
87 char _buf[NFTNL_SNPRINTF_BUFSIZ];
89 size_t bufsiz =
sizeof(_buf);
92 ret = snprintf_cb(buf, bufsiz, obj, cmd, type, flags);
96 if (ret >= NFTNL_SNPRINTF_BUFSIZ) {
103 ret = snprintf_cb(buf, bufsiz, obj, cmd, type, flags);
108 ret = fprintf(fp,
"%s", buf);
117void __nftnl_assert_attr_exists(uint16_t attr, uint16_t attr_max,
118 const char *filename,
int line)
120 fprintf(stderr,
"libnftnl: attribute %d > %d (maximum) assertion failed in %s:%d\n",
121 attr, attr_max, filename, line);
125void __nftnl_assert_fail(uint16_t attr,
const char *filename,
int line)
127 fprintf(stderr,
"libnftnl: attribute %d assertion failed in %s:%d\n",
128 attr, filename, line);
132void __noreturn __abi_breakage(
const char *file,
int line,
const char *reason)
134 fprintf(stderr,
"nf_tables kernel ABI is broken, contact your vendor.\n"
135 "%s:%d reason: %s\n", file, line, reason);
139int nftnl_set_str_attr(
const char **dptr, uint32_t *flags,
140 uint16_t attr,
const void *data, uint32_t data_len)
142 if (*flags & (1 << attr))
145 *dptr = strndup(data, data_len);
149 *flags |= (1 << attr);
153static bool is_wildcard_str(
const char *str)
155 size_t len = strlen(str);
157 if (len < 1 || str[len - 1] !=
'*')
159 if (len < 2 || str[len - 2] !=
'\\')
165void nftnl_attr_put_ifname(
struct nlmsghdr *nlh,
const char *ifname)
167 uint16_t attr = NFTA_DEVICE_NAME;
170 if (is_wildcard_str(ifname)) {
171 snprintf(pfx, IFNAMSIZ,
"%s", ifname);
172 pfx[strlen(pfx) - 1] =
'\0';
174 attr = NFTA_DEVICE_PREFIX;
177 mnl_attr_put_strz(nlh, attr, ifname);
180char *nftnl_attr_get_ifname(
const struct nlattr *attr)
182 const char *dev = mnl_attr_get_str(attr);
185 switch (mnl_attr_get_type(attr)) {
186 case NFTA_DEVICE_NAME:
188 case NFTA_DEVICE_PREFIX:
189 snprintf(buf, IFNAMSIZ,
"%s*", dev);
196int nftnl_parse_str_attr(
const struct nlattr *tb,
int attr,
197 const char **field, uint32_t *flags)
202 if (*flags & (1 << attr))
204 *field = strdup(mnl_attr_get_str(tb));
207 *flags |= (1 << attr);