expose traffic stats to 'tinc info ___' and 'tinc dump nodes'
authorvolth <volth@volth.com>
Wed, 13 Jun 2018 14:12:02 +0000 (14:12 +0000)
committervolth <volth@volth.com>
Wed, 13 Jun 2018 14:50:13 +0000 (14:50 +0000)
src/info.c
src/node.c
src/tincctl.c

index 652c4aebcbecb44af6824f0b036876913f2ddb0d..9ac7bbcae36181bd264a1f083a04c8d65e3fb629 100644 (file)
@@ -71,15 +71,16 @@ static int info_node(int fd, const char *item) {
        node_status_t status;
        long int last_state_change;
        long int udp_ping_rtt;
+       uint64_t in_packets, in_bytes, out_packets, out_bytes;
 
        while(recvline(fd, line, sizeof(line))) {
-               int n = sscanf(line, "%d %d %4095s %4095s %4095s port %4095s %d %d %d %d %x %"PRIx32" %4095s %4095s %d %hd %hd %hd %ld %ld", &code, &req, node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_union.raw, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change, &udp_ping_rtt);
+               int n = sscanf(line, "%d %d %4095s %4095s %4095s port %4095s %d %d %d %d %x %"PRIx32" %4095s %4095s %d %hd %hd %hd %ld %ld %lu %lu %lu %lu", &code, &req, node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_union.raw, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change, &udp_ping_rtt, &in_packets, &in_bytes, &out_packets, &out_bytes);
 
                if(n == 2) {
                        break;
                }
 
-               if(n != 20) {
+               if(n != 24) {
                        fprintf(stderr, "Unable to parse node dump from tincd.\n");
                        return 1;
                }
@@ -188,6 +189,9 @@ static int info_node(int fd, const char *item) {
                printf("none, forwarded via %s\n", nexthop);
        }
 
+       printf("RX:          %lu packets  %lu bytes\n", in_packets, in_bytes);
+       printf("TX:          %lu packets  %lu bytes\n", out_packets, out_bytes);
+
        // List edges
        printf("Edges:       ");
        sendline(fd, "%d %d %s", CONTROL, REQ_DUMP_EDGES, item);
index c3f2ab55baf7b30e96bf154dd9f725482f6a8fd2..6a5b747e62ea6fde4602240e6bd66590c5ea5d27 100644 (file)
@@ -212,7 +212,7 @@ bool dump_nodes(connection_t *c) {
                }
 
                id[sizeof(id) - 1] = 0;
-               send_request(c, "%d %d %s %s %s %d %d %d %d %x %x %s %s %d %d %d %d %ld %ld", CONTROL, REQ_DUMP_NODES,
+               send_request(c, "%d %d %s %s %s %d %d %d %d %x %x %s %s %d %d %d %d %ld %ld %lu %lu %lu %lu", CONTROL, REQ_DUMP_NODES,
                             n->name, id, n->hostname ? : "unknown port unknown",
 #ifdef DISABLE_LEGACY
                             0, 0, 0,
@@ -221,7 +221,8 @@ bool dump_nodes(connection_t *c) {
 #endif
                             n->outcompression, n->options, bitfield_to_int(&n->status, sizeof(n->status)),
                             n->nexthop ? n->nexthop->name : "-", n->via ? n->via->name ? : "-" : "-", n->distance,
-                            n->mtu, n->minmtu, n->maxmtu, (long)n->last_state_change, (long)n->udp_ping_rtt);
+                            n->mtu, n->minmtu, n->maxmtu, (long)n->last_state_change, (long)n->udp_ping_rtt,
+                            n->in_packets, n->in_bytes, n->out_packets, n->out_bytes);
        }
 
        return send_request(c, "%d %d", CONTROL, REQ_DUMP_NODES);
index 76ff3740b912c41548423093c2365adae230f75b..af54aefb8af953697f99bf6b47bd0016b85a280e 100644 (file)
@@ -1299,12 +1299,13 @@ static int cmd_dump(int argc, char *argv[]) {
                node_status_t status;
                long int last_state_change;
                long int udp_ping_rtt;
+               uint64_t in_packets, in_bytes, out_packets, out_bytes;
 
                switch(req) {
                case REQ_DUMP_NODES: {
-                       int n = sscanf(line, "%*d %*d %4095s %4095s %4095s port %4095s %d %d %d %d %x %x %4095s %4095s %d %hd %hd %hd %ld %ld", node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change, &udp_ping_rtt);
+                       int n = sscanf(line, "%*d %*d %4095s %4095s %4095s port %4095s %d %d %d %d %x %x %4095s %4095s %d %hd %hd %hd %ld %ld %lu %lu %lu %lu", node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change, &udp_ping_rtt, &in_packets, &in_bytes, &out_packets, &out_bytes);
 
-                       if(n != 18) {
+                       if(n != 22) {
                                fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line);
                                return 1;
                        }
@@ -1332,8 +1333,8 @@ static int cmd_dump(int argc, char *argv[]) {
                                        continue;
                                }
 
-                               printf("%s id %s at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %d (min %d max %d)",
-                                      node, id, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu);
+                               printf("%s id %s at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %d (min %d max %d) rx %lu %lu tx %lu %lu",
+                                      node, id, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu, in_packets, in_bytes, out_packets, out_bytes);
                                if (udp_ping_rtt != -1)
                                        printf(" rtt %ld.%03ld", udp_ping_rtt/1000, udp_ping_rtt%1000);
                                printf("\n");