- Database structure changes: all IP addresses now stored as strings, not as integers
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 15 Oct 2004 15:26:37 +0000 (15:26 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 15 Oct 2004 15:26:37 +0000 (15:26 +0000)
- Fixed bug in internal stats collector thread on server
- Fixed bug (incorrect interface index retrieval) in AgentConnection::GetInterfaceList()
- Discovery process slightly improved
- All IP addresses both on server and client side now stored in host byte order

21 files changed:
include/netxmsdb.h
sql/events.in
sql/schema.in
src/agent/core/comm.cpp
src/agent/core/log.cpp
src/agent/core/netinfo.cpp
src/console/win32/CreateNodeDlg.cpp
src/libnetxms/tools.cpp
src/server/core/client.cpp
src/server/core/datacoll.cpp
src/server/core/db.cpp
src/server/core/discovery.cpp
src/server/core/interface.cpp
src/server/core/netinfo.cpp
src/server/core/netxmsd.dsp
src/server/core/nms_core.h
src/server/core/node.cpp
src/server/core/np.cpp
src/server/core/snmp.cpp
src/server/core/subnet.cpp
src/server/libnxsrv/agent.cpp

index ce96a2f..66b0aac 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _netxms_db_h
 #define _netxms_db_h
 
-#define DB_FORMAT_VERSION      13
+#define DB_FORMAT_VERSION      14
 
 #endif
index b7ddf9a..25c834b 100644 (file)
@@ -251,7 +251,7 @@ INSERT INTO events (event_id,name,severity,flags,message,description) VALUES
        (
                EVENT_INCORRECT_NETMASK, 'SYS_INCORRECT_NETMASK', 
                EVENT_SEVERITY_MINOR, 1,
-               'Invalid network mask %4 on interface %3, should be %5',
+               'Invalid network mask %4 on interface "%3", should be %5',
                'Generated when server detects invalid network mask on an interface.#0D#0A' CONCAT
                'Parameters:#0D#0A' CONCAT
                '   1) Interface object ID#0D#0A' CONCAT
index 73c9627..67655c0 100644 (file)
@@ -79,8 +79,8 @@ CREATE TABLE user_group_members
 CREATE TABLE new_nodes
 (
        id integer not null,
-       ip_addr integer not null,
-       ip_netmask integer not null,
+       ip_addr varchar(15) not null,
+       ip_netmask varchar(15) not null,
        discovery_flags integer not null
 );
 
@@ -95,7 +95,7 @@ CREATE TABLE nodes
        name varchar(63),
        status integer,
        is_deleted integer not null,
-       primary_ip integer,
+       primary_ip varchar(15),
        is_snmp integer,
        is_agent integer,
        is_bridge integer,
@@ -127,8 +127,8 @@ CREATE TABLE subnets
        name varchar(63),
        status integer,
        is_deleted integer not null,
-       ip_addr integer,
-       ip_netmask integer,
+       ip_addr varchar(15),
+       ip_netmask varchar(15),
        image_id integer,
        PRIMARY KEY(id)
 );
@@ -145,8 +145,8 @@ CREATE TABLE interfaces
        status integer,
         is_deleted integer,
        node_id integer not null,
-       ip_addr integer,
-       ip_netmask integer,
+       ip_addr varchar(15),
+       ip_netmask varchar(15),
        if_type integer,
        if_index integer,
        image_id integer,
@@ -418,8 +418,8 @@ CREATE TABLE deleted_objects
        object_id integer not null,
        object_class integer,
        name varchar(63),
-       ip_addr integer,
-       ip_netmask integer,
+       ip_addr varchar(15),
+       ip_netmask varchar(15),
        PRIMARY KEY(object_id)
 );
 
index 14c8bed..1197058 100644 (file)
@@ -158,7 +158,7 @@ THREAD_RESULT THREAD_CALL ListenerThread(void *)
       }
 
       iNumErrors = 0;     // Reset consecutive errors counter
