From 99526a6ad07c02e40e0831fd952974c5b7446f31 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 19 Aug 2016 19:15:39 +0200 Subject: 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 --- include/osmo-pcap/osmo_pcap_server.h | 27 ++++++++++++++++- src/osmo_server_main.c | 39 ++++++++++++++++++++++++ src/osmo_server_network.c | 58 ++++++++++++++++++++++++++++++++++-- 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 + * (C) 2011-2016 by Holger Hans Peter Freyther * (C) 2011 by On-Waves * All Rights Reserved * @@ -36,6 +36,9 @@ #include +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 #include #include +#include #include #include @@ -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 + * (C) 2011-2017 by Holger Hans Peter Freyther * (C) 2011 by On-Waves * All Rights Reserved * @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -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); -- cgit v1.2.3