implemented SNMP snapshots; SnmpWalk call refactored
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 30 Apr 2016 20:30:15 +0000 (23:30 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 30 Apr 2016 20:30:15 +0000 (23:30 +0300)
38 files changed:
include/nxsnmp.h
src/server/core/bridge.cpp
src/server/core/cdp.cpp
src/server/core/components.cpp
src/server/core/fdb.cpp
src/server/core/lldp.cpp
src/server/core/ndp.cpp
src/server/core/node.cpp
src/server/core/objtools.cpp
src/server/core/session.cpp
src/server/core/snmp.cpp
src/server/core/stp.cpp
src/server/core/vrrp.cpp
src/server/drivers/airespace/airespace.cpp
src/server/drivers/at/at.cpp
src/server/drivers/cat2900xl/cat2900xl.cpp
src/server/drivers/catalyst/catalyst.cpp
src/server/drivers/h3c/h3c.cpp
src/server/drivers/hpsw/hpsw.cpp
src/server/drivers/lib/avaya-ers/avaya-ers.cpp
src/server/drivers/lib/avaya-ers/vlan-if.cpp
src/server/drivers/lib/cisco/cisco.cpp
src/server/drivers/mikrotik/mikrotik.cpp
src/server/drivers/netscreen/netscreen.cpp
src/server/drivers/ntws/ntws.cpp
src/server/drivers/qtech-olt/qtech-olt.cpp
src/server/drivers/symbol-ws/symbol-ws.cpp
src/server/drivers/tb/tb.cpp
src/server/drivers/ubnt/ubnt.cpp
src/server/include/nms_objects.h
src/server/include/nms_topo.h
src/server/libnxsrv/ndd.cpp
src/server/libnxsrv/vlan.cpp
src/snmp/libnxsnmp/Makefile.am
src/snmp/libnxsnmp/oid.cpp
src/snmp/libnxsnmp/snapshot.cpp [new file with mode: 0644]
src/snmp/libnxsnmp/util.cpp
src/snmp/libnxsnmp/variable.cpp

index bba373e..9fa7277 100644 (file)
 
 #define OID_ERROR          -1
 #define OID_EQUAL          0
-#define OID_NOT_EQUAL      1
-#define OID_SHORTER        2
-#define OID_LONGER         3
+#define OID_PRECEDING      1
+#define OID_FOLLOWING      2
+#define OID_SHORTER        3
+#define OID_LONGER         4
 
 /**
  * libnxsnmp error codes
@@ -403,25 +404,25 @@ public:
    SNMP_Variable();
    SNMP_Variable(const TCHAR *name);
    SNMP_Variable(UINT32 *name, size_t nameLen);
-   SNMP_Variable(SNMP_Variable *src);
+   SNMP_Variable(const SNMP_Variable *src);
    ~SNMP_Variable();
 
    bool parse(BYTE *data, size_t varLength);
    size_t encode(BYTE *buffer, size_t bufferSize);
 
-   SNMP_ObjectId *getName() { return m_name; }
-   UINT32 getType() { return m_type; }
-   size_t getValueLength() { return m_valueLength; }
-   const BYTE *getValue() { return m_value; }
+   SNMP_ObjectId *getName() const { return m_name; }
+   UINT32 getType() const { return m_type; }
+   size_t getValueLength() const { return m_valueLength; }
+   const BYTE *getValue() const { return m_value; }
 
-       size_t getRawValue(BYTE *buffer, size_t bufSize);
-   UINT32 getValueAsUInt();
-   LONG getValueAsInt();
-   TCHAR *getValueAsString(TCHAR *buffer, size_t bufferSize);
-   TCHAR *getValueAsPrintableString(TCHAR *buffer, size_t bufferSize, bool *convertToHex);
-   SNMP_ObjectId *getValueAsObjectId();
-   TCHAR *getValueAsMACAddr(TCHAR *buffer);
-   TCHAR *getValueAsIPAddr(TCHAR *buffer);
+       size_t getRawValue(BYTE *buffer, size_t bufSize) const;
+   UINT32 getValueAsUInt() const;
+   LONG getValueAsInt() const;
+   TCHAR *getValueAsString(TCHAR *buffer, size_t bufferSize) const;
+   TCHAR *getValueAsPrintableString(TCHAR *buffer, size_t bufferSize, bool *convertToHex) const;
+   SNMP_ObjectId *getValueAsObjectId() const;
+   TCHAR *getValueAsMACAddr(TCHAR *buffer) const;
+   TCHAR *getValueAsIPAddr(TCHAR *buffer) const;
 
    void setValueFromString(UINT32 type, const TCHAR *value);
 };
@@ -696,6 +697,45 @@ public:
    UINT16 getPort() { return m_port; }
 };
 
+struct SNMP_SnapshotIndexEntry;
+
+/**
+ * SNMP snapshot
+ */
+class LIBNXSNMP_EXPORTABLE SNMP_Snapshot
+{
+private:
+   ObjectArray<SNMP_Variable> *m_values;
+   SNMP_SnapshotIndexEntry *m_index;
+
+   static UINT32 callback(SNMP_Variable *var, SNMP_Transport *transport, void *arg);
+
+   void buildIndex();
+   SNMP_SnapshotIndexEntry *find(const UINT32 *oid, size_t oidLen) const;
+   SNMP_SnapshotIndexEntry *find(const TCHAR *oid) const;
+
+public:
+   SNMP_Snapshot();
+   virtual ~SNMP_Snapshot();
+
+   static SNMP_Snapshot *create(SNMP_Transport *transport, const TCHAR *baseOid);
+   static SNMP_Snapshot *create(SNMP_Transport *transport, const UINT32 *baseOid, size_t oidLen);
+
+   Iterator<SNMP_Variable> *iterator() { return m_values->iterator(); }
+   EnumerationCallbackResult walk(const TCHAR *baseOid, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const;
+   EnumerationCallbackResult walk(const UINT32 *baseOid, size_t baseOidLen, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const;
+
+   SNMP_Variable *get(const TCHAR *oid) const;
+   SNMP_Variable *get(const UINT32 *oid, size_t oidLen) const;
+   SNMP_Variable *getNext(const TCHAR *oid) const;
+   SNMP_Variable *getNext(const UINT32 *oid, size_t oidLen) const;
+   SNMP_Variable *first() const { return m_values->get(0); }
+   SNMP_Variable *last() const { return m_values->get(m_values->size() - 1); }
+
+   int size() const { return m_values->size(); }
+   bool isEmpty() const { return m_values->size() == 0; }
+};
+
 /**
  * Functions
  */
@@ -720,9 +760,12 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpGet(int version, SNMP_Transport *transport,
 UINT32 LIBNXSNMP_EXPORTABLE SnmpGetEx(SNMP_Transport *pTransport,
                                       const TCHAR *szOidStr, const UINT32 *oidBinary, size_t oidLen, void *pValue,
                                       size_t bufferSize, UINT32 dwFlags, UINT32 *dataLen);
-UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTransport, const TCHAR *szRootOid,
-                                                                  UINT32 (* pHandler)(UINT32, SNMP_Variable *, SNMP_Transport *, void *),
-                                     void *pUserArg, BOOL bVerbose);
+UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(SNMP_Transport *transport, const TCHAR *rootOid,
+                                                                  UINT32 (* handler)(SNMP_Variable *, SNMP_Transport *, void *),
+                                     void *userArg, bool logErrors = false);
+UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(SNMP_Transport *transport, const UINT32 *rootOid, size_t rootOidLen,
+                                     UINT32 (* handler)(SNMP_Variable *, SNMP_Transport *, void *),
+                                     void *userArg, bool logErrors = false);
 
 #endif   /* __cplusplus */
 
index f11b3bc..270397f 100644 (file)
 /**
  * Map port numbers from dot1dBasePortTable to interface indexes
  */
-static UINT32 PortMapCallback(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 PortMapCallback(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    TCHAR oid[MAX_OID_LEN * 4], suffix[MAX_OID_LEN * 4];
    SNMP_ObjectId *pOid = var->getName();
    SNMPConvertOIDToText(pOid->getLength() - 11, (UINT32 *)&(pOid->getValue())[11], suffix, MAX_OID_LEN * 4);
 
        // Get interface index
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmpVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
        _tcscpy(oid, _T(".1.3.6.1.2.1.17.1.4.1.2"));
    _tcscat(oid, suffix);
        pRqPDU->bindVariable(new SNMP_Variable(oid));
@@ -56,7 +56,10 @@ static UINT32 PortMapCallback(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Trans
        return SNMP_ERR_SUCCESS;
 }
 
-void BridgeMapPorts(int snmpVersion, SNMP_Transport *transport, InterfaceList *ifList)
+/**
+ * Map bridge port numbers to interfaces
+ */
+void BridgeMapPorts(SNMP_Transport *transport, InterfaceList *ifList)
 {
-       SnmpWalk(snmpVersion, transport, _T(".1.3.6.1.2.1.17.1.4.1.1"), PortMapCallback, ifList, FALSE);
+       SnmpWalk(transport, _T(".1.3.6.1.2.1.17.1.4.1.1"), PortMapCallback, ifList);
 }
index 13f9fd9..6c3bb57 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 /**
  * Topology table walker's callback for CDP topology table
  */
-static UINT32 CDPTopoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 CDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        Node *node = (Node *)((LinkLayerNeighbors *)arg)->getData();
        SNMP_ObjectId *oid = var->getName();
@@ -47,7 +47,7 @@ static UINT32 CDPTopoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transp
        // Get additional info for current record
        UINT32 newOid[128];
        memcpy(newOid, oid->getValue(), oid->getLength() * sizeof(UINT32));
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmpVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
 
        newOid[13] = 7; // cdpCacheDevicePort
        pRqPDU->bindVariable(new SNMP_Variable(newOid, oid->getLength()));
index 825b314..cfcb0fb 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2012 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -182,7 +182,7 @@ UINT32 Component::fillMessage(NXCPMessage *msg, UINT32 baseId)
 /**
  * Physical entity tree walk callback
  */
-static UINT32 EntityWalker(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 EntityWalker(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        TCHAR buffer[256];
        Component *element = new Component(var->getName()->getValue()[12], var->getValueAsString(buffer, 256));
@@ -204,7 +204,7 @@ ComponentTree *BuildComponentTree(Node *node, SNMP_Transport *snmp)
        DbgPrintf(5, _T("Building component tree for node %s [%d]"), node->getName(), (int)node->getId());
        ObjectArray<Component> elements(16, 16);
        ComponentTree *tree = NULL;
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.47.1.1.1.1.7"), EntityWalker, &elements, FALSE) == SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.47.1.1.1.1.7"), EntityWalker, &elements) == SNMP_ERR_SUCCESS)
        {
                DbgPrintf(6, _T("BuildComponentTree(%s [%d]): %d elements found"), node->getName(), (int)node->getId(), elements.size());
 
index 570e01b..ddc3bbc 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -217,7 +217,7 @@ void ForwardingDatabase::sort()
 /**
  * FDB walker's callback
  */
-static UINT32 FDBHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
+static UINT32 FDBHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
 {
    SNMP_ObjectId *pOid = pVar->getName();
        size_t oidLen = pOid->getLength();
@@ -225,7 +225,7 @@ static UINT32 FDBHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *
        memcpy(oid, pOid->getValue(), oidLen * sizeof(UINT32));
 
        // Get port number and status
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), dwVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), pTransport->getSnmpVersion());
 
        oid[10] = 2;    // .1.3.6.1.2.1.17.4.3.1.2 - port number
        pRqPDU->bindVariable(new SNMP_Variable(oid, oidLen));
@@ -268,7 +268,7 @@ static UINT32 FDBHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *
 /**
  * dot1qTpFdbEntry walker's callback
  */
-static UINT32 Dot1qTpFdbHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
+static UINT32 Dot1qTpFdbHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
 {
        int port = pVar->getValueAsInt();
        if (port == 0)
@@ -280,7 +280,7 @@ static UINT32 Dot1qTpFdbHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Tran
        memcpy(oid, pOid->getValue(), oidLen * sizeof(UINT32));
 
        // Get port number and status
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), dwVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), pTransport->getSnmpVersion());
 
        oid[12] = 3;    // .1.3.6.1.2.1.17.7.1.2.2.1.3 - status
        pRqPDU->bindVariable(new SNMP_Variable(oid, oidLen));
@@ -315,7 +315,7 @@ static UINT32 Dot1qTpFdbHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Tran
 /**
  * dot1dBasePortTable walker's callback
  */
-static UINT32 Dot1dPortTableHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
+static UINT32 Dot1dPortTableHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
 {
    SNMP_ObjectId *pOid = pVar->getName();
        PORT_MAPPING_ENTRY pm;
index ebd1d1f..eb31124 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * Handler for walking local port table
  */
-static UINT32 PortLocalInfoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 PortLocalInfoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        LLDP_LOCAL_PORT_INFO *port = new LLDP_LOCAL_PORT_INFO;
    port->portNumber = var->getName()->getValue()[11];
@@ -34,7 +34,7 @@ static UINT32 PortLocalInfoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_
        SNMP_ObjectId *oid = var->getName();
        UINT32 newOid[128];
        memcpy(newOid, oid->getValue(), oid->getLength() * sizeof(UINT32));
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmpVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
 
        newOid[oid->getLength() - 2] = 4;       // lldpLocPortDescr
        pRqPDU->bindVariable(new SNMP_Variable(newOid, oid->getLength()));
@@ -69,7 +69,7 @@ static UINT32 PortLocalInfoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_
 ObjectArray<LLDP_LOCAL_PORT_INFO> *GetLLDPLocalPortInfo(SNMP_Transport *snmp)
 {
        ObjectArray<LLDP_LOCAL_PORT_INFO> *ports = new ObjectArray<LLDP_LOCAL_PORT_INFO>(64, 64, true);
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.0.8802.1.1.2.1.3.7.1.3"), PortLocalInfoHandler, ports, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.0.8802.1.1.2.1.3.7.1.3"), PortLocalInfoHandler, ports) != SNMP_ERR_SUCCESS)
        {
                delete ports;
                return NULL;
@@ -272,7 +272,7 @@ static void ProcessLLDPConnectionEntry(Node *node, StringObjectMap<SNMP_Variable
 /**
  * Topology table walker's callback for LLDP topology table
  */
-static UINT32 LLDPTopoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 LLDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    ((StringObjectMap<SNMP_Variable> *)arg)->set(var->getName()->getValueAsText(), new SNMP_Variable(var));
    return SNMP_ERR_SUCCESS;
index 3992da6..84b6d37 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 /**
  * Read remote slot and port from s5EnMsTopNmmEosTable
  */
-static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, UINT32 snmpVersion, SNMP_Transport *transport)
+static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, SNMP_Transport *transport)
 {
        // Read data from appropriate entry in s5EnMsTopNmmEosTable
        UINT32 eosEntryOID[64];
@@ -34,7 +34,7 @@ static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, UINT32 snmpVer
        eosEntryOID[12] = 1;
        eosEntryOID[13] = 1;
 
-   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmpVersion);
+   SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
        pRqPDU->bindVariable(new SNMP_Variable(eosEntryOID, oid->getLength()));
 
        WORD result = 0;
