Hello folks,
The attached patch adds write support for the ipForwarding and
ipDefaultTTL objects to net-snmp. The patch should be applied on top of
the latest net-snmp SVN tree.
Any feedback is welcome.
Thanks,
- Tushar Gohad
Index: net-snmp/README.agent-mibs
===================================================================
--- net-snmp.orig/README.agent-mibs
+++ net-snmp/README.agent-mibs
@@ -182,6 +182,9 @@ IP-MIB
ipv6RouterAdvertSpinLock.0 ---
ipv6ScopeZoneIndexTable ---
+ ipForwarding.0 L 5.4 S ip-mib/ip_scalars.c
+ ipDefaultTTL.0 L 5.4 S ip-mib/ip_scalars.c
+
------------------------------------------------------------------------------
IPV6-MIB
ipv6MIBObjects.?.0 U 4.1 O mibII/ipv6.c
Index: net-snmp/agent/mibgroup/ip-mib/data_access/scalars_linux.c
===================================================================
--- net-snmp.orig/agent/mibgroup/ip-mib/data_access/scalars_linux.c
+++ net-snmp/agent/mibgroup/ip-mib/data_access/scalars_linux.c
@@ -8,10 +8,11 @@
#include <net-snmp/data_access/ip_scalars.h>
-const char *ipfw_name = "/proc/sys/net/ipv6/conf/all/forwarding";
+const char *ipfw_name = "/proc/sys/net/ipv4/conf/all/forwarding";
+const char *ipfw6_name = "/proc/sys/net/ipv6/conf/all/forwarding";
int
-netsnmp_arch_ip_scalars_ipv6IpForwarding_get(u_long *value)
+netsnmp_arch_ip_scalars_ipForwarding_get(u_long *value)
{
FILE *filep;
int rc;
@@ -22,7 +23,7 @@ netsnmp_arch_ip_scalars_ipv6IpForwarding
filep = fopen(ipfw_name, "r");
if (NULL == filep) {
- DEBUGMSGTL(("access:ipv6IpForwarding", "could not open %s\n",
+ DEBUGMSGTL(("access:ipForwarding", "could not open %s\n",
ipfw_name));
return -2;
}
@@ -30,13 +31,13 @@ netsnmp_arch_ip_scalars_ipv6IpForwarding
rc = fscanf(filep, "%ld", value);
fclose(filep);
if (1 != rc) {
- DEBUGMSGTL(("access:ipv6IpForwarding", "could not read %s\n",
+ DEBUGMSGTL(("access:ipForwarding", "could not read %s\n",
ipfw_name));
return -3;
}
if ((0 != *value) && (1 != *value)) {
- DEBUGMSGTL(("access:ipv6IpForwarding", "unexpected value %ld in %s\n",
+ DEBUGMSGTL(("access:ipForwarding", "unexpected value %ld in %s\n",
*value, ipfw_name));
return -4;
}
@@ -45,6 +46,74 @@ netsnmp_arch_ip_scalars_ipv6IpForwarding
}
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));
+ 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_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, "%ld", 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;
@@ -60,10 +129,10 @@ netsnmp_arch_ip_scalars_ipv6IpForwarding
return SNMP_ERR_WRONGVALUE;
}
- filep = fopen(ipfw_name, "w");
+ filep = fopen(ipfw6_name, "w");
if (NULL == filep) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not open %s\n",
- ipfw_name));
+ ipfw6_name));
return SNMP_ERR_RESOURCEUNAVAILABLE;
}
@@ -71,7 +140,7 @@ netsnmp_arch_ip_scalars_ipv6IpForwarding
fclose(filep);
if (1 != rc) {
DEBUGMSGTL(("access:ipv6IpForwarding", "could not write %s\n",
- ipfw_name));
+ ipfw6_name));
return SNMP_ERR_GENERR;
}
Index: net-snmp/agent/mibgroup/ip-mib/ip_scalars.c
===================================================================
--- net-snmp.orig/agent/mibgroup/ip-mib/ip_scalars.c
+++ net-snmp/agent/mibgroup/ip-mib/ip_scalars.c
@@ -12,6 +12,18 @@
#include "ip_scalars.h"
int
+handle_ipForwarding(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests);
+
+int
+handle_ipDefaultTTL(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests);
+
+int
handle_ipv6IpForwarding(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
@@ -21,6 +33,8 @@ handle_ipv6IpForwarding(netsnmp_mib_hand
void
init_ip_scalars(void)
{
+ static oid ipForwarding_oid[] = { 1, 3, 6, 1, 2, 1, 4, 1 };
+ static oid ipDefaultTTL_oid[] = { 1, 3, 6, 1, 2, 1, 4, 2, 0 };
static oid ipReasmTimeout_oid[] = { 1, 3, 6, 1, 2, 1, 4, 13, 0 };
static oid ipv6IpForwarding_oid[] = { 1, 3, 6, 1, 2, 1, 4, 25 };
static oid ipv6IpDefaultHopLimit_oid[] =
@@ -35,6 +49,12 @@ init_ip_scalars(void)
HANDLER_CAN_RONLY, NULL, NULL);
netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("ipForwarding", handle_ipForwarding,
+ ipForwarding_oid,
+ OID_LENGTH(ipForwarding_oid),
+ HANDLER_CAN_RWRITE));
+
+ netsnmp_register_scalar(netsnmp_create_handler_registration
("ipv6IpForwarding", handle_ipv6IpForwarding,
ipv6IpForwarding_oid,
OID_LENGTH(ipv6IpForwarding_oid),
@@ -45,10 +65,116 @@ init_ip_scalars(void)
ipv6IpDefaultHopLimit_oid, OID_LENGTH(ipv6IpDefaultHopLimit_oid),
"/proc/sys/net/ipv6/conf/default/hop_limit", ASN_INTEGER,
HANDLER_CAN_RWRITE, NULL, NULL);
+
+ netsnmp_register_num_file_instance
+ ("ipDefaultTTL",
+ ipDefaultTTL_oid, OID_LENGTH(ipDefaultTTL_oid),
+ "/proc/sys/net/ipv4/ip_default_ttl", ASN_INTEGER,
+ HANDLER_CAN_RWRITE, NULL, NULL);
}
int
+handle_ipForwarding(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ u_long value;
+
+ int ret;
+ /* We are never called for a GETNEXT if it's registered as a
+ "instance", as it's "magically" handled for us. */
+
+ /* a instance handler also only hands us one request at a time, so
+ we don't need to loop over a list of requests; we'll only get one. */
+
+ switch(reqinfo->mode) {
+
+ case MODE_GET:
+ rc = netsnmp_arch_ip_scalars_ipForwarding_get(&value);
+ if (rc != 0) {
+ netsnmp_set_request_error(reqinfo, requests,
+ SNMP_NOSUCHINSTANCE);
+ }
+ else {
+ value = value ? 1 : 2;
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)&value, sizeof(value));
+ }
+ break;
+
+ /*
+ * SET REQUEST
+ *
+ * multiple states in the transaction. See:
+ * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg
+ */
+ case MODE_SET_RESERVE1:
+ break;
+
+ case MODE_SET_RESERVE2:
+ /*
+ * store old info for undo later
+ */
+ rc = netsnmp_arch_ip_scalars_ipForwarding_get(&value);
+ if (rc < 0) {
+ netsnmp_set_request_error(reqinfo, requests,
+ SNMP_ERR_NOCREATION);
+ } else {
+ u_long *value_save;
+ memdup((u_char **) & value_save, (u_char *) &value,
+ sizeof(value));
+ if ( NULL == value_save )
+ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_RESOURCEUNAVAILABLE);
+ else
+ netsnmp_request_add_list_data(requests,
+ netsnmp_create_data_list
+ ("ipfw", value_save,
+ free));
+ }
+ break;
+
+ case MODE_SET_FREE:
+ /* XXX: free resources allocated in RESERVE1 and/or
+ RESERVE2. Something failed somewhere, and the states
+ below won't be called. */
+ break;
+
+ case MODE_SET_ACTION:
+ /* XXX: perform the value change here */
+ value = *(requests->requestvb->val.integer);
+ rc = netsnmp_arch_ip_scalars_ipForwarding_set(value);
+ if ( 0 != rc ) {
+ netsnmp_set_request_error(reqinfo, requests, rc);
+ }
+ break;
+
+ case MODE_SET_COMMIT:
+ break;
+
+ case MODE_SET_UNDO:
+ value =
+ *((u_long *) netsnmp_request_get_list_data(requests,
+ "ipfw"));
+ rc = netsnmp_arch_ip_scalars_ipForwarding_set(value);
+ if ( 0 != rc ) {
+ netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED);
+ }
+ break;
+
+ default:
+ /* we should never get here, so this is a really bad error */
+ snmp_log(LOG_ERR, "unknown mode (%d) in handle_ipForwarding\n", reqinfo->mode );
+ return SNMP_ERR_GENERR;
+ }
+
+ return SNMP_ERR_NOERROR;
+}
+
+
+int
handle_ipv6IpForwarding(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders