From f23f45f0f09656c0ef960febf6e07442c9053e6d Mon Sep 17 00:00:00 2001 From: "/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=pablo/emailAddress=pablo@netfilter.org" Date: Sun, 23 Oct 2005 22:14:05 +0000 Subject: o Add conntrack event notification test o Define NFCT_ANY_GROUP flag o Now callback can return a value to stop receiving events o implement nfct_unset_callback() --- .../libnetfilter_conntrack/libnetfilter_conntrack.h | 13 ++++++++++--- src/libnetfilter_conntrack.c | 21 +++++++++++++++------ utils/ctnl_test.c | 18 +++++++++++++++++- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/include/libnetfilter_conntrack/libnetfilter_conntrack.h b/include/libnetfilter_conntrack/libnetfilter_conntrack.h index fdd3134..1f09354 100644 --- a/include/libnetfilter_conntrack/libnetfilter_conntrack.h +++ b/include/libnetfilter_conntrack/libnetfilter_conntrack.h @@ -30,6 +30,12 @@ enum { */ #define NFCT_ANY_ID 0 +/* + * Default flag that is passed to nfct_open(), subscribe + * to all possible groups + */ +#define NFCT_ANY_GROUP ~0U + union nfct_l4 { /* Add other protocols here. */ u_int16_t all; @@ -149,7 +155,7 @@ enum { NFCT_MSG_DESTROY }; -typedef void (*nfct_callback)(void *arg, unsigned int flags, int); +typedef int (*nfct_callback)(void *arg, unsigned int flags, int); typedef int (*nfct_handler)(struct sockaddr_nl *, struct nlmsghdr *, void *arg); struct nfct_handle { @@ -177,12 +183,13 @@ extern void nfct_unregister_proto(struct nfct_proto *h); extern struct nfct_handle *nfct_open(u_int8_t, unsigned); extern int nfct_close(struct nfct_handle *cth); extern void nfct_set_callback(struct nfct_handle *cth, nfct_callback callback); +extern void nfct_unset_callback(struct nfct_handle *cth); /* * callback displayers */ -extern void nfct_default_conntrack_display(void *arg, unsigned int, int); -extern void nfct_default_expect_display(void *arg, unsigned int, int); +extern int nfct_default_conntrack_display(void *arg, unsigned int, int); +extern int nfct_default_expect_display(void *arg, unsigned int, int); extern int nfct_create_conntrack(struct nfct_handle *cth, struct nfct_conntrack *ct); diff --git a/src/libnetfilter_conntrack.c b/src/libnetfilter_conntrack.c index 7900574..2dfdca1 100644 --- a/src/libnetfilter_conntrack.c +++ b/src/libnetfilter_conntrack.c @@ -104,6 +104,11 @@ void nfct_set_callback(struct nfct_handle *cth, nfct_callback callback) cth->callback = callback; } +void nfct_unset_callback(struct nfct_handle *cth) +{ + cth->callback = NULL; +} + static void nfct_set_handler(struct nfct_handle *cth, nfct_handler hndlr) { cth->handler = hndlr; @@ -419,7 +424,7 @@ static int nfct_conntrack_netlink_handler(struct sockaddr_nl *sock, struct nfct_conntrack ct; unsigned int flags = 0; struct nfct_handle *cth = arg; - int type = NFNL_MSG_TYPE(nlh->nlmsg_type); + int type = NFNL_MSG_TYPE(nlh->nlmsg_type), ret = 0; memset(&ct, 0, sizeof(struct nfct_conntrack)); @@ -473,13 +478,13 @@ static int nfct_conntrack_netlink_handler(struct sockaddr_nl *sock, attr = NFA_NEXT(attr, attrlen); } if (cth->callback) - cth->callback((void *) &ct, flags, - typemsg2enum(type, nlh->nlmsg_flags)); + ret = cth->callback((void *) &ct, flags, + typemsg2enum(type, nlh->nlmsg_flags)); - return 0; + return ret; } -void nfct_default_conntrack_display(void *arg, unsigned int flags, int type) +int nfct_default_conntrack_display(void *arg, unsigned int flags, int type) { struct nfct_conntrack *ct = arg; struct nfct_proto *h = NULL; @@ -535,9 +540,11 @@ void nfct_default_conntrack_display(void *arg, unsigned int flags, int type) sprintf(buf+size, "\n"); fprintf(stdout, buf); + + return 0; } -void nfct_default_expect_display(void *arg, unsigned int flags, int type) +int nfct_default_expect_display(void *arg, unsigned int flags, int type) { struct nfct_expect *exp = arg; char buf[256]; @@ -553,6 +560,8 @@ void nfct_default_expect_display(void *arg, unsigned int flags, int type) size += sprintf(buf+size, "id=%u ", exp->id); size += sprintf(buf, "\n"); fprintf(stdout, buf); + + return 0; } static int nfct_event_netlink_handler(struct sockaddr_nl *sock, diff --git a/utils/ctnl_test.c b/utils/ctnl_test.c index 5f33424..8fad660 100644 --- a/utils/ctnl_test.c +++ b/utils/ctnl_test.c @@ -14,6 +14,17 @@ #include #include +static int event_counter(void *arg, unsigned int flags, int type) +{ + static int counter = 0; + + fprintf(stdout, "Event number %d\n", ++counter); + if (counter > 10) + return -1; + + return 0; +} + int main(int argc, char **argv) { struct nfct_conntrack *ct; @@ -53,7 +64,7 @@ int main(int argc, char **argv) goto end; } - cth = nfct_open(CONNTRACK, 0); + cth = nfct_open(CONNTRACK, NFCT_ANY_GROUP); if (!cth) { fprintf(stderr, "Can't open handler\n"); errors++; @@ -75,6 +86,11 @@ int main(int argc, char **argv) fprintf(stdout, "TEST 2: dump conntrack table (%d)\n", ret); if (ret < 0) errors++; + + fprintf(stdout, "TEST 3: Waiting for 10 conntrack events\n"); + nfct_set_callback(cth, event_counter); + ret = nfct_event_conntrack(cth); + fprintf(stdout, "TEST 3: Received 10 conntrack events (%d)\n", ret); nfct_close(cth); nfct_conntrack_free(ct); -- cgit v1.2.3