All pastes #792908 Raw Edit

Mine

public text v1 · immutable
·published 2007-11-21 20:23 UTC
rendered paste body
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);