-      DebugPrintf("Incoming connection from %s", IpToStr(servAddr.sin_addr.s_addr, szBuffer));
+      DebugPrintf("Incoming connection from %s", IpToStr(ntohl(servAddr.sin_addr.s_addr), szBuffer));
 
       if (IsValidServerAddr(servAddr.sin_addr.s_addr))
       {
@@ -166,7 +166,7 @@ THREAD_RESULT THREAD_CALL ListenerThread(void *)
          DebugPrintf("Connection from %s accepted", szBuffer);
 
          // Create new session structure and threads
-         pSession = new CommSession(hClientSocket, servAddr.sin_addr.s_addr);
+         pSession = new CommSession(hClientSocket, ntohl(servAddr.sin_addr.s_addr));
          if (!RegisterSession(pSession))
          {
             delete pSession;
index bc2542b..a20216b 100644 (file)
@@ -196,7 +196,7 @@ static char *FormatMessageUX(DWORD dwMsgId, char **ppStrings)
 //             d - Decimal integer
 //             x - Hex integer
 //             e - System error code (will appear in log as textual description)
-//             a - IP address in network byte order
+//             a - IP address in host byte order
 //
 
 void WriteLog(DWORD msg, WORD wType, char *format, ...)
index 031f3bc..96f3ede 100644 (file)
@@ -118,7 +118,7 @@ LONG H_InterfaceList(char *cmd, char *arg, NETXMS_VALUES_LIST *value)
          {
             sprintf(szBuffer, "%d %s/%d %d %s %s", pInfo->Index, 
                     pAddr->IpAddress.String, 
-                    BitsInMask(inet_addr(pAddr->IpMask.String)),
+                    BitsInMask(ntohl(inet_addr(pAddr->IpMask.String))),
                     pInfo->Type, szMacAddr, szAdapterName);
             NxAddResultString(value, szBuffer);
          }
index 60bd71b..a7a6ffa 100644 (file)
@@ -50,8 +50,6 @@ END_MESSAGE_MAP()
 void CCreateNodeDlg::OnOK() 
 {
    m_wndIPAddr.GetAddress(m_dwIpAddr);
-   m_dwIpAddr = htonl(m_dwIpAddr);
-       
        CCreateObjectDlg::OnOK();
 }
 
index 9dd1540..8168c32 100644 (file)
@@ -44,7 +44,7 @@ static void (* m_pLogFunction)(int, TCHAR *);
 
 
 //
-// Calculate number of bits in netmask
+// Calculate number of bits in netmask (in host byte order)
 //
 
 int LIBNETXMS_EXPORTABLE BitsInMask(DWORD dwMask)
@@ -52,13 +52,13 @@ int LIBNETXMS_EXPORTABLE BitsInMask(DWORD dwMask)
    int bits;
    DWORD dwTemp;
 
-   for(bits = 0, dwTemp = ntohl(dwMask); dwTemp != 0; bits++, dwTemp <<= 1);
+   for(bits = 0, dwTemp = dwMask; dwTemp != 0; bits++, dwTemp <<= 1);
    return bits;
 }
 
 
 //
-// Convert IP address from binary form (network bytes order) to string
+// Convert IP address from binary form (host bytes order) to string
 //
 
 TCHAR LIBNETXMS_EXPORTABLE *IpToStr(DWORD dwAddr, TCHAR *szBuffer)
@@ -67,13 +67,8 @@ TCHAR LIBNETXMS_EXPORTABLE *IpToStr(DWORD dwAddr, TCHAR *szBuffer)
    TCHAR *szBufPtr;
 
    szBufPtr = szBuffer == NULL ? szInternalBuffer : szBuffer;
-#if WORDS_BIGENDIAN
    _stprintf(szBufPtr, _T("%ld.%ld.%ld.%ld"), dwAddr >> 24, (dwAddr >> 16) & 255,
-           (dwAddr >> 8) & 255, dwAddr & 255);
-#else
-   _stprintf(szBufPtr, _T("%ld.%ld.%ld.%ld"), dwAddr & 255, (dwAddr >> 8) & 255,
-           (dwAddr >> 16) & 255, dwAddr >> 24);
-#endif
+             (dwAddr >> 8) & 255, dwAddr & 255);
    return szBufPtr;
 }
 
index 7998324..e82667c 100644 (file)
@@ -144,7 +144,7 @@ THREAD_RESULT THREAD_CALL ClientListener(void *)
       errorCount = 0;     // Reset consecutive errors counter
 
       // Create new session structure and threads
-      pSession = new ClientSession(sockClient, servAddr.sin_addr.s_addr);
+      pSession = new ClientSession(sockClient, ntohl(servAddr.sin_addr.s_addr));
       if (!RegisterSession(pSession))
       {
          delete pSession;
index e31e526..3800326 100644 (file)
@@ -157,6 +157,8 @@ static THREAD_RESULT THREAD_CALL StatCollector(void *pArg)
       dwPollerQS[dwCurrPos] = m_pItemQueue->Size();
       dwDBWriterQS[dwCurrPos] = g_pLazyRequestQueue->Size();
       dwCurrPos++;
+      if (dwCurrPos == 12)
+         dwCurrPos = 0;
 
       // Calculate new averages
       for(i = 0, dSum1 = 0, dSum2 = 0; i < 12; i++)
index bcb1eb6..4910a43 100644 (file)
@@ -276,6 +276,19 @@ double DBGetFieldDouble(DB_RESULT hResult, int iRow, int iColumn)
 }
 
 
+//
+// Get field's value as IP address
+//
+
+DWORD DBGetFieldIPAddr(DB_RESULT hResult, int iRow, int iColumn)
+{
+   char *szVal;
+
+   szVal = DBGetField(hResult, iRow, iColumn);
+   return szVal == NULL ? INADDR_NONE : ntohl(inet_addr(szVal));
+}
+
+
 //
 // Get number of rows in result
 //
