aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-08-19 19:15:39 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-08-19 19:23:00 +0200
commit99526a6ad07c02e40e0831fd952974c5b7446f31 (patch)
tree9bc1fe1e69567224ed7c85e23a9ecc9b1c184bfc
parentc3455dcb7951069dab99effae71aac2a14961823 (diff)
server: Add global and per client counters and begin to count
Add the basics for getting a picture what a client and the server is doing. We need to create unique descriptions as the code is working with names and not numbers for clients. Change-Id: I4a9be5bdd815d280cccf0199efc2ca79fc77d393
-rw-r--r--include/osmo-pcap/osmo_pcap_server.h27
-rw-r--r--src/osmo_server_main.c39
-rw-r--r--src/osmo_server_network.c58
3 files changed, 121 insertions, 3 deletions
diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h
index 5af0838..a386a2a 100644
--- a/include/osmo-pcap/osmo_pcap_server.h
+++ b/include/osmo-pcap/osmo_pcap_server.h
@@ -1,7 +1,7 @@
/*
* osmo-pcap-server code
*
- * (C) 2011 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * (C) 2011-2016 by Holger Hans Peter Freyther <holger@moiji-mobile.com>
* (C) 2011 by On-Waves
* All Rights Reserved
*
@@ -36,6 +36,9 @@
#include <time.h>
+struct rate_ctr_group;
+struct rate_ctr_group_desc;
+
struct osmo_pcap_server;
@@ -44,6 +47,21 @@ struct osmo_pcap_server;
#define SERVER_MAX_DATA_SIZE 10000
+enum {
+ PEER_CTR_CONNECT,
+ PEER_CTR_BYTES,
+ PEER_CTR_PKTS,
+ PEER_CTR_PROTATE,
+};
+
+enum {
+ SERVER_CTR_CONNECT,
+ SERVER_CTR_BYTES,
+ SERVER_CTR_PKTS,
+ SERVER_CTR_PROTATE,
+ SERVER_CTR_NOCLIENT,
+};
+
struct osmo_pcap_conn {
/* list of connections */
struct llist_head entry;
@@ -72,6 +90,9 @@ struct osmo_pcap_conn {
int reopen;
char buf[SERVER_MAX_DATA_SIZE + sizeof(struct osmo_pcap_data)];
struct osmo_pcap_data *data;
+
+ /* statistics */
+ struct rate_ctr_group *ctrg;
};
struct osmo_pcap_server {
@@ -89,9 +110,13 @@ struct osmo_pcap_server {
char *base_path;
off_t max_size;
+
+ /* statistics */
+ struct rate_ctr_group *ctrg;
};
extern struct osmo_pcap_server *pcap_server;
+extern const struct rate_ctr_group_desc pcap_peer_group_desc;
void osmo_pcap_server_reopen(struct osmo_pcap_server *server);
int osmo_pcap_server_listen(struct osmo_pcap_server *server);
diff --git a/src/osmo_server_main.c b/src/osmo_server_main.c
index ef01300..bb94ec4 100644
--- a/src/osmo_server_main.c
+++ b/src/osmo_server_main.c
@@ -28,6 +28,7 @@
#include <osmocom/core/select.h>
#include <osmocom/core/stats.h>
#include <osmocom/core/talloc.h>
+#include <osmocom/core/utils.h>
#include <osmocom/vty/logging.h>
#include <osmocom/vty/telnet_interface.h>
@@ -52,6 +53,38 @@ struct osmo_pcap_server *pcap_server;
extern void *tall_msgb_ctx;
extern void *tall_ctr_ctx;
+
+static const struct rate_ctr_desc pcap_peer_ctr_desc[] = {
+ [PEER_CTR_CONNECT] = { "peer.connect", "Connect of a peer " },
+ [PEER_CTR_BYTES] = { "peer.bytes", "Received bytes " },
+ [PEER_CTR_PKTS] = { "peer.pkts", "Received packets " },
+ [PEER_CTR_PROTATE] = { "peer.file_rotated","Capture file rotated" },
+};
+
+static const struct rate_ctr_desc pcap_server_ctr_desc[] = {
+ [SERVER_CTR_CONNECT] = { "server.connect", "Connect of a peer " },
+ [SERVER_CTR_BYTES] = { "server.bytes", "Received bytes " },
+ [SERVER_CTR_PKTS] = { "server.pkts", "Received packets " },
+ [SERVER_CTR_PROTATE] = { "server.file_rotated", "Capture file rotated" },
+ [SERVER_CTR_NOCLIENT] = { "server.no_client", "Unknown connected " },
+};
+
+const struct rate_ctr_group_desc pcap_peer_group_desc = {
+ .group_name_prefix = NULL, /* will be dynamically patched */
+ .group_description = "PCAP peer statistics",
+ .num_ctr = ARRAY_SIZE(pcap_peer_ctr_desc),
+ .ctr_desc = pcap_peer_ctr_desc,
+ .class_id = OSMO_STATS_CLASS_PEER,
+};
+
+static const struct rate_ctr_group_desc pcap_server_group_desc = {
+ .group_name_prefix = "pcap.server",
+ .group_description = "PCAP Server global statistics",
+ .num_ctr = ARRAY_SIZE(pcap_server_ctr_desc),
+ .ctr_desc = pcap_server_ctr_desc,
+ .class_id = OSMO_STATS_CLASS_GLOBAL,
+};
+
static struct vty_app_info vty_info = {
.name = "OsmoPCAPServer",
.version = PACKAGE_VERSION,
@@ -194,6 +227,12 @@ int main(int argc, char **argv)
LOGP(DSERVER, LOGL_ERROR, "Failed to allocate osmo_pcap_server.\n");
exit(1);
}
+ pcap_server->ctrg = rate_ctr_group_alloc(pcap_server, &pcap_server_group_desc, 0);
+ if (!pcap_server->ctrg) {
+ LOGP(DSERVER, LOGL_ERROR, "Failed to allocate rate counter.\n");
+ exit(1);
+ }
+
INIT_LLIST_HEAD(&pcap_server->conn);
pcap_server->base_path = talloc_strdup(pcap_server, "./");
pcap_server->max_size = 1073741824;
diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c
index 6812f35..8d41eaf 100644
--- a/src/osmo_server_network.c
+++ b/src/osmo_server_network.c
@@ -1,7 +1,7 @@
/*
* osmo-pcap-server code
*
- * (C) 2011 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * (C) 2011-2017 by Holger Hans Peter Freyther <holger@moiji-mobile.com>
* (C) 2011 by On-Waves
* All Rights Reserved
*
@@ -26,6 +26,7 @@
#include <osmocom/core/socket.h>
#include <osmocom/core/talloc.h>
+#include <osmocom/core/rate_ctr.h>
#include <arpa/inet.h>
#include <sys/socket.h>
@@ -119,6 +120,8 @@ void osmo_pcap_server_close_trace(struct osmo_pcap_conn *conn)
if (conn->curr_filename) {
client_event(conn, "closingtracefile", conn->curr_filename);
+ rate_ctr_inc(&conn->ctrg->ctr[PEER_CTR_PROTATE]);
+ rate_ctr_inc(&conn->server->ctrg->ctr[SERVER_CTR_PROTATE]);
talloc_free(conn->curr_filename);
conn->curr_filename = NULL;
}
@@ -251,7 +254,9 @@ void osmo_pcap_server_delete(struct osmo_pcap_conn *conn)
struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server,
const char *name)
{
+ struct rate_ctr_group_desc *desc;
struct osmo_pcap_conn *conn;
+
llist_for_each_entry(conn, &server->conn, entry) {
if (strcmp(conn->name, name) == 0)
return conn;
@@ -260,10 +265,43 @@ struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server,
conn = talloc_zero(server, struct osmo_pcap_conn);
if (!conn) {
LOGP(DSERVER, LOGL_ERROR,
- "Failed to find the connection.\n");
+ "Failed to allocate the connection peer=%s.\n", name);
+ return NULL;
+ }
+
+ /* a bit nasty. we do not work with ids but names */
+ desc = talloc_zero(conn, struct rate_ctr_group_desc);
+ if (!desc) {
+ LOGP(DSERVER, LOGL_ERROR,
+ "Failed to allocate rate ctr desc peer=%s\n", name);
+ talloc_free(conn);
+ return NULL;
+ }
+ memcpy(desc, &pcap_peer_group_desc, sizeof(pcap_peer_group_desc));
+ desc->group_name_prefix = talloc_asprintf(desc, "pcap.peer.%s", name);
+ if (!desc->group_name_prefix) {
+ LOGP(DSERVER, LOGL_ERROR,
+ "Failed to allocate group name prefix peer=%s\n", name);
+ talloc_free(conn);
+ return NULL;
+ }
+ desc->group_description = talloc_asprintf(desc, "PCAP peer statistics %s", name);
+ if (!desc->group_description) {
+ LOGP(DSERVER, LOGL_ERROR,
+ "Failed to allocate group description peer=%s\n", name);
+ talloc_free(conn);
return NULL;
}
+ conn->ctrg = rate_ctr_group_alloc(desc, desc, 0);
+ if (!conn->ctrg) {
+ LOGP(DSERVER, LOGL_ERROR,
+ "Failed to allocate rate ctr peer=%s\n", name);
+ talloc_free(conn);
+ return NULL;
+ }
+
+
conn->name = talloc_strdup(conn, name);
conn->rem_fd.fd = -1;
conn->local_fd = -1;
@@ -327,6 +365,15 @@ static int read_cb_data(struct osmo_fd *fd, struct osmo_pcap_conn *conn)
} else if (conn->pend == 0) {
conn->state = STATE_INITIAL;
conn->pend = sizeof(*conn->data);
+
+ /* count the full packet we got */
+ rate_ctr_inc(&conn->ctrg->ctr[PEER_CTR_PKTS]);
+ rate_ctr_inc(&conn->server->ctrg->ctr[SERVER_CTR_PKTS]);
+
+ /* count the bytes of it */
+ rate_ctr_add(&conn->ctrg->ctr[PEER_CTR_BYTES], conn->data->len);
+ rate_ctr_add(&conn->server->ctrg->ctr[SERVER_CTR_BYTES], conn->data->len);
+
switch (conn->data->type) {
case PKT_LINK_HDR:
link_data(conn, conn->data);
@@ -374,6 +421,8 @@ static void new_connection(struct osmo_pcap_server *server,
return;
}
+ rate_ctr_inc(&client->ctrg->ctr[PEER_CTR_CONNECT]);
+
client->rem_fd.data = client;
client->rem_fd.when = BSC_FD_READ;
client->rem_fd.cb = read_cb;
@@ -396,6 +445,10 @@ static int accept_cb(struct osmo_fd *fd, unsigned int when)
}
server = fd->data;
+
+ /* count any accept to see no clients */
+ rate_ctr_inc(&server->ctrg->ctr[SERVER_CTR_CONNECT]);
+
llist_for_each_entry(conn, &server->conn, entry) {
if (conn->remote_addr.s_addr == addr.sin_addr.s_addr) {
LOGP(DSERVER, LOGL_NOTICE,
@@ -406,6 +459,7 @@ static int accept_cb(struct osmo_fd *fd, unsigned int when)
}
}
+ rate_ctr_inc(&server->ctrg->ctr[SERVER_CTR_NOCLIENT]);
LOGP(DSERVER, LOGL_ERROR,
"Failed to find client for %s\n", inet_ntoa(addr.sin_addr));
close(new_fd);