15 #include <libmnl/libmnl.h>
17 #ifndef __aligned_be64
18 #define __aligned_be64 __be64 __attribute__((aligned(8)))
19 #define __aligned_le64 __le64 __attribute__((aligned(8)))
22 #include <linux/netfilter/nfnetlink_queue.h>
24 #include <libnetfilter_queue/libnetfilter_queue.h>
33 void nfq_nlmsg_verdict_put(
struct nlmsghdr *nlh,
int id,
int verdict)
35 struct nfqnl_msg_verdict_hdr vh = {
36 .verdict = htonl(verdict),
39 mnl_attr_put(nlh, NFQA_VERDICT_HDR,
sizeof(vh), &vh);
41 EXPORT_SYMBOL(nfq_nlmsg_verdict_put);
43 void nfq_nlmsg_verdict_put_mark(
struct nlmsghdr *nlh, uint32_t mark)
45 mnl_attr_put_u32(nlh, NFQA_MARK, htonl(mark));
47 EXPORT_SYMBOL(nfq_nlmsg_verdict_put_mark);
50 nfq_nlmsg_verdict_put_pkt(
struct nlmsghdr *nlh,
const void *pkt, uint32_t plen)
52 mnl_attr_put(nlh, NFQA_PAYLOAD, plen, pkt);
54 EXPORT_SYMBOL(nfq_nlmsg_verdict_put_pkt);
90 struct nfqnl_msg_config_cmd command = {
94 mnl_attr_put(nlh, NFQA_CFG_CMD,
sizeof(command), &command);
98 void nfq_nlmsg_cfg_put_params(
struct nlmsghdr *nlh, uint8_t mode,
int range)
100 struct nfqnl_msg_config_params params = {
101 .copy_range = htonl(range),
104 mnl_attr_put(nlh, NFQA_CFG_PARAMS,
sizeof(params), ¶ms);
106 EXPORT_SYMBOL(nfq_nlmsg_cfg_put_params);
108 void nfq_nlmsg_cfg_put_qmaxlen(
struct nlmsghdr *nlh, uint32_t queue_maxlen)
110 mnl_attr_put_u32(nlh, NFQA_CFG_QUEUE_MAXLEN, htonl(queue_maxlen));
112 EXPORT_SYMBOL(nfq_nlmsg_cfg_put_qmaxlen);
123 static int nfq_pkt_parse_attr_cb(
const struct nlattr *attr,
void *data)
125 const struct nlattr **tb = data;
126 int type = mnl_attr_get_type(attr);
129 if (mnl_attr_type_valid(attr, NFQA_MAX) < 0)
134 case NFQA_IFINDEX_INDEV:
135 case NFQA_IFINDEX_OUTDEV:
136 case NFQA_IFINDEX_PHYSINDEV:
137 case NFQA_IFINDEX_PHYSOUTDEV:
144 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
148 if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC,
149 sizeof(
struct nfqnl_msg_packet_timestamp)) < 0) {
154 if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC,
155 sizeof(
struct nfqnl_msg_packet_hw)) < 0) {
159 case NFQA_PACKET_HDR:
160 if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC,
161 sizeof(
struct nfqnl_msg_packet_hdr)) < 0) {
184 return mnl_attr_parse(nlh,
sizeof(
struct nfgenmsg),
185 nfq_pkt_parse_attr_cb, attr);
void nfq_nlmsg_cfg_put_cmd(struct nlmsghdr *nlh, uint16_t pf, uint8_t cmd)
int nfq_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr **attr)