@@ -404,6 +417,19 @@ double DBGetFieldAsyncDouble(DB_RESULT hResult, int iColumn)
 }
 
 
+//
+// Get field's value as IP address from asynchronous SELECT result
+//
+
+DWORD DBGetFieldAsyncIPAddr(DB_RESULT hResult, int iColumn)
+{
+   char szBuffer[64];
+   
+   return DBGetFieldAsync(hResult, iColumn, szBuffer, 64) == NULL ? INADDR_NONE : 
+      ntohl(inet_addr(szBuffer));
+}
+
+
 //
 // Free asynchronous SELECT result
 //
index 6c39fc4..6a05d8d 100644 (file)
@@ -89,6 +89,7 @@ THREAD_RESULT THREAD_CALL DiscoveryThread(void *arg)
 {
    DWORD dwNewNodeId = 1, dwWatchdogId;
    Node *pNode;
+   char szIpAddr[16], szNetMask[16];
 
    dwWatchdogId = WatchdogAddThread("Network Discovery Thread", 90);
 
@@ -112,6 +113,8 @@ THREAD_RESULT THREAD_CALL DiscoveryThread(void *arg)
          {
             ARP_CACHE *pArpCache;
 
+            DbgPrintf(AF_DEBUG_DISCOVERY, _T("Starting discovery poll for node %s (%s)"),
+                      pNode->Name(), IpToStr(pNode->IpAddr(), szIpAddr));
             // Retrieve and analize node's ARP cache
             pArpCache = pNode->GetArpCache();
             if (pArpCache != NULL)
@@ -128,9 +131,9 @@ THREAD_RESULT THREAD_CALL DiscoveryThread(void *arg)
                         {
                            char szQuery[256];
 
-                           sprintf(szQuery, "INSERT INTO new_nodes (id,ip_addr,ip_netmask,discovery_flags) VALUES (%d,%d,%d,%d)",
-                                   dwNewNodeId++, pArpCache->pEntries[j].dwIpAddr,
-                                   pInterface->IpNetMask(), DF_DEFAULT);
+                           sprintf(szQuery, "INSERT INTO new_nodes (id,ip_addr,ip_netmask,discovery_flags) VALUES (%d,'%s','%s',%d)",
+                                   dwNewNodeId++, IpToStr(pArpCache->pEntries[j].dwIpAddr, szIpAddr),
+                                   IpToStr(pInterface->IpNetMask(), szNetMask), DF_DEFAULT);
                            DBQuery(g_hCoreDB, szQuery);
                         }
                   }
@@ -138,6 +141,8 @@ THREAD_RESULT THREAD_CALL DiscoveryThread(void *arg)
                DestroyArpCache(pArpCache);
             }
 
+            DbgPrintf(AF_DEBUG_DISCOVERY, _T("Finished discovery poll for node %s (%s)"),
+                      pNode->Name(), IpToStr(pNode->IpAddr(), szIpAddr));
             pNode->SetDiscoveryPollTimeStamp();
          }
       }
index 0c236f9..4ca0bfb 100644 (file)
@@ -100,8 +100,8 @@ BOOL Interface::CreateFromDB(DWORD dwId)
       m_dwId = dwId;
       strncpy(m_szName, DBGetField(hResult, 0, 1), MAX_OBJECT_NAME);
       m_iStatus = DBGetFieldLong(hResult, 0, 2);
-      m_dwIpAddr = DBGetFieldULong(hResult, 0, 3);
-      m_dwIpNetMask = DBGetFieldULong(hResult, 0, 4);
+      m_dwIpAddr = DBGetFieldIPAddr(hResult, 0, 3);
+      m_dwIpNetMask = DBGetFieldIPAddr(hResult, 0, 4);
       m_dwIfType = DBGetFieldULong(hResult, 0, 5);
       m_dwIfIndex = DBGetFieldULong(hResult, 0, 6);
       dwNodeId = DBGetFieldULong(hResult, 0, 7);
