aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/stroke
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-03-15 10:55:22 +0100
committerMartin Willi <martin@revosec.ch>2013-03-15 10:55:22 +0100
commitcf729248b28473b9651e347741d351cf0d34892f (patch)
treeffa05dd5a68b0fec088d779323fec34b36c45f33 /src/libcharon/plugins/stroke
parentd022322bed29e0b6d1ca09edb891402d7e2cc73f (diff)
downloadstrongswan-cf729248b28473b9651e347741d351cf0d34892f.tar.bz2
strongswan-cf729248b28473b9651e347741d351cf0d34892f.tar.xz
Add a "resetcounters" command to ipsec, clearing global or connection counters
Diffstat (limited to 'src/libcharon/plugins/stroke')
-rw-r--r--src/libcharon/plugins/stroke/stroke_counter.c22
-rw-r--r--src/libcharon/plugins/stroke/stroke_counter.h7
-rw-r--r--src/libcharon/plugins/stroke/stroke_socket.c10
3 files changed, 38 insertions, 1 deletions
diff --git a/src/libcharon/plugins/stroke/stroke_counter.c b/src/libcharon/plugins/stroke/stroke_counter.c
index e64415f5d..ff4746bf4 100644
--- a/src/libcharon/plugins/stroke/stroke_counter.c
+++ b/src/libcharon/plugins/stroke/stroke_counter.c
@@ -336,6 +336,27 @@ METHOD(stroke_counter_t, print, void,
}
}
+METHOD(stroke_counter_t, reset, void,
+ private_stroke_counter_t *this, char *name)
+{
+ this->lock->lock(this->lock);
+ if (name)
+ {
+ entry_t *entry;
+
+ entry = this->conns->remove(this->conns, name);
+ if (entry)
+ {
+ destroy_entry(entry);
+ }
+ }
+ else
+ {
+ memset(&this->counter, 0, sizeof(this->counter));
+ }
+ this->lock->unlock(this->lock);
+}
+
METHOD(stroke_counter_t, destroy, void,
private_stroke_counter_t *this)
{
@@ -370,6 +391,7 @@ stroke_counter_t *stroke_counter_create()
.message = _message_hook,
},
.print = _print,
+ .reset = _reset,
.destroy = _destroy,
},
.conns = hashtable_create((hashtable_hash_t)hash,
diff --git a/src/libcharon/plugins/stroke/stroke_counter.h b/src/libcharon/plugins/stroke/stroke_counter.h
index b39fcb8dd..fecf39f56 100644
--- a/src/libcharon/plugins/stroke/stroke_counter.h
+++ b/src/libcharon/plugins/stroke/stroke_counter.h
@@ -92,6 +92,13 @@ struct stroke_counter_t {
void (*print)(stroke_counter_t *this, FILE *out, char *name);
/**
+ * Reset global or connection specific counters.
+ *
+ * @param name name of connection counters to reset, NULL for global
+ */
+ void (*reset)(stroke_counter_t *this, char *name);
+
+ /**
* Destroy a stroke_counter_t.
*/
void (*destroy)(stroke_counter_t *this);
diff --git a/src/libcharon/plugins/stroke/stroke_socket.c b/src/libcharon/plugins/stroke/stroke_socket.c
index ebb3c723d..7d41682fb 100644
--- a/src/libcharon/plugins/stroke/stroke_socket.c
+++ b/src/libcharon/plugins/stroke/stroke_socket.c
@@ -509,7 +509,14 @@ static void stroke_counters(private_stroke_socket_t *this,
{
pop_string(msg, &msg->counters.name);
- this->counter->print(this->counter, out, msg->counters.name);
+ if (msg->counters.reset)
+ {
+ this->counter->reset(this->counter, msg->counters.name);
+ }
+ else
+ {
+ this->counter->print(this->counter, out, msg->counters.name);
+ }
}
/**
@@ -675,6 +682,7 @@ static job_requeue_t process(stroke_job_context_t *ctx)
break;
case STR_COUNTERS:
stroke_counters(this, msg, out);
+ break;
default:
DBG1(DBG_CFG, "received unknown stroke");
break;