class SNMP_ObjectId refactored; all SNMP walks now use SnmpWalk function from libnxsn...
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 1 May 2016 20:10:36 +0000 (23:10 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 1 May 2016 20:10:36 +0000 (23:10 +0300)
52 files changed:
.gitignore
configure.ac
include/nxsnmp.h
src/server/core/agent.cpp
src/server/core/bridge.cpp
src/server/core/cdp.cpp
src/server/core/components.cpp
src/server/core/dctable.cpp
src/server/core/dctcolumn.cpp
src/server/core/fdb.cpp
src/server/core/lldp.cpp
src/server/core/ndp.cpp
src/server/core/node.cpp
src/server/core/nxsl_classes.cpp
src/server/core/nxslext.cpp
src/server/core/objtools.cpp
src/server/core/session.cpp
src/server/core/snmp.cpp
src/server/core/snmptrap.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/libnxsrv/ndd.cpp
src/snmp/libnxsnmp/oid.cpp
src/snmp/libnxsnmp/pdu.cpp
src/snmp/libnxsnmp/snapshot.cpp
src/snmp/libnxsnmp/transport.cpp
src/snmp/libnxsnmp/util.cpp
src/snmp/libnxsnmp/variable.cpp
src/snmp/nxsnmpget/nxsnmpget.cpp
src/snmp/nxsnmpwalk/nxsnmpwalk.cpp
tests/Makefile.am
tests/test-libnxsnmp/.cproject [new file with mode: 0644]
tests/test-libnxsnmp/.project [new file with mode: 0644]
tests/test-libnxsnmp/.settings/language.settings.xml [new file with mode: 0644]
tests/test-libnxsnmp/Makefile.am [copied from tests/Makefile.am with 56% similarity]
tests/test-libnxsnmp/test-libnxsnmp.cpp [new file with mode: 0644]

index 5b95a2f..2161c4c 100644 (file)
@@ -217,6 +217,7 @@ target
 /tests/test-libnetxms/test-libnetxms
 /tests/test-libnxcc/test-libnxcc
 /tests/test-libnxdb/test-libnxdb
+/tests/test-libnxsnmp/test-libnxsnmp
 /tools/inst.tar.gz
 /webui/eclipse
 /x64
index 892a271..4c9629d 100644 (file)
@@ -3267,6 +3267,7 @@ AC_CONFIG_FILES([
        tests/test-libnetxms/Makefile
        tests/test-libnxcc/Makefile
        tests/test-libnxdb/Makefile
+       tests/test-libnxsnmp/Makefile
        tools/Makefile
 ])
 
index 9fa7277..b290982 100644 (file)
@@ -364,29 +364,36 @@ public:
 class LIBNXSNMP_EXPORTABLE SNMP_ObjectId
 {
 private:
-   UINT32 m_length;
+   size_t m_length;
    UINT32 *m_value;
-   TCHAR *m_textValue;
-
-   void convertToText();
 
 public:
    SNMP_ObjectId();
-   SNMP_ObjectId(SNMP_ObjectId *src);
-   SNMP_ObjectId(size_t length, const UINT32 *value);
+   SNMP_ObjectId(const SNMP_ObjectId &src);
+   SNMP_ObjectId(const UINT32 *value, size_t length);
    ~SNMP_ObjectId();
 
-   size_t getLength() { return (size_t)m_length; }
-   const UINT32 *getValue() { return m_value; }
-   const TCHAR *getValueAsText() { return CHECK_NULL(m_textValue); }
-   void setValue(UINT32 *value, size_t length);
-   void extend(UINT32 subId);
+   SNMP_ObjectId& operator =(const SNMP_ObjectId &src);
+
+   size_t length() const { return m_length; }
+   const UINT32 *value() const { return m_value; }
+   String toString() const;
+   TCHAR *toString(TCHAR *buffer, size_t bufferSize) const;
+   bool isValid() const { return (m_length > 0) && (m_value != NULL); }
+   bool isZeroDotZero() const { return (m_length == 2) && (m_value[0] == 0) && (m_value[1] == 0); }
+   UINT32 getElement(size_t index) const { return (index < m_length) ? m_value[index] : 0; }
 
-   int compare(const TCHAR *oid);
-   int compare(const UINT32 *oid, size_t length);
-       int compare(SNMP_ObjectId *oid);
+   int compare(const TCHAR *oid) const;
+   int compare(const UINT32 *oid, size_t length) const;
+       int compare(const SNMP_ObjectId& oid) const;
+
+   void setValue(const UINT32 *value, size_t length);
+   void extend(UINT32 subId);
+   void extend(const UINT32 *subId, size_t length);
+   void truncate(size_t count);
+   void changeElement(size_t pos, UINT32 value) { if (pos < m_length) m_value[pos] = value; }
 
-   bool isZeroDotZero() { return (m_length == 2) && (m_value[0] == 0) && (m_value[1] == 0); }
+   static SNMP_ObjectId parse(const TCHAR *oid);
 };
 
 /**
@@ -395,7 +402,7 @@ public:
 class LIBNXSNMP_EXPORTABLE SNMP_Variable
 {
 private:
-   SNMP_ObjectId *m_name;
+   SNMP_ObjectId m_name;
    UINT32 m_type;
    size_t m_valueLength;
    BYTE *m_value;
@@ -403,14 +410,15 @@ private:
 public:
    SNMP_Variable();
    SNMP_Variable(const TCHAR *name);
-   SNMP_Variable(UINT32 *name, size_t nameLen);
+   SNMP_Variable(const UINT32 *name, size_t nameLen);
+   SNMP_Variable(const SNMP_ObjectId &name);
    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() const { return m_name; }
+   const 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; }
@@ -420,7 +428,7 @@ public:
    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;
+   SNMP_ObjectId getValueAsObjectId() const;
    TCHAR *getValueAsMACAddr(TCHAR *buffer) const;
    TCHAR *getValueAsIPAddr(TCHAR *buffer) const;
 
index d5e8e57..4b72660 100644 (file)
@@ -401,13 +401,13 @@ void AgentConnectionEx::onSnmpTrap(NXCPMessage *msg)
                }
                else if (pdu->getCommand() == SNMP_REPORT)
                {
-                  DbgPrintf(6, _T("AgentConnectionEx::onSnmpTrap(): REPORT PDU with error %s"), pdu->getVariable(0)->getName()->getValueAsText());
+                  DbgPrintf(6, _T("AgentConnectionEx::onSnmpTrap(): REPORT PDU with error %s"), (const TCHAR *)pdu->getVariable(0)->getName().toString());
                }
                delete pdu;
             }
             else if (pdu->getCommand() == SNMP_REPORT)
             {
-               DbgPrintf(6, _T("AgentConnectionEx::onSnmpTrap(): REPORT PDU with error %s"), pdu->getVariable(0)->getName()->getValueAsText());
+               DbgPrintf(6, _T("AgentConnectionEx::onSnmpTrap(): REPORT PDU with error %s"), (const TCHAR *)pdu->getVariable(0)->getName().toString());
             }
          }
          else
index 270397f..0bc0d92 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** 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 General Public License as published by
  */
 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(), 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));
-
-       SNMP_PDU *pRespPDU;
-   UINT32 rcc = transport->doRequest(pRqPDU, &pRespPDU, SnmpGetDefaultTimeout(), 3);
-       delete pRqPDU;
-
-       if (rcc == SNMP_ERR_SUCCESS)
-   {
-               UINT32 ifIndex = pRespPDU->getVariable(0)->getValueAsUInt();
-               InterfaceList *ifList = (InterfaceList *)arg;
-               for(int i = 0; i < ifList->size(); i++)
-                       if (ifList->get(i)->index == ifIndex)
-                       {
-                               ifList->get(i)->bridgePort = var->getValueAsUInt();
-                               break;
-                       }
-      delete pRespPDU;
-       }
+   UINT32 ifIndex = var->getValueAsUInt();
+   InterfaceList *ifList = (InterfaceList *)arg;
+   for(int i = 0; i < ifList->size(); i++)
+      if (ifList->get(i)->index == ifIndex)
+      {
+         ifList->get(i)->bridgePort = var->getName().getElement(11);
+         break;
+      }
        return SNMP_ERR_SUCCESS;
 }
 
@@ -61,5 +43,5 @@ static UINT32 PortMapCallback(SNMP_Variable *var, SNMP_Transport *transport, voi
  */
 void BridgeMapPorts(SNMP_Transport *transport, InterfaceList *ifList)
 {
-       SnmpWalk(transport, _T(".1.3.6.1.2.1.17.1.4.1.1"), PortMapCallback, ifList);
+       SnmpWalk(transport, _T(".1.3.6.1.2.1.17.1.4.1.2"), PortMapCallback, ifList);
 }
index 6c3bb57..6559429 100644 (file)
@@ -28,7 +28,7 @@
 static UINT32 CDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        Node *node = (Node *)((LinkLayerNeighbors *)arg)->getData();
-       SNMP_ObjectId *oid = var->getName();
+       const SNMP_ObjectId& oid = var->getName();
 
        UINT32 remoteIp;
        var->getRawValue((BYTE *)&remoteIp, sizeof(UINT32));
@@ -45,12 +45,11 @@ static UINT32 CDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void
        DbgPrintf(6, _T("CDP(%s [%d]): remote node is %s [%d]"), node->getName(), node->getId(), remoteNode->getName(), remoteNode->getId());
 
        // 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(), transport->getSnmpVersion());
 
-       newOid[13] = 7; // cdpCacheDevicePort
-       pRqPDU->bindVariable(new SNMP_Variable(newOid, oid->getLength()));
+   SNMP_ObjectId newOid(oid);
+       newOid.changeElement(13, 7);    // cdpCacheDevicePort
+       pRqPDU->bindVariable(new SNMP_Variable(newOid));
 
    SNMP_PDU *pRespPDU = NULL;
    UINT32 rcc = transport->doRequest(pRqPDU, &pRespPDU, SnmpGetDefaultTimeout(), 3);
@@ -71,7 +70,7 @@ static UINT32 CDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void
                                LL_NEIGHBOR_INFO info;
 
                                // Index for cdpCacheTable is cdpCacheIfIndex, cdpCacheDeviceIndex
-                               info.ifLocal = oid->getValue()[oid->getLength() - 2];
+                               info.ifLocal = oid.value()[oid.length() - 2];
                                info.ifRemote = ifRemote->getIfIndex();
                                info.objectId = remoteNode->getId();
                                info.isPtToPt = true;
index cfcb0fb..c0c6916 100644 (file)
@@ -185,7 +185,7 @@ UINT32 Component::fillMessage(NXCPMessage *msg, UINT32 baseId)
 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));
+       Component *element = new Component(var->getName().getElement(12), var->getValueAsString(buffer, 256));
        UINT32 rc = element->updateFromSnmp(transport);
        if (rc != SNMP_ERR_SUCCESS)
        {
index 04c8db6..16d32ed 100644 (file)
@@ -616,7 +616,7 @@ bool DCTable::saveToDatabase(DB_HANDLE hdb)
                DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, (INT32)(i + 1));
                                        DBBind(hStmt, 3, DB_SQLTYPE_VARCHAR, column->getName(), DB_BIND_STATIC);
                                        SNMP_ObjectId *oid = column->getSnmpOid();
-                                       DBBind(hStmt, 4, DB_SQLTYPE_VARCHAR, (oid != NULL) ? oid->getValueAsText() : NULL, DB_BIND_STATIC);
+                                       DBBind(hStmt, 4, DB_SQLTYPE_VARCHAR, (oid != NULL) ? (const TCHAR *)oid->toString() : NULL, DB_BIND_TRANSIENT);
                                        DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, (INT32)column->getFlags());
                                        DBBind(hStmt, 6, DB_SQLTYPE_VARCHAR, column->getDisplayName(), DB_BIND_STATIC);
 
@@ -739,7 +739,7 @@ void DCTable::createMessage(NXCPMessage *pMsg)
                pMsg->setField(varId++, column->getFlags());
                SNMP_ObjectId *oid = column->getSnmpOid();
                if (oid != NULL)
-                       pMsg->setFieldFromInt32Array(varId++, (UINT32)oid->getLength(), oid->getValue());
+                       pMsg->setFieldFromInt32Array(varId++, (UINT32)oid->length(), oid->value());
                else
                        varId++;
                pMsg->setField(varId++, column->getDisplayName());
index 836cd21..6ca7338 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
@@ -29,7 +29,7 @@ DCTableColumn::DCTableColumn(const DCTableColumn *src)
 {
        nx_strncpy(m_name, src->m_name, MAX_COLUMN_NAME);
        m_flags = src->m_flags;
-       m_snmpOid = (src->m_snmpOid != NULL) ? new SNMP_ObjectId(src->m_snmpOid->getLength(), src->m_snmpOid->getValue()) : NULL;
+       m_snmpOid = (src->m_snmpOid != NULL) ? new SNMP_ObjectId(*src->m_snmpOid) : NULL;
    m_displayName = (src->m_displayName != NULL) ? _tcsdup(src->m_displayName) : NULL;
 }
 
@@ -48,7 +48,7 @@ DCTableColumn::DCTableColumn(NXCPMessage *msg, UINT32 baseId)
                UINT32 len = msg->getFieldAsInt32Array(baseId + 2, 256, oid);
                if (len > 0)
                {
-                       m_snmpOid = new SNMP_ObjectId(len, oid);
+                       m_snmpOid = new SNMP_ObjectId(oid, len);
                }
                else
                {
@@ -82,7 +82,7 @@ DCTableColumn::DCTableColumn(DB_RESULT hResult, int row)
                size_t len = SNMPParseOID(oid, oidBin, 256);
                if (len > 0)
                {
-                       m_snmpOid = new SNMP_ObjectId(len, oidBin);
+                       m_snmpOid = new SNMP_ObjectId(oidBin, len);
                }
                else
                {
@@ -111,7 +111,7 @@ DCTableColumn::DCTableColumn(ConfigEntry *e)
                size_t len = SNMPParseOID(oid, oidBin, 256);
                if (len > 0)
                {
-                       m_snmpOid = new SNMP_ObjectId(len, oidBin);
+                       m_snmpOid = new SNMP_ObjectId(oidBin, len);
                }
                else
                {
@@ -146,5 +146,5 @@ void DCTableColumn::createNXMPRecord(String &str, int id)
                           _T("\t\t\t\t\t\t</column>\n"),
                                                                  id, (const TCHAR *)EscapeStringForXML2(m_name),
                                                                  (const TCHAR *)EscapeStringForXML2(CHECK_NULL_EX(m_displayName)),
-                          (m_snmpOid != NULL) ? m_snmpOid->getValueAsText() : _T(""), (int)m_flags);
+                          (m_snmpOid != NULL) ? (const TCHAR *)m_snmpOid->toString() : _T(""), (int)m_flags);
 }
