From fe9d3fcb26b6ff30f4f02f14dddcde186b2955c1 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Fri, 23 Feb 2018 12:42:17 +0100 Subject: ipcpd: Print endpoint in flow statistics The flow statistics will now print the endpoint of the flow. If it's a local endpoint for the IPCP, it will print the component (e.g. "flow-allocator"). For remote flows, it will print the address of the IPCP. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- src/ipcpd/normal/dht.c | 5 +++-- src/ipcpd/normal/dt.c | 31 ++++++++++++++++++++++--------- src/ipcpd/normal/dt.h | 3 ++- src/ipcpd/normal/fa.c | 5 +++-- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index ebed4068..2577efc7 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -24,7 +24,8 @@ #include "config.h" -#define OUROBOROS_PREFIX "dht" +#define DHT "dht" +#define OUROBOROS_PREFIX DHT #include #include @@ -2767,7 +2768,7 @@ struct dht * dht_create(uint64_t addr) if (tpm_start(dht->tpm)) goto fail_tpm_start; - dht->fd = dt_reg_comp(dht, &dht_post_sdu); + dht->fd = dt_reg_comp(dht, &dht_post_sdu, DHT); notifier_reg(handle_event, dht); #else (void) handle_event; diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index adf07d1a..d0ab1a14 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -53,11 +53,12 @@ #include #include -#define STAT_FILE_LEN 1590 +#define STAT_FILE_LEN 1627 struct comp_info { void (* post_sdu)(void * comp, struct shm_du_buff * sdb); void * comp; + char * name; }; struct { @@ -68,6 +69,7 @@ struct { #ifdef IPCP_FLOW_STATS struct { time_t stamp; + uint64_t addr; size_t snd_pkt[QOS_CUBE_MAX]; size_t rcv_pkt[QOS_CUBE_MAX]; size_t snd_bytes[QOS_CUBE_MAX]; @@ -102,6 +104,7 @@ static int dt_stat_read(const char * path, int fd; int i; char str[587]; + char addrstr[20]; /* NOTE: we may need stronger checks. */ fd = atoi(path); @@ -118,6 +121,12 @@ static int dt_stat_read(const char * path, return 0; } + if (dt.stat[fd].addr == ipcpi.dt_addr) + sprintf(addrstr, dt.comps[fd].name); + else + sprintf(addrstr, "%" PRIu64, dt.stat[fd].addr); + sprintf(buf, "Endpt address: %20s\n", addrstr); + for (i = 0; i < QOS_CUBE_MAX; ++i) { sprintf(str, "Qos cube %d:\n" @@ -263,8 +272,8 @@ static struct rib_ops r_ops = { #ifdef IPCP_FLOW_STATS -static void set_used(int fd, - bool b) +static void stat_used(int fd, + uint64_t addr) { struct timespec now; @@ -274,13 +283,14 @@ static void set_used(int fd, memset(&dt.stat[fd], 0, sizeof(dt.stat[fd])); - dt.stat[fd].stamp = b ? now.tv_sec : 0; + dt.stat[fd].stamp = (addr != INVALID_ADDR) ? now.tv_sec : 0; + dt.stat[fd].addr = addr; pthread_mutex_unlock(&dt.stat[fd].lock); pthread_rwlock_wrlock(&dt.lock); - b ? ++dt.n_flows : --dt.n_flows; + (addr != INVALID_ADDR) ? ++dt.n_flows : --dt.n_flows; pthread_rwlock_unlock(&dt.lock); } @@ -299,14 +309,14 @@ static void handle_event(void * self, switch (event) { case NOTIFY_DT_CONN_ADD: #ifdef IPCP_FLOW_STATS - set_used(c->flow_info.fd, true); + stat_used(c->flow_info.fd, c->conn_info.addr); #endif sdu_sched_add(dt.sdu_sched, c->flow_info.fd); log_dbg("Added fd %d to SDU scheduler.", c->flow_info.fd); break; case NOTIFY_DT_CONN_DEL: #ifdef IPCP_FLOW_STATS - set_used(c->flow_info.fd, false); + stat_used(c->flow_info.fd, INVALID_ADDR); #endif sdu_sched_del(dt.sdu_sched, c->flow_info.fd); log_dbg("Removed fd %d from SDU scheduler.", c->flow_info.fd); @@ -662,7 +672,8 @@ void dt_stop(void) } int dt_reg_comp(void * comp, - void (* func)(void * func, struct shm_du_buff *)) + void (* func)(void * func, struct shm_du_buff *), + char * name) { int res_fd; @@ -679,13 +690,15 @@ int dt_reg_comp(void * comp, assert(dt.comps[res_fd].post_sdu == NULL); assert(dt.comps[res_fd].comp == NULL); + assert(dt.comps[res_fd].name == NULL); dt.comps[res_fd].post_sdu = func; dt.comps[res_fd].comp = comp; + dt.comps[res_fd].name = name; pthread_rwlock_unlock(&dt.lock); #ifdef IPCP_FLOW_STATS - set_used(res_fd, true); + stat_used(res_fd, ipcpi.dt_addr); #endif return res_fd; } diff --git a/src/ipcpd/normal/dt.h b/src/ipcpd/normal/dt.h index f3bfdc56..e0bbe3f3 100644 --- a/src/ipcpd/normal/dt.h +++ b/src/ipcpd/normal/dt.h @@ -46,7 +46,8 @@ int dt_start(void); void dt_stop(void); int dt_reg_comp(void * comp, - void (* func)(void * comp, struct shm_du_buff * sdb)); + void (* func)(void * comp, struct shm_du_buff * sdb), + char * name); int dt_write_sdu(uint64_t dst_addr, qoscube_t qc, diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index e7e5a786..00e93fb7 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -24,7 +24,8 @@ #include "config.h" -#define OUROBOROS_PREFIX "flow-allocator" +#define FA "flow-allocator" +#define OUROBOROS_PREFIX FA #include #include @@ -195,7 +196,7 @@ int fa_init(void) if (pthread_rwlock_init(&fa.flows_lock, NULL)) return -1; - fa.fd = dt_reg_comp(&fa, &fa_post_sdu); + fa.fd = dt_reg_comp(&fa, &fa_post_sdu, FA); return 0; } -- cgit v1.2.3