summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/man/fccntl.38
-rw-r--r--include/ouroboros/fccntl.h10
-rw-r--r--src/ipcpd/normal/dt.c22
-rw-r--r--src/lib/dev.c9
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 <[email protected]>
.\" Sander Vrijders <[email protected]>
-.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);