@@ -149,7 +149,7 @@ BOOL Interface::CreateFromDB(DWORD dwId)
 
 BOOL Interface::SaveToDB(void)
 {
-   char szQuery[1024], szMacStr[16];
+   char szQuery[1024], szMacStr[16], szIpAddr[16], szNetMask[16];
    BOOL bNewObject = TRUE;
    DWORD dwNodeId;
    DB_RESULT hResult;
@@ -178,14 +178,16 @@ BOOL Interface::SaveToDB(void)
    if (bNewObject)
       sprintf(szQuery, "INSERT INTO interfaces (id,name,status,is_deleted,ip_addr,"
                        "ip_netmask,node_id,if_type,if_index,image_id,mac_addr) "
-                       "VALUES (%ld,'%s',%d,%d,%ld,%ld,%ld,%ld,%ld,%ld,'%s')",
-              m_dwId, m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, m_dwIpNetMask, dwNodeId,
+                       "VALUES (%ld,'%s',%d,%d,'%s','%s',%ld,%ld,%ld,%ld,'%s')",
+              m_dwId, m_szName, m_iStatus, m_bIsDeleted, 
+              IpToStr(m_dwIpAddr, szIpAddr), IpToStr(m_dwIpNetMask, szNetMask), dwNodeId,
               m_dwIfType, m_dwIfIndex, m_dwImageId, szMacStr);
    else
       sprintf(szQuery, "UPDATE interfaces SET name='%s',status=%d,is_deleted=%d,"
-                       "ip_addr=%ld,ip_netmask=%ld,node_id=%ld,if_type=%ld,"
+                       "ip_addr='%s',ip_netmask='%s',node_id=%ld,if_type=%ld,"
                        "if_index=%ld,image_id=%ld,mac_addr='%s' WHERE id=%ld",
-              m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, m_dwIpNetMask, dwNodeId,
+              m_szName, m_iStatus, m_bIsDeleted, IpToStr(m_dwIpAddr, szIpAddr),
+              IpToStr(m_dwIpNetMask, szNetMask), dwNodeId,
               m_dwIfType, m_dwIfIndex, m_dwImageId, szMacStr, m_dwId);
    DBQuery(g_hCoreDB, szQuery);
 
@@ -238,7 +240,7 @@ void Interface::StatusPoll(ClientSession *pSession, DWORD dwRqId)
    SendPollerMsg(dwRqId, "   Starting status poll on interface %s\r\n"
                          "   Current interface status is %s\r\n",
                  m_szName, g_pszStatusName[m_iStatus]);
-   dwPingStatus = IcmpPing(m_dwIpAddr, 3, 1500, NULL);
+   dwPingStatus = IcmpPing(htonl(m_dwIpAddr), 3, 1500, NULL);
    if (dwPingStatus == ICMP_RAW_SOCK_FAILED)
       WriteLog(MSG_RAW_SOCK_FAILED, EVENTLOG_WARNING_TYPE, NULL);
    m_iStatus = (dwPingStatus == ICMP_SUCCESS) ? STATUS_NORMAL : STATUS_CRITICAL;
index 3350fdc..0b9dac3 100644 (file)
@@ -151,7 +151,7 @@ static ARP_CACHE *SysGetLocalArpCache(void)
           (sysArpCache->table[i].dwType == 4))  // Only static and dynamic entries
       {
          pArpCache->pEntries[pArpCache->dwNumEntries].dwIndex = sysArpCache->table[i].dwIndex;
-         pArpCache->pEntries[pArpCache->dwNumEntries].dwIpAddr = sysArpCache->table[i].dwAddr;
+         pArpCache->pEntries[pArpCache->dwNumEntries].dwIpAddr = ntohl(sysArpCache->table[i].dwAddr);
          memcpy(pArpCache->pEntries[pArpCache->dwNumEntries].bMacAddr, sysArpCache->table[i].bPhysAddr, 6);
          pArpCache->dwNumEntries++;
       }
@@ -196,7 +196,7 @@ static ARP_CACHE *SysGetLocalArpCache(void)
          pArpCache->pEntries = (ARP_ENTRY *)realloc(pArpCache->pEntries,
                                  sizeof(ARP_ENTRY) * pArpCache->dwNumEntries);
          pArpCache->pEntries[i].dwIndex = InterfaceIndexFromName(szIfName);
-         pArpCache->pEntries[i].dwIpAddr = inet_addr(szIpAddr);
+         pArpCache->pEntries[i].dwIpAddr = ntohl(inet_addr(szIpAddr));
          StrToMac(szMacAddr, pArpCache->pEntries[i].bMacAddr);
       }
       fclose(fp);
@@ -271,8 +271,8 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
             _tcsncpy(pIfList->pInterfaces[pIfList->iNumEntries].szName, szAdapterName, MAX_OBJECT_NAME);
             memcpy(pIfList->pInterfaces[pIfList->iNumEntries].bMacAddr, pInfo->Address, MAC_ADDR_LENGTH);
             pIfList->pInterfaces[pIfList->iNumEntries].dwIndex = pInfo->Index;
-            pIfList->pInterfaces[pIfList->iNumEntries].dwIpAddr = inet_addr(pAddr->IpAddress.String);
-            pIfList->pInterfaces[pIfList->iNumEntries].dwIpNetMask = inet_addr(pAddr->IpMask.String);
+            pIfList->pInterfaces[pIfList->iNumEntries].dwIpAddr = ntohl(_t_inet_addr(pAddr->IpAddress.String));
+            pIfList->pInterfaces[pIfList->iNumEntries].dwIpNetMask = ntohl(_t_inet_addr(pAddr->IpMask.String));
             pIfList->pInterfaces[pIfList->iNumEntries].dwType = pInfo->Type;
             pIfList->pInterfaces[pIfList->iNumEntries].iNumSecondary = 0;
             pIfList->iNumEntries++;
