File net-snmp-5.7.3-snmptrapd-add-forwarder-info.patch of Package net-snmp.22257
Index: net-snmp-5.7.3/apps/snmptrapd_handlers.c
===================================================================
--- net-snmp-5.7.3.orig/apps/snmptrapd_handlers.c
+++ net-snmp-5.7.3/apps/snmptrapd_handlers.c
@@ -884,6 +884,13 @@ int forward_handler( netsnmp_pdu
netsnmp_pdu *pdu2;
char buf[BUFSIZ], *cp;
+ int last_snmpTrapAddress_index = -1; /* .0 in .1.3.6.1.6.3.18.1.3 .0 */
+ const oid snmpTrapAddress_oid[] = { 1,3,6,1,6,3,18,1,3}; /* snmpTrapAddress_oid.0 is also defined as agentaddr_oid */
+/* const oid agentaddr_oid[] = { 1,3,6,1,6,3,18,1,3,0}; */ /* this is snmpTrapAddress_oid.0 */
+ oid forwarder_oid[] = { 1,3,6,1,6,3,18,1,3,0}; /* each forwarder will add this OID with changed last index */
+ const size_t snmpTrapAddress_oid_size = OID_LENGTH(snmpTrapAddress_oid);
+ const size_t forwarder_oid_len = OID_LENGTH(forwarder_oid);
+
DEBUGMSGTL(( "snmptrapd", "forward_handler (%s)\n", handler->token));
snmp_sess_init( &session );
@@ -904,6 +911,70 @@ int forward_handler( netsnmp_pdu
INFORMS which may require engineID probing */
pdu2 = snmp_clone_pdu(pdu);
+
+ netsnmp_indexed_addr_pair *addr_pair1 = NULL;
+ struct sockaddr_in *to1 = NULL;
+
+ if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID,
+ NETSNMP_DS_LIB_ADD_FORWARDER_INFO)) {
+ if (pdu && pdu->transport_data) {
+ addr_pair1 = (netsnmp_indexed_addr_pair *) pdu->transport_data;
+
+ if (addr_pair1 != NULL)
+ to1 = (struct sockaddr_in *) &(addr_pair1->remote_addr); /* get the IP address of the host, that this trap was sent to = this forwarder's IP address */
+ }
+
+ if (NULL != to1)
+ {
+ char agent_addr[5] = "0000"; /* store the decoded IP address here */
+ agent_addr[3] = (to1->sin_addr.s_addr >> 24) & 0xFF;
+ agent_addr[2] = (to1->sin_addr.s_addr >> 16) & 0xFF;
+ agent_addr[1] = (to1->sin_addr.s_addr >> 8) & 0xFF;
+ agent_addr[0] = (to1->sin_addr.s_addr) & 0xFF;
+ if (pdu2->agent_addr[0] == 0 && pdu2->agent_addr[1] == 0 && pdu2->agent_addr[2] == 0 && pdu2->agent_addr[3] == 0) //agent_addr is "0.0.0.0"
+ { /* there was no agent address defined in PDU */
+ memcpy (pdu2->agent_addr, agent_addr, 4); /* copy the forwarding agent IP address from the transport socket. */
+ }
+ else
+ { /* there is already agent address in PDU*/
+ /* do nothing */
+ }
+
+ netsnmp_variable_list *var = NULL;
+ netsnmp_variable_list *vblist = NULL;
+ vblist = pdu2->variables;
+
+ /* go via all OIDs in the payload, to see if the info about forwarder is already there - look for snmpTrapAddress_oid.x */
+ for (var = vblist; var; var = var->next_variable) {
+ if (var) {
+ if (!snmp_oid_ncompare(var->name, var->name_length,
+ snmpTrapAddress_oid, snmpTrapAddress_oid_size, snmpTrapAddress_oid_size))
+ {
+ int my_last_snmpTrapAddress_index = var->name[var->name_length]; /* .x in .1.3.6.1.6.3.18.1.3.x */
+ if (last_snmpTrapAddress_index < my_last_snmpTrapAddress_index)
+ last_snmpTrapAddress_index = my_last_snmpTrapAddress_index; /* in case the indexes are out-of-order in PDU */
+
+ forwarder_oid [forwarder_oid_len-1] = last_snmpTrapAddress_index+1; // indexing starts from zero, so at last index, insert next number for forwarder IP address
+ }
+ } /* var is not NULL */
+ } /* for var in vblist */
+
+
+ forwarder_oid [forwarder_oid_len-1] = last_snmpTrapAddress_index+1; /* change the last index of this OID to the next avaiable number. Indexing starts from zero, that is why forwarder_oid_len-1 */
+
+
+ /*add forwarder IP address as OID to trap payload */
+
+/* snmp_pdu_add_variable(pdu2, forwarder_oid, forwarder_oid_len,
+ ASN_IPADDRESS, (u_char*)&pdu2->agent_addr, 4); */
+
+ /* use the value from transport, so if v1 PDU is sent, the same IP is not duplicated
+ - you want every forwarder to add this OID with its own IP address */
+ snmp_pdu_add_variable(pdu2, forwarder_oid, forwarder_oid_len,
+ ASN_IPADDRESS, (u_char*)agent_addr, 4);
+ }
+ } /* NETSNMP_DS_LIB_ADD_FORWARDER_INFO is defined as true */
+
if (pdu2->transport_data) {
free(pdu2->transport_data);
pdu2->transport_data = NULL;
Index: net-snmp-5.7.3/apps/snmptrapd.c
===================================================================
--- net-snmp-5.7.3.orig/apps/snmptrapd.c
+++ net-snmp-5.7.3/apps/snmptrapd.c
@@ -245,6 +245,7 @@ usage(void)
fprintf(stderr, "\tWeb: http://www.net-snmp.org/\n");
fprintf(stderr, "\tEmail: net-snmp-coders@lists.sourceforge.net\n");
fprintf(stderr, "\n");
+ fprintf(stderr, " --add-forwarder-info\tadd info to SNMP payload about forwarder\n");
fprintf(stderr, " -a\t\t\tignore authentication failure traps\n");
fprintf(stderr, " -A\t\t\tappend to log file rather than truncating it\n");
fprintf(stderr, " -c FILE\t\tread FILE as a configuration file\n");
@@ -555,6 +556,15 @@ parse_config_outputOption(const char *to
}
}
+void
+parse_config_addForwarderInfo(const char *token, char *cptr)
+{
+ if (netsnmp_ds_parse_boolean(cptr) == 1) {
+ netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
+ NETSNMP_DS_LIB_ADD_FORWARDER_INFO, 1);
+ }
+}
+
static void
snmptrapd_main_loop(void)
{
@@ -718,6 +728,11 @@ main(int argc, char *argv[])
register_config_handler("snmptrapd", "outputOption",
parse_config_outputOption, NULL, "string");
+ netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
+ NETSNMP_DS_LIB_ADD_FORWARDER_INFO, 0);
+ register_config_handler("snmptrapd", "addForwarderInfo",
+ parse_config_addForwarderInfo, NULL, "(1|yes|true|0|no|false)");
+
/*
* Add some options if they are available.
*/
@@ -748,6 +763,11 @@ main(int argc, char *argv[])
version();
exit(0);
}
+ if (strcasecmp(optarg, "add-forwarder-info") == 0) {
+ netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
+ NETSNMP_DS_LIB_ADD_FORWARDER_INFO, 1);
+ break;
+ }
handle_long_opt(optarg);
break;
Index: net-snmp-5.7.3/include/net-snmp/library/default_store.h
===================================================================
--- net-snmp-5.7.3.orig/include/net-snmp/library/default_store.h
+++ net-snmp-5.7.3/include/net-snmp/library/default_store.h
@@ -94,6 +94,7 @@ extern "C" {
#define NETSNMP_DS_LIB_TSM_USE_PREFIX 39 /* TSM's simple security name mapping */
#define NETSNMP_DS_LIB_DONT_LOAD_HOST_FILES 40 /* don't read host.conf files */
#define NETSNMP_DS_LIB_DNSSEC_WARN_ONLY 41 /* tread DNSSEC errors as warnings */
+#define NETSNMP_DS_LIB_ADD_FORWARDER_INFO 42 /* add info about forwarder to SNMP packets */
#define NETSNMP_DS_LIB_MAX_BOOL_ID 48 /* match NETSNMP_DS_MAX_SUBIDS */
/*