From: Daniel Wagner <[email protected]>
Add helper function for flushing all nfacct rules.
---
Makefile.am | 3 +-
src/connman.h | 5 +++
src/nfacct.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 138 insertions(+), 1 deletion(-)
create mode 100644 src/nfacct.c
diff --git a/Makefile.am b/Makefile.am
index e42be93..a132678 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -97,7 +97,8 @@ src_connmand_SOURCES = $(gdbus_sources) $(gdhcp_sources)
$(gweb_sources) \
src/session.c src/tethering.c src/wpad.c src/wispr.c \
src/stats.c src/iptables.c src/dnsproxy.c src/6to4.c \
src/ippool.c src/bridge.c src/nat.c src/ipaddress.c \
- src/inotify.c src/firewall.c src/netfilter.c
+ src/inotify.c src/firewall.c src/netfilter.c \
+ src/nfacct.c
src_connmand_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ \
@XTABLES_LIBS@ @GNUTLS_LIBS@ -lresolv -ldl -lrt
diff --git a/src/connman.h b/src/connman.h
index 80a5336..0f98e4d 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -932,3 +932,8 @@ void __connman_netfilter_cancel(unsigned int id);
int __connman_netfilter_init(void);
void __connman_netfilter_cleanup(void);
+
+
+typedef int (* connman_nfacct_flush_cb_t) (int error, void *user_data);
+
+int __connman_nfacct_flush(connman_nfacct_flush_cb_t cb, void *user_data);
diff --git a/src/nfacct.c b/src/nfacct.c
new file mode 100644
index 0000000..b24cc30
--- /dev/null
+++ b/src/nfacct.c
@@ -0,0 +1,131 @@
+/*
+ *
+ * Connection Manager
+ *
+ * Copyright (C) 2013 BMW Car IT GmbH. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+
+#include "connman.h"
+
+struct nfacct_flush {
+ unsigned int pending;
+ int error;
+};
+
+static void nfacct_flush_del_cb(int error, void *user_data)
+{
+ struct cb_data *cbd = user_data;
+ struct nfacct_flush *nff = cbd->data;
+ connman_nfacct_flush_cb_t cb = cbd->cb;
+
+ DBG("error %d pending %d", error, nff->pending);
+
+ nff->pending--;
+
+ if (error < 0)
+ nff->error = error;
+
+ /*
+ * Wait for all pending commands before calling
+ * the callback.
+ */
+ if (nff->pending > 0)
+ return;
+
+ cb(nff->error, cbd->user_data);
+
+ g_free(nff);
+ g_free(cbd);
+}
+
+static void nfacct_flush_cb(int error, const char *name,
+ uint64_t packets, uint64_t bytes,
+ void *user_data)
+{
+ struct cb_data *cbd = user_data;
+ struct nfacct_flush *nff = cbd->data;
+ connman_nfacct_flush_cb_t cb = cbd->cb;
+ unsigned int id;
+
+ DBG("name %s packets %lu bytes %lu", name, packets, bytes);
+
+ if (error < 0) {
+ /*
+ * We will only be called once with an error and
+ * will be the first call.
+ */
+ nff->error = error;
+ goto out;
+ }
+
+ if (name == NULL) {
+ /* last call */
+
+ /*
+ * If we have one command pending, let that one
+ * report back the error.
+ */
+ if (nff->pending > 0)
+ return;
+
+ /*
+ * Either all __connman_netfilter_acct_del() failed
+ * or the dump was empty. In both cases just
+ * call the cb.
+ */
+ goto out;
+ }
+
+ id = __connman_netfilter_acct_del(name, nfacct_flush_del_cb, cbd);
+ if (id == 0) {
+ nff->error = -ECOMM;
+ return;
+ }
+
+ nff->pending++;
+ return;
+
+out:
+ cb(nff->error, cbd->user_data);
+
+ g_free(nff);
+ g_free(cbd);
+}
+
+int __connman_nfacct_flush(connman_nfacct_flush_cb_t cb, void *user_data)
+{
+ struct cb_data *cbd = cb_data_new(cb, user_data);
+ struct nfacct_flush *nff = g_new0(struct nfacct_flush, 1);
+
+ DBG("");
+
+ cbd->data = nff;
+
+ if (__connman_netfilter_acct_dump(FALSE, nfacct_flush_cb, cbd) != 0)
+ return 0;
+
+ g_free(nff);
+ g_free(cbd);
+
+ return -ECOMM;
+}
--
1.8.2.rc3.16.gce432ca
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman