summaryrefslogtreecommitdiffstats
path: root/src/libs/zbxsysinfo/netbsd/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/zbxsysinfo/netbsd/net.c')
-rw-r--r--src/libs/zbxsysinfo/netbsd/net.c393
1 files changed, 378 insertions, 15 deletions
diff --git a/src/libs/zbxsysinfo/netbsd/net.c b/src/libs/zbxsysinfo/netbsd/net.c
index 1925f27d..92493c22 100644
--- a/src/libs/zbxsysinfo/netbsd/net.c
+++ b/src/libs/zbxsysinfo/netbsd/net.c
@@ -21,50 +21,413 @@
#include "sysinfo.h"
-int NET_IF_IN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
+static struct nlist kernel_symbols[] =
{
+ {"_ifnet", N_UNDF, 0, 0, 0},
+ {"_tcbtable", N_UNDF, 0, 0, 0},
+ {NULL, 0, 0, 0, 0}
+};
- assert(result);
+#define IFNET_ID 0
- init_result(result);
+static int get_ifdata(const char *if_name, zbx_uint64_t *ibytes, zbx_uint64_t *ipackets, zbx_uint64_t *ierrors, zbx_uint64_t *idropped,
+ zbx_uint64_t *obytes, zbx_uint64_t *opackets, zbx_uint64_t *oerrors,
+ zbx_uint64_t *tbytes, zbx_uint64_t *tpackets, zbx_uint64_t *terrors, zbx_uint64_t *tdropped,
+ zbx_uint64_t *icollisions)
+{
+ struct ifnet_head head;
+ struct ifnet *ifp;
+ struct ifnet v;
+ kvm_t *kp;
+ int len = 0;
+ int ret = SYSINFO_RET_FAIL;
+
+ kp = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
+
+ if (kp) {
+ if (N_UNDF == kernel_symbols[IFNET_ID].n_type)
+ if (0 != kvm_nlist(kp, &kernel_symbols[0]))
+ kernel_symbols[IFNET_ID].n_type = N_UNDF;
+
+ if (N_UNDF != kernel_symbols[IFNET_ID].n_type) {
+ len = sizeof(struct ifnet_head);
+
+ if (kvm_read(kp, kernel_symbols[IFNET_ID].n_value, &head, len) >= len) {
+ len = sizeof(struct ifnet);
+
+ /* if_ibytes; total number of octets received */
+ /* if_ipackets; packets received on interface */
+ /* if_ierrors; input errors on interface */
+ /* if_iqdrops; dropped on input, this interface */
+ /* if_obytes; total number of octets sent */
+ /* if_opackets; packets sent on interface */
+ /* if_oerrors; output errors on interface */
+ /* if_collisions; collisions on csma interfaces */
+
+ if (ibytes)
+ *ibytes = 0;
+ if (ipackets)
+ *ipackets = 0;
+ if (ierrors)
+ *ierrors = 0;
+ if (idropped)
+ *idropped = 0;
+ if (obytes)
+ *obytes = 0;
+ if (opackets)
+ *opackets = 0;
+ if (oerrors)
+ *oerrors = 0;
+ if (tbytes)
+ *tbytes = 0;
+ if (tpackets)
+ *tpackets = 0;
+ if (terrors)
+ *terrors = 0;
+ if (tdropped)
+ *tdropped = 0;
+ if (icollisions)
+ *icollisions = 0;
+
+ for(ifp = head.tqh_first; ifp; ifp = v.if_list.tqe_next) {
+ if (kvm_read(kp, (u_long)ifp, &v, len) < len)
+ break;
+
+ if (*if_name == '\0' || 0 == strcmp(if_name, v.if_xname)) {
+ if (ibytes)
+ *ibytes += v.if_ibytes;
+ if (ipackets)
+ *ipackets += v.if_ipackets;
+ if (ierrors)
+ *ierrors += v.if_ierrors;
+ if (idropped)
+ *idropped += v.if_iqdrops;
+ if (obytes)
+ *obytes += v.if_obytes;
+ if (opackets)
+ *opackets += v.if_opackets;
+ if (oerrors)
+ *oerrors += v.if_oerrors;
+ if (tbytes)
+ *tbytes += v.if_ibytes + v.if_obytes;
+ if (tpackets)
+ *tpackets += v.if_ipackets + v.if_opackets;
+ if (terrors)
+ *terrors += v.if_ierrors + v.if_oerrors;
+ if (tdropped)
+ *tdropped += v.if_iqdrops;
+ if (icollisions)
+ *icollisions += v.if_collisions;
+ ret = SYSINFO_RET_OK;
+ }
+ }
+ }
+ }
+ kvm_close(kp);
+ }
+
+ return ret;
+}
+
+static int NET_IF_IN_BYTES(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_IN_PACKETS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_IN_ERRORS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_IN_DROPPED(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+int NET_IF_IN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
+{
+#define NET_FNCLIST struct net_fnclist_s
+NET_FNCLIST
+{
+ char *mode;
+ int (*function)();
+};
+
+ NET_FNCLIST fl[] =
+ {
+ {"bytes", NET_IF_IN_BYTES},
+ {"packets", NET_IF_IN_PACKETS},
+ {"errors", NET_IF_IN_ERRORS},
+ {"dropped", NET_IF_IN_DROPPED},
+ {0, 0}
+ };
+
+ char if_name[MAX_STRING_LEN];
+ char mode[MAX_STRING_LEN];
+ int i;
+
+ assert(result);
+
+ init_result(result);
+
+ if (num_param(param) > 2)
+ return SYSINFO_RET_FAIL;
+
+ if (0 != get_param(param, 1, if_name, sizeof(if_name)))
+ *if_name = '\0';
+
+ if (0 != get_param(param, 2, mode, sizeof(mode)))
+ *mode = '\0';
+
+ /* default parameter */
+ if (*mode == '\0')
+ zbx_snprintf(mode, sizeof(mode), "bytes");
+
+ for (i = 0; fl[i].mode != 0; i++)
+ if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
+ return (fl[i].function)(if_name, result);
+
return SYSINFO_RET_FAIL;
}
+static int NET_IF_OUT_BYTES(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_OUT_PACKETS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_OUT_ERRORS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
int NET_IF_OUT(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
+#define NET_FNCLIST struct net_fnclist_s
+NET_FNCLIST
+{
+ char *mode;
+ int (*function)();
+};
- assert(result);
+ NET_FNCLIST fl[] =
+ {
+ {"bytes", NET_IF_OUT_BYTES},
+ {"packets", NET_IF_OUT_PACKETS},
+ {"errors", NET_IF_OUT_ERRORS},
+/* {"dropped", NET_IF_OUT_DROPPED},*/
+ {0, 0}
+ };
+
+ char if_name[MAX_STRING_LEN];
+ char mode[MAX_STRING_LEN];
+ int i;
+
+ assert(result);
+
+ init_result(result);
+
+ if (num_param(param) > 2)
+ return SYSINFO_RET_FAIL;
+
+ if (0 != get_param(param, 1, if_name, sizeof(if_name)))
+ *if_name = '\0';
+
+ if (0 != get_param(param, 2, mode, sizeof(mode)))
+ *mode = '\0';
+
+ /* default parameter */
+ if (*mode == '\0')
+ zbx_snprintf(mode, sizeof(mode), "bytes");
+
+ for (i = 0; fl[i].mode != 0; i++)
+ if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
+ return (fl[i].function)(if_name, result);
- init_result(result);
-
return SYSINFO_RET_FAIL;
}
+static int NET_IF_TOTAL_BYTES(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_TOTAL_PACKETS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_TOTAL_ERRORS(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
+static int NET_IF_TOTAL_DROPPED(const char *if_name, AGENT_RESULT *result)
+{
+ zbx_uint64_t value;
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
+}
+
int NET_IF_TOTAL(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
+#define NET_FNCLIST struct net_fnclist_s
+NET_FNCLIST
+{
+ char *mode;
+ int (*function)();
+};
- assert(result);
+ NET_FNCLIST fl[] =
+ {
+ {"bytes", NET_IF_TOTAL_BYTES},
+ {"packets", NET_IF_TOTAL_PACKETS},
+ {"errors", NET_IF_TOTAL_ERRORS},
+ {"dropped", NET_IF_TOTAL_DROPPED},
+ {0, 0}
+ };
+
+ char if_name[MAX_STRING_LEN];
+ char mode[MAX_STRING_LEN];
+ int i;
+
+ assert(result);
+
+ init_result(result);
+
+ if (num_param(param) > 2)
+ return SYSINFO_RET_FAIL;
+
+ if (0 != get_param(param, 1, if_name, sizeof(if_name)))
+ *if_name = '\0';
+
+ if (0 != get_param(param, 2, mode, sizeof(mode)))
+ *mode = '\0';
+
+ /* default parameter */
+ if (*mode == '\0')
+ zbx_snprintf(mode, sizeof(mode), "bytes");
+
+ for (i = 0; fl[i].mode != 0; i++)
+ if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
+ return (fl[i].function)(if_name, result);
- init_result(result);
-
return SYSINFO_RET_FAIL;
}
int NET_TCP_LISTEN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
- assert(result);
+ assert(result);
- init_result(result);
+ init_result(result);
return SYSINFO_RET_FAIL;
}
int NET_IF_COLLISIONS(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
- assert(result);
+ zbx_uint64_t value;
+ char if_name[MAX_STRING_LEN];
- init_result(result);
-
- return SYSINFO_RET_FAIL;
+ assert(result);
+
+ init_result(result);
+
+ if (num_param(param) > 1)
+ return SYSINFO_RET_FAIL;
+
+ if (0 != get_param(param, 1, if_name, sizeof(if_name)))
+ *if_name = '\0';
+
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value))
+ return SYSINFO_RET_FAIL;
+
+ SET_UI64_RESULT(result, value);
+
+ return SYSINFO_RET_OK;
}