// SPDX-License-Identifier: GPL-3.0-or-later
#include "plugin_proc.h"
#define PLUGIN_PROC_MODULE_NETDEV_NAME "/proc/net/dev"
#define CONFIG_SECTION_PLUGIN_PROC_NETDEV "plugin:" PLUGIN_PROC_CONFIG_NAME ":" PLUGIN_PROC_MODULE_NETDEV_NAME
// As defined in https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net
const char *operstate_names[] = { "unknown", "notpresent", "down", "lowerlayerdown", "testing", "dormant", "up" };
static inline int get_operstate(char *operstate)
{
int i;
for (i = 0; i < (int) (sizeof(operstate_names) / sizeof(char *)); i++) {
if (!strcmp(operstate, operstate_names[i])) {
return i;
}
}
return 0;
}
// ----------------------------------------------------------------------------
// netdev list
static struct netdev {
char *name;
uint32_t hash;
size_t len;
// flags
int virtual;
int configured;
int enabled;
int updated;
int do_bandwidth;
int do_packets;
int do_errors;
int do_drops;
int do_fifo;
int do_compressed;
int do_events;
const char *chart_type_net_bytes;
const char *chart_type_net_packets;
const char *chart_type_net_errors;
const char *chart_type_net_fifo;
const char *chart_type_net_events;
const char *chart_type_net_drops;
const char *chart_type_net_compressed;
const char *chart_id_net_bytes;
const char *chart_id_net_packets;
const char *chart_id_net_errors;
const char *chart_id_net_fifo;
const char *chart_id_net_events;
const char *chart_id_net_drops;
const char *chart_id_net_compressed;
const char *chart_family;
struct label *chart_labels;
int flipped;
unsigned long priority;
// data collected
kernel_uint_t rbytes;
kernel_uint_t rpackets;
kernel_uint_t rerrors;
kernel_uint_t rdrops;
kernel_uint_t rfifo;
kernel_uint_t rframe;
kernel_uint_t rcompressed;
kernel_uint_t rmulticast;
kernel_uint_t tbytes;
kernel_uint_t tpackets;
kernel_uint_t terrors;
kernel_uint_t tdrops;
kernel_uint_t tfifo;
kernel_uint_t tcollisions;
kernel_uint_t tcarrier;
kernel_uint_t tcompressed;
kernel_uint_t speed;
kernel_uint_t duplex;
kernel_uint_t operstate;
// charts
RRDSET *st_bandwidth;
RRDSET *st_packets;
RRDSET *st_errors;
RRDSET *st_drops;
RRDSET *st_fifo;
RRDSET *st_compressed;
RRDSET *st_events;
// dimensions
RRDDIM *rd_rbytes;
RRDDIM *rd_rpackets;
RRDDIM *rd_rerrors;
RRDDIM *rd_rdrops;
RRDDIM *rd_rfifo;
RRDDIM *rd_rframe;
RRDDIM