diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ipcpd/normal/dt.c | 22 | ||||
-rw-r--r-- | src/lib/dev.c | 9 |
2 files changed, 26 insertions, 5 deletions
diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index 566ede24..68cd498f 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -35,6 +35,9 @@ #include <ouroboros/dev.h> #include <ouroboros/notifier.h> #include <ouroboros/rib.h> +#ifdef IPCP_FLOW_STATS +#include <ouroboros/fccntl.h> +#endif #include "connmgr.h" #include "ipcp.h" @@ -53,7 +56,7 @@ #include <inttypes.h> #include <assert.h> -#define STAT_FILE_LEN 2088 +#define STAT_FILE_LEN 2205 #ifndef CLOCK_REALTIME_COARSE #define CLOCK_REALTIME_COARSE CLOCK_REALTIME @@ -110,6 +113,8 @@ static int dt_stat_read(const char * path, char str[681]; char addrstr[20]; char tmstr[20]; + size_t rxqlen = 0; + size_t txqlen = 0; struct tm * tm; /* NOTE: we may need stronger checks. */ @@ -135,10 +140,17 @@ static int dt_stat_read(const char * path, tm = localtime(&dt.stat[fd].stamp); strftime(tmstr, sizeof(tmstr), "%F %T", tm); + if (fd >= PROG_RES_FDS) { + fccntl(fd, FLOWGRXQLEN, &rxqlen); + fccntl(fd, FLOWGTXQLEN, &txqlen); + } + sprintf(buf, - "Established : %20s\n" - "Endpt address: %20s\n", - tmstr, addrstr); + "Flow established at: %20s\n" + "Endpoint address: %20s\n" + "Queued packets (rx): %20zu\n" + "Queued packets (tx): %20zu\n\n", + tmstr, addrstr, rxqlen, txqlen); for (i = 0; i < QOS_CUBE_MAX; ++i) { sprintf(str, @@ -430,7 +442,7 @@ static void sdu_handler(int fd, #endif } else { dt_pci_shrink(sdb); - if (dt_pci.eid > PROG_RES_FDS) { + if (dt_pci.eid >= PROG_RES_FDS) { if (ipcp_flow_write(dt_pci.eid, sdb)) { ipcp_sdb_release(sdb); #ifdef IPCP_FLOW_STATS diff --git a/src/lib/dev.c b/src/lib/dev.c index 99ab4359..7e829a5f 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -670,6 +670,7 @@ int fccntl(int fd, qosspec_t * qs; uint32_t rx_acl; uint32_t tx_acl; + size_t * qlen; struct flow * flow; if (fd < 0 || fd >= PROG_MAX_FLOWS) @@ -728,6 +729,14 @@ int fccntl(int fd, goto einval; *qs = flow->spec; break; + case FLOWGRXQLEN: + qlen = va_arg(l, size_t *); + *qlen = shm_rbuff_queued(flow->rx_rb); + break; + case FLOWGTXQLEN: + qlen = va_arg(l, size_t *); + *qlen = shm_rbuff_queued(flow->rx_rb); + break; case FLOWSFLAGS: flow->oflags = va_arg(l, uint32_t); rx_acl = shm_rbuff_get_acl(flow->rx_rb); |