summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--conntrackd.84
-rw-r--r--include/conntrackd.h2
-rw-r--r--src/main.c23
-rw-r--r--src/stats-mode.c1
-rw-r--r--src/sync-mode.c10
5 files changed, 36 insertions, 4 deletions
diff --git a/conntrackd.8 b/conntrackd.8
index cd1e2bd..2002738 100644
--- a/conntrackd.8
+++ b/conntrackd.8
@@ -34,8 +34,8 @@ Dump the external cache, i.e. show foreign states
Display output in XML format. This option is only valid in combination
with "-i" and "-e" parameters.
.TP
-.BI "-f "
-Flush the internal and the external cache
+.BI "-f " "[|internal|external]"
+Flush the internal and/or external cache
.TP
.BI "-F "
Flush the kernel conntrack table (if you use a Linux kernel >= 2.6.29, this
diff --git a/include/conntrackd.h b/include/conntrackd.h
index bb038a9..9b3cdf2 100644
--- a/include/conntrackd.h
+++ b/include/conntrackd.h
@@ -31,6 +31,8 @@
#define STATS_RUNTIME 30 /* extended runtime stats */
#define STATS_MULTICAST 31 /* multicast network stats */
#define STATS_QUEUE 32 /* queue stats */
+#define FLUSH_INT_CACHE 33 /* flush internal cache */
+#define FLUSH_EXT_CACHE 34 /* flush external cache */
#define DEFAULT_CONFIGFILE "/etc/conntrackd/conntrackd.conf"
#define DEFAULT_LOCKFILE "/var/lock/conntrackd.lock"
diff --git a/src/main.c b/src/main.c
index 8f75904..82f0d27 100644
--- a/src/main.c
+++ b/src/main.c
@@ -38,7 +38,7 @@ static const char usage_daemon_commands[] =
static const char usage_client_commands[] =
"Client mode commands:\n"
" -c, commit external cache to conntrack table\n"
- " -f, flush internal and external cache\n"
+ " -f [|internal|external], flush internal and external cache\n"
" -F, flush kernel conntrack table\n"
" -i, display content of the internal cache\n"
" -e, display the content of the external cache\n"
@@ -144,7 +144,26 @@ int main(int argc, char *argv[])
break;
case 'f':
set_operation_mode(&type, REQUEST, argv);
- action = FLUSH_CACHE;
+ if (i+1 < argc && argv[i+1][0] != '-') {
+ if (strncmp(argv[i+1], "internal",
+ strlen(argv[i+1])) == 0) {
+ action = FLUSH_INT_CACHE;
+ i++;
+ } else if (strncmp(argv[i+1], "external",
+ strlen(argv[i+1])) == 0) {
+ action = FLUSH_EXT_CACHE;
+ i++;
+ } else {
+ fprintf(stderr, "ERROR: unknown "
+ "parameter `%s' for "
+ "option `-f'\n",
+ argv[i+1]);
+ exit(EXIT_FAILURE);
+ }
+ } else {
+ /* default to general flushing */
+ action = FLUSH_CACHE;
+ }
break;
case 'R':
set_operation_mode(&type, REQUEST, argv);
diff --git a/src/stats-mode.c b/src/stats-mode.c
index d561409..94fc45b 100644
--- a/src/stats-mode.c
+++ b/src/stats-mode.c
@@ -66,6 +66,7 @@ static int local_handler_stats(int fd, int type, void *data)
cache_dump(STATE_STATS(cache), fd, NFCT_O_XML);
break;
case FLUSH_CACHE:
+ case FLUSH_INT_CACHE:
dlog(LOG_NOTICE, "flushing caches");
cache_flush(STATE_STATS(cache));
break;
diff --git a/src/sync-mode.c b/src/sync-mode.c
index 74eb36e..866b313 100644
--- a/src/sync-mode.c
+++ b/src/sync-mode.c
@@ -466,6 +466,16 @@ static int local_handler_sync(int fd, int type, void *data)
cache_flush(STATE_SYNC(internal));
cache_flush(STATE_SYNC(external));
break;
+ case FLUSH_INT_CACHE:
+ /* inmediate flush, remove pending flush scheduled if any */
+ del_alarm(&STATE_SYNC(reset_cache_alarm));
+ dlog(LOG_NOTICE, "flushing internal cache");
+ cache_flush(STATE_SYNC(internal));
+ break;
+ case FLUSH_EXT_CACHE:
+ dlog(LOG_NOTICE, "flushing external cache");
+ cache_flush(STATE_SYNC(external));
+ break;
case KILL:
killer(0);
break;