@@ -316,6 +316,7 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
                memcpy(&pIfList->pInterfaces[i].dwIpAddr,
                       &(((struct sockaddr_in *)&ifrq.ifr_addr)->sin_addr.s_addr),
                       sizeof(DWORD));
+               pIfList->pInterfaces[i].dwIpAddr = ntohl(pIfList->pInterfaces[i].dwIpAddr);
             }
 
             // IP netmask
@@ -324,6 +325,7 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
                memcpy(&pIfList->pInterfaces[i].dwIpNetMask,
                       &(((struct sockaddr_in *)&ifrq.ifr_addr)->sin_addr.s_addr),
                       sizeof(DWORD));
+               pIfList->pInterfaces[i].dwIpNetMask = ntohl(pIfList->pInterfaces[i].dwIpNetMask);
             }
 
             // Interface type
index 12e53ab..3d722d5 100644 (file)
@@ -370,6 +370,10 @@ SOURCE=..\..\..\include\nxqueue.h
 
 SOURCE=..\include\nxsrvapi.h
 # End Source File
+# Begin Source File
+
+SOURCE=..\..\..\include\unicode.h
+# End Source File
 # End Group
 # Begin Group "Resource Files"
 
index 900ceb3..94ebacc 100644 (file)
@@ -367,12 +367,14 @@ DWORD DBGetFieldULong(DB_RESULT hResult, int iRow, int iColumn);
 INT64 DBGetFieldQuad(DB_RESULT hResult, int iRow, int iColumn);
 QWORD DBGetFieldUQuad(DB_RESULT hResult, int iRow, int iColumn);
 double DBGetFieldDouble(DB_RESULT hResult, int iRow, int iColumn);
+DWORD DBGetFieldIPAddr(DB_RESULT hResult, int iRow, int iColumn);
 char *DBGetFieldAsync(DB_ASYNC_RESULT hResult, int iColumn, char *pBuffer, int iBufSize);
 long DBGetFieldAsyncLong(DB_RESULT hResult, int iColumn);
 DWORD DBGetFieldAsyncULong(DB_ASYNC_RESULT hResult, int iColumn);
 INT64 DBGetFieldAsyncQuad(DB_RESULT hResult, int iColumn);
 QWORD DBGetFieldAsyncUQuad(DB_ASYNC_RESULT hResult, int iColumn);
 double DBGetFieldAsyncDouble(DB_RESULT hResult, int iColumn);
+DWORD DBGetFieldAsyncIPAddr(DB_RESULT hResult, int iColumn);
 int DBGetNumRows(DB_RESULT hResult);
 void DBFreeResult(DB_RESULT hResult);
 void DBFreeAsyncResult(DB_ASYNC_RESULT hResult);
index 6c25567..60918fb 100644 (file)
@@ -124,7 +124,7 @@ BOOL Node::CreateFromDB(DWORD dwId)
    m_dwId = dwId;
    strncpy(m_szName, DBGetField(hResult, 0, 1), MAX_OBJECT_NAME);
    m_iStatus = DBGetFieldLong(hResult, 0, 2);
-   m_dwIpAddr = DBGetFieldULong(hResult, 0, 3);
+   m_dwIpAddr = DBGetFieldIPAddr(hResult, 0, 3);
 
    // Flags
    if (DBGetFieldLong(hResult, 0, 4))
@@ -215,7 +215,7 @@ BOOL Node::CreateFromDB(DWORD dwId)
 
 BOOL Node::SaveToDB(void)
 {
-   TCHAR *pszEscDescr, szQuery[4096];
+   TCHAR *pszEscDescr, szQuery[4096], szIpAddr[16];
    DB_RESULT hResult;
    BOOL bNewObject = TRUE;
    BOOL bResult;
@@ -240,9 +240,10 @@ BOOL Node::SaveToDB(void)
                        "is_snmp,is_agent,is_bridge,is_router,snmp_version,community,"
                        "discovery_flags,status_poll_type,agent_port,auth_method,secret,"
                        "snmp_oid,is_local_mgmt,image_id,description,node_type)"
-                       " VALUES (%d,'%s',%d,%d,%d,%d,%d,%d,%d,%d,'%s',%d,%d,%d,%d,"
+                       " VALUES (%d,'%s',%d,%d,'%s',%d,%d,%d,%d,%d,'%s',%d,%d,%d,%d,"
                        "'%s','%s',%d,%ld,'%s',%ld)",
-              m_dwId, m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, 
+              m_dwId, m_szName, m_iStatus, m_bIsDeleted, 
+              IpToStr(m_dwIpAddr, szIpAddr),
               m_dwFlags & NF_IS_SNMP ? 1 : 0,
               m_dwFlags & NF_IS_NATIVE_AGENT ? 1 : 0,
               m_dwFlags & NF_IS_BRIDGE ? 1 : 0,
@@ -252,12 +253,13 @@ BOOL Node::SaveToDB(void)
               m_dwFlags & NF_IS_LOCAL_MGMT ? 1 : 0, m_dwImageId,
               pszEscDescr, m_dwNodeType);
    else
