This 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);