@@ -54,7 +54,7 @@ static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, UINT32 snmpVer
 /**
  * Topology table walker's callback for NDP topology table
  */
-static UINT32 NDPTopoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 NDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        Node *node = (Node *)((LinkLayerNeighbors *)arg)->getData();
        SNMP_ObjectId *oid = var->getName();
@@ -85,7 +85,7 @@ static UINT32 NDPTopoHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transp
                  remoteNode->getName(), remoteNode->getId(), (ifLocal != NULL) ? ifLocal->getName() : _T("(null)"));
        if (ifLocal != NULL)
        {
-               WORD rport = ReadRemoteSlotAndPort(node, oid, snmpVersion, transport);
+               WORD rport = ReadRemoteSlotAndPort(node, oid, transport);
                DbgPrintf(6, _T("NDP(%s [%d]): remote slot/port is %04X"), node->getName(), node->getId(), rport);
                if (rport != 0)
                {
index 9d4d489..f16601b 100644 (file)
@@ -626,7 +626,7 @@ InterfaceList *Node::getInterfaceList()
 
                        if ((pIfList != NULL) && (m_dwFlags & NF_IS_BRIDGE))
                        {
-                               BridgeMapPorts(m_snmpVersion, pTransport, pIfList);
+                               BridgeMapPorts(pTransport, pIfList);
                        }
                        delete pTransport;
                }
@@ -2371,7 +2371,7 @@ bool Node::confPollAgent(UINT32 dwRqId)
 /**
  * SNMP walker callback which sets indicator to true after first varbind and aborts walk
  */
-static UINT32 IndicatorSnmpWalkerCallback(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 IndicatorSnmpWalkerCallback(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    (*((bool *)arg)) = true;
    return SNMP_ERR_COMM;
@@ -2517,7 +2517,7 @@ bool Node::confPollSnmp(UINT32 dwRqId)
 
    // Check for printer MIB support
    bool present = false;
-   SnmpWalk(m_snmpVersion, pTransport, _T(".1.3.6.1.2.1.43"), IndicatorSnmpWalkerCallback, &present, FALSE);
+   SnmpWalk(pTransport, _T(".1.3.6.1.2.1.43"), IndicatorSnmpWalkerCallback, &present);
    if (present)
    {
       lockProperties();
@@ -2796,7 +2796,7 @@ void Node::checkBridgeMib(SNMP_Transport *pTransport)
 void Node::checkIfXTable(SNMP_Transport *pTransport)
 {
        bool present = false;
-       SnmpWalk(m_snmpVersion, pTransport, _T(".1.3.6.1.2.1.31.1.1.1.1"), IndicatorSnmpWalkerCallback, &present, FALSE);
+       SnmpWalk(pTransport, _T(".1.3.6.1.2.1.31.1.1.1.1"), IndicatorSnmpWalkerCallback, &present);
    if (present)
    {
                lockProperties();
@@ -3774,7 +3774,7 @@ static UINT32 ReadSNMPTableRow(SNMP_Transport *snmp, SNMP_ObjectId *rowOid, size
 /**
  * Callback for SnmpWalk in Node::getTableFromSNMP
  */
-static UINT32 SNMPGetTableCallback(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
+static UINT32 SNMPGetTableCallback(SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
 {
    ((ObjectArray<SNMP_ObjectId> *)arg)->add(new SNMP_ObjectId(varbind->getName()));
    return SNMP_ERR_SUCCESS;
@@ -3792,7 +3792,7 @@ UINT32 Node::getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableCo
       return DCE_COMM_ERROR;
 
    ObjectArray<SNMP_ObjectId> oidList(64, 64, true);
-   UINT32 rc = SnmpWalk(snmp->getSnmpVersion(), snmp, oid, SNMPGetTableCallback, &oidList, FALSE);
+   UINT32 rc = SnmpWalk(snmp, oid, SNMPGetTableCallback, &oidList, FALSE);
    if (rc == SNMP_ERR_SUCCESS)
    {
       *table = new Table;
@@ -3818,7 +3818,7 @@ UINT32 Node::getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableCo
 /**
  * Callback for SnmpWalk in Node::getListFromSNMP
  */
-static UINT32 SNMPGetListCallback(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
+static UINT32 SNMPGetListCallback(SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
 {
    bool convert = false;
    TCHAR buffer[256];
@@ -3837,7 +3837,7 @@ UINT32 Node::getListFromSNMP(WORD port, const TCHAR *oid, StringList **list)
       return DCE_COMM_ERROR;
 
    *list = new StringList;
-   UINT32 rc = SnmpWalk(snmp->getSnmpVersion(), snmp, oid, SNMPGetListCallback, *list, FALSE);
+   UINT32 rc = SnmpWalk(snmp, oid, SNMPGetListCallback, *list);
    delete snmp;
    if (rc != SNMP_ERR_SUCCESS)
    {
@@ -3859,7 +3859,7 @@ struct SNMPOIDSuffixListCallback_Data
 /**
  * Callback for SnmpWalk in Node::getOIDSuffixListFromSNMP
  */
-static UINT32 SNMPOIDSuffixListCallback(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
+static UINT32 SNMPOIDSuffixListCallback(SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
 {
    SNMPOIDSuffixListCallback_Data *data = (SNMPOIDSuffixListCallback_Data *)arg;
    SNMP_ObjectId *oid = varbind->getName();
@@ -3897,7 +3897,7 @@ UINT32 Node::getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **v
    }
 
    data.values = new StringMap;
-   UINT32 rc = SnmpWalk(snmp->getSnmpVersion(), snmp, oid, SNMPOIDSuffixListCallback, &data, FALSE);
+   UINT32 rc = SnmpWalk(snmp, oid, SNMPOIDSuffixListCallback, &data);
    delete snmp;
    if (rc == SNMP_ERR_SUCCESS)
    {
@@ -5540,7 +5540,7 @@ void Node::updateRoutingTable()
  * Call SNMP Enumerate with node's SNMP parameters
  */
 UINT32 Node::callSnmpEnumerate(const TCHAR *pszRootOid,
-                              UINT32 (* pHandler)(UINT32, SNMP_Variable *, SNMP_Transport *, void *),
+                              UINT32 (* pHandler)(SNMP_Variable *, SNMP_Transport *, void *),
                               void *pArg, const TCHAR *context)
 {
    if ((m_dwFlags & NF_IS_SNMP) &&
@@ -5553,7 +5553,7 @@ UINT32 Node::callSnmpEnumerate(const TCHAR *pszRootOid,
                pTransport = createSnmpTransport(0, context);
                if (pTransport != NULL)
                {
-                       dwResult = SnmpWalk(m_snmpVersion, pTransport, pszRootOid, pHandler, pArg, FALSE);
+                       dwResult = SnmpWalk(pTransport, pszRootOid, pHandler, pArg);
                        delete pTransport;
                }
                else
index 012394d..7b21efe 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2014 Raden Solutions
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -344,7 +344,7 @@ static void AddSNMPResult(Table *table, int column, SNMP_Variable *pVar, LONG nF
 /**
  * Handler for SNMP table enumeration
  */
-static UINT32 TableHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 TableHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    TCHAR szOid[MAX_OID_LEN * 4], szSuffix[MAX_OID_LEN * 4];
    SNMP_PDU *pRqPDU, *pRespPDU;
@@ -367,7 +367,7 @@ static UINT32 TableHandler(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport
    }
 
    // Get values for other columns
-   pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), dwVersion);
+   pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), pTransport->getSnmpVersion());
    for(i = 1; i < ((SNMP_ENUM_ARGS *)pArg)->dwNumCols; i++)
    {
       _tcscpy(szOid, ((SNMP_ENUM_ARGS *)pArg)->ppszOidList[i]);
index fac86e2..52551b8 100644 (file)
@@ -8770,7 +8770,7 @@ typedef struct
 /**
  * SNMP walker enumeration callback
  */
-static UINT32 WalkerCallback(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 WalkerCallback(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    NXCPMessage *pMsg = ((WALKER_ENUM_CALLBACK_ARGS *)pArg)->pMsg;
    TCHAR szBuffer[4096];
index 29eaf99..1d1f72f 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 /**
  * Handler for ARP enumeration
  */
-static UINT32 HandlerArp(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerArp(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 oidName[MAX_OID_LEN], dwIndex = 0;
    BYTE bMac[64];
@@ -35,12 +35,12 @@ static UINT32 HandlerArp(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *
    memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
 
    oidName[nameLen - 6] = 1;  // Retrieve interface index
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &dwIndex, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwIndex, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
       return dwResult;
 
    oidName[nameLen - 6] = 2;  // Retrieve MAC address for this IP
-       dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, bMac, 64, SG_RAW_RESULT);
+       dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, bMac, 64, SG_RAW_RESULT, NULL);
    if (dwResult == SNMP_ERR_SUCCESS)
    {
       ((ARP_CACHE *)pArg)->dwNumEntries++;
@@ -67,7 +67,7 @@ ARP_CACHE *SnmpGetArpCache(UINT32 dwVersion, SNMP_Transport *pTransport)
    pArpCache->dwNumEntries = 0;
    pArpCache->pEntries = NULL;
 
-   if (SnmpWalk(dwVersion, pTransport, _T(".1.3.6.1.2.1.4.22.1.3"), HandlerArp, pArpCache, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(pTransport, _T(".1.3.6.1.2.1.4.22.1.3"), HandlerArp, pArpCache) != SNMP_ERR_SUCCESS)
    {
       DestroyArpCache(pArpCache);
       pArpCache = NULL;
@@ -78,7 +78,7 @@ ARP_CACHE *SnmpGetArpCache(UINT32 dwVersion, SNMP_Transport *pTransport)
 /**
  * Handler for route enumeration
  */
-static UINT32 HandlerRoute(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerRoute(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 oidName[MAX_OID_LEN], dwResult;
    ROUTE route;
@@ -94,23 +94,23 @@ static UINT32 HandlerRoute(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport
    route.dwDestAddr = ntohl(pVar->getValueAsUInt());
 
    oidName[nameLen - 5] = 2;  // Interface index
-   if ((dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen,
-                           &route.dwIfIndex, sizeof(UINT32), 0)) != SNMP_ERR_SUCCESS)
+   if ((dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen,
+                             &route.dwIfIndex, sizeof(UINT32), 0, NULL)) != SNMP_ERR_SUCCESS)
       return dwResult;
 
    oidName[nameLen - 5] = 7;  // Next hop
-   if ((dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen,
-                           &route.dwNextHop, sizeof(UINT32), 0)) != SNMP_ERR_SUCCESS)
+   if ((dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen,
+                             &route.dwNextHop, sizeof(UINT32), 0, NULL)) != SNMP_ERR_SUCCESS)
       return dwResult;
 
    oidName[nameLen - 5] = 8;  // Route type
-   if ((dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen,
-                           &route.dwRouteType, sizeof(UINT32), 0)) != SNMP_ERR_SUCCESS)
+   if ((dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen,
+                             &route.dwRouteType, sizeof(UINT32), 0, NULL)) != SNMP_ERR_SUCCESS)
       return dwResult;
 
    oidName[nameLen - 5] = 11;  // Destination mask
-   if ((dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen,
-                           &route.dwDestMask, sizeof(UINT32), 0)) != SNMP_ERR_SUCCESS)
+   if ((dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen,
+                             &route.dwDestMask, sizeof(UINT32), 0, NULL)) != SNMP_ERR_SUCCESS)
       return dwResult;
 
    rt->iNumEntries++;
@@ -133,7 +133,7 @@ ROUTING_TABLE *SnmpGetRoutingTable(UINT32 dwVersion, SNMP_Transport *pTransport)
    pRT->iNumEntries = 0;
    pRT->pRoutes = NULL;
 
-   if (SnmpWalk(dwVersion, pTransport, _T(".1.3.6.1.2.1.4.21.1.1"), HandlerRoute, pRT, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(pTransport, _T(".1.3.6.1.2.1.4.21.1.1"), HandlerRoute, pRT) != SNMP_ERR_SUCCESS)
    {
       DestroyRoutingTable(pRT);
       pRT = NULL;
index 1214e63..70bee27 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 /**
  * STP port table walker's callback
  */
-static UINT32 STPPortListHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 STPPortListHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        int state = var->getValueAsInt();
        if ((state != 2) && (state != 5))
@@ -36,7 +36,7 @@ static UINT32 STPPortListHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Tr
    memcpy(oid, var->getName()->getValue(), var->getName()->getLength() * sizeof(UINT32));
 
    // Get designated bridge and designated port for this port
-   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmpVersion);
+   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
 
    oid[10] = 8;   // dot1dStpPortDesignatedBridge
    request->bindVariable(new SNMP_Variable(oid, var->getName()->getLength()));
index 05b65d1..35282b2 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -80,7 +80,7 @@ void VrrpRouter::addVirtualIP(SNMP_Variable *var)
 /**
  * VRRP walker callback
  */
-UINT32 VrrpRouter::walkerCallback(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+UINT32 VrrpRouter::walkerCallback(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        ((VrrpRouter *)arg)->addVirtualIP(var);
        return SNMP_ERR_SUCCESS;
@@ -89,17 +89,17 @@ UINT32 VrrpRouter::walkerCallback(UINT32 snmpVersion, SNMP_Variable *var, SNMP_T
 /**
  * Read VRs virtual IPs
  */
-bool VrrpRouter::readVirtualIP(UINT32 snmpVersion, SNMP_Transport *transport)
+bool VrrpRouter::readVirtualIP(SNMP_Transport *transport)
 {
        TCHAR oid[256];
        _sntprintf(oid, 256, _T(".1.3.6.1.2.1.68.1.4.1.2.%u.%u"), m_ifIndex, m_id);
-       return SnmpWalk(snmpVersion, transport, oid, VrrpRouter::walkerCallback, this, false) == SNMP_ERR_SUCCESS;
+       return SnmpWalk(transport, oid, VrrpRouter::walkerCallback, this) == SNMP_ERR_SUCCESS;
 }
 
 /**
  * VRRP virtual router table walker's callback
  */
-UINT32 VRRPHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+UINT32 VRRPHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        SNMP_ObjectId *oid = var->getName();
 
@@ -112,10 +112,10 @@ UINT32 VRRPHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *trans
        memcpy(oidMac, oid->getValue(), oid->getLength() * sizeof(UINT32));
        oidMac[10] = 2; // .1.3.6.1.2.1.68.1.3.1.2.ifIndex.vrid = virtual MAC
        BYTE macAddr[MAC_ADDR_LENGTH];
-       if (SnmpGet(snmpVersion, transport, NULL, oidMac, 13, &macAddr, MAC_ADDR_LENGTH, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidMac, 13, &macAddr, MAC_ADDR_LENGTH, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
        {
                VrrpRouter *router = new VrrpRouter(vrid, ifIndex, state, macAddr);
-               if (router->readVirtualIP(snmpVersion, transport))
+               if (router->readVirtualIP(transport))
                        ((VrrpInfo *)arg)->addRouter(router);
                else
                        delete router;
@@ -137,14 +137,14 @@ VrrpInfo *GetVRRPInfo(Node *node)
                return NULL;
 
        LONG version;
-       if (SnmpGet(node->getSNMPVersion(), transport, _T(".1.3.6.1.2.1.68.1.1.0"), NULL, 0, &version, sizeof(LONG), 0) != SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, _T(".1.3.6.1.2.1.68.1.1.0"), NULL, 0, &version, sizeof(LONG), 0, NULL) != SNMP_ERR_SUCCESS)
        {
                delete transport;
                return NULL;
        }
 
        VrrpInfo *info = new VrrpInfo(version);
-       if (SnmpWalk(node->getSNMPVersion(), transport, _T(".1.3.6.1.2.1.68.1.3.1.3"), VRRPHandler, info, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(transport, _T(".1.3.6.1.2.1.68.1.3.1.3"), VRRPHandler, info) != SNMP_ERR_SUCCESS)
        {
                delete info;
                info = NULL;
index 46bdcb8..b8830b7 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Cisco 4400 (former Airespace) wireless switches
-** Copyright (C) 2013-2014 Raden Solutions
+** Copyright (C) 2013-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -68,7 +68,7 @@ bool AirespaceDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
 {
    // read agentInventoryMachineModel
    TCHAR buffer[1024];
-   if (SnmpGet(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14179.1.1.1.3.0"), NULL, 0, buffer, sizeof(buffer), 0) != SNMP_ERR_SUCCESS)
+   if (SnmpGetEx(snmp, _T(".1.3.6.1.4.1.14179.1.1.1.3.0"), NULL, 0, buffer, sizeof(buffer), 0, NULL) != SNMP_ERR_SUCCESS)
       return false;
 
    // model must start with AIR-WLC44, like AIR-WLC4402-50-K9
@@ -103,7 +103,7 @@ bool AirespaceDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attr
 /**
  * Handler for access point enumeration
  */
-static UINT32 HandlerAccessPointList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
@@ -201,8 +201,8 @@ ObjectArray<AccessPointInfo> *AirespaceDriver::getAccessPoints(SNMP_Transport *s
 {
    ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
 
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14179.2.2.1.1.33"),  // bsnAPEthernetMacAddress
-            HandlerAccessPointList, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.14179.2.2.1.1.33"),  // bsnAPEthernetMacAddress
+                HandlerAccessPointList, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
@@ -214,7 +214,7 @@ ObjectArray<AccessPointInfo> *AirespaceDriver::getAccessPoints(SNMP_Transport *s
 /**
  * Handler for mobile units enumeration
  */
-static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
@@ -277,8 +277,8 @@ ObjectArray<WirelessStationInfo> *AirespaceDriver::getWirelessStations(SNMP_Tran
 {
    ObjectArray<WirelessStationInfo> *wsList = new ObjectArray<WirelessStationInfo>(0, 16, true);
 
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14179.2.1.4.1.1"), // bsnMobileStationMacAddress
-            HandlerWirelessStationList, wsList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.14179.2.1.4.1.1"), // bsnMobileStationMacAddress
+                HandlerWirelessStationList, wsList) != SNMP_ERR_SUCCESS)
    {
       delete wsList;
       wsList = NULL;
index 89393d5..3fbb528 100644 (file)
@@ -160,7 +160,7 @@ InterfaceList *AlliedTelesisDriver::getInterfaces(SNMP_Transport *snmp, StringMa
 /**
  * Handler for VLAN enumeration
  */
-static UINT32 HandlerVlanList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
 
@@ -223,7 +223,7 @@ VlanList *AlliedTelesisDriver::getVlans(SNMP_Transport *snmp, StringMap *attribu
    if (list == NULL)
       list = new VlanList();
 
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.207.8.33.8.1.1.2"), HandlerVlanList, list, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.207.8.33.8.1.1.2"), HandlerVlanList, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
    for(int i = 0; i < list->size(); i++)
index c36a5d8..23e1620 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Cisco catalyst 2900XL, 2950, and 3500XL switches
-** Copyright (C) 2003-2011 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -84,7 +84,7 @@ bool Cat2900Driver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
 /**
  * Handler for switch port enumeration
  */
-static UINT32 HandlerPortList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerPortList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        InterfaceList *ifList = (InterfaceList *)arg;
        InterfaceInfo *iface = ifList->findByIfIndex(var->getValueAsUInt());
@@ -112,7 +112,7 @@ InterfaceList *Cat2900Driver::getInterfaces(SNMP_Transport *snmp, StringMap *att
                return NULL;
        
        // Set slot and port number for physical interfaces
-       SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.9.87.1.4.1.1.25"), HandlerPortList, ifList, FALSE);
+       SnmpWalk(snmp, _T(".1.3.6.1.4.1.9.9.87.1.4.1.1.25"), HandlerPortList, ifList);
 
        return ifList;
 }
index f8b9213..4eb8747 100644 (file)
@@ -73,7 +73,7 @@ bool CatalystDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
 /**
  * Handler for switch port enumeration
  */
-static UINT32 HandlerPortList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerPortList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        InterfaceList *ifList = (InterfaceList *)arg;
 
@@ -86,7 +86,7 @@ static UINT32 HandlerPortList(UINT32 version, SNMP_Variable *var, SNMP_Transport
                UINT32 oid[] = { 1, 3, 6, 1, 4, 1, 9, 5, 1, 3, 1, 1, 25, 0 };
                oid[13] = moduleIndex;
                UINT32 slot;
-               if (SnmpGet(version, transport, NULL, oid, 14, &slot, sizeof(UINT32), 0) != SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oid, 14, &slot, sizeof(UINT32), 0, NULL) != SNMP_ERR_SUCCESS)
                        slot = moduleIndex;     // Assume slot # equal to module index if it cannot be read
 
                iface->slot = slot;
@@ -110,7 +110,7 @@ InterfaceList *CatalystDriver::getInterfaces(SNMP_Transport *snmp, StringMap *at
                return NULL;
        
        // Set slot and port number for physical interfaces
-       SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.5.1.4.1.1.11"), HandlerPortList, ifList, FALSE);
+       SnmpWalk(snmp, _T(".1.3.6.1.4.1.9.5.1.4.1.1.11"), HandlerPortList, ifList);
 
        return ifList;
 }
index 0631b88..9c82e81 100644 (file)
@@ -84,7 +84,7 @@ void H3CDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, StringMap
 /**
  * Handler for port walk
  */
-static UINT32 PortWalkHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 PortWalkHandler(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    InterfaceList *ifList = (InterfaceList *)arg;
    UINT32 ifIndex = var->getValueAsUInt();
@@ -116,7 +116,7 @@ InterfaceList *H3CDriver::getInterfaces(SNMP_Transport *snmp, StringMap *attribu
                return NULL;
 
        // Find physical ports
-   SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.43.45.1.2.23.1.18.4.5.1.3"), PortWalkHandler, ifList, FALSE);
+   SnmpWalk(snmp, _T(".1.3.6.1.4.1.43.45.1.2.23.1.18.4.5.1.3"), PortWalkHandler, ifList);
        return ifList;
 }
 
index d5d0c4c..48d05f4 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for HP switches with HH3C MIB support
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -84,7 +84,7 @@ void HPSwitchDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, Strin
 /**
  * Handler for port walk
  */
-static UINT32 PortWalkHandler(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 PortWalkHandler(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    InterfaceList *ifList = (InterfaceList *)arg;
    UINT32 ifIndex = var->getValueAsUInt();
@@ -116,7 +116,7 @@ InterfaceList *HPSwitchDriver::getInterfaces(SNMP_Transport *snmp, StringMap *at
                return NULL;
 
        // Find physical ports (walk hh3cLswPortIfindex)
-   SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.25506.8.35.18.4.5.1.3"), PortWalkHandler, ifList, FALSE);
+   SnmpWalk(snmp, _T(".1.3.6.1.4.1.25506.8.35.18.4.5.1.3"), PortWalkHandler, ifList);
        return ifList;
 }
 
index a09be82..5407ad4 100644 (file)
@@ -38,7 +38,7 @@ UINT32 AvayaERSDriver::getSlotSize(StringMap *attributes)
 /**
  * Handler for VLAN enumeration on Avaya ERS
  */
-static UINT32 HandlerVlanList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerVlanList(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 oidName[MAX_OID_LEN], dwResult;
    VlanList *vlanList = (VlanList *)pArg;
@@ -50,7 +50,7 @@ static UINT32 HandlerVlanList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transp
    memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 2;
    TCHAR buffer[256];
-       dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, buffer, sizeof(buffer), SG_STRING_RESULT);
+       dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, buffer, sizeof(buffer), SG_STRING_RESULT, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
        {
                delete vlan;
@@ -71,7 +71,7 @@ static UINT32 HandlerVlanList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transp
    oidName[nameLen - 2] = 12;
        BYTE portMask[256];
        memset(portMask, 0, sizeof(portMask));
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, portMask, sizeof(portMask), SG_RAW_RESULT);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, portMask, sizeof(portMask), SG_RAW_RESULT, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
        {
                delete vlan;
@@ -103,7 +103,7 @@ static UINT32 HandlerVlanList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transp
 VlanList *AvayaERSDriver::getVlans(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
        VlanList *list = new VlanList();
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.2272.1.3.2.1.1"), HandlerVlanList, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.2272.1.3.2.1.1"), HandlerVlanList, list, FALSE) != SNMP_ERR_SUCCESS)
        {
                delete_and_null(list);
        }
index 34562ff..2e22af2 100644 (file)
@@ -46,7 +46,7 @@ struct VLAN_LIST
 /**
  * Handler for VLAN enumeration on Avaya ERS
  */
-static UINT32 HandlerVlanIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerVlanIfList(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 dwIndex, oidName[MAX_OID_LEN], dwResult;
    VLAN_LIST *pVlanList = (VLAN_LIST *)pArg;
@@ -63,15 +63,15 @@ static UINT32 HandlerVlanIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Tran
    // Get VLAN name
    memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 2;
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, 
-                      pVlanList->pList[dwIndex].szName, MAX_OBJECT_NAME * sizeof(TCHAR), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, 
+                        pVlanList->pList[dwIndex].szName, MAX_OBJECT_NAME * sizeof(TCHAR), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
       return dwResult;
 
    // Get VLAN interface index
    oidName[nameLen - 2] = 6;
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, 
-                      &pVlanList->pList[dwIndex].dwIfIndex, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, 
+                        &pVlanList->pList[dwIndex].dwIfIndex, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
       return dwResult;
 
@@ -79,7 +79,7 @@ static UINT32 HandlerVlanIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Tran
    oidName[nameLen - 2] = 19;
    memset(pVlanList->pList[dwIndex].bMacAddr, 0, MAC_ADDR_LENGTH);
    memset(szBuffer, 0, MAC_ADDR_LENGTH);
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, szBuffer, 256, SG_RAW_RESULT);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, szBuffer, 256, SG_RAW_RESULT, NULL);
    if (dwResult == SNMP_ERR_SUCCESS)
       memcpy(pVlanList->pList[dwIndex].bMacAddr, szBuffer, MAC_ADDR_LENGTH);
    return dwResult;
@@ -88,7 +88,7 @@ static UINT32 HandlerVlanIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Tran
 /**
  * Handler for VLAN enumeration
  */
-static UINT32 HandlerRapidCityIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerRapidCityIfList(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    InterfaceList *pIfList = (InterfaceList *)pArg;
    VLAN_LIST *pVlanList = (VLAN_LIST *)pIfList->getData();
@@ -114,13 +114,13 @@ static UINT32 HandlerRapidCityIfList(UINT32 dwVersion, SNMP_Variable *pVar, SNMP
 
       memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
       oidName[nameLen - 6] = 2;
-      dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &ipAddr, sizeof(UINT32), 0);
+      dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &ipAddr, sizeof(UINT32), 0, NULL);
 
       if (dwResult == SNMP_ERR_SUCCESS)
       {
          // Get netmask
          oidName[nameLen - 6] = 3;
-         dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &ipNetMask, sizeof(UINT32), 0);
+         dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &ipNetMask, sizeof(UINT32), 0, NULL);
       }
 
       if (dwResult == SNMP_ERR_SUCCESS)
@@ -149,10 +149,10 @@ void AvayaERSDriver::getVlanInterfaces(SNMP_Transport *pTransport, InterfaceList
 
    // Get VLAN list
    memset(&vlanList, 0, sizeof(VLAN_LIST));
-   SnmpWalk(pTransport->getSnmpVersion(), pTransport, _T(".1.3.6.1.4.1.2272.1.3.2.1.1"), HandlerVlanIfList, &vlanList, FALSE);
+   SnmpWalk(pTransport, _T(".1.3.6.1.4.1.2272.1.3.2.1.1"), HandlerVlanIfList, &vlanList);
 
    // Get interfaces
    pIfList->setData(&vlanList);
-   SnmpWalk(pTransport->getSnmpVersion(), pTransport, _T(".1.3.6.1.4.1.2272.1.8.2.1.1"), HandlerRapidCityIfList, pIfList, FALSE);
-   safe_free(vlanList.pList);
+   SnmpWalk(pTransport, _T(".1.3.6.1.4.1.2272.1.8.2.1.1"), HandlerRapidCityIfList, pIfList);
+   free(vlanList.pList);
 }
index 02f533a..567f1db 100644 (file)
@@ -27,7 +27,7 @@
 /**
  * Handler for VLAN enumeration on Cisco device
  */
-static UINT32 HandlerVlanList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
 
@@ -82,7 +82,7 @@ static void ParseVlanMap(VlanList *vlanList, UINT32 ifIndex, BYTE *map, int offs
 /**
  * Handler for trunk port enumeration on Cisco device
  */
-static UINT32 HandlerTrunkPorts(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerTrunkPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
    size_t nameLen = var->getName()->getLength();
@@ -92,7 +92,7 @@ static UINT32 HandlerTrunkPorts(UINT32 version, SNMP_Variable *var, SNMP_Transpo
        UINT32 oidName[256], value;
    memcpy(oidName, var->getName()->getValue(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 14;  // .1.3.6.1.4.1.9.9.46.1.6.1.1.14
-       if (SnmpGet(version, transport, NULL, oidName, nameLen, &value, sizeof(UINT32), 0) != SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidName, nameLen, &value, sizeof(UINT32), 0, NULL) != SNMP_ERR_SUCCESS)
           return SNMP_ERR_SUCCESS;     // Cannot get trunk state, ignore port
        if (value != 1)
           return SNMP_ERR_SUCCESS;     // Not a trunk port, ignore
@@ -106,25 +106,25 @@ static UINT32 HandlerTrunkPorts(UINT32 version, SNMP_Variable *var, SNMP_Transpo
    oidName[nameLen - 2] = 4;   // .1.3.6.1.4.1.9.9.46.1.6.1.1.4
        BYTE map[128];
        memset(map, 0, 128);
-       if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                ParseVlanMap(vlanList, ifIndex, map, 0);
 
        // VLAN map for VLAN IDs 1024..2047
    oidName[nameLen - 2] = 17;  // .1.3.6.1.4.1.9.9.46.1.6.1.1.17
        memset(map, 0, 128);
-       if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                ParseVlanMap(vlanList, ifIndex, map, 1024);
 
        // VLAN map for VLAN IDs 2048..3071
    oidName[nameLen - 2] = 18;  // .1.3.6.1.4.1.9.9.46.1.6.1.1.18
        memset(map, 0, 128);
-       if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                ParseVlanMap(vlanList, ifIndex, map, 2048);
 
        // VLAN map for VLAN IDs 3072..4095
    oidName[nameLen - 2] = 19;  // .1.3.6.1.4.1.9.9.46.1.6.1.1.19
        memset(map, 0, 128);
-       if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+       if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                ParseVlanMap(vlanList, ifIndex, map, 3072);
 
    return SNMP_ERR_SUCCESS;
@@ -134,7 +134,7 @@ static UINT32 HandlerTrunkPorts(UINT32 version, SNMP_Variable *var, SNMP_Transpo
 /**
  * Handler for access port enumeration on Cisco device
  */
-static UINT32 HandlerAccessPorts(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
    size_t nameLen = var->getName()->getLength();
@@ -150,25 +150,25 @@ static UINT32 HandlerAccessPorts(UINT32 version, SNMP_Variable *var, SNMP_Transp
 
                oidName[nameLen - 2] = 4;       // .1.3.6.1.4.1.9.9.68.1.2.2.1.4
                memset(map, 0, 128);
-               if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                        ParseVlanMap(vlanList, ifIndex, map, 0);
 
                // VLAN map for VLAN IDs 1024..2047
                oidName[nameLen - 2] = 5;       // .1.3.6.1.4.1.9.9.68.1.2.2.1.5
                memset(map, 0, 128);
-               if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                        ParseVlanMap(vlanList, ifIndex, map, 1024);
 
                // VLAN map for VLAN IDs 2048..3071
                oidName[nameLen - 2] = 6;       // .1.3.6.1.4.1.9.9.68.1.2.2.1.6
                memset(map, 0, 128);
-               if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                        ParseVlanMap(vlanList, ifIndex, map, 2048);
 
                // VLAN map for VLAN IDs 3072..4095
                oidName[nameLen - 2] = 7;       // .1.3.6.1.4.1.9.9.68.1.2.2.1.7
                memset(map, 0, 128);
-               if (SnmpGet(version, transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT) == SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oidName, nameLen, map, 128, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
                        ParseVlanMap(vlanList, ifIndex, map, 3072);
        }
        else
@@ -176,7 +176,7 @@ static UINT32 HandlerAccessPorts(UINT32 version, SNMP_Variable *var, SNMP_Transp
                // Port is in just one VLAN, it's ID must be in vmVlan
           oidName[nameLen - 2] = 2;    // .1.3.6.1.4.1.9.9.68.1.2.2.1.2
                UINT32 vlanId = 0;
-               if (SnmpGet(version, transport, NULL, oidName, nameLen, &vlanId, sizeof(UINT32), 0) == SNMP_ERR_SUCCESS)
+               if (SnmpGetEx(transport, NULL, oidName, nameLen, &vlanId, sizeof(UINT32), 0, NULL) == SNMP_ERR_SUCCESS)
                {
                        if (vlanId != 0)
                                vlanList->addMemberPort((int)vlanId, ifIndex);
@@ -194,15 +194,15 @@ VlanList *CiscoDeviceDriver::getVlans(SNMP_Transport *snmp, StringMap *attribute
        VlanList *list = new VlanList();
        
        // Vlan list
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.9.46.1.3.1.1.4"), HandlerVlanList, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.9.9.46.1.3.1.1.4"), HandlerVlanList, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
        // Trunk ports
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.9.46.1.6.1.1.5"), HandlerTrunkPorts, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.9.9.46.1.6.1.1.5"), HandlerTrunkPorts, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
        // Access ports
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.9.68.1.2.2.1.1"), HandlerAccessPorts, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.9.9.68.1.2.2.1.1"), HandlerAccessPorts, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
        return list;
index 2fbaecc..35736c0 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Mikrotik routers
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -98,7 +98,7 @@ InterfaceList *MikrotikDriver::getInterfaces(SNMP_Transport *snmp, StringMap *at
 /**
  * SNMP walker callback which just counts number of varbinds
  */
-static UINT32 CountingSnmpWalkerCallback(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 CountingSnmpWalkerCallback(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        (*((int *)arg))++;
        return SNMP_ERR_SUCCESS;
@@ -114,7 +114,7 @@ static UINT32 CountingSnmpWalkerCallback(UINT32 version, SNMP_Variable *var, SNM
 bool MikrotikDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
    int count = 0;
-   SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14988.1.1.1.3.1.4"), CountingSnmpWalkerCallback, &count, FALSE);
+   SnmpWalk(snmp, _T(".1.3.6.1.4.1.14988.1.1.1.3.1.4"), CountingSnmpWalkerCallback, &count);
    return count > 0;
 }
 
@@ -126,7 +126,7 @@ static int s_frequencyMap[14] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447
 /**
  * Handler for access point enumeration - adopted
  */
-static UINT32 HandlerAccessPointList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
@@ -204,8 +204,8 @@ static UINT32 HandlerAccessPointList(UINT32 version, SNMP_Variable *var, SNMP_Tr
 ObjectArray<AccessPointInfo> *MikrotikDriver::getAccessPoints(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
    ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14988.1.1.1.3.1.4"),
-            HandlerAccessPointList, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.14988.1.1.1.3.1.4"),
+                HandlerAccessPointList, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
@@ -233,7 +233,7 @@ AccessPointState MikrotikDriver::getAccessPointState(SNMP_Transport *snmp, Strin
 /**
  * Handler for mobile units enumeration
  */
-static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
@@ -269,8 +269,8 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
 ObjectArray<WirelessStationInfo> *MikrotikDriver::getWirelessStations(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
    ObjectArray<WirelessStationInfo> *wsList = new ObjectArray<WirelessStationInfo>(0, 16, true);
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14988.1.1.1.2.1.1"), // mtxrWlRtabAddr
-            HandlerWirelessStationList, wsList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.14988.1.1.1.2.1.1"), // mtxrWlRtabAddr
+                HandlerWirelessStationList, wsList) != SNMP_ERR_SUCCESS)
    {
       delete wsList;
       wsList = NULL;
index be8d02e..c24609d 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Netscreen firewalls
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -84,7 +84,7 @@ void NetscreenDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, Stri
 /**
  * Handler for interface enumeration
  */
-static UINT32 HandlerIfList(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerIfList(SNMP_Variable *varbind, SNMP_Transport *transport, void *arg)
 {
        InterfaceList *ifList = (InterfaceList *)arg;
 
@@ -95,7 +95,7 @@ static UINT32 HandlerIfList(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Tra
        InterfaceInfo *iface = new InterfaceInfo(varbind->getValueAsUInt());
 
        oidName[10] = 2;        // nsIfName
-       UINT32 rc = SnmpGet(snmpVersion, transport, NULL, oidName, nameLen, iface->name, MAX_DB_STRING * sizeof(TCHAR), SG_STRING_RESULT);
+       UINT32 rc = SnmpGetEx(transport, NULL, oidName, nameLen, iface->name, MAX_DB_STRING * sizeof(TCHAR), SG_STRING_RESULT, NULL);
        if (rc != SNMP_ERR_SUCCESS)
    {
       delete iface;
@@ -104,7 +104,7 @@ static UINT32 HandlerIfList(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Tra
        nx_strncpy(iface->description, iface->name, MAX_DB_STRING);
 
        oidName[10] = 11;       // nsIfMAC
-       rc = SnmpGet(snmpVersion, transport, NULL, oidName, nameLen, iface->macAddr, 6, SG_RAW_RESULT);
+       rc = SnmpGetEx(transport, NULL, oidName, nameLen, iface->macAddr, 6, SG_RAW_RESULT, NULL);
        if (rc != SNMP_ERR_SUCCESS)
    {
       delete iface;
@@ -113,7 +113,7 @@ static UINT32 HandlerIfList(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Tra
 
        oidName[10] = 6;        // nsIfIp
    UINT32 ipAddr;
-       rc = SnmpGet(snmpVersion, transport, NULL, oidName, nameLen, &ipAddr, sizeof(UINT32), 0);
+       rc = SnmpGetEx(transport, NULL, oidName, nameLen, &ipAddr, sizeof(UINT32), 0, NULL);
        if (rc != SNMP_ERR_SUCCESS)
    {
       delete iface;
@@ -122,7 +122,7 @@ static UINT32 HandlerIfList(UINT32 snmpVersion, SNMP_Variable *varbind, SNMP_Tra
 
        oidName[10] = 7;        // nsIfNetmask
    UINT32 ipNetMask;
-       rc = SnmpGet(snmpVersion, transport, NULL, oidName, nameLen, &ipNetMask, sizeof(UINT32), 0);
+       rc = SnmpGetEx(transport, NULL, oidName, nameLen, &ipNetMask, sizeof(UINT32), 0, NULL);
        if (rc != SNMP_ERR_SUCCESS)
    {
       delete iface;
@@ -148,7 +148,7 @@ InterfaceList *NetscreenDriver::getInterfaces(SNMP_Transport *snmp, StringMap *a
                return NULL;
 
        InterfaceList *ifList = new InterfaceList;
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.3224.9.1.1.1"), HandlerIfList, ifList, FALSE) == SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.3224.9.1.1.1"), HandlerIfList, ifList) == SNMP_ERR_SUCCESS)
        {
                // Fix interface indexes
                for(int i = 0; i < ifList->size(); i++)
index ec1df77..ed46584 100644 (file)
@@ -104,7 +104,7 @@ bool NtwsDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attribute
 /**
  * Handler for access point enumeration - unadopted
  */
-static UINT32 HandlerAccessPointListUnadopted(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPointListUnadopted(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
@@ -118,7 +118,7 @@ static UINT32 HandlerAccessPointListUnadopted(UINT32 version, SNMP_Variable *var
 /**
  * Handler for access point enumeration - adopted
  */
-static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPointListAdopted(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    int ret = SNMP_ERR_SUCCESS;
 
@@ -137,7 +137,7 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
       serial[i] = oid[i + 17];
    serial[slen] = 0;
 
-   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), version);
+   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
    
    oid[15] = 6;  // ntwsApStatApStatusModel
    request->bindVariable(new SNMP_Variable(oid, nameLen));
@@ -182,7 +182,7 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
 /**
  * Handler for radios enumeration
  */
-static UINT32 HandlerRadioList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerRadioList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    AccessPointInfo *ap = (AccessPointInfo *)arg;
 
@@ -197,7 +197,7 @@ static UINT32 HandlerRadioList(UINT32 version, SNMP_Variable *var, SNMP_Transpor
    rif.index = (int)oid[nameLen - 1];
    _sntprintf(rif.name, sizeof(rif.name) / sizeof(TCHAR), _T("Radio%d"), rif.index);
    
-   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), version);
+   SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
    
    oid[15] = 6;  // ntwsApStatRadioStatusCurrentPowerLevel
    request->bindVariable(new SNMP_Variable(oid, nameLen));
@@ -233,8 +233,8 @@ ObjectArray<AccessPointInfo> *NtwsDriver::getAccessPoints(SNMP_Transport *snmp,
    ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
 
    // Adopted
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.45.6.1.4.5.1.1.2.1.2"),
-            HandlerAccessPointListAdopted, apList, FALSE) == SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.45.6.1.4.5.1.1.2.1.2"),
+                HandlerAccessPointListAdopted, apList) == SNMP_ERR_SUCCESS)
    {
       // Read radios by walking .1.3.6.1.4.1.45.6.1.4.5.1.1.4.1.3.<ap serial> (ntwsApStatRadioStatusBaseMac)
       for(int i = 0; i < apList->size(); i++)
@@ -246,9 +246,7 @@ ObjectArray<AccessPointInfo> *NtwsDriver::getAccessPoints(SNMP_Transport *snmp,
          oid[16] = (UINT32)_tcslen(serial);
          for(UINT32 i = 0; i < oid[16]; i++)
             oid[i + 17] = (UINT32)serial[i];
-         TCHAR rootOid[1024];
-         SNMPConvertOIDToText(oid[16] + 17, oid, rootOid, 1024);
-         SnmpWalk(snmp->getSnmpVersion(), snmp, rootOid, HandlerRadioList, ap, FALSE);
+         SnmpWalk(snmp, oid, oid[16] + 17, HandlerRadioList, ap);
       }
    }
    else
@@ -258,8 +256,8 @@ ObjectArray<AccessPointInfo> *NtwsDriver::getAccessPoints(SNMP_Transport *snmp,
    }
 
    // Unadopted
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.45.6.1.4.15.1.2.1.2"),
-            HandlerAccessPointListUnadopted, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.45.6.1.4.15.1.2.1.2"),
+                HandlerAccessPointListUnadopted, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
@@ -271,7 +269,7 @@ ObjectArray<AccessPointInfo> *NtwsDriver::getAccessPoints(SNMP_Transport *snmp,
 /**
  * Handler for mobile units enumeration
  */
-static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    int ret = SNMP_ERR_SUCCESS;
 
@@ -286,26 +284,26 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
 
    UINT32 ipAddr;
    oid[14] = 6; // wsCcRfMuIpAddr
-   ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &ipAddr, sizeof(ipAddr), 0);
+   ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &ipAddr, sizeof(ipAddr), 0, NULL);
    UINT32 vlanInfex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 4; // wsCcRfMuVlanIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &vlanInfex, sizeof(vlanInfex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &vlanInfex, sizeof(vlanInfex), 0, NULL);
    }
 
    UINT32 wlanInfex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 2; // wsCcRfMuWlanIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &wlanInfex, sizeof(vlanInfex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &wlanInfex, sizeof(vlanInfex), 0, NULL);
    }
 
    UINT32 rfIndex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 3; // wsCcRfMuRadioIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &rfIndex, sizeof(rfIndex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &rfIndex, sizeof(rfIndex), 0, NULL);
    }
 
    TCHAR ssid[MAX_OBJECT_NAME];
@@ -314,7 +312,7 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
       UINT32 wlanOid[] = { 1, 3, 6, 1, 4, 1, 388, 14, 3, 2, 1, 14, 1, 1, 4, 0 };
       wlanOid[(sizeof(wlanOid) / sizeof(wlanOid[0])) - 1] = wlanInfex;
 
-      ret = SnmpGet(version, transport, NULL, wlanOid, sizeof(wlanOid) / sizeof(wlanOid[0]), ssid, sizeof(ssid), 0);
+      ret = SnmpGetEx(transport, NULL, wlanOid, sizeof(wlanOid) / sizeof(wlanOid[0]), ssid, sizeof(ssid), 0, NULL);
    }
 
    if (ret == SNMP_ERR_SUCCESS)
@@ -345,8 +343,8 @@ ObjectArray<WirelessStationInfo> *NtwsDriver::getWirelessStations(SNMP_Transport
 {
    ObjectArray<WirelessStationInfo> *wsList = new ObjectArray<WirelessStationInfo>(0, 16, true);
 
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.12.3.1.1"), // wsCcRfMuMac
-            HandlerWirelessStationList, wsList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.12.3.1.1"), // wsCcRfMuMac
+                HandlerWirelessStationList, wsList) != SNMP_ERR_SUCCESS)
    {
       delete wsList;
       wsList = NULL;
index 9b60333..88abf9f 100644 (file)
@@ -80,7 +80,7 @@ bool QtechOLTDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
 /**
  * Handler for enumerating indexes
  */
-static UINT32 HandlerIndex(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerIndex(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
     UINT32 oid[128];
     size_t oidLen = pVar->getName()->getLength();
@@ -102,11 +102,10 @@ static UINT32 HandlerIndex(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport
  */
 InterfaceList *QtechOLTDriver::getInterfaces(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData, int useAliases, bool useIfXTable)
 {
-   TCHAR szOid[128];
    UINT32 oid[MAX_OID_LEN];
 
    InterfaceList *pIfList = NetworkDeviceDriver::getInterfaces(snmp, attributes, driverData, 0, false);
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.27514.1.11.4.1.1.1"), HandlerIndex, pIfList, FALSE) == SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.27514.1.11.4.1.1.1"), HandlerIndex, pIfList) == SNMP_ERR_SUCCESS)
    {
       for(int i = 0; i < pIfList->size(); i++)
       {
@@ -118,20 +117,17 @@ InterfaceList *QtechOLTDriver::getInterfaces(SNMP_Transport *snmp, StringMap *at
             oid[14] = iface->slot;
             oid[15] = iface->index - iface->slot * 1000;
             iface->type = IFTYPE_GPON;
-            SNMPConvertOIDToText(16, oid, szOid, 128);
-            if (SnmpGet(snmp->getSnmpVersion(), snmp, szOid, NULL, 0, iface->alias, MAX_DB_STRING * sizeof(TCHAR), 0) != SNMP_ERR_SUCCESS)
+            if (SnmpGetEx(snmp, NULL, oid, 16, iface->alias, MAX_DB_STRING * sizeof(TCHAR), 0, NULL) != SNMP_ERR_SUCCESS)
             {
                StrStrip(iface->alias);
             }
             oid[12] = 13;
-            SNMPConvertOIDToText(16, oid, szOid, 128);
-            if (SnmpGet(snmp->getSnmpVersion(), snmp, szOid, NULL, 0, iface->description, MAX_DB_STRING * sizeof(TCHAR), 0) != SNMP_ERR_SUCCESS)
+            if (SnmpGetEx(snmp, NULL, oid, 16, iface->description, MAX_DB_STRING * sizeof(TCHAR), 0, NULL) != SNMP_ERR_SUCCESS)
             {
                StrStrip(iface->description);
             }
             oid[12] = 2;
-            SNMPConvertOIDToText(16, oid, szOid, 128);
-            if (SnmpGet(snmp->getSnmpVersion(), snmp, szOid, NULL, 0, iface->name, MAX_DB_STRING * sizeof(TCHAR), 0) != SNMP_ERR_SUCCESS)
+            if (SnmpGetEx(snmp, NULL, oid, 16, iface->name, MAX_DB_STRING * sizeof(TCHAR), 0, NULL) != SNMP_ERR_SUCCESS)
             {
                iface->type = IFTYPE_OTHER;
             }
@@ -155,7 +151,6 @@ void QtechOLTDriver::getInterfaceState(SNMP_Transport *snmp, StringMap *attribut
                                        int ifTableSuffixLen, UINT32 *ifTableSuffix, InterfaceAdminState *adminState, InterfaceOperState *operState)
 {
    UINT32 dwOperStatus = 0;
-   TCHAR szOid[256];
    UINT32 oid[MAX_OID_LEN];
 
    *adminState = IF_ADMIN_STATE_UP;
@@ -165,8 +160,7 @@ void QtechOLTDriver::getInterfaceState(SNMP_Transport *snmp, StringMap *attribut
       SNMPParseOID(_T(".1.3.6.1.4.1.27514.1.11.4.1.1.3.0.0.0"), oid, MAX_OID_LEN);
       oid[14] = ifIndex / 1000;
       oid[15] = ifIndex - oid[14] * 1000;
-      SNMPConvertOIDToText(16, oid, szOid, 128);
-      SnmpGet(snmp->getSnmpVersion(), snmp, szOid, NULL, 0, &dwOperStatus, sizeof(UINT32), 0);
+      SnmpGetEx(snmp, NULL, oid, 16, &dwOperStatus, sizeof(UINT32), 0, NULL);
       switch(dwOperStatus)
       {
          case 1:
index c7e75af..ca292f6 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Symbol WS series wireless switches
-** Copyright (C) 2013-2015 Raden Solutions
+** Copyright (C) 2013-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -128,7 +128,7 @@ bool SymbolDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attribu
 /**
  * Handler for access point enumeration - unadopted
  */
-static UINT32 HandlerAccessPointListUnadopted(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPointListUnadopted(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
@@ -139,7 +139,7 @@ static UINT32 HandlerAccessPointListUnadopted(UINT32 version, SNMP_Variable *var
    UINT32 oid[] = { 1, 3, 6, 1, 4, 1, 388, 14, 3, 2, 1, 9, 4, 1, 3, 0 };
    oid[(sizeof(oid) / sizeof(oid[0])) - 1] = apIndex;
    INT32 type;
-   if (SnmpGet(version, transport, NULL, oid, 16, &type, sizeof(INT32), 0) != SNMP_ERR_SUCCESS)
+   if (SnmpGetEx(transport, NULL, oid, 16, &type, sizeof(INT32), 0, NULL) != SNMP_ERR_SUCCESS)
    {
       type = -1;
    }
@@ -173,7 +173,7 @@ static UINT32 HandlerAccessPointListUnadopted(UINT32 version, SNMP_Variable *var
 /**
  * Handler for access point enumeration - adopted
  */
-static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPointListAdopted(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    int ret = SNMP_ERR_SUCCESS;
 
@@ -200,13 +200,13 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[(sizeof(oid) / sizeof(oid[0])) - 2] = 4; // 1.3.6.1.4.1.388.14.3.2.1.9.2.1.4.x, wsCcRfApSerialNumber
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &serial, sizeof(serial), SG_STRING_RESULT);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &serial, sizeof(serial), SG_STRING_RESULT, NULL);
    }
    if (ret == SNMP_ERR_SUCCESS)
    {
       // get number of radios
       oid[(sizeof(oid) / sizeof(oid[0])) - 2] = 9; // 1.3.6.1.4.1.388.14.3.2.1.9.2.1.9.x, wsCcRfApNumRadios
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &numberOfRadios, sizeof(numberOfRadios), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &numberOfRadios, sizeof(numberOfRadios), 0, NULL);
    }
 
    // load radios
@@ -214,14 +214,12 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
    if (ret == SNMP_ERR_SUCCESS && numberOfRadios > 0)
    {
       oid[(sizeof(oid) / sizeof(oid[0])) - 2] = 10; // 1.3.6.1.4.1.388.14.3.2.1.9.2.1.10.x, wsCcRfApRadio1
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]),
-            &(radioIndex[0]), sizeof(radioIndex[0]), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &(radioIndex[0]), sizeof(radioIndex[0]), 0, NULL);
    }
    if (ret == SNMP_ERR_SUCCESS && numberOfRadios > 1)
    {
       oid[(sizeof(oid) / sizeof(oid[0])) - 2] = 11; // 1.3.6.1.4.1.388.14.3.2.1.9.2.1.11.x, wsCcRfApRadio2
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]),
-            &(radioIndex[1]), sizeof(radioIndex[1]), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &(radioIndex[1]), sizeof(radioIndex[1]), 0, NULL);
    }
 
    // get AP model
@@ -230,8 +228,7 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
    if (ret == SNMP_ERR_SUCCESS)
    {
       radioOid[(sizeof(radioOid) / sizeof(radioOid[0])) - 1] = radioIndex[0];
-      ret = SnmpGet(version, transport, NULL, radioOid, sizeof(radioOid) / sizeof(radioOid[0]),
-            &type, sizeof(type), 0);
+      ret = SnmpGetEx(transport, NULL, radioOid, sizeof(radioOid) / sizeof(radioOid[0]), &type, sizeof(type), 0, NULL);
    }
 
    if (ret == SNMP_ERR_SUCCESS)
@@ -282,36 +279,33 @@ static UINT32 HandlerAccessPointListAdopted(UINT32 version, SNMP_Variable *var,
       // MAC
       if (ret == SNMP_ERR_SUCCESS)
       {
-         ret = SnmpGet(version, transport, NULL, macOid, sizeof(macOid) / sizeof(macOid[0]),
-               &radioInfo->macAddr, MAC_ADDR_LENGTH, SG_RAW_RESULT);
+         ret = SnmpGetEx(transport, NULL, macOid, sizeof(macOid) / sizeof(macOid[0]), &radioInfo->macAddr, MAC_ADDR_LENGTH, SG_RAW_RESULT, NULL);
       }
 
       // Name
       if (ret == SNMP_ERR_SUCCESS)
       {
-         ret = SnmpGet(version, transport, NULL, descOid, sizeof(descOid) / sizeof(descOid[0]),
-               &radioInfo->name, sizeof(radioInfo->name), SG_STRING_RESULT);
+         ret = SnmpGetEx(transport, NULL, descOid, sizeof(descOid) / sizeof(descOid[0]), &radioInfo->name, sizeof(radioInfo->name), SG_STRING_RESULT, NULL);
       }
 
       // Channel
       if (ret == SNMP_ERR_SUCCESS)
       {
-         ret = SnmpGet(version, transport, NULL, channelOid, sizeof(channelOid) / sizeof(channelOid[0]),
-               &radioInfo->channel, sizeof(radioInfo->channel), 0);
+         ret = SnmpGetEx(transport, NULL, channelOid, sizeof(channelOid) / sizeof(channelOid[0]), &radioInfo->channel, sizeof(radioInfo->channel), 0, NULL);
       }
 
       // Transmitting power (in dBm)
       if (ret == SNMP_ERR_SUCCESS)
       {
-         ret = SnmpGet(version, transport, NULL, currentPowerDbOid, sizeof(currentPowerDbOid) / sizeof(currentPowerDbOid[0]),
-               &radioInfo->powerDBm, sizeof(radioInfo->powerDBm), 0);
+         ret = SnmpGetEx(transport, NULL, currentPowerDbOid, sizeof(currentPowerDbOid) / sizeof(currentPowerDbOid[0]),
+                         &radioInfo->powerDBm, sizeof(radioInfo->powerDBm), 0, NULL);
       }
 
       // Transmitting power (in mW)
       if (ret == SNMP_ERR_SUCCESS)
       {
-         ret = SnmpGet(version, transport, NULL, currentPowerMwOid, sizeof(currentPowerMwOid) / sizeof(currentPowerMwOid[0]),
-               &radioInfo->powerMW, sizeof(radioInfo->powerMW), 0);
+         ret = SnmpGetEx(transport, NULL, currentPowerMwOid, sizeof(currentPowerMwOid) / sizeof(currentPowerMwOid[0]),
+                         &radioInfo->powerMW, sizeof(radioInfo->powerMW), 0, NULL);
       }
 
       if (ret == SNMP_ERR_SUCCESS)
@@ -339,16 +333,16 @@ ObjectArray<AccessPointInfo> *SymbolDriver::getAccessPoints(SNMP_Transport *snmp
    ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
 
    // Adopted
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.2.1.2"),
-            HandlerAccessPointListAdopted, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.2.1.2"),
+                HandlerAccessPointListAdopted, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
    }
 
    // Unadopted
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.4.1.2"),
-            HandlerAccessPointListUnadopted, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.4.1.2"),
+                HandlerAccessPointListUnadopted, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
@@ -369,7 +363,7 @@ struct AP_SEARCH_DATA
 /**
  * Handler for unadopted access point search by MAC
  */
-static UINT32 HandlerAccessPointFindUnadopted(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerAccessPointFindUnadopted(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    AP_SEARCH_DATA *data = (AP_SEARCH_DATA *)arg;
    if (!memcmp(var->getValue(), data->macAddr, MAC_ADDR_LENGTH))
@@ -408,8 +402,8 @@ AccessPointState SymbolDriver::getAccessPointState(SNMP_Transport *snmp, StringM
    AP_SEARCH_DATA data;
    memcpy(data.macAddr, macAddr, MAC_ADDR_LENGTH);
    data.found = false;
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.4.1.2"), 
-                HandlerAccessPointFindUnadopted, &data, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.4.1.2"),
+                HandlerAccessPointFindUnadopted, &data) != SNMP_ERR_SUCCESS)
    {
       return AP_UNKNOWN;
    }
@@ -420,7 +414,7 @@ AccessPointState SymbolDriver::getAccessPointState(SNMP_Transport *snmp, StringM
 /**
  * Handler for mobile units enumeration
  */
-static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    int ret = SNMP_ERR_SUCCESS;
 
@@ -435,26 +429,26 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
 
    UINT32 ipAddr;
    oid[14] = 6; // wsCcRfMuIpAddr
-   ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &ipAddr, sizeof(ipAddr), 0);
+   ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &ipAddr, sizeof(ipAddr), 0, NULL);
    UINT32 vlanInfex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 4; // wsCcRfMuVlanIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &vlanInfex, sizeof(vlanInfex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &vlanInfex, sizeof(vlanInfex), 0, NULL);
    }
 
    UINT32 wlanInfex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 2; // wsCcRfMuWlanIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &wlanInfex, sizeof(vlanInfex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &wlanInfex, sizeof(vlanInfex), 0, NULL);
    }
 
    UINT32 rfIndex;
    if (ret == SNMP_ERR_SUCCESS)
    {
       oid[14] = 3; // wsCcRfMuRadioIndex
-      ret = SnmpGet(version, transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &rfIndex, sizeof(rfIndex), 0);
+      ret = SnmpGetEx(transport, NULL, oid, sizeof(oid) / sizeof(oid[0]), &rfIndex, sizeof(rfIndex), 0, NULL);
    }
 
    TCHAR ssid[MAX_OBJECT_NAME];
@@ -463,7 +457,7 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
       UINT32 wlanOid[] = { 1, 3, 6, 1, 4, 1, 388, 14, 3, 2, 1, 14, 1, 1, 4, 0 };
       wlanOid[(sizeof(wlanOid) / sizeof(wlanOid[0])) - 1] = wlanInfex;
 
-      ret = SnmpGet(version, transport, NULL, wlanOid, sizeof(wlanOid) / sizeof(wlanOid[0]), ssid, sizeof(ssid), 0);
+      ret = SnmpGetEx(transport, NULL, wlanOid, sizeof(wlanOid) / sizeof(wlanOid[0]), ssid, sizeof(ssid), 0, NULL);
    }
 
    if (ret == SNMP_ERR_SUCCESS)
@@ -495,8 +489,8 @@ ObjectArray<WirelessStationInfo> *SymbolDriver::getWirelessStations(SNMP_Transpo
 {
    ObjectArray<WirelessStationInfo> *wsList = new ObjectArray<WirelessStationInfo>(0, 16, true);
 
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.12.3.1.1"), // wsCcRfMuMac
-            HandlerWirelessStationList, wsList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.12.3.1.1"), // wsCcRfMuMac
+                HandlerWirelessStationList, wsList) != SNMP_ERR_SUCCESS)
    {
       delete wsList;
       wsList = NULL;
index f31eed0..6c12a92 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for TelcoBridges gateways
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -73,7 +73,7 @@ bool TelcoBridgesDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oi
 /**
  * Handler for enumerating indexes
  */
-static UINT32 HandlerIndex(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerIndex(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    if (var->getName()->getLength() == 12)
    {
@@ -92,7 +92,7 @@ static UINT32 HandlerIndex(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transpor
 /**
  * Handler for enumerating IP addresses via ipAddrTable
  */
-static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerIpAddr(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 index, dwNetMask, dwResult;
    UINT32 oidName[MAX_OID_LEN];
@@ -100,7 +100,7 @@ static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transpor
    size_t nameLen = pVar->getName()->getLength();
    memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
    oidName[nameLen - 5] = 3;  // Retrieve network mask for this IP
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
        {
                TCHAR buffer[1024];
@@ -113,7 +113,7 @@ static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transpor
        }
 
    oidName[nameLen - 5] = 2;  // Retrieve interface index for this IP
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &index, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &index, sizeof(UINT32), 0, NULL);
    if (dwResult == SNMP_ERR_SUCCESS)
    {
                InterfaceList *ifList = (InterfaceList *)pArg;
@@ -152,7 +152,7 @@ InterfaceList *TelcoBridgesDriver::getInterfaces(SNMP_Transport *snmp, StringMap
        DbgPrintf(6, _T("TelcoBridgesDriver::getInterfaces(%p)"), snmp);
 
    // Gather interface indexes
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.2.2.1.1"), HandlerIndex, ifList, FALSE) == SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.2.2.1.1"), HandlerIndex, ifList) == SNMP_ERR_SUCCESS)
    {
       // Enumerate interfaces
                for(int i = 0; i < ifList->size(); i++)
@@ -211,7 +211,7 @@ InterfaceList *TelcoBridgesDriver::getInterfaces(SNMP_Transport *snmp, StringMap
       }
 
       // Interface IP address'es and netmasks
-               UINT32 error = SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.4.20.1.1"), HandlerIpAddr, ifList, FALSE);
+               UINT32 error = SnmpWalk(snmp, _T(".1.3.6.1.2.1.4.20.1.1"), HandlerIpAddr, ifList);
       if (error == SNMP_ERR_SUCCESS)
       {
          success = true;
index 4266ade..126ee0a 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Ubiquity Networks access points
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -128,7 +128,7 @@ static bool ParseMACAddress(const TCHAR *text, BYTE *mac)
 /**
  * Handler for access point enumeration
  */
-static UINT32 HandlerAccessPointList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
@@ -192,8 +192,8 @@ static UINT32 HandlerAccessPointList(UINT32 version, SNMP_Variable *var, SNMP_Tr
 ObjectArray<AccessPointInfo> *UbiquityNetworksDriver::getAccessPoints(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
    ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.2.840.10036.1.1.1.1"),   // dot11StationID
-            HandlerAccessPointList, apList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.2.840.10036.1.1.1.1"),   // dot11StationID
+                HandlerAccessPointList, apList) != SNMP_ERR_SUCCESS)
    {
       delete apList;
       return NULL;
@@ -204,7 +204,7 @@ ObjectArray<AccessPointInfo> *UbiquityNetworksDriver::getAccessPoints(SNMP_Trans
 /**
  * Handler for mobile units enumeration
  */
-static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
@@ -242,8 +242,8 @@ static UINT32 HandlerWirelessStationList(UINT32 version, SNMP_Variable *var, SNM
 ObjectArray<WirelessStationInfo> *UbiquityNetworksDriver::getWirelessStations(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
 {
    ObjectArray<WirelessStationInfo> *wsList = new ObjectArray<WirelessStationInfo>(0, 16, true);
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.14988.1.1.1.2.1.3"), // mtxrWlRtabStrength
-            HandlerWirelessStationList, wsList, FALSE) != SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.4.1.14988.1.1.1.2.1.3"), // mtxrWlRtabStrength
+                HandlerWirelessStationList, wsList) != SNMP_ERR_SUCCESS)
    {
       delete wsList;
       wsList = NULL;
index a7772b2..38aafa9 100644 (file)
@@ -1537,7 +1537,7 @@ public:
    void setLastEventId(int nIndex, QWORD qwId) { if ((nIndex >= 0) && (nIndex < MAX_LAST_EVENTS)) m_qwLastEvents[nIndex] = qwId; }
 
    UINT32 callSnmpEnumerate(const TCHAR *pszRootOid,
-      UINT32 (* pHandler)(UINT32, SNMP_Variable *, SNMP_Transport *, void *), void *pArg, const TCHAR *context = NULL);
+      UINT32 (* pHandler)(SNMP_Variable *, SNMP_Transport *, void *), void *pArg, const TCHAR *context = NULL);
 
        nxmap_ObjList *getL2Topology();
        nxmap_ObjList *buildL2Topology(UINT32 *pdwStatus, int radius, bool includeEndNodes);
index 265a5b8..20a8b0b 100644 (file)
@@ -212,7 +212,7 @@ public:
 
 class VrrpRouter
 {
-       friend UINT32 VRRPHandler(UINT32, SNMP_Variable *, SNMP_Transport *, void *);
+       friend UINT32 VRRPHandler(SNMP_Variable *, SNMP_Transport *, void *);
 
 private:
        UINT32 m_id;
@@ -223,10 +223,10 @@ private:
        UINT32 *m_ipAddrList;
 
        void addVirtualIP(SNMP_Variable *var);
-       static UINT32 walkerCallback(UINT32 snmpVersion, SNMP_Variable *var, SNMP_Transport *transport, void *arg);
+       static UINT32 walkerCallback(SNMP_Variable *var, SNMP_Transport *transport, void *arg);
 
 protected:
-       bool readVirtualIP(UINT32 snmpVersion, SNMP_Transport *transport);
+       bool readVirtualIP(SNMP_Transport *transport);
 
 public:
        VrrpRouter(UINT32 id, UINT32 ifIndex, int state, BYTE *macAddr);
@@ -242,7 +242,7 @@ public:
 
 class VrrpInfo
 {
-       friend UINT32 VRRPHandler(UINT32, SNMP_Variable *, SNMP_Transport *, void *);
+       friend UINT32 VRRPHandler(SNMP_Variable *, SNMP_Transport *, void *);
 
 private:
        int m_version;
@@ -279,7 +279,7 @@ void AddCDPNeighbors(Node *node, LinkLayerNeighbors *nbs);
 void AddSTPNeighbors(Node *node, LinkLayerNeighbors *nbs);
 void BuildLldpId(int type, const BYTE *data, int length, TCHAR *id, int idLen);
 
-void BridgeMapPorts(int snmpVersion, SNMP_Transport *transport, InterfaceList *ifList);
+void BridgeMapPorts(SNMP_Transport *transport, InterfaceList *ifList);
 
 VrrpInfo *GetVRRPInfo(Node *node);
 
index b9a6f81..b839755 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -156,7 +156,7 @@ void NetworkDeviceDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid,
 /**
  * Handler for enumerating indexes
  */
-static UINT32 HandlerIndex(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerIndex(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
        ((InterfaceList *)pArg)->add(new InterfaceInfo(pVar->getValueAsUInt()));
    return SNMP_ERR_SUCCESS;
@@ -165,7 +165,7 @@ static UINT32 HandlerIndex(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport
 /**
  * Handler for enumerating indexes via ifXTable
  */
-static UINT32 HandlerIndexIfXTable(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerIndexIfXTable(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    SNMP_ObjectId *name = pVar->getName();
    UINT32 index = name->getValue()[name->getLength() - 1];
@@ -179,7 +179,7 @@ static UINT32 HandlerIndexIfXTable(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_T
 /**
  * Handler for enumerating IP addresses via ipAddrTable
  */
-static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
+static UINT32 HandlerIpAddr(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    UINT32 index, dwNetMask, dwResult;
    UINT32 oidName[MAX_OID_LEN];
@@ -187,7 +187,7 @@ static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transpor
    size_t nameLen = pVar->getName()->getLength();
    memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
    oidName[nameLen - 5] = 3;  // Retrieve network mask for this IP
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
        {
                TCHAR buffer[1024];
@@ -200,7 +200,7 @@ static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transpor
        }
 
    oidName[nameLen - 5] = 2;  // Retrieve interface index for this IP
-   dwResult = SnmpGet(dwVersion, pTransport, NULL, oidName, nameLen, &index, sizeof(UINT32), 0);
+   dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &index, sizeof(UINT32), 0, NULL);
    if (dwResult == SNMP_ERR_SUCCESS)
    {
                InterfaceList *ifList = (InterfaceList *)pArg;
@@ -223,7 +223,7 @@ static UINT32 HandlerIpAddr(UINT32 dwVersion, SNMP_Variable *pVar, SNMP_Transpor
 /**
  * Handler for enumerating IP addresses via ipAddressTable
  */
-static UINT32 HandlerIpAddressTable(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerIpAddressTable(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    InterfaceList *ifList = (InterfaceList *)arg;
 
@@ -289,7 +289,7 @@ static UINT32 HandlerIpAddressTable(UINT32 version, SNMP_Variable *var, SNMP_Tra
 /**
  * Handler for enumerating IP address prefixes via ipAddressPrefixTable
  */
-static UINT32 HandlerIpAddressPrefixTable(UINT32 version, SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
+static UINT32 HandlerIpAddressPrefixTable(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    InterfaceList *ifList = (InterfaceList *)arg;
    const UINT32 *oid = var->getName()->getValue();
@@ -365,10 +365,10 @@ InterfaceList *NetworkDeviceDriver::getInterfaces(SNMP_Transport *snmp, StringMa
    pIfList = new InterfaceList(iNumIf);
 
    // Gather interface indexes
-   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.2.2.1.1"), HandlerIndex, pIfList, FALSE) == SNMP_ERR_SUCCESS)
+   if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.2.2.1.1"), HandlerIndex, pIfList) == SNMP_ERR_SUCCESS)
    {
       // Gather additional interfaces from ifXTable
-      SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.31.1.1.1.1"), HandlerIndexIfXTable, pIfList, FALSE);
+      SnmpWalk(snmp, _T(".1.3.6.1.2.1.31.1.1.1.1"), HandlerIndexIfXTable, pIfList);
 
       // Enumerate interfaces
                for(i = 0; i < pIfList->size(); i++)
@@ -506,7 +506,7 @@ InterfaceList *NetworkDeviceDriver::getInterfaces(SNMP_Transport *snmp, StringMa
       }
 
       // Interface IP address'es and netmasks
-               error = SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.4.20.1.1"), HandlerIpAddr, pIfList, FALSE);
+               error = SnmpWalk(snmp, _T(".1.3.6.1.2.1.4.20.1.1"), HandlerIpAddr, pIfList);
       if (error == SNMP_ERR_SUCCESS)
       {
          bSuccess = TRUE;
@@ -517,10 +517,10 @@ InterfaceList *NetworkDeviceDriver::getInterfaces(SNMP_Transport *snmp, StringMa
                }
 
       // Get IP addresses from ipAddressTable if available
-               SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.4.34.1.3"), HandlerIpAddressTable, pIfList, FALSE);
+               SnmpWalk(snmp, _T(".1.3.6.1.2.1.4.34.1.3"), HandlerIpAddressTable, pIfList);
       if (pIfList->isPrefixWalkNeeded())
       {
-               SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.4.32.1.5"), HandlerIpAddressPrefixTable, pIfList, FALSE);
+               SnmpWalk(snmp, _T(".1.3.6.1.2.1.4.32.1.5"), HandlerIpAddressPrefixTable, pIfList);
       }
    }
        else
@@ -601,7 +601,7 @@ void NetworkDeviceDriver::getInterfaceState(SNMP_Transport *snmp, StringMap *att
 /**
  * Handler for VLAN enumeration
  */
-static UINT32 HandlerVlanList(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
 
@@ -653,7 +653,7 @@ static void ParseVlanPorts(VlanList *vlanList, VlanInfo *vlan, BYTE map, int off
 /**
  * Handler for VLAN egress port enumeration
  */
-static UINT32 HandlerVlanEgressPorts(UINT32 version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+static UINT32 HandlerVlanEgressPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
        UINT32 vlanId = var->getName()->getValue()[var->getName()->getLength() - 1];
@@ -684,18 +684,18 @@ VlanList *NetworkDeviceDriver::getVlans(SNMP_Transport *snmp, StringMap *attribu
        VlanList *list = new VlanList();
        
    // dot1qVlanStaticName
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.17.7.1.4.3.1.1"), HandlerVlanList, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.17.7.1.4.3.1.1"), HandlerVlanList, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
    // dot1qVlanCurrentEgressPorts
-       if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.17.7.1.4.2.1.4"), HandlerVlanEgressPorts, list, FALSE) != SNMP_ERR_SUCCESS)
+       if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.17.7.1.4.2.1.4"), HandlerVlanEgressPorts, list) != SNMP_ERR_SUCCESS)
                goto failure;
 
    if (list->getData() == NULL)
    {
       // Some devices does not return anything under dot1qVlanCurrentEgressPorts.
       // In that case we use dot1qVlanStaticEgressPorts
-          if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.2.1.17.7.1.4.3.1.2"), HandlerVlanEgressPorts, list, FALSE) != SNMP_ERR_SUCCESS)
+          if (SnmpWalk(snmp, _T(".1.3.6.1.2.1.17.7.1.4.3.1.2"), HandlerVlanEgressPorts, list) != SNMP_ERR_SUCCESS)
                   goto failure;
    }
 
index 78449b8..a90cdb0 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2011 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
index a4432e3..f5b2a8d 100644 (file)
@@ -1,5 +1,6 @@
 SOURCES = ber.cpp engine.cpp main.cpp mib.cpp oid.cpp pdu.cpp \
-          security.cpp transport.cpp util.cpp variable.cpp zfile.cpp
+          security.cpp snapshot.cpp transport.cpp util.cpp \
+          variable.cpp zfile.cpp
 
 lib_LTLIBRARIES = libnxsnmp.la
 
index 14d2d2d..23afbe2 100644 (file)
@@ -93,15 +93,24 @@ int SNMP_ObjectId::compare(const TCHAR *pszOid)
 }
 
 /**
- * Compare this OID to another
+ * Compare this OID to another. Possible return values are:
+ *    OID_EQUAL     both OIDs are equal
+ *    OID_SHORTER   this OID is shorter than given, but common parts are equal
+ *    OID_LONGER    this OID is longer than given, but common parts are equal
+ *    OID_PRECEDING this OID preceding given OID (less than given OID)
+ *    OID_FOLLOWING this OID following given OID (greater than given OID)
  */
 int SNMP_ObjectId::compare(const UINT32 *oid, size_t length)
 {
    if ((oid == NULL) || (length == 0) || (m_value == NULL))
       return OID_ERROR;
 
-   if (memcmp(m_value, oid, min(length, m_length) * sizeof(UINT32)))
-      return OID_NOT_EQUAL;
+   size_t stop = min(length, m_length);
+   for(size_t i = 0; i < stop; i++)
+   {
+      if (m_value[i] != oid[i])
+         return (m_value[i] < oid[i]) ? OID_PRECEDING : OID_FOLLOWING;
+   }
 
    return (length == m_length) ? OID_EQUAL : 
             ((length < m_length) ? OID_SHORTER : OID_LONGER);
diff --git a/src/snmp/libnxsnmp/snapshot.cpp b/src/snmp/libnxsnmp/snapshot.cpp
new file mode 100644 (file)
index 0000000..8274a88
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+** NetXMS - Network Management System
+** SNMP support library
+** Copyright (C) 2003-2016 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 3 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** File: snapshot.cpp
+**
+**/
+
+#include "libnxsnmp.h"
+#include <uthash.h>
+
+/**
+ * Snapshot index entry
+ */
+struct SNMP_SnapshotIndexEntry
+{
+   UT_hash_handle hh;
+   SNMP_Variable *var;
+   int pos;
+};
+
+/**
+ * Constructor
+ */
+SNMP_Snapshot::SNMP_Snapshot()
+{
+   m_values = new ObjectArray<SNMP_Variable>(64, 64, true);
+   m_index = NULL;
+}
+
+/**
+ * Destructor
+ */
+SNMP_Snapshot::~SNMP_Snapshot()
+{
+   delete m_values;
+
+   SNMP_SnapshotIndexEntry *entry, *tmp;
+   HASH_ITER(hh, m_index, entry, tmp)
+   {
+      HASH_DEL(m_index, entry);
+      free(entry);
+   }
+}
+
+/**
+ * Build OID index
+ */
+void SNMP_Snapshot::buildIndex()
+{
+   for(int i = 0; i < m_values->size(); i++)
+   {
+      SNMP_Variable *v = m_values->get(i);
+      SNMP_SnapshotIndexEntry *entry = (SNMP_SnapshotIndexEntry *)malloc(sizeof(SNMP_SnapshotIndexEntry));
+      entry->var = v;
+      entry->pos = i;
+      HASH_ADD_KEYPTR(hh, m_index, entry->var->getName()->getValue(), entry->var->getName()->getLength() * sizeof(UINT32), entry);
+   }
+}
+
+/**
+ * Find OID index entry by OID
+ */
+SNMP_SnapshotIndexEntry *SNMP_Snapshot::find(const UINT32 *oid, size_t oidLen) const
+{
+   SNMP_SnapshotIndexEntry *entry;
+   HASH_FIND(hh, m_index, oid, oidLen * sizeof(UINT32), entry);
+   return entry;
+}
+
+/**
+ * Find OID index entry by OID
+ */
+SNMP_SnapshotIndexEntry *SNMP_Snapshot::find(const TCHAR *oid) const
+{
+   UINT32 binOid[MAX_OID_LEN];
+   size_t oidLen = SNMPParseOID(oid, binOid, MAX_OID_LEN);
+   if (oidLen == 0)
+      return NULL;
+   return find(binOid, oidLen);
+}
+
+/**
+ * Snapshot creation callback
+ */
+UINT32 SNMP_Snapshot::callback(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+{
+   ((SNMP_Snapshot *)arg)->m_values->add(new SNMP_Variable(var));
+   return SNMP_ERR_SUCCESS;
+}
+
+/**
+ * Create snapshot (using text OID)
+ */
+SNMP_Snapshot *SNMP_Snapshot::create(SNMP_Transport *transport, const TCHAR *baseOid)
+{
+   SNMP_Snapshot *s = new SNMP_Snapshot();
+   if (SnmpWalk(transport, baseOid, SNMP_Snapshot::callback, s) == SNMP_ERR_SUCCESS)
+      s->buildIndex();
+   else
+      delete_and_null(s);
+   return s;
+}
+
+/**
+ * Create snapshot (using binary OID)
+ */
+SNMP_Snapshot *SNMP_Snapshot::create(SNMP_Transport *transport, const UINT32 *baseOid, size_t oidLen)
+{
+   SNMP_Snapshot *s = new SNMP_Snapshot();
+   if (SnmpWalk(transport, baseOid, oidLen, SNMP_Snapshot::callback, s) == SNMP_ERR_SUCCESS)
+      s->buildIndex();
+   else
+      delete_and_null(s);
+   return s;
+}
+
+/**
+ * Get variable
+ */
+SNMP_Variable *SNMP_Snapshot::get(const TCHAR *oid) const
+{
+   SNMP_SnapshotIndexEntry *entry = find(oid);
+   return (entry != NULL) ? entry->var : NULL;
+}
+
+/**
+ * Get variable
+ */
+SNMP_Variable *SNMP_Snapshot::get(const UINT32 *oid, size_t oidLen) const
+{
+   SNMP_SnapshotIndexEntry *entry = find(oid, oidLen);
+   return (entry != NULL) ? entry->var : NULL;
+}
+
+/**
+ * Get next variable for given OID
+ */
+SNMP_Variable *SNMP_Snapshot::getNext(const TCHAR *oid) const
+{
+   UINT32 binOid[MAX_OID_LEN];
+   size_t oidLen = SNMPParseOID(oid, binOid, MAX_OID_LEN);
+   if (oidLen == 0)
+      return NULL;
+   return getNext(binOid, oidLen);
+}
+
+/**
+ * Get next variable for given OID
+ */
+SNMP_Variable *SNMP_Snapshot::getNext(const UINT32 *oid, size_t oidLen) const
+{
+   SNMP_SnapshotIndexEntry *entry = find(oid, oidLen);
+   if (entry != NULL)
+      return m_values->get(entry->pos + 1);
+
+   for(int i = 0; i < m_values->size(); i++)
+   {
+      SNMP_Variable *v = m_values->get(i);
+      int c = v->getName()->compare(oid, oidLen);
+      if ((c == OID_FOLLOWING) || (c == OID_LONGER))
+         return v;
+   }
+   return NULL;
+}
+
+/**
+ * Walk part of snapshot
+ */
+EnumerationCallbackResult SNMP_Snapshot::walk(const TCHAR *baseOid, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const
+{
+   UINT32 binOid[MAX_OID_LEN];
+   size_t oidLen = SNMPParseOID(baseOid, binOid, MAX_OID_LEN);
+   if (oidLen == 0)
+      return _CONTINUE;
+   return walk(binOid, oidLen, handler, userArg);
+}
+
+/**
+ * Walk part of snapshot
+ */
+EnumerationCallbackResult SNMP_Snapshot::walk(const UINT32 *baseOid, size_t baseOidLen, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const
+{
+   EnumerationCallbackResult result = _CONTINUE;
+   SNMP_Variable *curr = getNext(baseOid, baseOidLen);
+   while(curr->getName()->compare(baseOid, baseOidLen) == OID_LONGER)
+   {
+      result = handler(curr, this, userArg);
+      if (result == _STOP)
+         break;
+      curr = getNext(curr->getName()->getValue(), curr->getName()->getLength());
+   }
+   return result;
+}
index a848e8a..7c57a8c 100644 (file)
@@ -101,7 +101,7 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpGet(int version, SNMP_Transport *transport,
  * Get value for SNMP variable
  * If szOidStr is not NULL, string representation of OID is used, otherwise -
  * binary representation from oidBinary and dwOidLen
- * If SG_RAW_RESULT flag given and dataLen is not NULL actial data length will be stored there
+ * If SG_RAW_RESULT flag given and dataLen is not NULL actual data length will be stored there
  * Note: buffer size is in bytes
  */
 UINT32 LIBNXSNMP_EXPORTABLE SnmpGetEx(SNMP_Transport *pTransport,
@@ -231,27 +231,42 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpGetEx(SNMP_Transport *pTransport,
 /**
  * Enumerate multiple values by walking through MIB, starting at given root
  */
-UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTransport, const TCHAR *szRootOid,
-                                     UINT32 (* pHandler)(UINT32, SNMP_Variable *, SNMP_Transport *, void *),
-                                     void *pUserArg, BOOL bVerbose)
+UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(SNMP_Transport *transport, const TCHAR *rootOid,
+                                     UINT32 (* handler)(SNMP_Variable *, SNMP_Transport *, void *),
+                                     void *userArg, bool logErrors)
 {
-       if (pTransport == NULL)
-               return SNMP_ERR_COMM;
+   if (transport == NULL)
+      return SNMP_ERR_COMM;
 
-   // Get root
-       UINT32 pdwRootName[MAX_OID_LEN];
-   size_t dwRootLen = SNMPParseOID(szRootOid, pdwRootName, MAX_OID_LEN);
-   if (dwRootLen == 0)
+   UINT32 rootOidBin[MAX_OID_LEN];
+   size_t rootOidLen = SNMPParseOID(rootOid, rootOidBin, MAX_OID_LEN);
+   if (rootOidLen == 0)
    {
-      InetAddress a = pTransport->getPeerIpAddress();
-      nxlog_write(s_msgParseError, NXLOG_WARNING, "ssA", szRootOid, _T("SnmpWalk"), &a);
+      if (logErrors)
+      {
+         InetAddress a = transport->getPeerIpAddress();
+         nxlog_write(s_msgParseError, NXLOG_WARNING, "ssA", rootOid, _T("SnmpWalk"), &a);
+      }
       return SNMP_ERR_BAD_OID;
    }
 
+   return SnmpWalk(transport, rootOidBin, rootOidLen, handler, userArg, logErrors);
+}
+
+/**
+ * Enumerate multiple values by walking through MIB, starting at given root
+ */
+UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(SNMP_Transport *transport, const UINT32 *rootOid, size_t rootOidLen,
+                                     UINT32 (* handler)(SNMP_Variable *, SNMP_Transport *, void *),
+                                     void *userArg, bool logErrors)
+{
+       if (transport == NULL)
+               return SNMP_ERR_COMM;
+
        // First OID to request
    UINT32 pdwName[MAX_OID_LEN];
-   memcpy(pdwName, pdwRootName, dwRootLen * sizeof(UINT32));
-   size_t nameLength = dwRootLen;
+   memcpy(pdwName, rootOid, rootOidLen * sizeof(UINT32));
+   size_t nameLength = rootOidLen;
 
    // Walk the MIB
    UINT32 dwResult;
@@ -260,10 +275,10 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTranspor
    size_t firstObjectNameLen = 0;
    while(bRunning)
    {
-      SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_NEXT_REQUEST, (UINT32)InterlockedIncrement(&s_requestId), dwVersion);
+      SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_NEXT_REQUEST, (UINT32)InterlockedIncrement(&s_requestId), transport->getSnmpVersion());
       pRqPDU->bindVariable(new SNMP_Variable(pdwName, nameLength));
           SNMP_PDU *pRespPDU;
-      dwResult = pTransport->doRequest(pRqPDU, &pRespPDU, s_snmpTimeout, 3);
+      dwResult = transport->doRequest(pRqPDU, &pRespPDU, s_snmpTimeout, 3);
 
       // Analyze response
       if (dwResult == SNMP_ERR_SUCCESS)
@@ -279,8 +294,8 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTranspor
                // Should we stop walking?
                                        // Some buggy SNMP agents may return first value after last one
                                        // (Toshiba Strata CTX do that for example), so last check is here
-               if ((pVar->getName()->getLength() < dwRootLen) ||
-                   (memcmp(pdwRootName, pVar->getName()->getValue(), dwRootLen * sizeof(UINT32))) ||
+               if ((pVar->getName()->getLength() < rootOidLen) ||
+                   (memcmp(rootOid, pVar->getName()->getValue(), rootOidLen * sizeof(UINT32))) ||
                                                 (pVar->getName()->compare(pdwName, nameLength) == OID_EQUAL) ||
                                                 (pVar->getName()->compare(firstObjectName, firstObjectNameLen) == OID_EQUAL))
                {
@@ -298,7 +313,7 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTranspor
                                        }
 
                // Call user's callback function for processing
-               dwResult = pHandler(dwVersion, pVar, pTransport, pUserArg);
+               dwResult = handler(pVar, transport, userArg);
                if (dwResult != SNMP_ERR_SUCCESS)
                {
                   bRunning = FALSE;
@@ -321,7 +336,7 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(UINT32 dwVersion, SNMP_Transport *pTranspor
       }
       else
       {
-         if (bVerbose)
+         if (logErrors)
             nxlog_write(s_msgGetError, EVENTLOG_ERROR_TYPE, "d", dwResult);
          bRunning = FALSE;
       }
index 0ed3499..69d54a9 100644 (file)
@@ -66,7 +66,7 @@ SNMP_Variable::SNMP_Variable(UINT32 *name, size_t nameLen)
 /**
  * Copy constructor
  */
-SNMP_Variable::SNMP_Variable(SNMP_Variable *src)
+SNMP_Variable::SNMP_Variable(const SNMP_Variable *src)
 {
    m_valueLength = src->m_valueLength;
    m_value = (src->m_value != NULL) ? (BYTE *)nx_memdup(src->m_value, src->m_valueLength) : NULL;
@@ -164,7 +164,7 @@ bool SNMP_Variable::parse(BYTE *data, size_t varLength)
  * Get raw value
  * Returns actual data length
  */
-size_t SNMP_Variable::getRawValue(BYTE *buffer, size_t bufSize)
+size_t SNMP_Variable::getRawValue(BYTE *buffer, size_t bufSize) const
 {
        size_t len = min(bufSize, (size_t)m_valueLength);
    memcpy(buffer, m_value, len);
@@ -174,7 +174,7 @@ size_t SNMP_Variable::getRawValue(BYTE *buffer, size_t bufSize)
 /**
  * Get value as unsigned integer
  */
-UINT32 SNMP_Variable::getValueAsUInt()
+UINT32 SNMP_Variable::getValueAsUInt() const
 {
    UINT32 dwValue;
 
@@ -202,7 +202,7 @@ UINT32 SNMP_Variable::getValueAsUInt()
 /**
  * Get value as signed integer
  */
-LONG SNMP_Variable::getValueAsInt()
+LONG SNMP_Variable::getValueAsInt() const
 {
    LONG iValue;
 
@@ -231,7 +231,7 @@ LONG SNMP_Variable::getValueAsInt()
  * Get value as string
  * Note: buffer size is in characters
  */
-TCHAR *SNMP_Variable::getValueAsString(TCHAR *buffer, size_t bufferSize)
+TCHAR *SNMP_Variable::getValueAsString(TCHAR *buffer, size_t bufferSize) const
 {
    size_t length;
 
@@ -289,7 +289,7 @@ TCHAR *SNMP_Variable::getValueAsString(TCHAR *buffer, size_t bufferSize)
  * Get value as printable string, doing bin to hex conversion if necessary
  * Note: buffer size is in characters
  */
-TCHAR *SNMP_Variable::getValueAsPrintableString(TCHAR *buffer, size_t bufferSize, bool *convertToHex)
+TCHAR *SNMP_Variable::getValueAsPrintableString(TCHAR *buffer, size_t bufferSize, bool *convertToHex) const
 {
    size_t length;
        bool convertToHexAllowed = *convertToHex;
@@ -361,9 +361,9 @@ TCHAR *SNMP_Variable::getValueAsPrintableString(TCHAR *buffer, size_t bufferSize
 }
 
 /**
- * Get value as object id
+ * Get value as object id. Returned object must be destroyed by caller
  */
-SNMP_ObjectId *SNMP_Variable::getValueAsObjectId()
+SNMP_ObjectId *SNMP_Variable::getValueAsObjectId() const
 {
    SNMP_ObjectId *oid = NULL;
 
@@ -377,7 +377,7 @@ SNMP_ObjectId *SNMP_Variable::getValueAsObjectId()
 /**
  * Get value as MAC address
  */
-TCHAR *SNMP_Variable::getValueAsMACAddr(TCHAR *buffer)
+TCHAR *SNMP_Variable::getValueAsMACAddr(TCHAR *buffer) const
 {
    int i;
    TCHAR *pszPos;
@@ -399,7 +399,7 @@ TCHAR *SNMP_Variable::getValueAsMACAddr(TCHAR *buffer)
 /**
  * Get value as IP address
  */
-TCHAR *SNMP_Variable::getValueAsIPAddr(TCHAR *buffer)
+TCHAR *SNMP_Variable::getValueAsIPAddr(TCHAR *buffer) const
 {
    // Ignore type and check only length
    if (m_valueLength >= 4)