summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libnetfilter_conntrack/libnetfilter_conntrack.h12
-rw-r--r--src/libnetfilter_conntrack.c28
-rw-r--r--utils/ctnl_test.c6
3 files changed, 28 insertions, 18 deletions
diff --git a/include/libnetfilter_conntrack/libnetfilter_conntrack.h b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
index c0636b3..a51c55b 100644
--- a/include/libnetfilter_conntrack/libnetfilter_conntrack.h
+++ b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
@@ -197,7 +197,7 @@ enum {
};
struct nfct_handle;
-typedef int (*nfct_callback)(void *arg, unsigned int flags, int);
+typedef int (*nfct_callback)(void *arg, unsigned int flags, int, void *data);
typedef int (*nfct_handler)(struct nfct_handle *cth, struct nlmsghdr *nlh,
void *arg);
@@ -230,16 +230,16 @@ extern int nfct_close(struct nfct_handle *cth);
* [Register|unregister] callbacks
*/
extern void nfct_register_callback(struct nfct_handle *cth,
- nfct_callback callback);
+ nfct_callback callback, void *data);
extern void nfct_unregister_callback(struct nfct_handle *cth);
/*
* callback displayers
*/
-extern int nfct_default_conntrack_display(void *arg, unsigned int, int);
-extern int nfct_default_conntrack_display_id(void *arg, unsigned int, int);
-extern int nfct_default_expect_display(void *arg, unsigned int, int);
-extern int nfct_default_expect_display_id(void *arg, unsigned int, int);
+extern int nfct_default_conntrack_display(void *arg, unsigned int, int, void *);
+extern int nfct_default_conntrack_display_id(void *arg, unsigned int, int, void *);
+extern int nfct_default_expect_display(void *arg, unsigned int, int, void *);
+extern int nfct_default_expect_display_id(void *arg, unsigned int, int, void *);
/*
* [Create|update|get|destroy] conntracks
diff --git a/src/libnetfilter_conntrack.c b/src/libnetfilter_conntrack.c
index 5b125cc..872a3df 100644
--- a/src/libnetfilter_conntrack.c
+++ b/src/libnetfilter_conntrack.c
@@ -26,6 +26,7 @@
struct nfct_handle {
struct nfnl_handle nfnlh;
nfct_callback callback; /* user callback */
+ void *callback_data; /* user data for callback */
nfct_handler handler; /* netlink handler */
};
@@ -106,14 +107,17 @@ int nfct_close(struct nfct_handle *cth)
return err;
}
-void nfct_register_callback(struct nfct_handle *cth, nfct_callback callback)
+void nfct_register_callback(struct nfct_handle *cth, nfct_callback callback,
+ void *data)
{
cth->callback = callback;
+ cth->callback_data = data;
}
void nfct_unregister_callback(struct nfct_handle *cth)
{
cth->callback = NULL;
+ cth->callback_data = NULL;
}
static void nfct_build_tuple_ip(struct nfnlhdr *req, int size,
@@ -484,7 +488,8 @@ static int nfct_conntrack_netlink_handler(struct nfct_handle *cth,
if (cth->callback)
ret = cth->callback((void *) &ct, flags,
- typemsg2enum(type, nlh->nlmsg_flags));
+ typemsg2enum(type, nlh->nlmsg_flags),
+ cth->callback_data);
return ret;
}
@@ -541,8 +546,8 @@ int nfct_sprintf_proto(char *buf, struct nfct_tuple *t)
int nfct_sprintf_counters(char *buf, struct nfct_conntrack *ct, int dir)
{
return (sprintf(buf, "packets=%llu bytes=%llu ",
- ct->counters[dir].packets,
- ct->counters[dir].bytes));
+ (unsigned long long) ct->counters[dir].packets,
+ (unsigned long long) ct->counters[dir].bytes));
}
int nfct_sprintf_mark(char *buf, struct nfct_conntrack *ct)
@@ -617,7 +622,8 @@ int nfct_sprintf_conntrack_id(char *buf, struct nfct_conntrack *ct,
return --size;
}
-int nfct_default_conntrack_display(void *arg, unsigned int flags, int type)
+int nfct_default_conntrack_display(void *arg, unsigned int flags, int type,
+ void *data)
{
char buf[512];
int size;
@@ -630,7 +636,8 @@ int nfct_default_conntrack_display(void *arg, unsigned int flags, int type)
return 0;
}
-int nfct_default_conntrack_display_id(void *arg, unsigned int flags, int type)
+int nfct_default_conntrack_display_id(void *arg, unsigned int flags, int type,
+ void *data)
{
char buf[512];
int size;
@@ -673,7 +680,8 @@ int nfct_sprintf_expect_id(char *buf, struct nfct_expect *exp)
return --size;
}
-int nfct_default_expect_display(void *arg, unsigned int flags, int type)
+int nfct_default_expect_display(void *arg, unsigned int flags, int type,
+ void *data)
{
char buf[256];
int size = 0;
@@ -686,7 +694,8 @@ int nfct_default_expect_display(void *arg, unsigned int flags, int type)
return 0;
}
-int nfct_default_expect_display_id(void *arg, unsigned int flags, int type)
+int nfct_default_expect_display_id(void *arg, unsigned int flags, int type,
+ void *data)
{
char buf[256];
int size = 0;
@@ -739,7 +748,8 @@ static int nfct_expect_netlink_handler(struct nfct_handle *cth,
if (cth->callback)
ret = cth->callback((void *)&exp, 0,
- typemsg2enum(type, nlh->nlmsg_flags));
+ typemsg2enum(type, nlh->nlmsg_flags),
+ cth->callback_data);
return 0;
}
diff --git a/utils/ctnl_test.c b/utils/ctnl_test.c
index 3c8f6d8..f1361d3 100644
--- a/utils/ctnl_test.c
+++ b/utils/ctnl_test.c
@@ -15,7 +15,7 @@
#include <signal.h>
#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
-static int event_counter(void *arg, unsigned int flags, int type)
+static int event_counter(void *arg, unsigned int flags, int type, void *data)
{
static int counter = 0;
@@ -90,7 +90,7 @@ int main(int argc, char **argv)
if (ret < 0 && ret != -EEXIST)
errors++;
- nfct_register_callback(cth, nfct_default_conntrack_display);
+ nfct_register_callback(cth, nfct_default_conntrack_display, NULL);
ret = nfct_dump_conntrack_table_reset_counters(cth);
fprintf(stdout, "TEST 2: dump conntrack table and reset (%d)\n", ret);
if (ret < 0)
@@ -132,7 +132,7 @@ int main(int argc, char **argv)
fprintf(stdout, "TEST 7: Waiting for 10 conntrack events\n");
signal(SIGINT, event_sighandler);
- nfct_register_callback(cth, event_counter);
+ nfct_register_callback(cth, event_counter, NULL);
ret = nfct_event_conntrack(cth);
fprintf(stdout, "TEST 7: Received 10 conntrack events (%d)\n", ret);