10#include <libmnl/libmnl.h>
11#include <linux/netfilter/nfnetlink.h>
12#include <linux/netfilter/nfnetlink_conntrack.h>
13#include <linux/netfilter/nf_conntrack_common.h>
14#include <linux/netfilter/nf_conntrack_tcp.h>
16static void put_msg(
char *buf, uint16_t i,
int seq)
20 struct nlattr *nest1, *nest2;
23 nlh->nlmsg_type = (NFNL_SUBSYS_CTNETLINK << 8) | IPCTNL_MSG_CT_NEW;
24 nlh->nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_EXCL|NLM_F_ACK;
28 nfh->nfgen_family = AF_INET;
29 nfh->version = NFNETLINK_V0;
68static int cb_err(
const struct nlmsghdr *nlh,
void *data)
72 printf(
"message with seq %u has failed: %s\n",
73 nlh->nlmsg_seq, strerror(-err->error));
77static mnl_cb_t cb_ctl_array[NLMSG_MIN_TYPE] = {
78 [NLMSG_ERROR] = cb_err,
82send_batch(
struct mnl_socket *nl,
struct mnl_nlmsg_batch *b,
int portid)
86 char rcv_buf[MNL_SOCKET_BUFFER_SIZE];
90 perror(
"mnl_socket_sendto");
101 FD_SET(fd, &readfds);
103 ret = select(fd+1, &readfds, NULL, NULL, &tv);
108 while (ret > 0 && FD_ISSET(fd, &readfds)) {
111 perror(
"mnl_socket_recvfrom");
116 NULL, NULL, cb_ctl_array,
117 MNL_ARRAY_SIZE(cb_ctl_array));
119 perror(
"mnl_cb_run2");
123 ret = select(fd+1, &readfds, NULL, NULL, &tv);
129 FD_SET(fd, &readfds);
135 struct mnl_socket *nl;
136 char snd_buf[MNL_SOCKET_BUFFER_SIZE*2];
137 struct mnl_nlmsg_batch *b;
139 unsigned int seq, portid;
144 perror(
"mnl_socket_open");
148 perror(
"mnl_socket_bind");
159 perror(
"mnl_nlmsg_batch_start");
164 for (i=1024, j=0; i<65535; i++, j++) {
172 send_batch(nl, b, portid);
181 send_batch(nl, b, portid);
void mnl_attr_put_u8(struct nlmsghdr *nlh, uint16_t type, uint8_t data)
void mnl_attr_put_u16(struct nlmsghdr *nlh, uint16_t type, uint16_t data)
struct nlattr * mnl_attr_nest_start(struct nlmsghdr *nlh, uint16_t type)
void mnl_attr_put_u32(struct nlmsghdr *nlh, uint16_t type, uint32_t data)
void mnl_attr_nest_end(struct nlmsghdr *nlh, struct nlattr *start)
void * mnl_nlmsg_batch_current(struct mnl_nlmsg_batch *b)
bool mnl_nlmsg_batch_next(struct mnl_nlmsg_batch *b)
size_t mnl_nlmsg_batch_size(struct mnl_nlmsg_batch *b)
void * mnl_nlmsg_batch_head(struct mnl_nlmsg_batch *b)
void mnl_nlmsg_batch_reset(struct mnl_nlmsg_batch *b)
struct mnl_nlmsg_batch * mnl_nlmsg_batch_start(void *buf, size_t limit)
bool mnl_nlmsg_batch_is_empty(struct mnl_nlmsg_batch *b)
void mnl_nlmsg_batch_stop(struct mnl_nlmsg_batch *b)
int mnl_cb_run2(const void *buf, size_t numbytes, unsigned int seq, unsigned int portid, mnl_cb_t cb_data, void *data, const mnl_cb_t *cb_ctl_array, unsigned int cb_ctl_array_len)
void * mnl_nlmsg_get_payload(const struct nlmsghdr *nlh)
struct nlmsghdr * mnl_nlmsg_put_header(void *buf)
void * mnl_nlmsg_put_extra_header(struct nlmsghdr *nlh, size_t size)
int mnl_socket_get_fd(const struct mnl_socket *nl)
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)