diff options
Diffstat (limited to 'agent/mibgroup/sctp-mib/sctpScalars_linux.c')
-rw-r--r-- | agent/mibgroup/sctp-mib/sctpScalars_linux.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/agent/mibgroup/sctp-mib/sctpScalars_linux.c b/agent/mibgroup/sctp-mib/sctpScalars_linux.c new file mode 100644 index 0000000..8cbe90f --- /dev/null +++ b/agent/mibgroup/sctp-mib/sctpScalars_linux.c @@ -0,0 +1,185 @@ +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> + +#include "sctpScalars_common.h" + +#include <stdio.h> +#include <errno.h> + +#define PROC_PREFIX "/proc" +#define PROC_RTO_MIN PROC_PREFIX "/sys/net/sctp/rto_min" +#define PROC_RTO_MAX PROC_PREFIX "/sys/net/sctp/rto_max" +#define PROC_RTO_INITIAL PROC_PREFIX "/sys/net/sctp/rto_initial" +#define PROC_VAL_COOKIE_LIFE PROC_PREFIX "/sys/net/sctp/valid_cookie_life" +#define PROC_MAX_INIT_RETR PROC_PREFIX "/sys/net/sctp/max_init_retransmits" +#define PROC_STATS PROC_PREFIX "/net/sctp/snmp" + +/** + * Reads one integer value from a file. + */ +static int +load_uint_file(const char *filename, u_int * value) +{ + FILE *f; + int ret; + + f = fopen(filename, "r"); + if (f == NULL) { + DEBUGMSGTL(("sctp:scalars:arch:load", "Cannot read file %s\n", + filename)); + return -1; + } + + ret = fscanf(f, "%u", value); + if (ret != 1) { + DEBUGMSGTL(("sctp:scalars:arch:load", "Malformed file %s\n", + filename)); + return -2; + } + + fclose(f); + return 0; +} + +void +netsnmp_access_sctp_stats_arch_init() +{ +} + +int +netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats) +{ + FILE *f; + char line[100]; + unsigned long long value; + char *delimiter; + int ret = 0; + + DEBUGMSGTL(("sctp:scalars:stats:arch_load", + "netsnmp_access_sctp_stats_arch_load called")); + + memset(sctp_stats, 0, sizeof(netsnmp_sctp_stats)); + f = fopen(PROC_STATS, "r"); + if (f == NULL) + return -1; + + while (fgets(line, sizeof(line), f) != NULL) { + DEBUGMSGTL(("sctp:scalars:stats:arch_load", "read: %s", line)); + + delimiter = strchr(line, '\t'); + if (delimiter == NULL) { + DEBUGMSGTL(("sctp:scalars:stats:arch_load", + "Malformed line, cannot find '\\t'!\n")); + return -1; + } + errno = 0; + value = strtoull(delimiter + 1, NULL, 10); + if (errno != 0) { + DEBUGMSGTL(("sctp:scalars:stats:arch_load", + "Malformed value!'\n")); + return -1; + } + + if (line[6] == 'r') + sctp_stats->curr_estab = value; + else if (line[5] == 'c') + sctp_stats->active_estabs = value; + else if (line[4] == 'P') + sctp_stats->passive_estabs = value; + else if (line[5] == 'b') + sctp_stats->aborteds = value; + else if (line[4] == 'S') + sctp_stats->shutdowns = value; + else if (line[8] == 'f') + sctp_stats->out_of_blues = value; + else if (line[6] == 'e') + sctp_stats->checksum_errors = value; + else if (line[4] == 'O') { + if (line[7] == 'C') { + sctp_stats->out_ctrl_chunks.low = value & 0xffffffff; + sctp_stats->out_ctrl_chunks.high = value >> 32; + } else if (line[7] == 'O') { + sctp_stats->out_order_chunks.low = value & 0xffffffff; + sctp_stats->out_order_chunks.high = value >> 32; + } else if (line[7] == 'U') { + sctp_stats->out_unorder_chunks.low = value & 0xffffffff; + sctp_stats->out_unorder_chunks.high = value >> 32; + } else if (line[7] == 'S') { + sctp_stats->out_sctp_packs.low = value & 0xffffffff; + sctp_stats->out_sctp_packs.high = value >> 32; + } else + ret = -1; + } else { + if (line[6] == 'C') { + sctp_stats->in_ctrl_chunks.low = value & 0xffffffff; + sctp_stats->in_ctrl_chunks.high = value >> 32; + } else if (line[6] == 'O') { + sctp_stats->in_order_chunks.low = value & 0xffffffff; + sctp_stats->in_order_chunks.high = value >> 32; + } else if (line[6] == 'U') { + sctp_stats->in_unorder_chunks.low = value & 0xffffffff; + sctp_stats->in_unorder_chunks.high = value >> 32; + } else if (line[4] == 'F') { + sctp_stats->frag_usr_msgs.low = value & 0xffffffff; + sctp_stats->frag_usr_msgs.high = value >> 32; + } else if (line[4] == 'R') { + sctp_stats->reasm_usr_msgs.low = value & 0xffffffff; + sctp_stats->reasm_usr_msgs.high = value >> 32; + } else if (line[6] == 'S') { + sctp_stats->in_sctp_packs.low = value & 0xffffffff; + sctp_stats->in_sctp_packs.high = value >> 32; + } else + ret = -1; + } + + if (ret < 0) { + DEBUGMSGTL(("sctp:scalars:stats:arch_load", + "Unknown entry!'\n")); + return ret; + } + } + + sctp_stats->discontinuity_time = 0; + return 0; +} + +void +netsnmp_access_sctp_params_arch_init() +{ +} + +int +netsnmp_access_sctp_params_arch_load(netsnmp_sctp_params * sctp_params) +{ + int ret; + DEBUGMSGTL(("sctp:scalars:params:arch_load", + "netsnmp_access_sctp_params_arch_load called")); + + sctp_params->rto_algorithm = NETSNMP_SCTP_ALGORITHM_OTHER; + + ret = load_uint_file(PROC_RTO_MIN, &sctp_params->rto_min); + if (ret < 0) + return ret; + + ret = load_uint_file(PROC_RTO_MAX, &sctp_params->rto_max); + if (ret < 0) + return ret; + + ret = load_uint_file(PROC_RTO_INITIAL, &sctp_params->rto_initial); + if (ret < 0) + return ret; + + sctp_params->max_assocs = -1; /* dynamic allocation of associations */ + + ret = load_uint_file(PROC_VAL_COOKIE_LIFE, + &sctp_params->val_cookie_life); + if (ret < 0) + return ret; + + ret = load_uint_file(PROC_MAX_INIT_RETR, &sctp_params->max_init_retr); + if (ret < 0) + return ret; + + return 0; +} |