9 #include <libmnl/libmnl.h>
10 #include <linux/netfilter.h>
11 #include <linux/netfilter/nfnetlink.h>
14 #define aligned_be64 u_int64_t __attribute__((aligned(8)))
17 #include <linux/netfilter/nfnetlink_log.h>
19 static int parse_attr_cb(
const struct nlattr *attr,
void *data)
21 const struct nlattr **tb = data;
30 case NFULA_IFINDEX_INDEV:
31 case NFULA_IFINDEX_OUTDEV:
32 case NFULA_IFINDEX_PHYSINDEV:
33 case NFULA_IFINDEX_PHYSOUTDEV:
35 perror(
"mnl_attr_validate");
41 sizeof(
struct nfulnl_msg_packet_timestamp)) < 0) {
42 perror(
"mnl_attr_validate");
48 sizeof(
struct nfulnl_msg_packet_hw)) < 0) {
49 perror(
"mnl_attr_validate");
55 perror(
"mnl_attr_validate");
66 static int log_cb(
const struct nlmsghdr *nlh,
void *data)
68 struct nlattr *tb[NFULA_MAX+1] = {};
69 struct nfulnl_msg_packet_hdr *ph = NULL;
70 const char *prefix = NULL;
74 if (tb[NFULA_PACKET_HDR])
81 printf(
"log received (prefix=\"%s\" hw=0x%04x hook=%u mark=%u)\n",
82 prefix ? prefix :
"", ntohs(ph->hw_protocol), ph->hook,
88 static struct nlmsghdr *
89 nflog_build_cfg_pf_request(
char *buf, uint8_t command)
92 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
93 nlh->nlmsg_flags = NLM_F_REQUEST;
96 nfg->nfgen_family = AF_INET;
97 nfg->version = NFNETLINK_V0;
99 struct nfulnl_msg_config_cmd cmd = {
107 static struct nlmsghdr *
108 nflog_build_cfg_request(
char *buf, uint8_t command,
int qnum)
111 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
112 nlh->nlmsg_flags = NLM_F_REQUEST;
115 nfg->nfgen_family = AF_INET;
116 nfg->version = NFNETLINK_V0;
117 nfg->res_id = htons(qnum);
119 struct nfulnl_msg_config_cmd cmd = {
127 static struct nlmsghdr *
128 nflog_build_cfg_params(
char *buf, uint8_t mode,
int range,
int qnum)
131 nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG;
132 nlh->nlmsg_flags = NLM_F_REQUEST;
135 nfg->nfgen_family = AF_UNSPEC;
136 nfg->version = NFNETLINK_V0;
137 nfg->res_id = htons(qnum);
139 struct nfulnl_msg_config_mode params = {
140 .copy_range = htonl(range),
143 mnl_attr_put(nlh, NFULA_CFG_MODE,
sizeof(params), ¶ms);
148 int main(
int argc,
char *argv[])
151 char buf[MNL_SOCKET_BUFFER_SIZE];
152 struct nlmsghdr *nlh;
154 unsigned int portid, qnum;
157 printf(
"Usage: %s [queue_num]\n", argv[0]);
160 qnum = atoi(argv[1]);
164 perror(
"mnl_socket_open");
169 perror(
"mnl_socket_bind");
174 nlh = nflog_build_cfg_pf_request(buf, NFULNL_CFG_CMD_PF_UNBIND);
177 perror(
"mnl_socket_send");
181 nlh = nflog_build_cfg_pf_request(buf, NFULNL_CFG_CMD_PF_BIND);
184 perror(
"mnl_socket_send");
188 nlh = nflog_build_cfg_request(buf, NFULNL_CFG_CMD_BIND, qnum);
191 perror(
"mnl_socket_send");
195 nlh = nflog_build_cfg_params(buf, NFULNL_COPY_PACKET, 0xFFFF, qnum);
198 perror(
"mnl_socket_send");
204 perror(
"mnl_socket_recvfrom");
208 ret =
mnl_cb_run(buf, ret, 0, portid, log_cb, NULL);
210 perror(
"mnl_cb_run");
216 perror(
"mnl_socket_recvfrom");