-      sprintf(szQuery, "UPDATE nodes SET name='%s',status=%d,is_deleted=%d,primary_ip=%d,"
+      sprintf(szQuery, "UPDATE nodes SET name='%s',status=%d,is_deleted=%d,primary_ip='%s',"
                        "is_snmp=%d,is_agent=%d,is_bridge=%d,is_router=%d,snmp_version=%d,"
                        "community='%s',discovery_flags=%d,status_poll_type=%d,agent_port=%d,"
                        "auth_method=%d,secret='%s',snmp_oid='%s',is_local_mgmt=%d,"
                        "image_id=%ld,description='%s',node_type=%ld WHERE id=%ld",
-              m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, 
+              m_szName, m_iStatus, m_bIsDeleted, 
+              IpToStr(m_dwIpAddr, szIpAddr), 
               m_dwFlags & NF_IS_SNMP ? 1 : 0,
               m_dwFlags & NF_IS_NATIVE_AGENT ? 1 : 0,
               m_dwFlags & NF_IS_BRIDGE ? 1 : 0,
@@ -334,7 +336,7 @@ BOOL Node::NewNodePoll(DWORD dwNetMask)
       m_dwFlags |= NF_IS_SNMP | dwNodeFlags;
    }
 
-   pAgentConn = new AgentConnection(m_dwIpAddr, m_wAgentPort, m_wAuthMethod,
+   pAgentConn = new AgentConnection(htonl(m_dwIpAddr), m_wAgentPort, m_wAuthMethod,
                                     m_szSharedSecret);
    if (pAgentConn->Connect())
       m_dwFlags |= NF_IS_NATIVE_AGENT;
@@ -461,12 +463,14 @@ Interface *Node::FindInterface(DWORD dwIndex, DWORD dwHostAddr)
       {
          pInterface = (Interface *)m_pChildList[i];
          if (pInterface->IfIndex() == dwIndex)
+         {
             if ((pInterface->IpAddr() & pInterface->IpNetMask()) ==
                 (dwHostAddr & pInterface->IpNetMask()))
             {
                Unlock();
                return pInterface;
             }
+         }
       }
    Unlock();
    return NULL;
@@ -489,18 +493,16 @@ void Node::CreateNewInterface(DWORD dwIpAddr, DWORD dwNetMask, char *szName,
       pSubnet = FindSubnetForNode(dwIpAddr);
       if (pSubnet == NULL)
       {
-         DWORD dwAddr = ntohl(dwIpAddr);
-
          // Check if netmask is 0 (detect), and if yes, create
          // new subnet with class mask
          if (dwNetMask == 0)
          {
-            if (dwAddr < 0x80000000)
-               dwNetMask = htonl(0xFF000000);   // Class A
-            else if (dwAddr < 0xC0000000)
-               dwNetMask = htonl(0xFFFF0000);   // Class B
-            else if (dwAddr < 0xE0000000)
-               dwNetMask = htonl(0xFFFFFF00);   // Class C
+            if (dwIpAddr < 0x80000000)
+               dwNetMask = 0xFF000000;   // Class A
+            else if (dwIpAddr < 0xC0000000)
+               dwNetMask = 0xFFFF0000;   // Class B
+            else if (dwIpAddr < 0xE0000000)
+               dwNetMask = 0xFFFFFF00;   // Class C
             else
             {
                TCHAR szBuffer[16];
@@ -513,7 +515,7 @@ void Node::CreateNewInterface(DWORD dwIpAddr, DWORD dwNetMask, char *szName,
          }
 
          // Create new subnet object
-         if (dwAddr < 0xE0000000)
+         if (dwIpAddr < 0xE0000000)
          {
             pSubnet = new Subnet(dwIpAddr & dwNetMask, dwNetMask);
             NetObjInsert(pSubnet, TRUE);
@@ -684,7 +686,7 @@ void Node::ConfigurationPoll(ClientSession *pSession, DWORD dwRqId)
       SendPollerMsg(dwRqId, _T("   SNMP agent is not responding\r\n"));
    }
 
-   pAgentConn = new AgentConnection(m_dwIpAddr, m_wAgentPort, m_wAuthMethod, m_szSharedSecret);
+   pAgentConn = new AgentConnection(htonl(m_dwIpAddr), m_wAgentPort, m_wAuthMethod, m_szSharedSecret);
    if (pAgentConn->Connect())
    {
       m_dwFlags |= NF_IS_NATIVE_AGENT;
@@ -814,7 +816,7 @@ BOOL Node::ConnectToAgent(void)
 {
    // Create new agent connection object if needed
    if (m_pAgentConnection == NULL)
-      m_pAgentConnection = new AgentConnection(m_dwIpAddr, m_wAgentPort, m_wAuthMethod, m_szSharedSecret);
+      m_pAgentConnection = new AgentConnection(htonl(m_dwIpAddr), m_wAgentPort, m_wAuthMethod, m_szSharedSecret);
 
    // Check if we already connected
    if (m_pAgentConnection->Nop() == ERR_SUCCESS)
index a22c4a5..eb8b95c 100644 (file)
@@ -99,8 +99,8 @@ THREAD_RESULT THREAD_CALL NodePoller(void *arg)
             WatchdogNotify(dwWatchdogId);
 
             dwId = DBGetFieldULong(hResult, i, 0);
-            dwIpAddr = DBGetFieldULong(hResult, i, 1);
-            dwNetMask = DBGetFieldULong(hResult, i, 2);
+            dwIpAddr = DBGetFieldIPAddr(hResult, i, 1);
+            dwNetMask = DBGetFieldIPAddr(hResult, i, 2);
             dwFlags = DBGetFieldULong(hResult, i, 3);
 
             PollNewNode(dwIpAddr, dwNetMask, dwFlags, NULL);
index b1d957a..8af9661 100644 (file)
@@ -186,9 +186,9 @@ BOOL SnmpGet(DWORD dwAddr, const char *szCommunity, const char *szOidStr,
                      break;
                   case ASN_IPADDRESS:
                      if (bStringResult)
-                        IpToStr(*pVar->val.integer, (char *)pValue);
+                        IpToStr(ntohl(*pVar->val.integer), (char *)pValue);
                      else
-                        *((long *)pValue) = *pVar->val.integer;
+                        *((long *)pValue) = ntohl(*pVar->val.integer);
                      break;
                   case ASN_OCTET_STR:
                      memcpy(pValue, pVar->val.string, min(pVar->val_len, dwBufferSize - 1));
@@ -383,7 +383,7 @@ static void HandlerIpAddr(DWORD dwAddr, const char *szCommunity, variable_list *
                }
                i = ((INTERFACE_LIST *)pArg)->iNumEntries - 1;
             }
-            ((INTERFACE_LIST *)pArg)->pInterfaces[i].dwIpAddr = *pVar->val.integer;
+            ((INTERFACE_LIST *)pArg)->pInterfaces[i].dwIpAddr = ntohl(*pVar->val.integer);
             ((INTERFACE_LIST *)pArg)->pInterfaces[i].dwIpNetMask = dwNetMask;
             break;
          }
@@ -478,7 +478,7 @@ static void HandlerArp(DWORD dwAddr, const char *szCommunity, variable_list *pVa
       ((ARP_CACHE *)pArg)->dwNumEntries++;
       ((ARP_CACHE *)pArg)->pEntries = (ARP_ENTRY *)realloc(((ARP_CACHE *)pArg)->pEntries,
                sizeof(ARP_ENTRY) * ((ARP_CACHE *)pArg)->dwNumEntries);
-      ((ARP_CACHE *)pArg)->pEntries[((ARP_CACHE *)pArg)->dwNumEntries - 1].dwIpAddr = *pVar->val.integer;
+      ((ARP_CACHE *)pArg)->pEntries[((ARP_CACHE *)pArg)->dwNumEntries - 1].dwIpAddr = ntohl(*pVar->val.integer);
       memcpy(((ARP_CACHE *)pArg)->pEntries[((ARP_CACHE *)pArg)->dwNumEntries - 1].bMacAddr, bMac, 6);
       ((ARP_CACHE *)pArg)->pEntries[((ARP_CACHE *)pArg)->dwNumEntries - 1].dwIndex = dwIndex;
    }
index f169768..43524da 100644 (file)
@@ -80,8 +80,8 @@ BOOL Subnet::CreateFromDB(DWORD dwId)
    m_dwId = dwId;
    strncpy(m_szName, DBGetField(hResult, 0, 1), MAX_OBJECT_NAME);
    m_iStatus = DBGetFieldLong(hResult, 0, 2);
-   m_dwIpAddr = DBGetFieldULong(hResult, 0, 3);
-   m_dwIpNetMask = DBGetFieldULong(hResult, 0, 4);
+   m_dwIpAddr = DBGetFieldIPAddr(hResult, 0, 3);
+   m_dwIpNetMask = DBGetFieldIPAddr(hResult, 0, 4);
    m_dwImageId = DBGetFieldULong(hResult, 0, 5);
    m_bIsDeleted = DBGetFieldLong(hResult, 0, 6);
 
@@ -100,7 +100,7 @@ BOOL Subnet::CreateFromDB(DWORD dwId)
 
 BOOL Subnet::SaveToDB(void)
 {
-   char szQuery[1024];
+   char szQuery[1024], szIpAddr[16], szNetMask[16];
    DB_RESULT hResult;
    DWORD i;
    BOOL bNewObject = TRUE;
@@ -121,12 +121,14 @@ BOOL Subnet::SaveToDB(void)
    // Form and execute INSERT or UPDATE query
    if (bNewObject)
       sprintf(szQuery, "INSERT INTO subnets (id,name,status,is_deleted,ip_addr,ip_netmask,image_id) "
-                       "VALUES (%ld,'%s',%d,%d,%ld,%ld,%ld)",
-              m_dwId, m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, m_dwIpNetMask, m_dwImageId);
+                       "VALUES (%ld,'%s',%d,%d,'%s','%s',%ld)",
+              m_dwId, m_szName, m_iStatus, m_bIsDeleted, 
+              IpToStr(m_dwIpAddr, szIpAddr), IpToStr(m_dwIpNetMask, szNetMask), m_dwImageId);
    else
-      sprintf(szQuery, "UPDATE subnets SET name='%s',status=%d,is_deleted=%d,ip_addr=%ld,"
-                       "ip_netmask=%ld,image_id=%ld WHERE id=%ld",
-              m_szName, m_iStatus, m_bIsDeleted, m_dwIpAddr, m_dwIpNetMask, m_dwImageId, m_dwId);
+      sprintf(szQuery, "UPDATE subnets SET name='%s',status=%d,is_deleted=%d,ip_addr='%s',"
+                       "ip_netmask='%s',image_id=%ld WHERE id=%ld",
+              m_szName, m_iStatus, m_bIsDeleted, IpToStr(m_dwIpAddr, szIpAddr),
+              IpToStr(m_dwIpNetMask, szNetMask), m_dwImageId, m_dwId);
    DBQuery(g_hCoreDB, szQuery);
 
    // Update node to subnet mapping
index 7dcccc5..821381f 100644 (file)
@@ -239,7 +239,7 @@ BOOL AgentConnection::Connect(BOOL bVerbose)
    if (connect(m_hSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
    {
       if (bVerbose)
-         PrintMsg(_T("Cannot establish connection with agent %s"), IpToStr(m_dwAddr, szBuffer));
+         PrintMsg(_T("Cannot establish connection with agent %s"), IpToStr(ntohl(m_dwAddr), szBuffer));
       goto connect_cleanup;
    }
 
@@ -249,7 +249,7 @@ BOOL AgentConnection::Connect(BOOL bVerbose)
    // Authenticate itself to agent
    if ((dwError = Authenticate()) != ERR_SUCCESS)
    {
-      PrintMsg(_T("Authentication to agent %s failed (%s)"), IpToStr(m_dwAddr, szBuffer),
+      PrintMsg(_T("Authentication to agent %s failed (%s)"), IpToStr(ntohl(m_dwAddr), szBuffer),
                AgentErrorCodeToText(dwError));
       goto connect_cleanup;
    }
@@ -257,7 +257,7 @@ BOOL AgentConnection::Connect(BOOL bVerbose)
    // Test connectivity
    if ((dwError = Nop()) != ERR_SUCCESS)
    {
-      PrintMsg(_T("Communication with agent %s failed (%s)"), IpToStr(m_dwAddr, szBuffer),
+      PrintMsg(_T("Communication with agent %s failed (%s)"), IpToStr(ntohl(m_dwAddr), szBuffer),
                AgentErrorCodeToText(dwError));
       goto connect_cleanup;
    }
@@ -366,8 +366,8 @@ INTERFACE_LIST *AgentConnection::GetInterfaceList(void)
             {
                pSlash = _T("24");
             }
-            pIfList->pInterfaces[i].dwIpAddr = _t_inet_addr(pBuf);
-            pIfList->pInterfaces[i].dwIpNetMask = htonl(~(0xFFFFFFFF >> _tcstoul(pSlash, NULL, 10)));
+            pIfList->pInterfaces[i].dwIpAddr = ntohl(_t_inet_addr(pBuf));
+            pIfList->pInterfaces[i].dwIpNetMask = ~(0xFFFFFFFF >> _tcstoul(pSlash, NULL, 10));
             pBuf = pChar + 1;
          }
 
@@ -376,7 +376,7 @@ INTERFACE_LIST *AgentConnection::GetInterfaceList(void)
          if (pChar != NULL)
          {
             *pChar = 0;
-            pIfList->pInterfaces[i].dwIndex = _tcstoul(pBuf, NULL, 10);
+            pIfList->pInterfaces[i].dwType = _tcstoul(pBuf, NULL, 10);
             pBuf = pChar + 1;
          }
 
@@ -490,7 +490,7 @@ ARP_CACHE *AgentConnection::GetArpCache(void)
          pChar = _tcschr(pBuf, _T(' '));
          if (pChar != NULL)
             *pChar = 0;
-         pArpCache->pEntries[i].dwIpAddr = _t_inet_addr(pBuf);
+         pArpCache->pEntries[i].dwIpAddr = ntohl(_t_inet_addr(pBuf));
 
          // Interface index
          if (pChar != NULL)