blob: 85e912aad86f4eb50a29f49cd368f1146e8cbb17 [file] [log] [blame]
/*
* Arp MIB architecture support
*
* $Id$
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/data_access/ip_scalars.h>
netsnmp_feature_require(register_num_file_instance)
static const char ipfw_name[] = "/proc/sys/net/ipv4/conf/all/forwarding";
static const char ipttl_name[] = "/proc/sys/net/ipv4/ip_default_ttl";
static const char ipfw6_name[] = "/proc/sys/net/ipv6/conf/all/forwarding";
static const char iphop6_name[] = "/proc/sys/net/ipv6/conf/all/hop_limit";
int
netsnmp_arch_ip_scalars_ipForwarding_get(u_long *value)
{
FILE *filep;
int rc;
if (NULL == value)
return -1;
filep = fopen(ipfw_name, "r");
if (NULL == filep) {
DEBUGMSGTL(("access:ipForwarding", "could not open %s\n",
ipfw_name));
return -2;
}
rc = fscanf(filep, "%lu", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipForwarding", "could not read %s\n",
ipfw_name));
return -3;
}
if ((0 != *value) && (1 != *value)) {
DEBUGMSGTL(("access:ipForwarding", "unexpected value %ld in %s\n",
*value, ipfw_name));
return -4;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipForwarding_set(u_long value)
{
FILE *filep;
int rc;
if (1 == value)
;
else if (2 == value)
value = 0;
else {
DEBUGMSGTL(("access:ipForwarding", "bad value %ld for %s\n",
value, ipfw_name));
return SNMP_ERR_WRONGVALUE;
}
filep = fopen(ipfw_name, "w");
if (NULL == filep) {
DEBUGMSGTL(("access:ipForwarding", "could not open %s\n",
ipfw_name));
return SNMP_ERR_RESOURCEUNAVAILABLE;
}
rc = fprintf(filep, "%ld", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipForwarding", "could not write %s\n",
ipfw_name));
return SNMP_ERR_GENERR;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipDefaultTTL_get(u_long *value)
{
FILE *filep;
int rc;
if (NULL == value)
return -1;
filep = fopen(ipttl_name, "r");
if (NULL == filep) {
DEBUGMSGTL(("access:ipDefaultTTL", "could not open %s\n",
ipttl_name));
return -2;
}
rc = fscanf(filep, "%lu", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipDefaultTTL", "could not read %s\n",
ipttl_name));
return -3;
}
if ((0 == *value) || (255 < *value)) {
DEBUGMSGTL(("access:ipDefaultTTL", "unexpected value %ld in %s\n",
*value, ipttl_name));
return -4;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipDefaultTTL_set(u_long value)
{
FILE *filep;
int rc;
if (value == 0 || value > 255) {
DEBUGMSGTL(("access:ipDefaultTTL", "bad value %ld for %s\n",
value, ipttl_name));
return SNMP_ERR_WRONGVALUE;
}
filep = fopen(ipttl_name, "w");
if (NULL == filep) {
DEBUGMSGTL(("access:ipDefaultTTL", "could not open %s\n",
ipttl_name));
return SNMP_ERR_RESOURCEUNAVAILABLE;
}
rc = fprintf(filep, "%ld", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipDefaultTTL", "could not write %s\n",
ipttl_name));
return SNMP_ERR_GENERR;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipv6IpForwarding_get(u_long *value)
{
FILE *filep;
int rc;
if (NULL == value)
return -1;
filep = fopen(ipfw6_name, "r");
if (NULL == filep) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not open %s\n",
ipfw6_name));
return -2;
}
rc = fscanf(filep, "%lu", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not read %s\n",
ipfw6_name));
return -3;
}
if ((0 != *value) && (1 != *value)) {
DEBUGMSGTL(("access:ipv6IpForwarding", "unexpected value %ld in %s\n",
*value, ipfw6_name));
return -4;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipv6IpForwarding_set(u_long value)
{
FILE *filep;
int rc;
if (1 == value)
;
else if (2 == value)
value = 0;
else {
DEBUGMSGTL(("access:ipv6IpForwarding",
"bad value %ld for ipv6IpForwarding\n", value));
return SNMP_ERR_WRONGVALUE;
}
filep = fopen(ipfw6_name, "w");
if (NULL == filep) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not open %s\n",
ipfw6_name));
return SNMP_ERR_RESOURCEUNAVAILABLE;
}
rc = fprintf(filep, "%ld", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not write %s\n",
ipfw6_name));
return SNMP_ERR_GENERR;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipv6IpDefaultHopLimit_get(u_long *value)
{
FILE *filep;
int rc;
if (NULL == value)
return -1;
filep = fopen(iphop6_name, "r");
if (NULL == filep) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "could not open %s\n",
iphop6_name));
return -2;
}
rc = fscanf(filep, "%lu", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "could not read %s\n",
iphop6_name));
return -3;
}
if ((0 == *value) || (255 < *value)) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "unexpected value %ld in %s\n",
*value, iphop6_name));
return -4;
}
return 0;
}
int
netsnmp_arch_ip_scalars_ipv6IpDefaultHopLimit_set(u_long value)
{
FILE *filep;
int rc;
if (value == 0 || value > 255) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "bad value %ld for %s\n",
value, iphop6_name));
return SNMP_ERR_WRONGVALUE;
}
filep = fopen(iphop6_name, "w");
if (NULL == filep) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "could not open %s\n",
iphop6_name));
return SNMP_ERR_RESOURCEUNAVAILABLE;
}
rc = fprintf(filep, "%ld", value);
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipDefaultHopLimit", "could not write %s\n",
iphop6_name));
return SNMP_ERR_GENERR;
}
return 0;
}
void
netsnmp_arch_ip_scalars_register_handlers(void)
{
static oid ipReasmTimeout_oid[] = { 1, 3, 6, 1, 2, 1, 4, 13, 0 };
netsnmp_register_num_file_instance
("ipReasmTimeout",
ipReasmTimeout_oid, OID_LENGTH(ipReasmTimeout_oid),
"/proc/sys/net/ipv4/ipfrag_time", ASN_INTEGER,
HANDLER_CAN_RONLY, NULL, NULL);
}