rendered paste bodyThis patch allows GETBULKs to be forwarded to agentx subagents.
It looks longer than it is cause I had to indent the for loop.
This is against version 5.4, please ignore my local svn revision.
Signed-off-by:meis@nets.rwth...
--
Index: agent/mibgroup/agentx/master.c
===================================================================
--- agent/mibgroup/agentx/master.c (revision 2863)
+++ agent/mibgroup/agentx/master.c (working copy)
@@ -218,7 +218,7 @@
int reqid, netsnmp_pdu *pdu, void *magic)
{
netsnmp_delegated_cache *cache = (netsnmp_delegated_cache *) magic;
- int i, ret;
+ int i, ret, first=1;
netsnmp_request_info *requests, *request;
netsnmp_variable_list *var;
netsnmp_session *ax_session;
@@ -364,31 +364,50 @@
*/
DEBUGMSGTL(("agentx/master",
"agentx_got_response() beginning...\n"));
- for (var = pdu->variables, request = requests; request && var;
- request = request->next, var = var->next_variable) {
- /*
- * Otherwise, process successful requests
- */
- DEBUGMSGTL(("agentx/master",
- " handle_agentx_response: processing: "));
- DEBUGMSGOID(("agentx/master", var->name, var->name_length));
- DEBUGMSG(("agentx/master", "\n"));
- if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_VERBOSE)) {
- DEBUGMSGTL(("snmp_agent", " >> "));
- DEBUGMSGVAR(("snmp_agent", var));
- DEBUGMSG(("snmp_agent", "\n"));
- }
- /*
- * update the oid in the original request
- */
- if (var->type != SNMP_ENDOFMIBVIEW) {
- snmp_set_var_typed_value(request->requestvb, var->type,
- var->val.string, var->val_len);
- snmp_set_var_objid(request->requestvb, var->name,
- var->name_length);
- }
- request->delegated = REQUEST_IS_NOT_DELEGATED;
+ /* Loop through varbinds and assign them to requests. The do
+ * loop will only actually loop in case of a GETBULK */
+
+ var = pdu->variables;
+ do {
+ for (request = requests; request && var;
+ request = request->next, var = var->next_variable) {
+ if (!first) { /* GETBULK */
+ while (!request->requestvb->next_variable)
+ if (!(request=request->next)) break;
+ if (!request) break;
+ request->requestvb = request->requestvb->next_variable;
+ }
+ /*
+ * Otherwise, process successful requests
+ */
+ DEBUGMSGTL(("agentx/master",
+ " handle_agentx_response: processing: "));
+ DEBUGMSGOID(("agentx/master", var->name, var->name_length));
+ DEBUGMSG(("agentx/master", "\n"));
+ if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_VERBOSE)) {
+ DEBUGMSGTL(("snmp_agent", " >> "));
+ DEBUGMSGVAR(("snmp_agent", var));
+ DEBUGMSG(("snmp_agent", "\n"));
+ }
+
+ /*
+ * update the oid in the original request
+ */
+ if (var->type != SNMP_ENDOFMIBVIEW) {
+ snmp_set_var_typed_value(request->requestvb, var->type,
+ var->val.string, var->val_len);
+ snmp_set_var_objid(request->requestvb, var->name,
+ var->name_length);
+ }
+ request->delegated = REQUEST_IS_NOT_DELEGATED;
+ }
+ first=0;
+ if (!requests->requestvb->next_variable) break;
+ } while (var);
+
+ for (request = requests; request; request = request->next) {
+ request->requestvb = request->requestvb_start;
}
if (request || var) {
@@ -402,8 +421,6 @@
SNMP_ERR_GENERR);
}
- if (cache->reqinfo->mode == MODE_GETBULK)
- netsnmp_bulk_to_next_fix_requests(requests);
} else {
/*
* mark set requests as handled
@@ -464,7 +481,7 @@
break;
case MODE_GETBULK: /* WWWXXX */
- pdu = snmp_pdu_create(AGENTX_MSG_GETNEXT);
+ pdu = snmp_pdu_create(AGENTX_MSG_GETBULK);
break;
case MODE_SET_RESERVE1:
@@ -506,6 +523,8 @@
pdu->reqid = snmp_get_next_transid();
pdu->transid = reqinfo->asp->pdu->transid;
pdu->sessid = ax_session->subsession->sessid;
+ pdu->errstat = reqinfo->asp->pdu->errstat;
+ pdu->errindex = reqinfo->asp->pdu->errindex;
if (reginfo->contextName) {
pdu->community = strdup(reginfo->contextName);
pdu->community_len = strlen(reginfo->contextName);