Symbol: AP listing
authorAlex Kirhenshtein <alk@netxms.org>
Thu, 4 Apr 2013 06:12:17 +0000 (06:12 +0000)
committerAlex Kirhenshtein <alk@netxms.org>
Thu, 4 Apr 2013 06:12:17 +0000 (06:12 +0000)
src/server/drivers/symbol-ws/symbol-ws.cpp
src/server/drivers/symbol-ws/symbol-ws.h
src/server/include/nddrv.h

index ecad804..c168af9 100644 (file)
@@ -77,23 +77,6 @@ void SymbolDriver::analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, StringM
 {
 }
 
-/**
- * Get list of interfaces for given node
- *
- * @param snmp SNMP transport
- * @param attributes Node's custom attributes
- */
-InterfaceList *SymbolDriver::getInterfaces(SNMP_Transport *snmp, StringMap *attributes, void *driverData, int useAliases, bool useIfXTable)
-{
-   // Get interface list from standard MIB
-   InterfaceList *ifList = NetworkDeviceDriver::getInterfaces(snmp, attributes, driverData, useAliases, useIfXTable);
-   if (ifList == NULL)
-   {
-      return NULL;
-   }
-
-   return ifList;
-}
 
 /**
  * Get cluster mode for device (standalone / active / standby)
@@ -104,8 +87,41 @@ InterfaceList *SymbolDriver::getInterfaces(SNMP_Transport *snmp, StringMap *attr
  */
 int SymbolDriver::getClusterMode(SNMP_Transport *snmp, StringMap *attributes, void *driverData)
 {
+   int ret = CLUSTER_MODE_UNKNOWN;
+
+#define _GET(oid) \
+   SnmpGet(snmp->getSnmpVersion(), snmp, oid, NULL, 0, &value, sizeof(DWORD), 0)
+
+   DWORD value = 0;
+   if (_GET(_T(".1.3.6.1.4.1.388.14.1.8.1.2.0")) == SNMP_ERR_SUCCESS)
+   {
+      if (value == 1)
+      {
+         if (_GET(_T(".1.3.6.1.4.1.388.14.1.8.1.2.0")) == SNMP_ERR_SUCCESS)
+         {
+            if (value == 1)
+            {
+               ret = CLUSTER_MODE_ACTIVE;
+            }
+            else if (value == 2)
+            {
+               ret = CLUSTER_MODE_STANDBY;
+            }
+
+         }
+         // enabled
+      }
+      else
+      {
+         ret = CLUSTER_MODE_STANDALONE;
+      }
+   }
+#undef _GET
+
+   return ret;
 }
 
+
 /*
  * Check switch for wireless capabilities
  *
@@ -118,6 +134,60 @@ bool SymbolDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attribu
    return true;
 }
 
+
+/**
+ * Handler for access point enumeration
+ */
+static DWORD HandlerAccessPointList(DWORD version, SNMP_Variable *var, SNMP_Transport *transport, void *arg)
+{
+   ObjectArray<AccessPointInfo> *apList = (ObjectArray<AccessPointInfo> *)arg;
+
+   SNMP_ObjectId *name = var->GetName();
+   DWORD nameLen = name->getLength();
+   DWORD apIndex = name->getValue()[nameLen - 1];
+   bool adopted = name->getValue()[12] == 2; // 2 == adopted, 4 == unadopted
+
+   if (!adopted)
+   {
+      DWORD oid[] = { 1, 3, 6, 1, 4, 1, 388, 14, 3, 2, 1, 9, 4, 1, 3, 0 };
+      oid[15] = apIndex;
+      DWORD type;
+      if (SnmpGet(version, transport, NULL, oid, 16, &type, sizeof(DWORD), 0) != SNMP_ERR_SUCCESS)
+      {
+         type = -1;
+      }
+
+      const TCHAR *model;
+      switch (type)
+      {
+         case 1:
+            model = _T("AP100");
+            break;
+         case 2:
+            model = _T("AP200");
+            break;
+         case 3:
+            model = _T("AP300");
+            break;
+         case 4:
+            model = _T("AP4131");
+            break;
+         default:
+            model = _T("UNKNOWN");
+            break;
+      }
+
+      AccessPointInfo *info = new AccessPointInfo((BYTE *)var->GetValue(), AP_UNADOPTED, model, NULL);
+      apList->add(info);
+   }
+   else
+   {
+   }
+
+   return SNMP_ERR_SUCCESS;
+}
+
+
 /*
  * Get access points
  *
@@ -127,7 +197,23 @@ bool SymbolDriver::isWirelessController(SNMP_Transport *snmp, StringMap *attribu
  */
 ObjectArray<AccessPointInfo> *SymbolDriver::getAccessPoints(SNMP_Transport *snmp, StringMap *attributes, void *driverData)
 {
-   return new ObjectArray(0, 16, true);
+   ObjectArray<AccessPointInfo> *apList = new ObjectArray<AccessPointInfo>(0, 16, true);
+
+   // Adopted
+   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.2.1.2"), HandlerAccessPointList, apList, FALSE) != SNMP_ERR_SUCCESS)
+   {
+      delete apList;
+      apList = NULL;
+   }
+
+   // Unadopted
+   if (SnmpWalk(snmp->getSnmpVersion(), snmp, _T(".1.3.6.1.4.1.388.14.3.2.1.9.4.1.2"), HandlerAccessPointList, apList, FALSE) != SNMP_ERR_SUCCESS)
+   {
+      delete apList;
+      apList = NULL;
+   }
+
+   return apList;
 }
 
 /*
@@ -138,7 +224,9 @@ ObjectArray<AccessPointInfo> *SymbolDriver::getAccessPoints(SNMP_Transport *snmp
  */
 ObjectArray<WirelessStationInfo> *SymbolDriver::getWirelessStations(SNMP_Transport *snmp, StringMap *attributes, void *driverData)
 {
-   return new ObjectArray(0, 16, true);
+   ObjectArray<WirelessStationInfo> *ret = new ObjectArray<WirelessStationInfo>(0, 16, true);
+
+   return ret;
 }
 
 /**
index 158d173..2a2ce1b 100644 (file)
@@ -39,7 +39,6 @@ public:
    virtual int isPotentialDevice(const TCHAR *oid);
    virtual bool isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid);
    virtual void analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, StringMap *attributes, void **driverData);
-   virtual InterfaceList *getInterfaces(SNMP_Transport *snmp, StringMap *attributes, void *driverData, int useAliases, bool useIfXTable);
    virtual int getClusterMode(SNMP_Transport *snmp, StringMap *attributes, void *driverData);
    virtual bool isWirelessController(SNMP_Transport *snmp, StringMap *attributes, void *driverData);
    virtual ObjectArray<AccessPointInfo> *getAccessPoints(SNMP_Transport *snmp, StringMap *attributes, void *driverData);
index c383e7a..17244a4 100644 (file)
@@ -83,11 +83,22 @@ enum
  */
 enum
 {
+   CLUSTER_MODE_UNKNOWN = -1,
    CLUSTER_MODE_STANDALONE = 0,
    CLUSTER_MODE_ACTIVE = 1,
    CLUSTER_MODE_STANDBY = 2
 };
 
+
+/**
+ * Access point state
+ */
+enum
+{
+   AP_ADOPTED = 0,
+   AP_UNADOPTED = 1
+};
+
 /**
  * Module layout definition
  */