--- embedaddon/mpd/src/ngfunc.c	2012/02/21 23:32:47	1.1
+++ embedaddon/mpd/src/ngfunc.c	2016/11/01 09:56:12	1.1.1.3
@@ -44,8 +44,8 @@
 #endif
 #ifdef USE_NG_NETFLOW
 #include <netgraph/netflow/ng_netflow.h>
-#if NGM_NETFLOW_COOKIE >= 1309868867
 #include <netgraph/netflow/netflow.h>
+#if NGM_NETFLOW_COOKIE >= 1309868867
 #include <netgraph/netflow/netflow_v9.h>
 #endif
 #endif
@@ -460,8 +460,10 @@ NgFuncSendQuery(const char *path, int cookie, int cmd,
     }
 
     /* Send message */
-    if (NgSendMsg(gNgStatSock, path, cookie, cmd, args, arglen) < 0)
+    if (NgSendMsg(gNgStatSock, path, cookie, cmd, args, arglen) < 0) {
+	Perror("NgFuncSendQuery: can't send message");
 	return (-1);
+    }
 
     /* Read message */
     if (NgRecvMsg(gNgStatSock, rbuf, replen, raddr) < 0) {
@@ -627,7 +629,7 @@ NgFuncWriteFrame(int dsock, const char *hookname, cons
     /* ENOBUFS can be expected on some links, e.g., ng_pptpgre(4) */
     if (rtn < 0 && errno != ENOBUFS) {
 	Perror("[%s] error writing len %d frame to %s",
-	    label, MBLEN(bp), hookname);
+	    label, (int)MBLEN(bp), hookname);
     }
     mbfree(bp);
     return (rtn);
@@ -763,6 +765,8 @@ NetflowSetCommand(Context ctx, int ac, char *av[], voi
     	    gNetflowExport = *sin;
     	    break;
 	case SET_SELF:
+	    if (ac != 1 && ac != 2)
+		return (-1);
     	    if ((sin = ParseAddrPort(ac, av, ALLOW_IPV4|ALLOW_IPV6)) == NULL)
 		return (-1);
     	    gNetflowSource = *sin;
@@ -815,7 +819,7 @@ NetflowSetCommand(Context ctx, int ac, char *av[], voi
 	case SET_HOOK:
     	    if (ac != 1)
 		return (-1);
-    	    if (atoi(av[0]) <= 0)
+    	    if (atoi(av[0]) <= 0 || atoi(av[0]) >= NG_NETFLOW_MAXIFACES)
 		Error("Bad netflow hook number \"%s\"", av[0]);
     	    gNetflowIface = atoi(av[0])-1;
     	    break;
@@ -825,6 +829,136 @@ NetflowSetCommand(Context ctx, int ac, char *av[], voi
     }
 
     return (0);
+}
+
+/*
+ * ShowNetflow()
+ *
+ * Show state of a Netflow
+ */
+
+int
+ShowNetflow(Context ctx, int ac, char *av[], void *arg)
+{
+    struct u_addr addr;
+    in_port_t port;
+    char buf[64];
+    char path[NG_PATHSIZ];
+    union {
+        u_char buf[sizeof(struct ng_mesg) + sizeof(struct ng_netflow_info)];
+        struct ng_mesg reply;
+    } u;
+    struct ng_netflow_info *const ni = \
+        (struct ng_netflow_info *)(void *)u.reply.data;
+#ifdef NGM_NETFLOW_V9_COOKIE
+    union {
+        u_char buf[sizeof(struct ng_mesg) + sizeof(struct ng_netflow_v9info)];
+        struct ng_mesg reply;
+    } uv9;
+    struct ng_netflow_v9info *const niv9 = \
+        (struct ng_netflow_v9info *)(void *)uv9.reply.data;
+#endif /* NGM_NETFLOW_V9_COOKIE */
+
+    if (gNetflowNodeID>0) {
+        snprintf(path, sizeof(path), "[%x]:", gNetflowNodeID);
+        if (NgFuncSendQuery(path, NGM_NETFLOW_COOKIE, NGM_NETFLOW_INFO,
+        NULL, 0, &u.reply, sizeof(u), NULL) < 0)
+            return(-7);
+#ifdef NGM_NETFLOW_V9_COOKIE
+        if (NgFuncSendQuery(path, NGM_NETFLOW_COOKIE, NGM_NETFLOW_V9INFO,
+        NULL, 0, &uv9.reply, sizeof(uv9), NULL) < 0)
+            return(-7);
+#endif /* NGM_NETFLOW_V9_COOKIE */
+    }
+
+    Printf("Netflow status:\r\n");
+    Printf("\tNode created   : %s\r\n", gNetflowNodeID ? "Yes" : "No");
+    Printf("Netflow settings:\r\n");
+    Printf("\tNode name      : %s\r\n", gNetflowNodeName);
+    Printf("\tInitial hook   : %d\r\n", gNetflowIface);
+    Printf("\tTimeouts, sec:\r\n");
+    Printf("\t  Active       : %u\r\n",
+        (gNetflowNodeID>0) ? ni->nfinfo_act_t :
+        (gNetflowActive ? gNetflowActive : ACTIVE_TIMEOUT));
+    Printf("\t  Inactive     : %u\r\n",
+        (gNetflowNodeID>0) ? ni->nfinfo_inact_t :
+        (gNetflowInactive ? gNetflowInactive : INACTIVE_TIMEOUT));
+    sockaddrtou_addr(&gNetflowExport, &addr, &port);
+    Printf("\tExport address : %s port %d\r\n",
+        u_addrtoa(&addr, buf, sizeof(buf)), (int)port);
+    sockaddrtou_addr(&gNetflowSource, &addr, &port);
+    Printf("\tSource address : %s port %d\r\n",
+        u_addrtoa(&addr, buf, sizeof(buf)), (int)port);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    Printf("\tExport version : v%d\r\n", gNetflowVer);
+    Printf("Netflow v9 configuration:\r\n");
+    Printf("\tTemplate:\r\n");
+#ifdef NGM_NETFLOW_V9_COOKIE
+    Printf("\t  Time         : %d\r\n",
+        (gNetflowNodeID>0) ? niv9->templ_time :
+        (gNetflowTime ? gNetflowTime : NETFLOW_V9_MAX_TIME_TEMPL));
+    Printf("\t  Packets      : %d\r\n",
+        (gNetflowNodeID>0) ? niv9->templ_packets :
+        (gNetflowPackets ? gNetflowPackets : NETFLOW_V9_MAX_PACKETS_TEMPL));
+    Printf("\tNetflow v9 MTU : %d\r\n",
+        (gNetflowNodeID>0) ? niv9->mtu :
+        (gNetflowMTU ? gNetflowMTU : BASE_MTU));
+#else
+    Printf("\t  Time         : %d\r\n",
+        gNetflowTime ? gNetflowTime : NETFLOW_V9_MAX_TIME_TEMPL);
+    Printf("\t  Packets      : %d\r\n",
+        gNetflowPackets ? gNetflowPackets : NETFLOW_V9_MAX_PACKETS_TEMPL);
+    Printf("\tNetflow v9 MTU : %d\r\n",
+        gNetflowMTU ? gNetflowMTU : BASE_MTU);
+#endif /* NGM_NETFLOW_V9_COOKIE */
+#endif
+    if (gNetflowNodeID>0) {
+        Printf("Traffic stats:\r\n");
+#if NGM_NETFLOW_COOKIE >= 1365756954
+        Printf("\tAccounted IPv4 octets  : %llu\r\n", (unsigned long long)ni->nfinfo_bytes);
+        Printf("\tAccounted IPv4 packets : %llu\r\n", (unsigned long long)ni->nfinfo_packets);
+        Printf("\tAccounted IPv6 octets  : %llu\r\n", (unsigned long long)ni->nfinfo_bytes6);
+        Printf("\tAccounted IPv6 packets : %llu\r\n", (unsigned long long)ni->nfinfo_packets6);
+        Printf("\tSkipped IPv4 octets    : %llu\r\n", (unsigned long long)ni->nfinfo_sbytes);
+        Printf("\tSkipped IPv4 packets   : %llu\r\n", (unsigned long long)ni->nfinfo_spackets);
+        Printf("\tSkipped IPv6 octets    : %llu\r\n", (unsigned long long)ni->nfinfo_sbytes6);
+        Printf("\tSkipped IPv6 packets   : %llu\r\n", (unsigned long long)ni->nfinfo_spackets6);
+        Printf("\tActive expiries        : %llu\r\n", (unsigned long long)ni->nfinfo_act_exp);
+        Printf("\tInactive expiries      : %llu\r\n", (unsigned long long)ni->nfinfo_inact_exp);
+        Printf("\tUsed IPv4 cache records: %u\r\n", ni->nfinfo_used);
+        Printf("\tUsed IPv6 cache records: %u\r\n", ni->nfinfo_used6);
+        Printf("\tFailed allocations     : %u\r\n", ni->nfinfo_alloc_failed);
+        Printf("\tFailed v5 export       : %u\r\n", ni->nfinfo_export_failed);
+        Printf("\tFailed v9 export       : %u\r\n", ni->nfinfo_export9_failed);
+        Printf("\tRallocated mbufs       : %u\r\n", ni->nfinfo_realloc_mbuf);
+        Printf("\tFibs allocated         : %u\r\n", ni->nfinfo_alloc_fibs);
+#else /* NGM_NETFLOW_COOKIE >= 1365756954 */
+        Printf("\tAccounted IPv4 octets  : %llu\r\n", (unsigned long long)ni->nfinfo_bytes);
+        Printf("\tAccounted IPv4 packets : %u\r\n", ni->nfinfo_packets);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+        Printf("\tAccounted IPv6 octets  : %llu\r\n", (unsigned long long)ni->nfinfo_bytes6);
+        Printf("\tAccounted IPv6 packets : %u\r\n", ni->nfinfo_packets6);
+        Printf("\tSkipped IPv4 octets    : %llu\r\n", (unsigned long long)ni->nfinfo_sbytes);
+        Printf("\tSkipped IPv4 packets   : %u\r\n", ni->nfinfo_spackets);
+        Printf("\tSkipped IPv6 octets    : %llu\r\n", (unsigned long long)ni->nfinfo_sbytes6);
+        Printf("\tSkipped IPv6 packets   : %u\r\n", ni->nfinfo_spackets6);
+#endif
+        Printf("\tUsed IPv4 cache records: %u\r\n", ni->nfinfo_used);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+        Printf("\tUsed IPv6 cache records: %u\r\n", ni->nfinfo_used6);
+#endif
+        Printf("\tFailed allocations     : %u\r\n", ni->nfinfo_alloc_failed);
+        Printf("\tFailed v5 export       : %u\r\n", ni->nfinfo_export_failed);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+        Printf("\tFailed v9 export       : %u\r\n", ni->nfinfo_export9_failed);
+        Printf("\tRallocated mbufs       : %u\r\n", ni->nfinfo_realloc_mbuf);
+        Printf("\tFibs allocated         : %u\r\n", ni->nfinfo_alloc_fibs);
+#endif
+        Printf("\tActive expiries        : %u\r\n", ni->nfinfo_act_exp);
+        Printf("\tInactive expiries      : %u\r\n", ni->nfinfo_inact_exp);
+#endif /* NGM_NETFLOW_COOKIE >= 1365756954 */
+    }
+    return(0);
 }
 #endif /* USE_NG_NETFLOW */