index ddc3bbc..7db488a 100644 (file)
@@ -219,19 +219,16 @@ void ForwardingDatabase::sort()
  */
 static UINT32 FDBHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
 {
-   SNMP_ObjectId *pOid = pVar->getName();
-       size_t oidLen = pOid->getLength();
-       UINT32 oid[MAX_OID_LEN];
-       memcpy(oid, pOid->getValue(), oidLen * sizeof(UINT32));
+   SNMP_ObjectId oid(pVar->getName());
 
        // Get port number and status
    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));
+       oid.changeElement(10, 2);       // .1.3.6.1.2.1.17.4.3.1.2 - port number
+       pRqPDU->bindVariable(new SNMP_Variable(oid));
 
-       oid[10] = 3;    // .1.3.6.1.2.1.17.4.3.1.3 - status
-       pRqPDU->bindVariable(new SNMP_Variable(oid, oidLen));
+       oid.changeElement(10, 3);       // .1.3.6.1.2.1.17.4.3.1.3 - status
+       pRqPDU->bindVariable(new SNMP_Variable(oid));
 
    SNMP_PDU *pRespPDU;
    UINT32 rcc = pTransport->doRequest(pRqPDU, &pRespPDU, SnmpGetDefaultTimeout(), 3);
@@ -274,16 +271,13 @@ static UINT32 Dot1qTpFdbHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport,
        if (port == 0)
                return SNMP_ERR_SUCCESS;
 
-   SNMP_ObjectId *pOid = pVar->getName();
-       size_t oidLen = pOid->getLength();
-       UINT32 oid[MAX_OID_LEN];
-       memcpy(oid, pOid->getValue(), oidLen * sizeof(UINT32));
 
        // Get port number and status
    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));
+   SNMP_ObjectId oid(pVar->getName());
+   oid.changeElement(12, 3);   // .1.3.6.1.2.1.17.7.1.2.2.1.3 - status
+       pRqPDU->bindVariable(new SNMP_Variable(oid));
 
    SNMP_PDU *pRespPDU;
    UINT32 rcc = pTransport->doRequest(pRqPDU, &pRespPDU, SnmpGetDefaultTimeout(), 3);
@@ -298,11 +292,12 @@ static UINT32 Dot1qTpFdbHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport,
 
                        memset(&entry, 0, sizeof(FDB_ENTRY));
                        entry.port = (UINT32)port;
+                       size_t oidLen = oid.length();
                        for(size_t i = oidLen - MAC_ADDR_LENGTH, j = 0; i < oidLen; i++)
-                               entry.macAddr[j++] = (BYTE)oid[i];
+                               entry.macAddr[j++] = oid.getElement(i);
                        Node *node = FindNodeByMAC(entry.macAddr);
                        entry.nodeObject = (node != NULL) ? node->getId() : 0;
-         entry.vlanId = (UINT16)oid[oidLen - MAC_ADDR_LENGTH - 1];
+         entry.vlanId = (UINT16)oid.getElement(oidLen - MAC_ADDR_LENGTH - 1);
          entry.type = (UINT16)status;
                        ((ForwardingDatabase *)arg)->addEntry(&entry);
                }
@@ -317,9 +312,9 @@ static UINT32 Dot1qTpFdbHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport,
  */
 static UINT32 Dot1dPortTableHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *arg)
 {
-   SNMP_ObjectId *pOid = pVar->getName();
+   const SNMP_ObjectId& oid = pVar->getName();
        PORT_MAPPING_ENTRY pm;
-       pm.port = pOid->getValue()[pOid->getLength() - 1];
+       pm.port = oid.value()[oid.length() - 1];
        pm.ifIndex = pVar->getValueAsUInt();
        ((ForwardingDatabase *)arg)->addPortMapping(&pm);
        return SNMP_ERR_SUCCESS;
index eb31124..8a23766 100644 (file)
 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];
+   port->portNumber = var->getName().getElement(11);
        port->localIdLen = var->getRawValue(port->localId, 256);
 
-       SNMP_ObjectId *oid = var->getName();
+       const SNMP_ObjectId& oid = var->getName();
        UINT32 newOid[128];
-       memcpy(newOid, oid->getValue(), oid->getLength() * sizeof(UINT32));
+       memcpy(newOid, oid.value(), oid.length() * sizeof(UINT32));
    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()));
+       newOid[oid.length() - 2] = 4;   // lldpLocPortDescr
+       pRqPDU->bindVariable(new SNMP_Variable(newOid, oid.length()));
 
-   newOid[oid->getLength() - 2] = 2;   // lldpLocPortIdSubtype
-   pRqPDU->bindVariable(new SNMP_Variable(newOid, oid->getLength()));
+   newOid[oid.length() - 2] = 2;   // lldpLocPortIdSubtype
+   pRqPDU->bindVariable(new SNMP_Variable(newOid, oid.length()));
 
        SNMP_PDU *pRespPDU = NULL;
    UINT32 rcc = transport->doRequest(pRqPDU, &pRespPDU, SnmpGetDefaultTimeout(), 3);
