9#include <libmnl/libmnl.h>
10#include <linux/netfilter.h>
11#include <linux/netfilter/nfnetlink.h>
12#include <linux/netfilter/nfnetlink_log.h>
14static int parse_attr_cb(
const struct nlattr *attr,
void *data)
16 const struct nlattr **tb = data;
25 case NFULA_IFINDEX_INDEV:
26 case NFULA_IFINDEX_OUTDEV:
27 case NFULA_IFINDEX_PHYSINDEV:
28 case NFULA_IFINDEX_PHYSOUTDEV:
30 perror(
"mnl_attr_validate");
36 sizeof(
struct nfulnl_msg_packet_timestamp)) < 0) {
37 perror(
"mnl_attr_validate2");
43 sizeof(
struct nfulnl_msg_packet_hw)) < 0) {
44 perror(
"mnl_attr_validate2");
50 perror(
"mnl_attr_validate");
61static int log_cb(
const struct nlmsghdr *nlh,
void *data)
63 struct nlattr *tb[NFULA_MAX+1] = {};
64 struct nfulnl_msg_packet_hdr *ph = NULL;
65 const char *prefix = NULL;
69 if (tb[NFULA_PACKET_HDR])
76 printf(
"log received (prefix=\"%s\" hw=0x%04x hook=%u mark=%u)\n",
77 prefix ? prefix :
"", ntohs(ph->hw_protocol), ph->hook,
83static struct nlmsghdr *
84nflog_build_cfg_pf_request(
char *buf, uint8_t command)
87 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
88 nlh->nlmsg_flags = NLM_F_REQUEST;
91 nfg->nfgen_family = AF_INET;
92 nfg->version = NFNETLINK_V0;
94 struct nfulnl_msg_config_cmd cmd = {
102static struct nlmsghdr *
103nflog_build_cfg_request(
char *buf, uint8_t command,
int qnum)
106 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
107 nlh->nlmsg_flags = NLM_F_REQUEST;
110 nfg->nfgen_family = AF_INET;
111 nfg->version = NFNETLINK_V0;
112 nfg->res_id = htons(qnum);
114 struct nfulnl_msg_config_cmd cmd = {
122static struct nlmsghdr *
123nflog_build_cfg_params(
char *buf, uint8_t mode,
int range,
int qnum)
126 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
127 nlh->nlmsg_flags = NLM_F_REQUEST;
130 nfg->nfgen_family = AF_UNSPEC;
131 nfg->version = NFNETLINK_V0;
132 nfg->res_id = htons(qnum);
134 struct nfulnl_msg_config_mode params = {
135 .copy_range = htonl(range),
138 mnl_attr_put(nlh, NFULA_CFG_MODE,
sizeof(params), ¶ms);
143int main(
int argc,
char *argv[])
145 struct mnl_socket *nl;
146 char buf[MNL_SOCKET_BUFFER_SIZE];
147 struct nlmsghdr *nlh;
149 unsigned int portid, qnum;
152 printf(
"Usage: %s [queue_num]\n", argv[0]);
155 qnum = atoi(argv[1]);
159 perror(
"mnl_socket_open");
164 perror(
"mnl_socket_bind");
169 nlh = nflog_build_cfg_pf_request(buf, NFULNL_CFG_CMD_PF_UNBIND);
172 perror(
"mnl_socket_sendto");
176 nlh = nflog_build_cfg_pf_request(buf, NFULNL_CFG_CMD_PF_BIND);
179 perror(
"mnl_socket_sendto");
183 nlh = nflog_build_cfg_request(buf, NFULNL_CFG_CMD_BIND, qnum);
186 perror(
"mnl_socket_sendto");
190 nlh = nflog_build_cfg_params(buf, NFULNL_COPY_PACKET, 0xFFFF, qnum);
193 perror(
"mnl_socket_sendto");
199 perror(
"mnl_socket_recvfrom");
203 ret =
mnl_cb_run(buf, ret, 0, portid, log_cb, NULL);
205 perror(
"mnl_cb_run");
211 perror(
"mnl_socket_recvfrom");
void * mnl_attr_get_payload(const struct nlattr *attr)
int mnl_attr_validate(const struct nlattr *attr, enum mnl_attr_data_type type)
int mnl_attr_parse(const struct nlmsghdr *nlh, unsigned int offset, mnl_attr_cb_t cb, void *data)
int mnl_attr_type_valid(const struct nlattr *attr, uint16_t max)
uint16_t mnl_attr_get_type(const struct nlattr *attr)
int mnl_attr_validate2(const struct nlattr *attr, enum mnl_attr_data_type type, size_t exp_len)
uint32_t mnl_attr_get_u32(const struct nlattr *attr)
const char * mnl_attr_get_str(const struct nlattr *attr)
void mnl_attr_put(struct nlmsghdr *nlh, uint16_t type, size_t len, const void *data)
int mnl_cb_run(const void *buf, size_t numbytes, unsigned int seq, unsigned int portid, mnl_cb_t cb_data, void *data)
struct nlmsghdr * mnl_nlmsg_put_header(void *buf)
void * mnl_nlmsg_put_extra_header(struct nlmsghdr *nlh, size_t size)
int mnl_socket_close(struct mnl_socket *nl)
unsigned int mnl_socket_get_portid(const struct mnl_socket *nl)
struct mnl_socket * mnl_socket_open(int bus)
ssize_t mnl_socket_recvfrom(const struct mnl_socket *nl, void *buf, size_t bufsiz)
int mnl_socket_bind(struct mnl_socket *nl, unsigned int groups, pid_t pid)
ssize_t mnl_socket_sendto(const struct mnl_socket *nl, const void *buf, size_t len)