diff options
| -rw-r--r-- | doc/man/fccntl.3 | 8 | ||||
| -rw-r--r-- | include/ouroboros/fccntl.h | 10 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt.c | 22 | ||||
| -rw-r--r-- | src/lib/dev.c | 9 | 
4 files changed, 40 insertions, 9 deletions
diff --git a/doc/man/fccntl.3 b/doc/man/fccntl.3 index 8cd64b13..34e63e7d 100644 --- a/doc/man/fccntl.3 +++ b/doc/man/fccntl.3 @@ -2,7 +2,7 @@  .\" Dimitri Staessens <dimitri.staessens@ugent.be>  .\" Sander Vrijders <sander.vrijders@ugent.be> -.TH FCCNTL 3 2017-08-30 Ouroboros "Ouroboros Programmer's Manual" +.TH FCCNTL 3 2018-02-28 Ouroboros "Ouroboros Programmer's Manual"  .SH NAME @@ -65,6 +65,12 @@ argument. Supported flags are:  \fBFLOWGFLAGS\fR    - get the current flow flags. Takes an \fBuint32_t  \fIflags\fR as third argument. +\fBFLOWGRXQLEN\fR   - get the current number of packets in the receive +buffer. Takes a \fBsize_t \fIqlen\fR as third argument. + +\fBFLOWGTXQLEN\fR   - get the current number of packets in the transmit +buffer. Takes a \fBsize_t \fIqlen\fR as third argument. +  \fBFRCTSFLAGS\fR    - set FRCT flags. Takes FRCT flags as third  argument. Supported flags are: diff --git a/include/ouroboros/fccntl.h b/include/ouroboros/fccntl.h index 55e6a343..8940e6ef 100644 --- a/include/ouroboros/fccntl.h +++ b/include/ouroboros/fccntl.h @@ -50,7 +50,7 @@  #define FRCTFORDERING 00000010 /* Ordered delivery       */  #define FRCTFPARTIAL  00000020 /* Allow partial delivery */ -/* Operations */ +/* Flow operations */  #define FLOWSRCVTIMEO 00000001 /* Set read timeout       */  #define FLOWGRCVTIMEO 00000002 /* Get read timeout       */  #define FLOWSSNDTIMEO 00000003 /* Set send timeout       */ @@ -58,8 +58,12 @@  #define FLOWGQOSSPEC  00000005 /* Get qosspec_t          */  #define FLOWSFLAGS    00000006 /* Set flags for flow     */  #define FLOWGFLAGS    00000007 /* Get flags for flow     */ -#define FRCTSFLAGS    00000010 /* Set flags for FRCT     */ -#define FRCTGFLAGS    00000011 /* Get flags for FRCT     */ +#define FLOWGRXQLEN   00000010 /* Get queue length on rx */ +#define FLOWGTXQLEN   00000011 /* Get queue length on tx */ + +/* FRCT operations */ +#define FRCTSFLAGS    00001000 /* Set flags for FRCT     */ +#define FRCTGFLAGS    00001001 /* Get flags for FRCT     */  __BEGIN_DECLS 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);  | 
