ct_stress.c
/* simple tool to generate random of flow entries to fill hard the
conntrack table. Early drop will not save our day then, because
the table will be plenty of assured flows. If things go well,
we hit ENOMEM at some point.
You have to use conntrack_events_reliable together with this tool.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <time.h>
#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
int main(int argc, char *argv[])
{
time_t t;
int ret, i, j, r;
struct nfct_handle *h;
struct nf_conntrack *ct;
if (argc < 2) {
fprintf(stderr, "Usage: %s [ct_table_size]\n", argv[0]);
exit(EXIT_FAILURE);
}
time(&t);
srandom(t);
r = random();
ct = nfct_new();
if (!ct) {
perror("nfct_new");
return 0;
}
h = nfct_open(CONNTRACK, 0);
if (!h) {
perror("nfct_open");
nfct_destroy(ct);
return -1;
}
for (i = r, j = 0;i < (r + atoi(argv[1]) * 2); i++, j++) {
nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET);
nfct_set_attr_u32(ct, ATTR_IPV4_SRC, inet_addr("1.1.1.1") + i);
nfct_set_attr_u32(ct, ATTR_IPV4_DST, inet_addr("2.2.2.2") + i);
nfct_set_attr_u8(ct, ATTR_L4PROTO, IPPROTO_TCP);
nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(10));
nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(20));
nfct_setobjopt(ct, NFCT_SOPT_SETUP_REPLY);
nfct_set_attr_u8(ct, ATTR_TCP_STATE, TCP_CONNTRACK_ESTABLISHED);
nfct_set_attr_u32(ct, ATTR_TIMEOUT, 1000);
nfct_set_attr_u32(ct, ATTR_STATUS, IPS_ASSURED);
if (i % 10000 == 0)
printf("added %d flow entries\n", j);
ret = nfct_query(h, NFCT_Q_CREATE, ct);
if (ret == -1)
perror("nfct_query: ");
}
nfct_close(h);
nfct_destroy(ct);
exit(EXIT_SUCCESS);
}
nfct_open
struct nfct_handle * nfct_open(uint8_t, unsigned)
Definition main.c:84
nfct_close
int nfct_close(struct nfct_handle *cth)
Definition main.c:105
nfct_query
int nfct_query(struct nfct_handle *h, const enum nf_conntrack_query query, const void *data)
Definition conntrack/api.c:991
nfct_set_attr_u32
void nfct_set_attr_u32(struct nf_conntrack *ct, const enum nf_conntrack_attr type, uint32_t value)
Definition conntrack/api.c:439
nfct_destroy
void nfct_destroy(struct nf_conntrack *ct)
Definition conntrack/api.c:93
nfct_setobjopt
int nfct_setobjopt(struct nf_conntrack *ct, unsigned int option)
Definition conntrack/api.c:169
nfct_set_attr_u16
void nfct_set_attr_u16(struct nf_conntrack *ct, const enum nf_conntrack_attr type, uint16_t value)
Definition conntrack/api.c:426
nfct_set_attr_u8
void nfct_set_attr_u8(struct nf_conntrack *ct, const enum nf_conntrack_attr type, uint8_t value)
Definition conntrack/api.c:413
nfct_new
struct nf_conntrack * nfct_new(void)
Definition conntrack/api.c:76