@@ -164,26 +164,26 @@ static SNMP_Variable *GetVariableFromCache(UINT32 *oid, size_t oidLen, StringObj
  */
 static void ProcessLLDPConnectionEntry(Node *node, StringObjectMap<SNMP_Variable> *connections, SNMP_Variable *var, LinkLayerNeighbors *nbs)
 {
-       SNMP_ObjectId *oid = var->getName();
+       const SNMP_ObjectId& oid = var->getName();
 
        // Get additional info for current record
        UINT32 newOid[128];
-       memcpy(newOid, oid->getValue(), oid->getLength() * sizeof(UINT32));
+       memcpy(newOid, oid.value(), oid.length() * sizeof(UINT32));
 
-       newOid[oid->getLength() - 4] = 4;       // lldpRemChassisIdSubtype
-       SNMP_Variable *lldpRemChassisIdSubtype = GetVariableFromCache(newOid, oid->getLength(), connections);
+       newOid[oid.length() - 4] = 4;   // lldpRemChassisIdSubtype
+       SNMP_Variable *lldpRemChassisIdSubtype = GetVariableFromCache(newOid, oid.length(), connections);
 
-       newOid[oid->getLength() - 4] = 7;       // lldpRemPortId
-   SNMP_Variable *lldpRemPortId = GetVariableFromCache(newOid, oid->getLength(), connections);
+       newOid[oid.length() - 4] = 7;   // lldpRemPortId
+   SNMP_Variable *lldpRemPortId = GetVariableFromCache(newOid, oid.length(), connections);
 
-       newOid[oid->getLength() - 4] = 6;       // lldpRemPortIdSubtype
-   SNMP_Variable *lldpRemPortIdSubtype = GetVariableFromCache(newOid, oid->getLength(), connections);
+       newOid[oid.length() - 4] = 6;   // lldpRemPortIdSubtype
+   SNMP_Variable *lldpRemPortIdSubtype = GetVariableFromCache(newOid, oid.length(), connections);
 
-       newOid[oid->getLength() - 4] = 8;       // lldpRemPortDesc
-   SNMP_Variable *lldpRemPortDesc = GetVariableFromCache(newOid, oid->getLength(), connections);
+       newOid[oid.length() - 4] = 8;   // lldpRemPortDesc
+   SNMP_Variable *lldpRemPortDesc = GetVariableFromCache(newOid, oid.length(), connections);
 
-   newOid[oid->getLength() - 4] = 9;   // lldpRemSysName
-   SNMP_Variable *lldpRemSysName = GetVariableFromCache(newOid, oid->getLength(), connections);
+   newOid[oid.length() - 4] = 9;   // lldpRemSysName
+   SNMP_Variable *lldpRemSysName = GetVariableFromCache(newOid, oid.length(), connections);
 
        if ((lldpRemChassisIdSubtype != NULL) && (lldpRemPortId != NULL) && (lldpRemPortIdSubtype != NULL) && (lldpRemPortDesc != NULL) && (lldpRemSysName != NULL))
    {
@@ -228,7 +228,7 @@ static void ProcessLLDPConnectionEntry(Node *node, StringObjectMap<SNMP_Variable
          info.isCached = false;
 
                        // Index to lldpRemTable is lldpRemTimeMark, lldpRemLocalPortNum, lldpRemIndex
-                       UINT32 localPort = oid->getValue()[oid->getLength() - 2];
+                       UINT32 localPort = oid.getElement(oid.length() - 2);
 
                        // Determine interface index from local port number. It can be
                        // either ifIndex or dot1dBasePort, as described in LLDP MIB:
@@ -274,7 +274,8 @@ static void ProcessLLDPConnectionEntry(Node *node, StringObjectMap<SNMP_Variable
  */
 static UINT32 LLDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
-   ((StringObjectMap<SNMP_Variable> *)arg)->set(var->getName()->getValueAsText(), new SNMP_Variable(var));
+   TCHAR buffer[1024];
+   ((StringObjectMap<SNMP_Variable> *)arg)->set(var->getName().toString(buffer, 1024), new SNMP_Variable(var));
    return SNMP_ERR_SUCCESS;
 }
 
index 84b6d37..f10465d 100644 (file)
 /**
  * Read remote slot and port from s5EnMsTopNmmEosTable
  */
-static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, SNMP_Transport *transport)
+static WORD ReadRemoteSlotAndPort(Node *node, const SNMP_ObjectId& oid, SNMP_Transport *transport)
 {
        // Read data from appropriate entry in s5EnMsTopNmmEosTable
        UINT32 eosEntryOID[64];
-       memcpy(eosEntryOID, oid->getValue(), oid->getLength() * sizeof(UINT32));
+       memcpy(eosEntryOID, oid.value(), oid.length() * sizeof(UINT32));
        eosEntryOID[11] = 3;
        eosEntryOID[12] = 1;
        eosEntryOID[13] = 1;
 
    SNMP_PDU *pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), transport->getSnmpVersion());
-       pRqPDU->bindVariable(new SNMP_Variable(eosEntryOID, oid->getLength()));
+       pRqPDU->bindVariable(new SNMP_Variable(eosEntryOID, oid.length()));
 
        WORD result = 0;
        SNMP_PDU *pRespPDU = NULL;
@@ -57,11 +57,11 @@ static WORD ReadRemoteSlotAndPort(Node *node, SNMP_ObjectId *oid, SNMP_Transport
 static UINT32 NDPTopoHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
        Node *node = (Node *)((LinkLayerNeighbors *)arg)->getData();
-       SNMP_ObjectId *oid = var->getName();
+       const SNMP_ObjectId& oid = var->getName();
 
        // Entries indexed by slot, port, IP address, and segment ID
-       UINT32 slot = oid->getValue()[14];
-       UINT32 port = oid->getValue()[15];
+       UINT32 slot = oid.getElement(14);
+       UINT32 port = oid.getElement(15);
 
        // Table always contains record with slot=0 and port=0 which
        // represents local chassis. We should ignore this record.
index f16601b..6e4d293 100644 (file)
@@ -3721,7 +3721,7 @@ UINT32 Node::getItemFromSNMP(WORD port, const TCHAR *param, size_t bufSize, TCHA
 /**
  * Read one row for SNMP table
  */
-static UINT32 ReadSNMPTableRow(SNMP_Transport *snmp, SNMP_ObjectId *rowOid, size_t baseOidLen, UINT32 index,
+static UINT32 ReadSNMPTableRow(SNMP_Transport *snmp, const SNMP_ObjectId *rowOid, size_t baseOidLen, UINT32 index,
                                ObjectArray<DCTableColumn> *columns, Table *table)
 {
    SNMP_PDU request(SNMP_GET_REQUEST, SnmpNewRequestId(), snmp->getSnmpVersion());
@@ -3731,12 +3731,12 @@ static UINT32 ReadSNMPTableRow(SNMP_Transport *snmp, SNMP_ObjectId *rowOid, size
       if (c->getSnmpOid() != NULL)
       {
          UINT32 oid[MAX_OID_LEN];
-         size_t oidLen = c->getSnmpOid()->getLength();
-         memcpy(oid, c->getSnmpOid()->getValue(), oidLen * sizeof(UINT32));
+         size_t oidLen = c->getSnmpOid()->length();
+         memcpy(oid, c->getSnmpOid()->value(), oidLen * sizeof(UINT32));
          if (rowOid != NULL)
          {
-            size_t suffixLen = rowOid->getLength() - baseOidLen;
-            memcpy(&oid[oidLen], rowOid->getValue() + baseOidLen, suffixLen * sizeof(UINT32));
+            size_t suffixLen = rowOid->length() - baseOidLen;
+            memcpy(&oid[oidLen], rowOid->value() + baseOidLen, suffixLen * sizeof(UINT32));
             oidLen += suffixLen;
          }
          else
@@ -3862,11 +3862,11 @@ struct SNMPOIDSuffixListCallback_Data
 static UINT32 SNMPOIDSuffixListCallback(SNMP_Variable *varbind, SNMP_Transport *snmp, void *arg)
 {
    SNMPOIDSuffixListCallback_Data *data = (SNMPOIDSuffixListCallback_Data *)arg;
-   SNMP_ObjectId *oid = varbind->getName();
-   if (oid->getLength() <= data->oidLen)
+   const SNMP_ObjectId& oid = varbind->getName();
+   if (oid.length() <= data->oidLen)
       return SNMP_ERR_SUCCESS;
    TCHAR buffer[256];
-   SNMPConvertOIDToText(oid->getLength() - data->oidLen, &(oid->getValue()[data->oidLen]), buffer, 256);
+   SNMPConvertOIDToText(oid.length() - data->oidLen, &(oid.value()[data->oidLen]), buffer, 256);
 
    const TCHAR *key = (buffer[0] == _T('.')) ? &buffer[1] : buffer;
 
index e287939..831892c 100644 (file)
@@ -1182,7 +1182,7 @@ NXSL_Value *NXSL_SNMPVarBindClass::getAttr(NXSL_Object *object, const TCHAR *att
        }
        else if (!_tcscmp(attr, _T("name")))
        {
-               value = new NXSL_Value(t->getName()->getValueAsText());
+               value = new NXSL_Value(t->getName().toString());
        }
        else if (!_tcscmp(attr, _T("value")))
        {
index f385545..5588785 100644 (file)
@@ -1168,6 +1168,15 @@ finish:
 }
 
 /**
+ * SNMP walk callback
+ */
+static UINT32 WalkCallback(SNMP_Variable *var, SNMP_Transport *transport, void *userArg)
+{
+   ((NXSL_Array *)userArg)->add(new NXSL_Value(new NXSL_Object(&g_nxslSnmpVarBindClass, new SNMP_Variable(var))));
+   return SNMP_ERR_SUCCESS;
+}
+
+/**
  * Do SNMP walk starting from the given oid
  * Syntax:
  *    SNMPWalk(transport, oid)
@@ -1179,13 +1188,6 @@ finish:
  */
 static int F_SNMPWalk(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_VM *vm)
 {
-       static UINT32 requestId = 1;
-       UINT32 rootName[MAX_OID_LEN], name[MAX_OID_LEN], result;
-   size_t rootNameLen, nameLen;
-       SNMP_PDU *rqPDU, *rspPDU;
-       BOOL isRunning = TRUE;
-       int i = 0;
-
        if (!argv[0]->isObject())
                return NXSL_ERR_NOT_OBJECT;
        if (!argv[1]->isString())
@@ -1195,84 +1197,18 @@ static int F_SNMPWalk(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_V
        if (_tcscmp(obj->getClass()->getName(), g_nxslSnmpTransportClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       SNMP_Transport *trans = (SNMP_Transport*)obj->getData();
-
-   // Get root
-   rootNameLen = SNMPParseOID(argv[1]->getValueAsCString(), rootName, MAX_OID_LEN);
-   if (rootNameLen == 0)
-      return SNMP_ERR_BAD_OID;
-
-       memcpy(name, rootName, rootNameLen * sizeof(UINT32));
-   nameLen = rootNameLen;
-
-       NXSL_Array *varList = new NXSL_Array;
-
-   // Walk the MIB
-   while(isRunning)
+   NXSL_Array *varList = new NXSL_Array;
+       SNMP_Transport *transport = (SNMP_Transport *)obj->getData();
+       UINT32 result = SnmpWalk(transport, argv[1]->getValueAsCString(), WalkCallback, varList);
+       if (result == SNMP_ERR_SUCCESS)
    {
-      rqPDU = new SNMP_PDU(SNMP_GET_NEXT_REQUEST, requestId++, trans->getSnmpVersion());
-      rqPDU->bindVariable(new SNMP_Variable(name, nameLen));
-      result = trans->doRequest(rqPDU, &rspPDU, SnmpGetDefaultTimeout(), 3);
-
-      // Analyze response
-      if (result == SNMP_ERR_SUCCESS)
-      {
-         if ((rspPDU->getNumVariables() > 0) &&
-             (rspPDU->getErrorCode() == SNMP_PDU_ERR_SUCCESS))
-         {
-            SNMP_Variable *var = rspPDU->getVariable(0);
-            if ((var->getType() != ASN_NO_SUCH_OBJECT) &&
-                (var->getType() != ASN_NO_SUCH_INSTANCE))
-            {
-               // Do we have to stop walking?
-               if ((var->getName()->getLength() < rootNameLen) ||
-                   (memcmp(rootName, var->getName()->getValue(), rootNameLen * sizeof(UINT32))) ||
-                   ((var->getName()->getLength() == nameLen) &&
-                    (!memcmp(var->getName()->getValue(), name, var->getName()->getLength() * sizeof(UINT32)))))
-               {
-                  isRunning = FALSE;
-                  delete rspPDU;
-                  delete rqPDU;
-                  break;
-               }
-               memcpy(name, var->getName()->getValue(), var->getName()->getLength() * sizeof(UINT32));
-               nameLen = var->getName()->getLength();
-                                       varList->set(i++, new NXSL_Value(new NXSL_Object(&g_nxslSnmpVarBindClass, var)));
-                                       rspPDU->unlinkVariables();
-            }
-            else
-            {
-               result = SNMP_ERR_NO_OBJECT;
-               isRunning = FALSE;
-            }
-         }
-         else
-         {
-            if (rspPDU->getErrorCode() == SNMP_PDU_ERR_NO_SUCH_NAME)
-               result = SNMP_ERR_NO_OBJECT;
-            else
-               result = SNMP_ERR_AGENT;
-            isRunning = FALSE;
-         }
-         delete rspPDU;
-      }
-      else
-      {
-         isRunning = FALSE;
-      }
-      delete rqPDU;
+      *ppResult = new NXSL_Value(varList);
    }
-
-       if (result != SNMP_ERR_SUCCESS)
-       {
-               DbgPrintf(9, _T("SNMPWalk returned %d"), result);
-               *ppResult = new NXSL_Value;
-      delete varList;
-       }
        else
-       {
-               *ppResult = new NXSL_Value(varList);
-       }
+   {
+      *ppResult = new NXSL_Value;
+      delete varList;
+   }
        return 0;
 }
 
index 7b21efe..099fc09 100644 (file)
@@ -358,12 +358,9 @@ static UINT32 TableHandler(SNMP_Variable *pVar, SNMP_Transport *pTransport, void
    }
    else
    {
-      SNMP_ObjectId *pOid;
-
       nameLen = SNMPParseOID(((SNMP_ENUM_ARGS *)pArg)->ppszOidList[0], pdwVarName, MAX_OID_LEN);
-      pOid = pVar->getName();
-      SNMPConvertOIDToText(pOid->getLength() - nameLen,
-         (UINT32 *)&(pOid->getValue())[nameLen], szSuffix, MAX_OID_LEN * 4);
+      const SNMP_ObjectId& oid = pVar->getName();
+      SNMPConvertOIDToText(oid.length() - nameLen, (UINT32 *)&(oid.value())[nameLen], szSuffix, MAX_OID_LEN * 4);
    }
 
    // Get values for other columns
index 52551b8..f15404c 100644 (file)
@@ -8776,9 +8776,9 @@ static UINT32 WalkerCallback(SNMP_Variable *pVar, SNMP_Transport *pTransport, vo
    TCHAR szBuffer[4096];
        bool convertToHex = true;
 
-       pVar->getValueAsPrintableString(szBuffer, 4096, &convertToHex);
-   pMsg->setField(((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwId++, (TCHAR *)pVar->getName()->getValueAsText());
+   pMsg->setField(((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwId++, pVar->getName().toString(szBuffer, 4096));
        pMsg->setField(((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwId++, convertToHex ? (UINT32)0xFFFF : pVar->getType());
+   pVar->getValueAsPrintableString(szBuffer, 4096, &convertToHex);
    pMsg->setField(((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwId++, szBuffer);
    ((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwNumVars++;
    if (((WALKER_ENUM_CALLBACK_ARGS *)pArg)->dwNumVars == 50)
index 1d1f72f..9cce946 100644 (file)
@@ -31,8 +31,8 @@ static UINT32 HandlerArp(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *
    BYTE bMac[64];
    UINT32 dwResult;
 
-   size_t nameLen = pVar->getName()->getLength();
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   size_t nameLen = pVar->getName().length();
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
 
    oidName[nameLen - 6] = 1;  // Retrieve interface index
    dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwIndex, sizeof(UINT32), 0, NULL);
@@ -84,13 +84,13 @@ static UINT32 HandlerRoute(SNMP_Variable *pVar, SNMP_Transport *pTransport, void
    ROUTE route;
        ROUTING_TABLE *rt = (ROUTING_TABLE *)pArg;
 
-   size_t nameLen = pVar->getName()->getLength();
+   size_t nameLen = pVar->getName().length();
        if ((nameLen < 5) || (nameLen > MAX_OID_LEN))
        {
-               DbgPrintf(4, _T("HandlerRoute(): strange nameLen %d (name=%s)"), nameLen, pVar->getName()->getValueAsText());
+               DbgPrintf(4, _T("HandlerRoute(): strange nameLen %d (name=%s)"), nameLen, (const TCHAR *)pVar->getName().toString());
                return SNMP_ERR_SUCCESS;
        }
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
    route.dwDestAddr = ntohl(pVar->getValueAsUInt());
 
    oidName[nameLen - 5] = 2;  // Interface index
index 56c372c..b10afb4 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** 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 General Public License as published by
@@ -168,14 +168,14 @@ void InitTraps()
 static void GenerateTrapEvent(UINT32 dwObjectId, UINT32 dwIndex, SNMP_PDU *pdu, int sourcePort)
 {
    TCHAR *argList[32], szBuffer[256];
-   const TCHAR *names[33];
+   TCHAR names[33][512];
    char szFormat[] = "sssssssssssssssssssssssssssssssss";
    UINT32 i;
    int iResult;
 
    memset(argList, 0, sizeof(argList));
    memset(names, 0, sizeof(names));
-   names[0] = _T("oid");
+   _tcscpy(names[0], _T("oid"));
 
        // Extract varbinds from trap and add them as event's parameters
    for(i = 0; i < m_pTrapCfg[dwIndex].dwNumMaps; i++)
@@ -191,7 +191,7 @@ static void GenerateTrapEvent(UINT32 dwObjectId, UINT32 dwIndex, SNMP_PDU *pdu,
                (s_allowVarbindConversion && !(m_pTrapCfg[dwIndex].pMaps[i].dwFlags & TRAP_VARBIND_FORCE_TEXT)) ?
                   varbind->getValueAsPrintableString(szBuffer, 256, &convertToHex) :
                   varbind->getValueAsString(szBuffer, 256));
-            names[i + 1] = varbind->getName()->getValueAsText();
+            varbind->getName().toString(names[i + 1], 512);
          }
       }
       else
@@ -200,17 +200,17 @@ static void GenerateTrapEvent(UINT32 dwObjectId, UINT32 dwIndex, SNMP_PDU *pdu,
          for(int j = 0; j < pdu->getNumVariables(); j++)
          {
             SNMP_Variable *varbind = pdu->getVariable(j);
-            iResult = varbind->getName()->compare(
+            iResult = varbind->getName().compare(
                   m_pTrapCfg[dwIndex].pMaps[i].pdwObjectId,
                   m_pTrapCfg[dwIndex].pMaps[i].dwOidLen);
-            if ((iResult == OID_EQUAL) || (iResult == OID_SHORTER))
+            if ((iResult == OID_EQUAL) || (iResult == OID_LONGER))
             {
                                        bool convertToHex = true;
                                        argList[i] = _tcsdup(
                   (s_allowVarbindConversion && !(m_pTrapCfg[dwIndex].pMaps[i].dwFlags & TRAP_VARBIND_FORCE_TEXT)) ?
                      varbind->getValueAsPrintableString(szBuffer, 256, &convertToHex) :
                      varbind->getValueAsString(szBuffer, 256));
-               names[i] = varbind->getName()->getValueAsText();
+                   varbind->getName().toString(names[i + 1], 512);
                break;
             }
          }
@@ -219,12 +219,12 @@ static void GenerateTrapEvent(UINT32 dwObjectId, UINT32 dwIndex, SNMP_PDU *pdu,
 
    argList[m_pTrapCfg[dwIndex].dwNumMaps] = (TCHAR *)malloc(16 * sizeof(TCHAR));
    _sntprintf(argList[m_pTrapCfg[dwIndex].dwNumMaps], 16, _T("%d"), sourcePort);
-   names[m_pTrapCfg[dwIndex].dwNumMaps + 1] = _T("sourcePort");
+   _tcscpy(names[m_pTrapCfg[dwIndex].dwNumMaps + 1], _T("sourcePort"));
    szFormat[m_pTrapCfg[dwIndex].dwNumMaps + 2] = 0;
    PostEventWithTagAndNames(
       m_pTrapCfg[dwIndex].dwEventCode, dwObjectId,
-          m_pTrapCfg[dwIndex].szUserTag, szFormat, names,
-      pdu->getTrapId()->getValueAsText(),
+          m_pTrapCfg[dwIndex].szUserTag, szFormat, (const TCHAR **)names,
+      (const TCHAR *)pdu->getTrapId()->toString(),
       argList[0], argList[1], argList[2], argList[3],
       argList[4], argList[5], argList[6], argList[7],
       argList[8], argList[9], argList[10], argList[11],
@@ -259,7 +259,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
    int iResult;
 
    DbgPrintf(4, _T("Received SNMP %s %s from %s"), isInformRq ? _T("INFORM-REQUEST") : _T("TRAP"),
-             pdu->getTrapId()->getValueAsText(), srcAddr.toString(szBuffer));
+             pdu->getTrapId()->toString(&szBuffer[96], 4000), srcAddr.toString(szBuffer));
        if (isInformRq)
        {
                SNMP_PDU *response = new SNMP_PDU(SNMP_RESPONSE, pdu->getRequestId(), pdu->getVersion());
@@ -280,7 +280,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
    if (m_bLogAllTraps || (pNode != NULL))
    {
       NXCPMessage msg;
-      TCHAR szQuery[8192];
+      TCHAR szQuery[8192], oidText[1024];
       UINT32 dwTimeStamp = (UINT32)time(NULL);
 
       dwBufSize = pdu->getNumVariables() * 4096 + 16;
@@ -293,7 +293,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
                        bool convertToHex = true;
          dwBufPos += _sntprintf(&pszTrapArgs[dwBufPos], dwBufSize - dwBufPos, _T("%s%s == '%s'"),
                                 (dwBufPos == 0) ? _T("") : _T("; "),
-                                pVar->getName()->getValueAsText(),
+                                pVar->getName().toString(oidText, 1024),
                                                                                  s_allowVarbindConversion ? pVar->getValueAsPrintableString(szBuffer, 3000, &convertToHex) : pVar->getValueAsString(szBuffer, 3000));
       }
 
@@ -302,7 +302,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
                                 _T("ip_addr,object_id,trap_oid,trap_varlist) VALUES ")
                                 _T("(") INT64_FMT _T(",%d,'%s',%d,'%s',%s)"),
                  m_qnTrapId, dwTimeStamp, srcAddr.toString(szBuffer),
-                 (pNode != NULL) ? pNode->getId() : (UINT32)0, pdu->getTrapId()->getValueAsText(),
+                 (pNode != NULL) ? pNode->getId() : (UINT32)0, pdu->getTrapId()->toString(oidText, 1024),
                  (const TCHAR *)DBPrepareString(g_dbDriver, pszTrapArgs));
       QueueSQLRequest(szQuery);
 
@@ -314,7 +314,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
       msg.setField(VID_TRAP_LOG_MSG_BASE + 1, dwTimeStamp);
       msg.setField(VID_TRAP_LOG_MSG_BASE + 2, srcAddr);
       msg.setField(VID_TRAP_LOG_MSG_BASE + 3, (pNode != NULL) ? pNode->getId() : (UINT32)0);
-      msg.setField(VID_TRAP_LOG_MSG_BASE + 4, (TCHAR *)pdu->getTrapId()->getValueAsText());
+      msg.setField(VID_TRAP_LOG_MSG_BASE + 4, pdu->getTrapId()->toString(oidText, 1024));
       msg.setField(VID_TRAP_LOG_MSG_BASE + 5, pszTrapArgs);
       EnumerateClientSessions(BroadcastNewTrap, &msg);
       free(pszTrapArgs);
@@ -361,7 +361,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
                   dwMatchIdx = i;
                   break;   // Find exact match
                }
-               else if (iResult == OID_SHORTER)
+               else if (iResult == OID_LONGER)
                {
                   if (m_pTrapCfg[i].dwOidLen > dwMatchLen)
                   {
@@ -381,6 +381,8 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
             // Handle unprocessed traps
             if (!processed)
             {
+               TCHAR oidText[1024];
+
                // Build trap's parameters string
                dwBufSize = pdu->getNumVariables() * 4096 + 16;
                pszTrapArgs = (TCHAR *)malloc(sizeof(TCHAR) * dwBufSize);
@@ -391,14 +393,14 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
                                           bool convertToHex = true;
                   dwBufPos += _sntprintf(&pszTrapArgs[dwBufPos], dwBufSize - dwBufPos, _T("%s%s == '%s'"),
                                          (dwBufPos == 0) ? _T("") : _T("; "),
-                                         pVar->getName()->getValueAsText(),
+                                         pVar->getName().toString(oidText, 1024),
                                                                                                     s_allowVarbindConversion ? pVar->getValueAsPrintableString(szBuffer, 512, &convertToHex) : pVar->getValueAsString(szBuffer, 512));
                }
 
                // Generate default event for unmatched traps
                const TCHAR *names[3] = { _T("oid"), NULL, _T("sourcePort") };
                PostEventWithNames(EVENT_SNMP_UNMATCHED_TRAP, pNode->getId(), "ssd", names,
-                  pdu->getTrapId()->getValueAsText(), pszTrapArgs, srcPort);
+                  pdu->getTrapId()->toString(oidText, 1024), pszTrapArgs, srcPort);
                free(pszTrapArgs);
             }
          }
@@ -683,7 +685,7 @@ THREAD_RESULT THREAD_CALL SNMPTrapReceiver(void *pArg)
                           }
                           else if (pdu->getCommand() == SNMP_REPORT)
                           {
-                                  DbgPrintf(6, _T("SNMPTrapReceiver: REPORT PDU with error %s"), pdu->getVariable(0)->getName()->getValueAsText());
+                                  DbgPrintf(6, _T("SNMPTrapReceiver: REPORT PDU with error %s"), (const TCHAR *)pdu->getVariable(0)->getName().toString());
                           }
             delete pdu;
          }
index 70bee27..a782d23 100644 (file)
@@ -33,16 +33,16 @@ static UINT32 STPPortListHandler(SNMP_Variable *var, SNMP_Transport *transport,
 
        Node *node = (Node *)((LinkLayerNeighbors *)arg)->getData();
        UINT32 oid[64];
-   memcpy(oid, var->getName()->getValue(), var->getName()->getLength() * sizeof(UINT32));
+   memcpy(oid, var->getName().value(), var->getName().length() * sizeof(UINT32));
 
    // Get designated bridge and designated port for this port
    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()));
+   request->bindVariable(new SNMP_Variable(oid, var->getName().length()));
 
    oid[10] = 9;   // dot1dStpPortDesignatedPort
-   request->bindVariable(new SNMP_Variable(oid, var->getName()->getLength()));
+   request->bindVariable(new SNMP_Variable(oid, var->getName().length()));
 
        SNMP_PDU *response = NULL;
    UINT32 rcc = transport->doRequest(request, &response, SnmpGetDefaultTimeout(), 3);
index 35282b2..9406152 100644 (file)
@@ -69,7 +69,7 @@ void VrrpRouter::addVirtualIP(SNMP_Variable *var)
                return; // Ignore non-active VIPs
 
        // IP is encoded in last 4 elements of the OID
-       const UINT32 *oid = var->getName()->getValue();
+       const UINT32 *oid = var->getName().value();
        UINT32 vip = (oid[13] << 24) | (oid[14] << 16) | (oid[15] << 8) | oid[16];
 
        if (m_ipAddrCount % 16 == 0)
@@ -101,15 +101,15 @@ bool VrrpRouter::readVirtualIP(SNMP_Transport *transport)
  */
 UINT32 VRRPHandler(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
-       SNMP_ObjectId *oid = var->getName();
+       const SNMP_ObjectId& oid = var->getName();
 
        // Entries indexed by ifIndex and VRID
-       UINT32 ifIndex = oid->getValue()[11];
-       UINT32 vrid = oid->getValue()[12];
+       UINT32 ifIndex = oid.value()[11];
+       UINT32 vrid = oid.value()[12];
        int state = var->getValueAsInt();
 
        UINT32 oidMac[64];
-       memcpy(oidMac, oid->getValue(), oid->getLength() * sizeof(UINT32));
+       memcpy(oidMac, oid.value(), oid.length() * 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 (SnmpGetEx(transport, NULL, oidMac, 13, &macAddr, MAC_ADDR_LENGTH, SG_RAW_RESULT, NULL) == SNMP_ERR_SUCCESS)
index b8830b7..09bd082 100644 (file)
@@ -107,10 +107,10 @@ static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, v
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
    UINT32 oid[MAX_OID_LEN];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
 
    SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmp->getSnmpVersion());
    
@@ -218,10 +218,10 @@ static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snm
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
    UINT32 oid[MAX_OID_LEN];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
 
    SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmp->getSnmpVersion());
 
index 3fbb528..f9e2883 100644 (file)
@@ -164,7 +164,7 @@ static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *snmp, void *ar
 {
    VlanList *vlanList = (VlanList *)arg;
 
-       VlanInfo *vlan = new VlanInfo(var->getName()->getValue()[var->getName()->getLength() - 1], VLAN_PRM_SLOTPORT);
+       VlanInfo *vlan = new VlanInfo(var->getName().getElement(var->getName().length() - 1), VLAN_PRM_SLOTPORT);
 
        TCHAR buffer[256];
        vlan->setName(var->getValueAsString(buffer, 256));
index 23e1620..6b70edb 100644 (file)
@@ -90,9 +90,9 @@ static UINT32 HandlerPortList(SNMP_Variable *var, SNMP_Transport *transport, voi
        InterfaceInfo *iface = ifList->findByIfIndex(var->getValueAsUInt());
        if (iface != NULL)
        {
-               size_t nameLen = var->getName()->getLength();
-               iface->slot = var->getName()->getValue()[nameLen - 2];
-               iface->port = var->getName()->getValue()[nameLen - 1];
+               size_t nameLen = var->getName().length();
+               iface->slot = var->getName().getElement(nameLen - 2);
+               iface->port = var->getName().getElement(nameLen - 1);
                iface->isPhysicalPort = true;
        }
        return SNMP_ERR_SUCCESS;
index 4eb8747..a59f182 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Cisco Catalyst switches
-** 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 Lesser General Public License as published by
@@ -67,7 +67,7 @@ int CatalystDriver::isPotentialDevice(const TCHAR *oid)
 bool CatalystDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
 {
        UINT32 value = 0;
-       return SnmpGet(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.9.5.1.2.14.0"), NULL, 0, &value, sizeof(UINT32), 0) == SNMP_ERR_SUCCESS;
+       return SnmpGetEx(snmp, _T(".1.3.6.1.4.1.9.5.1.2.14.0"), NULL, 0, &value, sizeof(UINT32), 0, NULL) == SNMP_ERR_SUCCESS;
 }
 
 /**
@@ -80,9 +80,9 @@ static UINT32 HandlerPortList(SNMP_Variable *var, SNMP_Transport *transport, voi
        InterfaceInfo *iface = ifList->findByIfIndex(var->getValueAsUInt());
        if (iface != NULL)
        {
-               size_t nameLen = var->getName()->getLength();
+               size_t nameLen = var->getName().length();
                
-               UINT32 moduleIndex = var->getName()->getValue()[nameLen - 2];
+               UINT32 moduleIndex = var->getName().getElement(nameLen - 2);
                UINT32 oid[] = { 1, 3, 6, 1, 4, 1, 9, 5, 1, 3, 1, 1, 25, 0 };
                oid[13] = moduleIndex;
                UINT32 slot;
@@ -90,7 +90,7 @@ static UINT32 HandlerPortList(SNMP_Variable *var, SNMP_Transport *transport, voi
                        slot = moduleIndex;     // Assume slot # equal to module index if it cannot be read
 
                iface->slot = slot;
-               iface->port = var->getName()->getValue()[nameLen - 1];
+               iface->port = var->getName().getElement(nameLen - 1);
                iface->isPhysicalPort = true;
        }
        return SNMP_ERR_SUCCESS;
index 9c82e81..046f407 100644 (file)
@@ -94,8 +94,8 @@ static UINT32 PortWalkHandler(SNMP_Variable *var, SNMP_Transport *snmp, void *ar
       if (iface->index == ifIndex)
       {
          iface->isPhysicalPort = true;
-         iface->slot = var->getName()->getValue()[18];
-         iface->port = var->getName()->getValue()[20];
+         iface->slot = var->getName().getElement(18);
+         iface->port = var->getName().getElement(20);
          break;
       }
    }
index 48d05f4..57d1785 100644 (file)
@@ -94,8 +94,8 @@ static UINT32 PortWalkHandler(SNMP_Variable *var, SNMP_Transport *snmp, void *ar
       if (iface->index == ifIndex)
       {
          iface->isPhysicalPort = true;
-         iface->slot = var->getName()->getValue()[15];
-         iface->port = var->getName()->getValue()[17];
+         iface->slot = var->getName().getElement(15);
+         iface->port = var->getName().getElement(17);
          break;
       }
    }
index 5407ad4..a23e2bb 100644 (file)
@@ -43,11 +43,11 @@ static UINT32 HandlerVlanList(SNMP_Variable *pVar, SNMP_Transport *pTransport, v
    UINT32 oidName[MAX_OID_LEN], dwResult;
    VlanList *vlanList = (VlanList *)pArg;
 
-   size_t nameLen = pVar->getName()->getLength();
+   size_t nameLen = pVar->getName().length();
        VlanInfo *vlan = new VlanInfo(pVar->getValueAsInt(), VLAN_PRM_IFINDEX);
 
    // Get VLAN name
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 2;
    TCHAR buffer[256];
        dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, buffer, sizeof(buffer), SG_STRING_RESULT, NULL);
index 2e22af2..146f31a 100644 (file)
@@ -52,7 +52,7 @@ static UINT32 HandlerVlanIfList(SNMP_Variable *pVar, SNMP_Transport *pTransport,
    VLAN_LIST *pVlanList = (VLAN_LIST *)pArg;
    BYTE szBuffer[256];
 
-   size_t nameLen = pVar->getName()->getLength();
+   size_t nameLen = pVar->getName().length();
 
    // Extend VLAN list and set ID of new VLAN
    dwIndex = pVlanList->dwNumVlans;
@@ -61,7 +61,7 @@ static UINT32 HandlerVlanIfList(SNMP_Variable *pVar, SNMP_Transport *pTransport,
    pVlanList->pList[dwIndex].dwVlanId = pVar->getValueAsUInt();
 
    // Get VLAN name
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 2;
    dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, 
                         pVlanList->pList[dwIndex].szName, MAX_OBJECT_NAME * sizeof(TCHAR), 0, NULL);
@@ -107,12 +107,12 @@ static UINT32 HandlerRapidCityIfList(SNMP_Variable *pVar, SNMP_Transport *pTrans
       iface->type = IFTYPE_L2VLAN;
       memcpy(iface->macAddr, pVlanList->pList[dwVlanIndex].bMacAddr, MAC_ADDR_LENGTH);
       
-      size_t nameLen = pVar->getName()->getLength();
+      size_t nameLen = pVar->getName().length();
 
       // Get IP address
       UINT32 ipAddr, ipNetMask;
 
-      memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+      memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
       oidName[nameLen - 6] = 2;
       dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &ipAddr, sizeof(UINT32), 0, NULL);
 
index 567f1db..79a2ca0 100644 (file)
@@ -31,7 +31,7 @@ static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *transport, voi
 {
    VlanList *vlanList = (VlanList *)arg;
 
-       VlanInfo *vlan = new VlanInfo(var->getName()->getValue()[var->getName()->getLength() - 1], VLAN_PRM_IFINDEX);
+       VlanInfo *vlan = new VlanInfo(var->getName().getElement(var->getName().length() - 1), VLAN_PRM_IFINDEX);
 
        TCHAR buffer[256];
        vlan->setName(var->getValueAsString(buffer, 256));
@@ -85,12 +85,12 @@ static void ParseVlanMap(VlanList *vlanList, UINT32 ifIndex, BYTE *map, int offs
 static UINT32 HandlerTrunkPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
-   size_t nameLen = var->getName()->getLength();
-       UINT32 ifIndex = var->getName()->getValue()[nameLen - 1];
+   size_t nameLen = var->getName().length();
+   UINT32 ifIndex = var->getName().getElement(nameLen - 1);
 
-       // Check if port is acting as trunk
-       UINT32 oidName[256], value;
-   memcpy(oidName, var->getName()->getValue(), nameLen * sizeof(UINT32));
+   // Check if port is acting as trunk
+   UINT32 oidName[256], value;
+   memcpy(oidName, var->getName().value(), nameLen * sizeof(UINT32));
    oidName[nameLen - 2] = 14;  // .1.3.6.1.4.1.9.9.46.1.6.1.1.14
        if (SnmpGetEx(transport, NULL, oidName, nameLen, &value, sizeof(UINT32), 0, NULL) != SNMP_ERR_SUCCESS)
           return SNMP_ERR_SUCCESS;     // Cannot get trunk state, ignore port
@@ -137,11 +137,11 @@ static UINT32 HandlerTrunkPorts(SNMP_Variable *var, SNMP_Transport *transport, v
 static UINT32 HandlerAccessPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
-   size_t nameLen = var->getName()->getLength();
-       UINT32 ifIndex = var->getName()->getValue()[nameLen - 1];
+   size_t nameLen = var->getName().length();
+   UINT32 ifIndex = var->getName().getElement(nameLen - 1);
 
-       UINT32 oidName[256];
-   memcpy(oidName, var->getName()->getValue(), nameLen * sizeof(UINT32));
+   UINT32 oidName[256];
+   memcpy(oidName, var->getName().value(), nameLen * sizeof(UINT32));
 
        // Entry type: 3=multi-vlan
        if (var->getValueAsInt() == 3)
index 35736c0..0f6b461 100644 (file)
@@ -130,10 +130,10 @@ static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, v
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
    UINT32 oid[MAX_OID_LEN];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
    UINT32 apIndex = oid[nameLen - 1];
 
    SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmp->getSnmpVersion());
@@ -237,8 +237,8 @@ static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snm
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   UINT32 apIndex = name->getValue()[name->getLength() - 1];
+   const SNMP_ObjectId& name = var->getName();
+   UINT32 apIndex = name.getElement(name.length() - 1);
 
    WirelessStationInfo *info = new WirelessStationInfo;
    memset(info, 0, sizeof(WirelessStationInfo));
index c24609d..800b202 100644 (file)
@@ -86,11 +86,11 @@ void NetscreenDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, Stri
  */
 static UINT32 HandlerIfList(SNMP_Variable *varbind, SNMP_Transport *transport, void *arg)
 {
-       InterfaceList *ifList = (InterfaceList *)arg;
+   InterfaceList *ifList = (InterfaceList *)arg;
 
-   size_t nameLen = varbind->getName()->getLength();
-       UINT32 oidName[MAX_OID_LEN];
-       memcpy(oidName, varbind->getName()->getValue(), nameLen * sizeof(UINT32));
+   size_t nameLen = varbind->getName().length();
+   UINT32 oidName[MAX_OID_LEN];
+   memcpy(oidName, varbind->getName().value(), nameLen * sizeof(UINT32));
 
        InterfaceInfo *iface = new InterfaceInfo(varbind->getValueAsUInt());
 
index ed46584..4c056e9 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Driver for Nortel WLAN Security Switch series
-** Copyright (C) 2013 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
@@ -124,11 +124,11 @@ static UINT32 HandlerAccessPointListAdopted(SNMP_Variable *var, SNMP_Transport *
 
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
 
    UINT32 oid[128];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
 
    // get serial number - it's encoded in OID as <length>.<serial>
    TCHAR serial[128];
@@ -186,11 +186,11 @@ static UINT32 HandlerRadioList(SNMP_Variable *var, SNMP_Transport *transport, vo
 {
    AccessPointInfo *ap = (AccessPointInfo *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
 
    UINT32 oid[128];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
 
    RadioInterfaceInfo rif;
    memcpy(rif.macAddr, var->getValue(), MAC_ADDR_LENGTH);
@@ -275,9 +275,9 @@ static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *tra
 
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
-   const UINT32 *value = name->getValue();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
+   const UINT32 *value = name.value();
 
    UINT32 oid[32];
    memcpy(oid, value, nameLen * sizeof(value[0]));
index 88abf9f..c58d682 100644 (file)
@@ -82,12 +82,9 @@ bool QtechOLTDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid)
  */
 static UINT32 HandlerIndex(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
-    UINT32 oid[128];
-    size_t oidLen = pVar->getName()->getLength();
-    memcpy(oid, pVar->getName()->getValue(), oidLen * sizeof(UINT32));
-
-    InterfaceInfo *info = new InterfaceInfo(pVar->getValueAsUInt() + oid[14] * 1000);
-    info->slot = oid[14];
+    UINT32 slot = pVar->getName().getElement(14);
+    InterfaceInfo *info = new InterfaceInfo(pVar->getValueAsUInt() + slot * 1000);
+    info->slot = slot;
     info->port = info->index - info->slot * 1000;
     info->isPhysicalPort = true;
     ((InterfaceList *)pArg)->add(info);
index ca292f6..54a498f 100644 (file)
@@ -132,9 +132,9 @@ static UINT32 HandlerAccessPointListUnadopted(SNMP_Variable *var, SNMP_Transport
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
-   UINT32 apIndex = name->getValue()[nameLen - 1];
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
+   UINT32 apIndex = name.getElement(nameLen - 1);
 
    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;
@@ -179,9 +179,9 @@ static UINT32 HandlerAccessPointListAdopted(SNMP_Variable *var, SNMP_Transport *
 
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
-   UINT32 apIndex = name->getValue()[nameLen - 1];
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
+   UINT32 apIndex = name.getElement(nameLen - 1);
 
    UINT32 numberOfRadios = 0;
    TCHAR serial[128];
@@ -420,9 +420,9 @@ static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *tra
 
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
-   const UINT32 *value = name->getValue();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
+   const UINT32 *value = name.value();
 
    UINT32 oid[32];
    memcpy(oid, value, nameLen * sizeof(value[0]));
index 6c12a92..3f196e5 100644 (file)
@@ -75,9 +75,9 @@ bool TelcoBridgesDriver::isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oi
  */
 static UINT32 HandlerIndex(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
-   if (var->getName()->getLength() == 12)
+   if (var->getName().length() == 12)
    {
-      const UINT32 *oid = var->getName()->getValue();
+      const UINT32 *oid = var->getName().value();
       UINT32 ifIndex = (oid[10] << 12) | (oid[11] & 0x0FFF);
       ((InterfaceList *)arg)->add(new InterfaceInfo(ifIndex, 2, &oid[10]));
    }
@@ -97,8 +97,8 @@ static UINT32 HandlerIpAddr(SNMP_Variable *pVar, SNMP_Transport *pTransport, voi
    UINT32 index, dwNetMask, dwResult;
    UINT32 oidName[MAX_OID_LEN];
 
-   size_t nameLen = pVar->getName()->getLength();
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   size_t nameLen = pVar->getName().length();
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
    oidName[nameLen - 5] = 3;  // Retrieve network mask for this IP
    dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
index 126ee0a..7ec34b9 100644 (file)
@@ -132,10 +132,10 @@ static UINT32 HandlerAccessPointList(SNMP_Variable *var, SNMP_Transport *snmp, v
 {
    ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   size_t nameLen = name->getLength();
+   const SNMP_ObjectId& name = var->getName();
+   size_t nameLen = name.length();
    UINT32 oid[MAX_OID_LEN];
-   memcpy(oid, name->getValue(), nameLen * sizeof(UINT32));
+   memcpy(oid, name.value(), nameLen * sizeof(UINT32));
    UINT32 apIndex = oid[nameLen - 1];
 
    SNMP_PDU *request = new SNMP_PDU(SNMP_GET_REQUEST, SnmpNewRequestId(), snmp->getSnmpVersion());
@@ -208,13 +208,13 @@ static UINT32 HandlerWirelessStationList(SNMP_Variable *var, SNMP_Transport *snm
 {
    ObjectArray<WirelessStationInfo> *wsList = (ObjectArray<WirelessStationInfo> *)arg;
 
-   SNMP_ObjectId *name = var->getName();
-   UINT32 apIndex = name->getValue()[name->getLength() - 1];
+   const SNMP_ObjectId& name = var->getName();
+   UINT32 apIndex = name.getElement(name.length() - 1);
 
    WirelessStationInfo *info = new WirelessStationInfo;
    memset(info, 0, sizeof(WirelessStationInfo));
    for(int i = 0; i < MAC_ADDR_LENGTH; i++)
-      info->macAddr[i] = name->getValue()[i + 13];
+      info->macAddr[i] = name.getElement(i + 13);
    info->ipAddr = 0;
    info->vlan = 1;
    info->signalStrength = var->getValueAsInt();
index b839755..b16f850 100644 (file)
@@ -167,8 +167,8 @@ static UINT32 HandlerIndex(SNMP_Variable *pVar, SNMP_Transport *pTransport, void
  */
 static UINT32 HandlerIndexIfXTable(SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
-   SNMP_ObjectId *name = pVar->getName();
-   UINT32 index = name->getValue()[name->getLength() - 1];
+   const SNMP_ObjectId& name = pVar->getName();
+   UINT32 index = name.value()[name.length() - 1];
    if (((InterfaceList *)pArg)->findByIfIndex(index) == NULL)
    {
           ((InterfaceList *)pArg)->add(new InterfaceInfo(index));
@@ -184,8 +184,8 @@ static UINT32 HandlerIpAddr(SNMP_Variable *pVar, SNMP_Transport *pTransport, voi
    UINT32 index, dwNetMask, dwResult;
    UINT32 oidName[MAX_OID_LEN];
 
-   size_t nameLen = pVar->getName()->getLength();
-   memcpy(oidName, pVar->getName()->getValue(), nameLen * sizeof(UINT32));
+   size_t nameLen = pVar->getName().length();
+   memcpy(oidName, pVar->getName().value(), nameLen * sizeof(UINT32));
    oidName[nameLen - 5] = 3;  // Retrieve network mask for this IP
    dwResult = SnmpGetEx(pTransport, NULL, oidName, nameLen, &dwNetMask, sizeof(UINT32), 0, NULL);
    if (dwResult != SNMP_ERR_SUCCESS)
@@ -228,8 +228,8 @@ static UINT32 HandlerIpAddressTable(SNMP_Variable *var, SNMP_Transport *snmp, vo
    InterfaceList *ifList = (InterfaceList *)arg;
 
    UINT32 oid[128];
-   size_t oidLen = var->getName()->getLength();
-   memcpy(oid, var->getName()->getValue(), oidLen * sizeof(UINT32));
+   size_t oidLen = var->getName().length();
+   memcpy(oid, var->getName().value(), oidLen * sizeof(UINT32));
 
    // Check address family (1 = ipv4, 2 = ipv6)
    if ((oid[10] != 1) && (oid[10] != 2))
@@ -268,17 +268,16 @@ static UINT32 HandlerIpAddressTable(SNMP_Variable *var, SNMP_Transport *snmp, vo
       // check number of varbinds and address type (1 = unicast)
       if ((response->getNumVariables() == 2) && (response->getVariable(0)->getValueAsInt() == 1))
       {
-         SNMP_ObjectId *prefix = response->getVariable(1)->getValueAsObjectId();
-         if ((prefix != NULL) && !prefix->isZeroDotZero())
+         SNMP_ObjectId prefix = response->getVariable(1)->getValueAsObjectId();
+         if (prefix.isValid() && !prefix.isZeroDotZero())
          {
             // Last element in ipAddressPrefixTable index is prefix length
-            addr.setMaskBits((int)prefix->getValue()[prefix->getLength() - 1]);
+            addr.setMaskBits((int)prefix.value()[prefix.length() - 1]);
          }
          else
          {
             ifList->setPrefixWalkNeeded();
          }
-         delete prefix;
          iface->ipAddrList.add(addr);
       }
       delete response;
@@ -292,7 +291,7 @@ static UINT32 HandlerIpAddressTable(SNMP_Variable *var, SNMP_Transport *snmp, vo
 static UINT32 HandlerIpAddressPrefixTable(SNMP_Variable *var, SNMP_Transport *snmp, void *arg)
 {
    InterfaceList *ifList = (InterfaceList *)arg;
-   const UINT32 *oid = var->getName()->getValue();
+   const UINT32 *oid = var->getName().value();
    
    // Check address family (1 = ipv4, 2 = ipv6)
    if ((oid[10] != 1) && (oid[10] != 2))
@@ -605,7 +604,7 @@ static UINT32 HandlerVlanList(SNMP_Variable *var, SNMP_Transport *transport, voi
 {
    VlanList *vlanList = (VlanList *)arg;
 
-       VlanInfo *vlan = new VlanInfo(var->getName()->getValue()[var->getName()->getLength() - 1], VLAN_PRM_BPORT);
+       VlanInfo *vlan = new VlanInfo(var->getName().value()[var->getName().length() - 1], VLAN_PRM_BPORT);
 
        TCHAR buffer[256];
        vlan->setName(var->getValueAsString(buffer, 256));
@@ -656,7 +655,7 @@ static void ParseVlanPorts(VlanList *vlanList, VlanInfo *vlan, BYTE map, int off
 static UINT32 HandlerVlanEgressPorts(SNMP_Variable *var, SNMP_Transport *transport, void *arg)
 {
    VlanList *vlanList = (VlanList *)arg;
-       UINT32 vlanId = var->getName()->getValue()[var->getName()->getLength() - 1];
+       UINT32 vlanId = var->getName().value()[var->getName().length() - 1];
        VlanInfo *vlan = vlanList->findById(vlanId);
        if (vlan != NULL)
        {
index 23afbe2..f4c6e26 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** SNMP support library
-** 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 Lesser General Public License as published by
@@ -30,36 +30,24 @@ SNMP_ObjectId::SNMP_ObjectId()
 {
    m_length = 0;
    m_value = NULL;
-   m_textValue = NULL;
 }
 
 /**
  * Copy constructor
  */
-SNMP_ObjectId::SNMP_ObjectId(SNMP_ObjectId *src)
+SNMP_ObjectId::SNMP_ObjectId(const SNMP_ObjectId &src)
 {
-   m_length = src->m_length;
-   m_value = (UINT32 *)nx_memdup(src->m_value, sizeof(UINT32) * m_length);
-   if (src->m_textValue != NULL)
-   {
-      m_textValue = _tcsdup(src->m_textValue);
-   }
-   else
-   {
-      m_textValue = NULL;
-      convertToText();
-   }
+   m_length = src.m_length;
+   m_value = (UINT32 *)nx_memdup(src.m_value, sizeof(UINT32) * m_length);
 }
 
 /**
  * Create OID from existing binary value
  */
-SNMP_ObjectId::SNMP_ObjectId(size_t length, const UINT32 *value)
+SNMP_ObjectId::SNMP_ObjectId(const UINT32 *value, size_t length)
 {
    m_length = (UINT32)length;
    m_value = (UINT32 *)nx_memdup(value, sizeof(UINT32) * length);
-   m_textValue = NULL;
-   convertToText();
 }
 
 /**
@@ -67,23 +55,43 @@ SNMP_ObjectId::SNMP_ObjectId(size_t length, const UINT32 *value)
  */
 SNMP_ObjectId::~SNMP_ObjectId()
 {
-   safe_free(m_value);
-   safe_free(m_textValue);
+   free(m_value);
+}
+
+/**
+ * Operator =
+ */
+SNMP_ObjectId& SNMP_ObjectId::operator =(const SNMP_ObjectId &src)
+{
+   free(m_value);
+   m_length = src.m_length;
+   m_value = (UINT32 *)nx_memdup(src.m_value, sizeof(UINT32) * m_length);
+   return *this;
 }
 
 /**
- * Convert binary representation to text
+ * Get OID value as text
  */
-void SNMP_ObjectId::convertToText()
+String SNMP_ObjectId::toString() const
 {
-   m_textValue = (TCHAR *)realloc(m_textValue, sizeof(TCHAR) * (m_length * 6 + 1));
-   SNMPConvertOIDToText(m_length, m_value, m_textValue, m_length * 6 + 1);
+   TCHAR buffer[MAX_OID_LEN * 5];
+   SNMPConvertOIDToText(m_length, m_value, buffer, MAX_OID_LEN * 5);
+   return String(buffer);
+}
+
+/**
+ * Get OID value as text
+ */
+TCHAR *SNMP_ObjectId::toString(TCHAR *buffer, size_t bufferSize) const
+{
+   SNMPConvertOIDToText(m_length, m_value, buffer, bufferSize);
+   return buffer;
 }
 
 /**
  * Compare this OID with another
  */
-int SNMP_ObjectId::compare(const TCHAR *pszOid)
+int SNMP_ObjectId::compare(const TCHAR *pszOid) const
 {
    UINT32 dwBuffer[MAX_OID_LEN];
    size_t length = SNMPParseOID(pszOid, dwBuffer, MAX_OID_LEN);
@@ -100,7 +108,7 @@ int SNMP_ObjectId::compare(const TCHAR *pszOid)
  *    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)
+int SNMP_ObjectId::compare(const UINT32 *oid, size_t length) const
 {
    if ((oid == NULL) || (length == 0) || (m_value == NULL))
       return OID_ERROR;
@@ -112,29 +120,25 @@ int SNMP_ObjectId::compare(const UINT32 *oid, size_t length)
          return (m_value[i] < oid[i]) ? OID_PRECEDING : OID_FOLLOWING;
    }
 
-   return (length == m_length) ? OID_EQUAL : 
-            ((length < m_length) ? OID_SHORTER : OID_LONGER);
+   return (length == m_length) ? OID_EQUAL : ((length < m_length) ? OID_LONGER : OID_SHORTER);
 }
 
 /**
  * Compare this OID to another
  */
-int SNMP_ObjectId::compare(SNMP_ObjectId *oid)
+int SNMP_ObjectId::compare(const SNMP_ObjectId& oid) const
 {
-       if (oid == NULL)
-      return OID_ERROR;
-       return compare(oid->getValue(), oid->getLength());
+       return compare(oid.value(), oid.length());
 }
 
 /**
  * Set new value
  */
-void SNMP_ObjectId::setValue(UINT32 *value, size_t length)
+void SNMP_ObjectId::setValue(const UINT32 *value, size_t length)
 {
-   safe_free(m_value);
+   free(m_value);
    m_length = (UINT32)length;
    m_value = (UINT32 *)nx_memdup(value, sizeof(UINT32) * length);
-   convertToText();
 }
 
 /**
@@ -146,5 +150,40 @@ void SNMP_ObjectId::extend(UINT32 subId)
 {
    m_value = (UINT32 *)realloc(m_value, sizeof(UINT32) * (m_length + 1));
    m_value[m_length++] = subId;
-   convertToText();
+}
+
+/**
+ * Extend value by multiple subids
+ *
+ * @param subId sub-identifier to add
+ * @param length length of sub-identifier to add
+ */
+void SNMP_ObjectId::extend(const UINT32 *subId, size_t length)
+{
+   m_value = (UINT32 *)realloc(m_value, sizeof(UINT32) * (m_length + length));
+   memcpy(&m_value[m_length], subId, length * sizeof(UINT32));
+   m_length += length;
+}
+
+/**
+ * Truncate value by given number of sub-identifiers
+ *
+ * @param count number of sub-identifiers to remove
+ */
+void SNMP_ObjectId::truncate(size_t count)
+{
+   if (count < m_length)
+      m_length -= count;
+   else
+      m_length = 0;
+}
+
+/**
+ * Parse OID
+ */
+SNMP_ObjectId SNMP_ObjectId::parse(const TCHAR *oid)
+{
+   UINT32 buffer[MAX_OID_LEN];
+   size_t length = SNMPParseOID(oid, buffer, MAX_OID_LEN);
+   return SNMP_ObjectId(buffer, length);
 }
index d74f1c0..c6243be 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** SNMP support library
-** 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
@@ -121,7 +121,7 @@ SNMP_PDU::SNMP_PDU(SNMP_PDU *src) : m_authoritativeEngine(&src->m_authoritativeE
    m_variables = new ObjectArray<SNMP_Variable>(src->m_variables->size(), 16, true);
    for(int i = 0; i < src->m_variables->size(); i++)
       m_variables->add(new SNMP_Variable(src->m_variables->get(i)));
-   m_pEnterprise = (src->m_pEnterprise != NULL) ? new SNMP_ObjectId(src->m_pEnterprise) : NULL;
+   m_pEnterprise = (src->m_pEnterprise != NULL) ? new SNMP_ObjectId(*src->m_pEnterprise) : NULL;
    m_dwErrorCode = src->m_dwErrorCode;
    m_dwErrorIndex = src->m_dwErrorIndex;
    m_dwRqId = src->m_dwRqId;
@@ -285,7 +285,7 @@ bool SNMP_PDU::parseTrapPDU(BYTE *pData, size_t pduLength)
          memset(oid, 0, sizeof(SNMP_OID));
          if (BER_DecodeContent(dwType, pbCurrPos, dwLength, (BYTE *)oid))
          {
-            m_pEnterprise = new SNMP_ObjectId(oid->length, oid->value);
+            m_pEnterprise = new SNMP_ObjectId(oid->value, oid->length);
             pduLength -= dwLength + idLength;
             pbCurrPos += dwLength;
 
@@ -409,7 +409,7 @@ bool SNMP_PDU::parseTrap2PDU(BYTE *pData, size_t pduLength)
          SNMP_Variable *var = m_variables->get(1);
          if (var->getType() == ASN_OBJECT_ID)
          {
-            m_pEnterprise = new SNMP_ObjectId(var->getValueLength() / sizeof(UINT32), (UINT32 *)var->getValue());
+            m_pEnterprise = new SNMP_ObjectId((UINT32 *)var->getValue(), var->getValueLength() / sizeof(UINT32));
             bResult = true;
          }
       }
@@ -417,16 +417,16 @@ bool SNMP_PDU::parseTrap2PDU(BYTE *pData, size_t pduLength)
       // Set V1 trap type and specific trap type fields
       if (bResult)
       {
-         if ((m_pEnterprise->compare(pdwStdTrapPrefix, 9) == OID_SHORTER) &&
-             (m_pEnterprise->getLength() == 10))
+         if ((m_pEnterprise->compare(pdwStdTrapPrefix, 9) == OID_LONGER) &&
+             (m_pEnterprise->length() == 10))
          {
-            m_trapType = m_pEnterprise->getValue()[9];
+            m_trapType = m_pEnterprise->value()[9];
             m_specificTrap = 0;
          }
          else
          {
             m_trapType = 6;
-            m_specificTrap = m_pEnterprise->getValue()[m_pEnterprise->getLength() - 1];
+            m_specificTrap = m_pEnterprise->value()[m_pEnterprise->length() - 1];
          }
       }
    }
@@ -942,7 +942,7 @@ size_t SNMP_PDU::encode(BYTE **ppBuffer, SNMP_SecurityContext *securityContext)
    for(dwBufferSize = 1024, i = 0; i < m_variables->size(); i++)
    {
       SNMP_Variable *var = m_variables->get(i);
-      dwBufferSize += var->getValueLength() + var->getName()->getLength() * 4 + 16;
+      dwBufferSize += var->getValueLength() + var->getName().length() * 4 + 16;
    }
    pBlock = (BYTE *)malloc(dwBufferSize);
    pVarBinds = (BYTE *)malloc(dwBufferSize);
@@ -976,8 +976,8 @@ size_t SNMP_PDU::encode(BYTE **ppBuffer, SNMP_SecurityContext *securityContext)
       switch(pduType)
       {
          case ASN_TRAP_V1_PDU:
-            dwBytes = BER_Encode(ASN_OBJECT_ID, (BYTE *)m_pEnterprise->getValue(),
-                                 m_pEnterprise->getLength() * sizeof(UINT32),
+            dwBytes = BER_Encode(ASN_OBJECT_ID, (BYTE *)m_pEnterprise->value(),
+                                 m_pEnterprise->length() * sizeof(UINT32),
                                  pbCurrPos, dwBufferSize - dwPDUSize);
             dwPDUSize += dwBytes;
             pbCurrPos += dwBytes;
index 8274a88..a6255b3 100644 (file)
@@ -69,7 +69,7 @@ void SNMP_Snapshot::buildIndex()
       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);
+      HASH_ADD_KEYPTR(hh, m_index, entry->var->getName().value(), entry->var->getName().length() * sizeof(UINT32), entry);
    }
 }
 
@@ -172,7 +172,7 @@ SNMP_Variable *SNMP_Snapshot::getNext(const UINT32 *oid, size_t oidLen) const
    for(int i = 0; i < m_values->size(); i++)
    {
       SNMP_Variable *v = m_values->get(i);
-      int c = v->getName()->compare(oid, oidLen);
+      int c = v->getName().compare(oid, oidLen);
       if ((c == OID_FOLLOWING) || (c == OID_LONGER))
          return v;
    }
@@ -198,12 +198,12 @@ EnumerationCallbackResult SNMP_Snapshot::walk(const UINT32 *baseOid, size_t base
 {
    EnumerationCallbackResult result = _CONTINUE;
    SNMP_Variable *curr = getNext(baseOid, baseOidLen);
-   while(curr->getName()->compare(baseOid, baseOidLen) == OID_LONGER)
+   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());
+      curr = getNext(curr->getName().value(), curr->getName().length());
    }
    return result;
 }
index 6c57af5..4113ce7 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ** NetXMS - Network Management System
 ** SNMP support library
-** 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
  */
 static struct
 {
-       const TCHAR *oid;
+       const UINT32 oid[12];
+       size_t oidLen;
        UINT32 errorCode;
 } s_oidToErrorMap[] =
 {
-       { _T(".1.3.6.1.6.3.11.2.1.3"), SNMP_ERR_ENGINE_ID },
-       { _T(".1.3.6.1.6.3.11.2.1.3.0"), SNMP_ERR_ENGINE_ID },
-       { _T(".1.3.6.1.6.3.15.1.1.1.0"), SNMP_ERR_UNSUPP_SEC_LEVEL },
-       { _T(".1.3.6.1.6.3.15.1.1.2.0"), SNMP_ERR_TIME_WINDOW },
-       { _T(".1.3.6.1.6.3.15.1.1.3.0"), SNMP_ERR_SEC_NAME },
-       { _T(".1.3.6.1.6.3.15.1.1.4.0"), SNMP_ERR_ENGINE_ID },
-       { _T(".1.3.6.1.6.3.15.1.1.5.0"), SNMP_ERR_AUTH_FAILURE },
-       { _T(".1.3.6.1.6.3.15.1.1.6.0"), SNMP_ERR_DECRYPTION },
-       { NULL, 0 }
+       { { 1, 3, 6, 1, 6, 3, 11, 2, 1, 3 }, 10, SNMP_ERR_ENGINE_ID },
+       { { 1, 3, 6, 1, 6, 3, 11, 2, 1, 3, 0 }, 11, SNMP_ERR_ENGINE_ID },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 }, 11, SNMP_ERR_UNSUPP_SEC_LEVEL },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 }, 11, SNMP_ERR_TIME_WINDOW },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 }, 11, SNMP_ERR_SEC_NAME },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 }, 11, SNMP_ERR_ENGINE_ID },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 }, 11, SNMP_ERR_AUTH_FAILURE },
+       { { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 }, 11, SNMP_ERR_DECRYPTION },
+       { { 0 }, 0, 0 }
 };
 
 /**
@@ -149,11 +150,11 @@ retry:
                                                if ((*response)->getCommand() == SNMP_REPORT)
                                                {
                               SNMP_Variable *var = (*response)->getVariable(0);
-                                                       const TCHAR *oid = var->getName()->getValueAsText();
                                                        rc = SNMP_ERR_AGENT;
-                                                       for(int i = 0; s_oidToErrorMap[i].oid != NULL; i++)
+                                                       const SNMP_ObjectId& oid = var->getName();
+                                                       for(int i = 0; s_oidToErrorMap[i].oidLen != 0; i++)
                                                        {
-                                                               if (!_tcscmp(oid, s_oidToErrorMap[i].oid))
+                                                               if (oid.compare(s_oidToErrorMap[i].oid, s_oidToErrorMap[i].oidLen) == OID_EQUAL)
                                                                {
                                                                        rc = s_oidToErrorMap[i].errorCode;
                                                                        break;
index 7c57a8c..8ff77ba 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
@@ -294,18 +294,18 @@ UINT32 LIBNXSNMP_EXPORTABLE SnmpWalk(SNMP_Transport *transport, const UINT32 *ro
                // 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() < rootOidLen) ||
-                   (memcmp(rootOid, pVar->getName()->getValue(), rootOidLen * sizeof(UINT32))) ||
-                                                (pVar->getName()->compare(pdwName, nameLength) == OID_EQUAL) ||
-                                                (pVar->getName()->compare(firstObjectName, firstObjectNameLen) == OID_EQUAL))
+               if ((pVar->getName().length() < rootOidLen) ||
+                   (memcmp(rootOid, pVar->getName().value(), rootOidLen * sizeof(UINT32))) ||
+                                                (pVar->getName().compare(pdwName, nameLength) == OID_EQUAL) ||
+                                                (pVar->getName().compare(firstObjectName, firstObjectNameLen) == OID_EQUAL))
                {
                   bRunning = FALSE;
                   delete pRespPDU;
                   delete pRqPDU;
                   break;
                }
-               nameLength = pVar->getName()->getLength();
-               memcpy(pdwName, pVar->getName()->getValue(), nameLength * sizeof(UINT32));
+               nameLength = pVar->getName().length();
+               memcpy(pdwName, pVar->getName().value(), nameLength * sizeof(UINT32));
                                        if (firstObjectNameLen == 0)
                                        {
                                                firstObjectNameLen = nameLength;
index 69d54a9..9f314c8 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** SNMP support library
-** Copyright (C) 2003-2010 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
@@ -28,7 +28,6 @@
  */
 SNMP_Variable::SNMP_Variable()
 {
-   m_name = NULL;
    m_value = NULL;
    m_type = ASN_NULL;
    m_valueLength = 0;
@@ -39,28 +38,30 @@ SNMP_Variable::SNMP_Variable()
  */
 SNMP_Variable::SNMP_Variable(const TCHAR *name)
 {
-   size_t length;
-   UINT32 *pdwOid;
-
+   m_name = SNMP_ObjectId::parse(name);
    m_value = NULL;
    m_type = ASN_NULL;
    m_valueLength = 0;
+}
 
-   pdwOid = (UINT32 *)malloc(sizeof(UINT32) * MAX_OID_LEN);
-   length = SNMPParseOID(name, pdwOid, MAX_OID_LEN);
-   m_name = new SNMP_ObjectId(length, pdwOid);
-   free(pdwOid);
+/**
+ * Create variable of ASN_NULL type
+ */
+SNMP_Variable::SNMP_Variable(const UINT32 *name, size_t nameLen) : m_name(name, nameLen)
+{
+   m_value = NULL;
+   m_type = ASN_NULL;
+   m_valueLength = 0;
 }
 
 /**
  * Create variable of ASN_NULL type
  */
-SNMP_Variable::SNMP_Variable(UINT32 *name, size_t nameLen)
+SNMP_Variable::SNMP_Variable(const SNMP_ObjectId &name) : m_name(name)
 {
    m_value = NULL;
    m_type = ASN_NULL;
    m_valueLength = 0;
-   m_name = new SNMP_ObjectId(nameLen, name);
 }
 
 /**
@@ -71,7 +72,7 @@ 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;
    m_type = src->m_type;
-   m_name = new SNMP_ObjectId(src->m_name);
+   m_name = src->m_name;
 }
 
 /**
@@ -79,8 +80,7 @@ SNMP_Variable::SNMP_Variable(const SNMP_Variable *src)
  */
 SNMP_Variable::~SNMP_Variable()
 {
-   delete m_name;
-   safe_free(m_value);
+   free(m_value);
 }
 
 /**
@@ -104,7 +104,7 @@ bool SNMP_Variable::parse(BYTE *data, size_t varLength)
    memset(oid, 0, sizeof(SNMP_OID));
    if (BER_DecodeContent(type, pbCurrPos, length, (BYTE *)oid))
    {
-      m_name = new SNMP_ObjectId(oid->length, oid->value);
+      m_name.setValue(oid->value, (size_t)oid->length);
       varLength -= length + dwIdLength;
       pbCurrPos += length;
       bResult = TRUE;
@@ -363,15 +363,11 @@ TCHAR *SNMP_Variable::getValueAsPrintableString(TCHAR *buffer, size_t bufferSize
 /**
  * Get value as object id. Returned object must be destroyed by caller
  */
-SNMP_ObjectId *SNMP_Variable::getValueAsObjectId() const
+SNMP_ObjectId SNMP_Variable::getValueAsObjectId() const
 {
-   SNMP_ObjectId *oid = NULL;
-
-   if (m_type == ASN_OBJECT_ID)
-   {
-      oid = new SNMP_ObjectId(m_valueLength / sizeof(UINT32), (UINT32 *)m_value);
-   }
-   return oid;
+   if (m_type != ASN_OBJECT_ID)
+      return SNMP_ObjectId();
+   return SNMP_ObjectId((UINT32 *)m_value, m_valueLength / sizeof(UINT32));
 }
 
 /**
@@ -423,10 +419,10 @@ size_t SNMP_Variable::encode(BYTE *pBuffer, size_t bufferSize)
    size_t bytes, dwWorkBufSize;
    BYTE *pWorkBuf;
 
-   dwWorkBufSize = (UINT32)(m_valueLength + m_name->getLength() * 4 + 16);
+   dwWorkBufSize = (UINT32)(m_valueLength + m_name.length() * 4 + 16);
    pWorkBuf = (BYTE *)malloc(dwWorkBufSize);
-   bytes = BER_Encode(ASN_OBJECT_ID, (BYTE *)m_name->getValue(), 
-                        m_name->getLength() * sizeof(UINT32), 
+   bytes = BER_Encode(ASN_OBJECT_ID, (BYTE *)m_name.value(),
+                        m_name.length() * sizeof(UINT32),
                         pWorkBuf, dwWorkBufSize);
    bytes += BER_Encode(m_type, m_value, m_valueLength, 
                          pWorkBuf + bytes, dwWorkBufSize - bytes);
index c60a3da..1edc157 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** nxsnmpget - command line tool used to retrieve parameters from SNMP agent
-** Copyright (C) 2004-2009 Victor Kirhenshtein
+** Copyright (C) 2004-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
@@ -105,11 +105,11 @@ int GetData(int argc, TCHAR *argv[])
                var = response->getVariable(i);
                if (var->getType() == ASN_NO_SUCH_OBJECT)
                {
-                  _tprintf(_T("No such object: %s\n"), var->getName()->getValueAsText());
+                  _tprintf(_T("No such object: %s\n"), (const TCHAR *)var->getName().toString());
                }
                else if (var->getType() == ASN_NO_SUCH_INSTANCE)
                {
-                  _tprintf(_T("No such instance: %s\n"), var->getName()->getValueAsText());
+                  _tprintf(_T("No such instance: %s\n"), (const TCHAR *)var->getName().toString());
                }
                else
                {
@@ -117,7 +117,7 @@ int GetData(int argc, TCHAR *argv[])
                                                TCHAR typeName[256];
 
                                                var->getValueAsPrintableString(szBuffer, 1024, &convert);
-                                               _tprintf(_T("%s [%s]: %s\n"), var->getName()->getValueAsText(),
+                                               _tprintf(_T("%s [%s]: %s\n"), (const TCHAR *)var->getName().toString(),
                                                         convert ? _T("Hex-STRING") : SNMPDataTypeName(var->getType(), typeName, 256),
                            szBuffer);
                }
index 2ade0df..66569a2 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** nxsnmpwalk - command line tool used to retrieve parameters from SNMP agent
-** Copyright (C) 2004-2013 Victor Kirhenshtein
+** Copyright (C) 2004-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
@@ -40,19 +40,24 @@ static UINT32 m_snmpVersion = SNMP_VERSION_2C;
 static UINT32 m_timeout = 3000;
 
 /**
- * Get data
+ * Walk callback
  */
-int GetData(TCHAR *pszHost, TCHAR *pszRootOid)
+static UINT32 WalkCallback(SNMP_Variable *var, SNMP_Transport *transport, void *userArg)
 {
-   SNMP_UDPTransport *pTransport;
-   SNMP_PDU *pRqPDU, *pRespPDU;
-   UINT32 dwResult;
-   size_t dwRootLen, dwNameLen;
-   UINT32 pdwRootName[MAX_OID_LEN], pdwName[MAX_OID_LEN];
-   TCHAR szBuffer[1024], typeName[256];
-   int iExit = 0;
-   BOOL bRunning = TRUE;
+   TCHAR buffer[1024], typeName[256];
+   bool convert = true;
+   var->getValueAsPrintableString(buffer, 1024, &convert);
+   _tprintf(_T("%s [%s]: %s\n"), (const TCHAR *)var->getName().toString(),
+            convert ? _T("Hex-STRING") : SNMPDataTypeName(var->getType(), typeName, 256),
+            buffer);
+   return SNMP_ERR_SUCCESS;
+}
 
+/**
+ * Get data
+ */
+static int DoWalk(TCHAR *pszHost, TCHAR *pszRootOid)
+{
    // Initialize WinSock
 #ifdef _WIN32
    WSADATA wsaData;
@@ -60,110 +65,35 @@ int GetData(TCHAR *pszHost, TCHAR *pszRootOid)
 #endif
 
    // Create SNMP transport
-   pTransport = new SNMP_UDPTransport;
-   dwResult = pTransport->createUDPTransport(pszHost, m_port);
+   SNMP_UDPTransport *transport = new SNMP_UDPTransport();
+   UINT32 dwResult = transport->createUDPTransport(pszHost, m_port);
    if (dwResult != SNMP_ERR_SUCCESS)
    {
       _tprintf(_T("Unable to create UDP transport: %s\n"), SNMPGetErrorText(dwResult));
-      iExit = 2;
+      return 2;
+   }
+
+   if (m_snmpVersion == SNMP_VERSION_3)
+   {
+      SNMP_SecurityContext *context = new SNMP_SecurityContext(m_user, m_authPassword, m_encryptionPassword, m_authMethod, m_encryptionMethod);
+      if (m_contextName[0] != 0)
+         context->setContextNameA(m_contextName);
+      transport->setSecurityContext(context);
    }
    else
    {
-               if (m_snmpVersion == SNMP_VERSION_3)
-               {
-                       SNMP_SecurityContext *context = new SNMP_SecurityContext(m_user, m_authPassword, m_encryptionPassword, m_authMethod, m_encryptionMethod);
-                       if (m_contextName[0] != 0)
-                               context->setContextNameA(m_contextName);
-                       pTransport->setSecurityContext(context);
-               }
-               else
-               {
-                       pTransport->setSecurityContext(new SNMP_SecurityContext(m_community));
-               }
-
-      // Get root
-      dwRootLen = SNMPParseOID(pszRootOid, pdwRootName, MAX_OID_LEN);
-      if (dwRootLen == 0)
-      {
-         dwResult = SNMP_ERR_BAD_OID;
-      }
-      else
-      {
-         memcpy(pdwName, pdwRootName, dwRootLen * sizeof(UINT32));
-         dwNameLen = dwRootLen;
-
-         // Walk the MIB
-         UINT32 requestId = 1;
-         while(bRunning)
-         {
-                               pRqPDU = new SNMP_PDU(SNMP_GET_NEXT_REQUEST, requestId++, m_snmpVersion);
-            pRqPDU->bindVariable(new SNMP_Variable(pdwName, dwNameLen));
-            dwResult = pTransport->doRequest(pRqPDU, &pRespPDU, m_timeout, 3);
-
-            // Analyze response
-            if (dwResult == SNMP_ERR_SUCCESS)
-            {
-               if ((pRespPDU->getNumVariables() > 0) &&
-                   (pRespPDU->getErrorCode() == 0))
-               {
-                  SNMP_Variable *pVar = pRespPDU->getVariable(0);
-
-                  if ((pVar->getType() != ASN_NO_SUCH_OBJECT) &&
-                      (pVar->getType() != ASN_NO_SUCH_INSTANCE))
-                  {
-                     // Should we stop walking?
-                     if ((pVar->getName()->getLength() < dwRootLen) ||
-                         (memcmp(pdwRootName, pVar->getName()->getValue(), dwRootLen * sizeof(UINT32))) ||
-                         ((pVar->getName()->getLength() == dwNameLen) &&
-                          (!memcmp(pVar->getName()->getValue(), pdwName, pVar->getName()->getLength() * sizeof(UINT32)))))
-                     {
-                        bRunning = FALSE;
-                        delete pRespPDU;
-                        delete pRqPDU;
-                        break;
-                     }
-                     memcpy(pdwName, pVar->getName()->getValue(), 
-                            pVar->getName()->getLength() * sizeof(UINT32));
-                     dwNameLen = pVar->getName()->getLength();
-
-                     // Print OID and value
-                                                       bool convert = true;
-                                                       pVar->getValueAsPrintableString(szBuffer, 1024, &convert);
-                                                       _tprintf(_T("%s [%s]: %s\n"), pVar->getName()->getValueAsText(),
-                                                                               convert ? _T("Hex-STRING") : SNMPDataTypeName(pVar->getType(), typeName, 256),
-                                                                               szBuffer);
-                  }
-                  else
-                  {
-                     // Consider no object/no instance as end of walk signal instead of failure
-                     bRunning = FALSE;
-                  }
-               }
-               else
-               {
-                  // Some SNMP agents sends NO_SUCH_NAME PDU error after last element in MIB
-                  if (pRespPDU->getErrorCode() != SNMP_PDU_ERR_NO_SUCH_NAME)
-                     dwResult = SNMP_ERR_AGENT;
-                  bRunning = FALSE;
-               }
-               delete pRespPDU;
-            }
-            else
-            {
-               bRunning = FALSE;
-            }
-            delete pRqPDU;
-         }
-      }
+      transport->setSecurityContext(new SNMP_SecurityContext(m_community));
+   }
 
-      if (dwResult != SNMP_ERR_SUCCESS)
-      {
-         _tprintf(_T("SNMP Error: %s\n"), SNMPGetErrorText(dwResult));
-         iExit = 3;
-      }
+   int iExit = 0;
+   dwResult = SnmpWalk(transport, pszRootOid, WalkCallback, NULL);
+   if (dwResult != SNMP_ERR_SUCCESS)
+   {
+      _tprintf(_T("SNMP Error: %s\n"), SNMPGetErrorText(dwResult));
+      iExit = 3;
    }
 
-   delete pTransport;
+   delete transport;
    return iExit;
 }
 
@@ -331,13 +261,13 @@ int main(int argc, char *argv[])
       else
       {
 #ifdef UNICODE
-                       WCHAR *host = WideStringFromMBString(argv[optind]);
-                       WCHAR *rootOid = WideStringFromMBString(argv[optind + 1]);
-         iExit = GetData(host, rootOid);
+                       WCHAR *host = WideStringFromMBStringSysLocale(argv[optind]);
+                       WCHAR *rootOid = WideStringFromMBStringSysLocale(argv[optind + 1]);
+         iExit = DoWalk(host, rootOid);
                        free(host);
                        free(rootOid);
 #else
-         iExit = GetData(argv[optind], argv[optind + 1]);
+         iExit = DoWalk(argv[optind], argv[optind + 1]);
 #endif
       }
    }
index 0825584..bc1bffe 100644 (file)
@@ -8,4 +8,4 @@
 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-SUBDIRS = include test-libnetxms test-libnxdb test-libnxcc
+SUBDIRS = include test-libnetxms test-libnxdb test-libnxcc test-libnxsnmp
diff --git a/tests/test-libnxsnmp/.cproject b/tests/test-libnxsnmp/.cproject
new file mode 100644 (file)
index 0000000..d503e0f
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+       <storageModule moduleId="org.eclipse.cdt.core.settings">
+               <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.712934938">
+                       <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.712934938" moduleId="org.eclipse.cdt.core.settings" name="Default">
+                               <externalSettings/>
+                               <extensions>
+                                       <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+                               </extensions>
+                       </storageModule>
+                       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+                               <configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.base.712934938" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
+                                       <folderInfo id="cdt.managedbuild.toolchain.gnu.base.712934938.778677876" name="/" resourcePath="">
+                                               <toolChain id="cdt.managedbuild.toolchain.gnu.base.1024388310" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.base">
+                                                       <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.247251183" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
+                                                       <builder id="cdt.managedbuild.target.gnu.builder.base.26918137" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/>
+                                                       <tool id="cdt.managedbuild.tool.gnu.archiver.base.1423044504" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+                                                       <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1831770467" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base">
+                                                               <option id="gnu.cpp.compiler.option.include.paths.589648854" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/tests/include&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.compiler.option.preprocessor.def.1167467826" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="_THREAD_SAFE"/>
+                                                                       <listOptionValue builtIn="false" value="TRE_WCHAR=1"/>
+                                                                       <listOptionValue builtIn="false" value="UNICODE"/>
+                                                                       <listOptionValue builtIn="false" value="_GNU_SOURCE"/>
+                                                               </option>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2043386998" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+                                                       </tool>
+                                                       <tool id="cdt.managedbuild.tool.gnu.c.compiler.base.950847694" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
+                                                               <option id="gnu.c.compiler.option.include.paths.341291910" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/tests/include&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.c.compiler.option.preprocessor.def.symbols.2024558834" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="_THREAD_SAFE"/>
+                                                                       <listOptionValue builtIn="false" value="TRE_WCHAR=1"/>
+                                                                       <listOptionValue builtIn="false" value="UNICODE"/>
+                                                                       <listOptionValue builtIn="false" value="_GNU_SOURCE"/>
+                                                               </option>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.692604013" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+                                                       </tool>
+                                                       <tool id="cdt.managedbuild.tool.gnu.c.linker.base.176412097" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
+                                                       <tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.858981108" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base">
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1600721076" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+                                                                       <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+                                                                       <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+                                                               </inputType>
+                                                       </tool>
+                                                       <tool id="cdt.managedbuild.tool.gnu.assembler.base.1687409437" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
+                                                               <option id="gnu.both.asm.option.include.paths.1097569359" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${NETXMS_BASE}/tests/include&quot;"/>
+                                                               </option>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.assembler.input.858582429" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+                                                       </tool>
+                                               </toolChain>
+                                       </folderInfo>
+                               </configuration>
+                       </storageModule>
+                       <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+               </cconfiguration>
+       </storageModule>
+       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+               <project id="test-libnxsnmp.null.1095734205" name="test-libnxsnmp"/>
+       </storageModule>
+       <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+       <storageModule moduleId="scannerConfiguration">
+               <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.712934938;cdt.managedbuild.toolchain.gnu.base.712934938.778677876;cdt.managedbuild.tool.gnu.c.compiler.base.950847694;cdt.managedbuild.tool.gnu.c.compiler.input.692604013">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.712934938;cdt.managedbuild.toolchain.gnu.base.712934938.778677876;cdt.managedbuild.tool.gnu.cpp.compiler.base.1831770467;cdt.managedbuild.tool.gnu.cpp.compiler.input.2043386998">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
+       </storageModule>
+</cproject>
diff --git a/tests/test-libnxsnmp/.project b/tests/test-libnxsnmp/.project
new file mode 100644 (file)
index 0000000..340c29c
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>test-libnxsnmp</name>
+       <comment></comment>
+       <projects>
+               <project>libnetxms</project>
+               <project>libnxsnmp</project>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+                       <triggers>clean,full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+                       <triggers>full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.cdt.core.cnature</nature>
+               <nature>org.eclipse.cdt.core.ccnature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+       </natures>
+       <filteredResources>
+               <filter>
+                       <id>1462092864922</id>
+                       <name></name>
+                       <type>6</type>
+                       <matcher>
+                               <id>org.eclipse.ui.ide.multiFilter</id>
+                               <arguments>1.0-name-matches-false-false-*.o</arguments>
+                       </matcher>
+               </filter>
+               <filter>
+                       <id>1462092864929</id>
+                       <name></name>
+                       <type>6</type>
+                       <matcher>
+                               <id>org.eclipse.ui.ide.multiFilter</id>
+                               <arguments>1.0-name-matches-false-false-*.lo</arguments>
+                       </matcher>
+               </filter>
+               <filter>
+                       <id>1462092864934</id>
+                       <name></name>
+                       <type>6</type>
+                       <matcher>
+                               <id>org.eclipse.ui.ide.multiFilter</id>
+                               <arguments>1.0-name-matches-false-false-*.la</arguments>
+                       </matcher>
+               </filter>
+       </filteredResources>
+</projectDescription>
diff --git a/tests/test-libnxsnmp/.settings/language.settings.xml b/tests/test-libnxsnmp/.settings/language.settings.xml
new file mode 100644 (file)
index 0000000..58c875f
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+       <configuration id="cdt.managedbuild.toolchain.gnu.base.712934938" name="Default">
+               <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+                       <provider class="org.eclipse.cdt.core.language.settings.providers.LanguageSettingsGenericProvider" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" name="CDT User Setting Entries" prefer-non-shared="true"/>
+                       <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+                       <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
+                       <provider-reference id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" ref="shared-provider"/>
+                       <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+               </extension>
+       </configuration>
+</project>
similarity index 56%
copy from tests/Makefile.am
copy to tests/test-libnxsnmp/Makefile.am
index 0825584..680cccb 100644 (file)
@@ -8,4 +8,13 @@
 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-SUBDIRS = include test-libnetxms test-libnxdb test-libnxcc
+bin_PROGRAMS = test-libnxsnmp
+test_libnxsnmp_SOURCES = test-libnxsnmp.cpp
+test_libnxsnmp_CPPFLAGS = -I@top_srcdir@/include -I../include
+test_libnxsnmp_LDADD = @top_srcdir@/src/libnetxms/libnetxms.la @top_srcdir@/src/snmp/libnxsnmp/libnxsnmp.la
+
+if USE_INTERNAL_LIBTRE
+test_libnxsnmp_LDADD += @top_srcdir@/src/libtre/libnxtre.la
+endif
+
+EXTRA_DIST = test-libnxsnmp.vcproj
diff --git a/tests/test-libnxsnmp/test-libnxsnmp.cpp b/tests/test-libnxsnmp/test-libnxsnmp.cpp
new file mode 100644 (file)
index 0000000..4d45f34
--- /dev/null
@@ -0,0 +1,152 @@
+#include <nms_common.h>
+#include <nms_util.h>
+#include <nxsnmp.h>
+#include <testtools.h>
+
+static UINT32 s_sysDescription[] = { 1, 3, 6, 1, 2, 1, 1, 1, 0 };
+static SNMP_ObjectId s_oidSysDescription(s_sysDescription, sizeof(s_sysDescription) / sizeof(UINT32));
+static UINT32 s_unsignedTest[] = { 1, 3, 6, 1, 2, 1, 1, 2164260864, 0 };
+static UINT32 s_sysLocation[] = { 1, 3, 6, 1, 2, 1, 1, 6, 0 };
+static SNMP_ObjectId s_oidSysLocation(s_sysLocation, sizeof(s_sysLocation) / sizeof(UINT32));
+static UINT32 s_system[] = { 1, 3, 6, 1, 2, 1, 1 };
+static SNMP_ObjectId s_oidSystem(s_system, sizeof(s_system) / sizeof(UINT32));
+
+/**
+ * Test OID conversion
+ */
+static void TestOidConversion()
+{
+   TCHAR text[256];
+   UINT32 bin[256];
+
+   StartTest(_T("SNMPConvertOIDToText"));
+   SNMPConvertOIDToText(9, s_sysDescription, text, 256);
+   AssertTrue(!_tcscmp(text, _T(".1.3.6.1.2.1.1.1.0")));
+   EndTest();
+
+   StartTest(_T("SNMPConvertOIDToText - handling high bit set"));
+   SNMPConvertOIDToText(9, s_unsignedTest, text, 256);
+   AssertTrue(!_tcscmp(text, _T(".1.3.6.1.2.1.1.2164260864.0")));
+   EndTest();
+
+   StartTest(_T("SNMPParseOID"));
+   AssertEquals(SNMPParseOID(_T(".1.3.6.1.2.1.1.1.0"), bin, 256), 9);
+   AssertTrue(!memcmp(bin, s_sysDescription, 9 * sizeof(UINT32)));
+   EndTest();
+
+   StartTest(_T("SNMPParseOID - handling high bit set"));
+   AssertEquals(SNMPParseOID(_T(".1.3.6.1.2.1.1.2164260864.0"), bin, 256), 9);
+   AssertTrue(!memcmp(bin, s_unsignedTest, 9 * sizeof(UINT32)));
+   EndTest();
+}
+
+/**
+ * Test SNMP_ObjectId class
+ */
+static void TestOidClass()
+{
+   StartTest(_T("SNMP_ObjectId::toString"));
+   AssertTrue(!_tcscmp(s_oidSysDescription.toString(), _T(".1.3.6.1.2.1.1.1.0")));
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::length"));
+   AssertEquals(s_oidSysDescription.length(), 9);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::value"));
+   AssertTrue(!memcmp(s_oidSysDescription.value(), s_sysDescription, 9 * sizeof(UINT32)));
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::compare"));
+   AssertEquals(s_oidSysDescription.compare(s_sysDescription, 9), OID_EQUAL);
+   AssertEquals(s_oidSysDescription.compare(s_unsignedTest, 9), OID_PRECEDING);
+   AssertEquals(s_oidSysLocation.compare(s_oidSysDescription), OID_FOLLOWING);
+   AssertEquals(s_oidSysLocation.compare(s_system, 7), OID_LONGER);
+   AssertEquals(s_oidSystem.compare(s_oidSysLocation), OID_SHORTER);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId copy constructor"));
+   SNMP_ObjectId copy(s_oidSysLocation);
+   AssertEquals(copy.compare(s_oidSysLocation), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::operator ="));
+   copy = s_oidSysDescription;
+   AssertEquals(copy.compare(s_oidSysDescription), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::extend"));
+   copy = s_oidSystem;
+   copy.extend(1);
+   copy.extend(0);
+   AssertEquals(copy.compare(s_oidSysDescription), OID_EQUAL);
+   copy = s_oidSystem;
+   static UINT32 ext[] = { 6, 0 };
+   copy.extend(ext, 2);
+   AssertEquals(copy.compare(s_oidSysLocation), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::truncate"));
+   copy.truncate(2);
+   AssertEquals(copy.compare(s_oidSystem), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::getElement"));
+   AssertEquals(copy.getElement(1), 3);
+   AssertEquals(copy.getElement(100), 0);
+   EndTest();
+
+   StartTest(_T("SNMP_ObjectId::changeElement"));
+   copy = s_oidSysDescription;
+   copy.changeElement(7, 6);
+   AssertEquals(copy.compare(s_oidSysLocation), OID_EQUAL);
+   EndTest();
+}
+
+/**
+ * Test SNMP_Variable class
+ */
+static void TestVariableClass()
+{
+   StartTest(_T("SNMP_Variable default constructor"));
+   SNMP_Variable v1;
+   AssertFalse(v1.getName().isValid());
+   EndTest();
+
+   StartTest(_T("SNMP_Variable constructor from binary OID"));
+   SNMP_Variable v2(s_sysDescription, 9);
+   AssertEquals(v2.getName().compare(s_oidSysDescription), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_Variable constructor from OID object"));
+   SNMP_Variable v3(s_oidSysLocation);
+   AssertEquals(v3.getName().compare(s_oidSysLocation), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_Variable constructor from text OID"));
+   SNMP_Variable v4(_T(".1.3.6.1.2.1.1.6.0"));
+   AssertEquals(v4.getName().compare(s_oidSysLocation), OID_EQUAL);
+   EndTest();
+
+   StartTest(_T("SNMP_Variable::setValueFromString"));
+   v4.setValueFromString(ASN_COUNTER32, _T("42"));
+   AssertEquals(v4.getValueAsInt(), 42);
+   EndTest();
+
+   StartTest(_T("SNMP_Variable copy constructor"));
+   SNMP_Variable v5(&v4);
+   AssertEquals(v5.getName().compare(s_oidSysLocation), OID_EQUAL);
+   AssertEquals(v5.getValueAsInt(), 42);
+   EndTest();
+}
+
+/**
+ * main()
+ */
+int main(int argc, char *argv[])
+{
+   TestOidConversion();
+   TestOidClass();
+   TestVariableClass();
+   return 0;
+}