- Implemented NXCP version negotiation between server and agents
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 18 Sep 2006 21:25:34 +0000 (21:25 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 18 Sep 2006 21:25:34 +0000 (21:25 +0000)
- Some function names changed from CSCPsomething to NXCPsomething

12 files changed:
include/nms_cscp.h
include/nxcscpapi.h
src/agent/core/config.cpp
src/agent/core/session.cpp
src/libnxcl/comm.cpp
src/libnxcl/session.cpp
src/server/core/admin.cpp
src/server/core/client.cpp
src/server/core/session.cpp
src/server/include/nxsrvapi.h
src/server/libnxsrv/agent.cpp
src/server/tools/nxadm/comm.cpp

index 03f7cf7..c8a9620 100644 (file)
@@ -28,6 +28,8 @@
 // Constants
 //
 
+#define NXCP_VERSION                   2
+
 #define SERVER_LISTEN_PORT             4701
 #define MAX_DCI_STRING_VALUE           256
 #define CSCP_HEADER_SIZE               16
@@ -229,6 +231,7 @@ typedef struct
 #define MF_DONT_ENCRYPT    0x0004
 #define MF_END_OF_SEQUENCE 0x0008
 #define MF_REVERSE_ORDER   0x0010
+#define MF_CONTROL         0x0020
 
 
 //
@@ -416,6 +419,8 @@ typedef struct
 #define CMD_DELETE_AGENT_CONFIG     0x00B3
 #define CMD_SWAP_AGENT_CONFIGS      0x00B4
 #define CMD_TERMINATE_ALARM         0x00B5
+#define CMD_GET_NXCP_CAPS           0x00B6
+#define CMD_NXCP_CAPS               0x00B7
 
 
 //
index c52b1b4..a03cc2c 100644 (file)
@@ -70,15 +70,16 @@ private:
    DWORD m_dwId;
    DWORD m_dwNumVar;    // Number of variables
    CSCP_DF **m_ppVarList;   // List of variables
+   int m_nVersion;      // Protocol version
 
    void *Set(DWORD dwVarId, BYTE bType, void *pValue, DWORD dwSize = 0);
    void *Get(DWORD dwVarId, BYTE bType);
    DWORD FindVariable(DWORD dwVarId);
 
 public:
-   CSCPMessage();
+   CSCPMessage(int nVersion = NXCP_VERSION);
    CSCPMessage(CSCPMessage *pMsg);
-   CSCPMessage(CSCP_MESSAGE *pMsg);
+   CSCPMessage(CSCP_MESSAGE *pMsg, int nVersion = NXCP_VERSION);
    ~CSCPMessage();
 
    CSCP_MESSAGE *CreateMessage(void);
@@ -183,16 +184,17 @@ public:
 extern "C" {
 #endif
 
-int LIBNXCSCP_EXPORTABLE RecvCSCPMessage(SOCKET hSocket, CSCP_MESSAGE *pMsg,
+int LIBNXCSCP_EXPORTABLE RecvNXCPMessage(SOCKET hSocket, CSCP_MESSAGE *pMsg,
                                          CSCP_BUFFER *pBuffer, DWORD dwMaxMsgSize,
                                          CSCP_ENCRYPTION_CONTEXT **ppCtx,
                                          BYTE *pDecryptionBuffer, DWORD dwTimeout);
-CSCP_MESSAGE LIBNXCSCP_EXPORTABLE *CreateRawCSCPMessage(WORD wCode, DWORD dwId, WORD wFlags,
+CSCP_MESSAGE LIBNXCSCP_EXPORTABLE *CreateRawNXCPMessage(WORD wCode, DWORD dwId, WORD wFlags,
                                                         DWORD dwDataSize, void *pData,
                                                         CSCP_MESSAGE *pBuffer);
-TCHAR LIBNXCSCP_EXPORTABLE *CSCPMessageCodeName(WORD wCode, TCHAR *pszBuffer);
-BOOL LIBNXCSCP_EXPORTABLE SendFileOverCSCP(SOCKET hSocket, DWORD dwId, TCHAR *pszFile,
+TCHAR LIBNXCSCP_EXPORTABLE *NXCPMessageCodeName(WORD wCode, TCHAR *pszBuffer);
+BOOL LIBNXCSCP_EXPORTABLE SendFileOverNXCP(SOCKET hSocket, DWORD dwId, TCHAR *pszFile,
                                            CSCP_ENCRYPTION_CONTEXT *pCtx);
+BOOL LIBNXCSCP_EXPORTABLE NXCPGetPeerProtocolVersion(SOCKET hSocket, int *pnVersion);
    
 BOOL LIBNXCSCP_EXPORTABLE InitCryptoLib(DWORD dwEnabledCiphers);
 DWORD LIBNXCSCP_EXPORTABLE CSCPGetSupportedCiphers(void);
@@ -204,7 +206,7 @@ BOOL LIBNXCSCP_EXPORTABLE CSCPDecryptMessage(CSCP_ENCRYPTION_CONTEXT *pCtx,
 DWORD LIBNXCSCP_EXPORTABLE SetupEncryptionContext(CSCPMessage *pMsg, 
                                                   CSCP_ENCRYPTION_CONTEXT **ppCtx,
                                                   CSCPMessage **ppResponse,
-                                                  RSA *pPrivateKey);
+                                                  RSA *pPrivateKey, int nNXCPVersion);
 void LIBNXCSCP_EXPORTABLE DestroyEncryptionContext(CSCP_ENCRYPTION_CONTEXT *pCtx);
 void LIBNXCSCP_EXPORTABLE PrepareKeyRequestMsg(CSCPMessage *pMsg, RSA *pServerKey);
 RSA LIBNXCSCP_EXPORTABLE *LoadRSAKeys(TCHAR *pszKeyFile);
index e0ef88d..2b16a94 100644 (file)
@@ -117,9 +117,9 @@ BOOL DownloadConfig(TCHAR *pszServer)
          {
             pRawMsg = (CSCP_MESSAGE *)realloc(pRawMsg, MAX_MSG_SIZE);
             pBuffer = (CSCP_BUFFER *)malloc(sizeof(CSCP_BUFFER));
-            RecvCSCPMessage(0, NULL, pBuffer, 0, NULL, NULL, 0);
+            RecvNXCPMessage(0, NULL, pBuffer, 0, NULL, NULL, 0);
 
-            nLen = RecvCSCPMessage(hSocket, pRawMsg, pBuffer, MAX_MSG_SIZE,
+            nLen = RecvNXCPMessage(hSocket, pRawMsg, pBuffer, MAX_MSG_SIZE,
                                    &pDummyCtx, NULL, 30000);
             if (nLen >= 16)
             {
index 8b842eb..45a9c2a 100644 (file)
@@ -170,7 +170,7 @@ void CommSession::ReadThread(void)
    WORD wFlags;
 
    // Initialize raw message receiving function
-   RecvCSCPMessage(0, NULL, m_pMsgBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, m_pMsgBuffer, 0, NULL, NULL, 0);
 
    pRawMsg = (CSCP_MESSAGE *)malloc(RAW_MSG_SIZE);
 #ifdef _WITH_ENCRYPTION
@@ -178,7 +178,7 @@ void CommSession::ReadThread(void)
 #endif
    while(1)
    {
-      if ((iErr = RecvCSCPMessage(m_hSocket, pRawMsg, m_pMsgBuffer, RAW_MSG_SIZE,
+      if ((iErr = RecvNXCPMessage(m_hSocket, pRawMsg, m_pMsgBuffer, RAW_MSG_SIZE,
                                   &m_pCtx, pDecryptionBuffer, INFINITE)) <= 0)
       {
          break;
@@ -219,7 +219,7 @@ void CommSession::ReadThread(void)
             pRawMsg->dwId = ntohl(pRawMsg->dwId);
             pRawMsg->wCode = ntohs(pRawMsg->wCode);
             pRawMsg->dwNumVars = ntohl(pRawMsg->dwNumVars);
-            DebugPrintf(m_dwIndex, "Received raw message %s", CSCPMessageCodeName(pRawMsg->wCode, szBuffer));
+            DebugPrintf(m_dwIndex, "Received raw message %s", NXCPMessageCodeName(pRawMsg->wCode, szBuffer));
 
             if (pRawMsg->wCode == CMD_FILE_DATA)
             {
@@ -256,18 +256,39 @@ void CommSession::ReadThread(void)
                }
             }
          }
+         else if (wFlags & MF_CONTROL)
+         {
+            // Convert message header to host format
+            pRawMsg->dwId = ntohl(pRawMsg->dwId);
+            pRawMsg->wCode = ntohs(pRawMsg->wCode);
+            pRawMsg->dwNumVars = ntohl(pRawMsg->dwNumVars);
+            DebugPrintf(m_dwIndex, "Received control message %s", NXCPMessageCodeName(pRawMsg->wCode, szBuffer));
+
+            if (pRawMsg->wCode == CMD_GET_NXCP_CAPS)
+            {
+               CSCP_MESSAGE *pMsg;
+
+               pMsg = (CSCP_MESSAGE *)malloc(CSCP_HEADER_SIZE);
+               pMsg->dwId = htonl(pRawMsg->dwId);
+               pMsg->wCode = htons((WORD)CMD_NXCP_CAPS);
+               pMsg->wFlags = htons(MF_CONTROL);
+               pMsg->dwNumVars = htonl(NXCP_VERSION << 24);
+               pMsg->dwSize = htonl(CSCP_HEADER_SIZE);
+               SendRawMessage(pMsg, m_pCtx);
+            }
+         }
          else
          {
             // Create message object from raw message
             pMsg = new CSCPMessage(pRawMsg);
             if (pMsg->GetCode() == CMD_REQUEST_SESSION_KEY)
             {
-               DebugPrintf(m_dwIndex, "Received message %s", CSCPMessageCodeName(pMsg->GetCode(), szBuffer));
+               DebugPrintf(m_dwIndex, "Received message %s", NXCPMessageCodeName(pMsg->GetCode(), szBuffer));
                if (m_pCtx == NULL)
                {
                   CSCPMessage *pResponse;
 
-                  SetupEncryptionContext(pMsg, &m_pCtx, &pResponse, NULL);
+                  SetupEncryptionContext(pMsg, &m_pCtx, &pResponse, NULL, NXCP_VERSION);
                   SendMessage(pResponse);
                   delete pResponse;
                }
@@ -312,7 +333,7 @@ BOOL CommSession::SendRawMessage(CSCP_MESSAGE *pMsg, CSCP_ENCRYPTION_CONTEXT *pC
    BOOL bResult = TRUE;
    char szBuffer[128];
 
-   DebugPrintf(m_dwIndex, "Sending message %s", CSCPMessageCodeName(ntohs(pMsg->wCode), szBuffer));
+   DebugPrintf(m_dwIndex, "Sending message %s", NXCPMessageCodeName(ntohs(pMsg->wCode), szBuffer));
    if ((pCtx != NULL) && (pCtx != PROXY_ENCRYPTION_CTX))
    {
       CSCP_ENCRYPTED_MESSAGE *pEnMsg;
@@ -378,7 +399,7 @@ void CommSession::ProcessingThread(void)
       if (pMsg == INVALID_POINTER_VALUE)    // Session termination indicator
          break;
       dwCommand = pMsg->GetCode();
-      DebugPrintf(m_dwIndex, "Received message %s", CSCPMessageCodeName((WORD)dwCommand, szBuffer));
+      DebugPrintf(m_dwIndex, "Received message %s", NXCPMessageCodeName((WORD)dwCommand, szBuffer));
 
       // Prepare response message
       msg.SetCode(CMD_REQUEST_COMPLETED);
index d6c68a8..741faa5 100644 (file)
@@ -40,7 +40,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
 
    // Initialize raw message receiving function
    pMsgBuffer = (CSCP_BUFFER *)malloc(sizeof(CSCP_BUFFER));
-   RecvCSCPMessage(0, NULL, pMsgBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, pMsgBuffer, 0, NULL, NULL, 0);
 
    // Allocate space for raw message
    pRawMsg = (CSCP_MESSAGE *)malloc(pSession->m_dwReceiverBufferSize);
@@ -52,7 +52,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
    while(1)
    {
       // Receive raw message
-      if ((iErr = RecvCSCPMessage(pSession->m_hSocket, pRawMsg, 
+      if ((iErr = RecvNXCPMessage(pSession->m_hSocket, pRawMsg, 
                                   pMsgBuffer, pSession->m_dwReceiverBufferSize,
                                   &pSession->m_pCtx, pDecryptionBuffer, INFINITE)) <= 0)
          break;
@@ -61,7 +61,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
       if (iErr == 1)
       {
          DebugPrintf(_T("Received too large message %s (%d bytes)"), 
-                     CSCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
+                     NXCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
                      ntohl(pRawMsg->dwSize));
          continue;
       }
@@ -90,7 +90,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
          pRawMsg->dwId = ntohl(pRawMsg->dwId);
          pRawMsg->dwNumVars = ntohl(pRawMsg->dwNumVars);
 
-         DebugPrintf(_T("RecvRawMsg(\"%s\", id:%d)"), CSCPMessageCodeName(pRawMsg->wCode, szBuffer), pRawMsg->dwId);
+         DebugPrintf(_T("RecvRawMsg(\"%s\", id:%d)"), NXCPMessageCodeName(pRawMsg->wCode, szBuffer), pRawMsg->dwId);
 
          // Process message
          switch(pRawMsg->wCode)
@@ -141,7 +141,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
       {
          pMsg = new CSCPMessage(pRawMsg);
          bMsgNotNeeded = TRUE;
-         DebugPrintf(_T("RecvMsg(\"%s\", id:%d)"), CSCPMessageCodeName(pMsg->GetCode(), szBuffer), pMsg->GetId());
+         DebugPrintf(_T("RecvMsg(\"%s\", id:%d)"), NXCPMessageCodeName(pMsg->GetCode(), szBuffer), pMsg->GetId());
 
          // Process message
          switch(pMsg->GetCode())
@@ -154,7 +154,7 @@ THREAD_RESULT THREAD_CALL NetReceiver(NXCL_Session *pSession)
                {
                   CSCPMessage *pResponse;
 
-                  SetupEncryptionContext(pMsg, &pSession->m_pCtx, &pResponse, NULL);
+                  SetupEncryptionContext(pMsg, &pSession->m_pCtx, &pResponse, NULL, NXCP_VERSION);
                   pSession->SendMsg(pResponse);
                   delete pResponse;
                }
index bf639fa..20e6baf 100644 (file)
@@ -244,7 +244,7 @@ BOOL NXCL_Session::SendMsg(CSCPMessage *pMsg)
    if (m_dwFlags & NXC_SF_CONN_BROKEN)
       return FALSE;
 
-   DebugPrintf(_T("SendMsg(\"%s\"), id:%d)"), CSCPMessageCodeName(pMsg->GetCode(), szBuffer), pMsg->GetId());
+   DebugPrintf(_T("SendMsg(\"%s\"), id:%d)"), NXCPMessageCodeName(pMsg->GetCode(), szBuffer), pMsg->GetId());
    pRawMsg = pMsg->CreateMessage();
    if (m_pCtx != NULL)
    {
@@ -850,7 +850,7 @@ DWORD NXCL_Session::LoadUserDB(void)
 
 DWORD NXCL_Session::SendFile(DWORD dwRqId, TCHAR *pszFileName)
 {
-   return SendFileOverCSCP(m_hSocket, dwRqId, pszFileName, m_pCtx) ? RCC_SUCCESS : RCC_IO_ERROR;
+   return SendFileOverNXCP(m_hSocket, dwRqId, pszFileName, m_pCtx) ? RCC_SUCCESS : RCC_IO_ERROR;
 }
 
 
index e6a2c59..e2bb0ba 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: admin.cpp,v 1.17 2006-07-25 22:05:49 victor Exp $ */
+/* $Id: admin.cpp,v 1.18 2006-09-18 21:25:33 victor Exp $ */
 
 /* 
 ** NetXMS - Network Management System
@@ -50,13 +50,13 @@ static THREAD_RESULT THREAD_CALL ProcessingThread(void *pArg)
 
    pRawMsg = (CSCP_MESSAGE *)malloc(MAX_MSG_SIZE);
    pRecvBuffer = (CSCP_BUFFER *)malloc(sizeof(CSCP_BUFFER));
-   RecvCSCPMessage(0, NULL, pRecvBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, pRecvBuffer, 0, NULL, NULL, 0);
    ctx.hSocket = sock;
    ctx.pMsg = &response;
 
    while(1)
    {
-      iError = RecvCSCPMessage(sock, pRawMsg, pRecvBuffer, MAX_MSG_SIZE, &pDummyCtx, NULL, INFINITE);
+      iError = RecvNXCPMessage(sock, pRawMsg, pRecvBuffer, MAX_MSG_SIZE, &pDummyCtx, NULL, INFINITE);
       if (iError <= 0)
          break;   // Communication error or closed connection
 
@@ -175,6 +175,19 @@ THREAD_RESULT THREAD_CALL LocalAdminListener(void *pArg)
 /*
 
 $Log: not supported by cvs2svn $
+Revision 1.17  2006/07/25 22:05:49  victor
+Fixed some memory leaks:
+
+Server
+1. admin.cpp - ProcessingThread()
+2. events.cpp - ReloadEvents(), DeleteEventTemplateFromList()
+3. objtools.cpp - GetAgentTable()
+4. session.cpp - ClientSession::DeployPackage()
+5. users.cpp - LoadUsers()
+
+MySQL driver
+1. DrvFreeAsyncResult()
+
 Revision 1.16  2006/03/02 12:17:06  victor
 Removed various warnings related to 64bit platforms
 
index f87913f..4be3f37 100644 (file)
@@ -221,7 +221,7 @@ void DumpSessions(CONSOLE_CTX pCtx)
          ConsolePrintf(pCtx, "%-3d %-24s %-8s %s [%s]\n", i, 
                        (m_pSessionList[i]->GetState() != SESSION_STATE_PROCESSING) ?
                          pszStateName[m_pSessionList[i]->GetState()] :
-                         CSCPMessageCodeName(m_pSessionList[i]->GetCurrentCmd(), szBuffer),
+                         NXCPMessageCodeName(m_pSessionList[i]->GetCurrentCmd(), szBuffer),
                                                pszCipherName[m_pSessionList[i]->GetCipher() + 1],
                        m_pSessionList[i]->GetUserName(),
                        m_pSessionList[i]->GetClientInfo());
index ff90aa5..f5b0a56 100644 (file)
@@ -296,7 +296,7 @@ void ClientSession::ReadThread(void)
    WORD wFlags;
 
    // Initialize raw message receiving function
-   RecvCSCPMessage(0, NULL, m_pMsgBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, m_pMsgBuffer, 0, NULL, NULL, 0);
 
    pRawMsg = (CSCP_MESSAGE *)malloc(RAW_MSG_SIZE);
 #ifdef _WITH_ENCRYPTION
@@ -304,7 +304,7 @@ void ClientSession::ReadThread(void)
 #endif
    while(1)
    {
-      if ((iErr = RecvCSCPMessage(m_hSocket, pRawMsg, 
+      if ((iErr = RecvNXCPMessage(m_hSocket, pRawMsg, 
                                   m_pMsgBuffer, RAW_MSG_SIZE, 
                                   &m_pCtx, pDecryptionBuffer, INFINITE)) <= 0)
          break;
@@ -313,7 +313,7 @@ void ClientSession::ReadThread(void)
       if (iErr == 1)
       {
          DebugPrintf("Received message %s is too large (%d bytes)\n",
-                     CSCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
+                     NXCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
                      ntohl(pRawMsg->dwSize));
          continue;
       }
@@ -340,7 +340,7 @@ void ClientSession::ReadThread(void)
          pRawMsg->dwId = ntohl(pRawMsg->dwId);
          pRawMsg->wCode = ntohs(pRawMsg->wCode);
          pRawMsg->dwNumVars = ntohl(pRawMsg->dwNumVars);
-         DebugPrintf("Received raw message %s\n", CSCPMessageCodeName(pRawMsg->wCode, szBuffer));
+         DebugPrintf("Received raw message %s\n", NXCPMessageCodeName(pRawMsg->wCode, szBuffer));
 
          if ((pRawMsg->wCode == CMD_FILE_DATA) || 
              (pRawMsg->wCode == CMD_ABORT_FILE_TRANSFER))
@@ -403,7 +403,7 @@ void ClientSession::ReadThread(void)
          pMsg = new CSCPMessage(pRawMsg);
          if ((pMsg->GetCode() == CMD_SESSION_KEY) && (pMsg->GetId() == m_dwEncryptionRqId))
          {
-            m_dwEncryptionResult = SetupEncryptionContext(pMsg, &m_pCtx, NULL, g_pServerKey);
+            m_dwEncryptionResult = SetupEncryptionContext(pMsg, &m_pCtx, NULL, g_pServerKey, NXCP_VERSION);
             ConditionSet(m_condEncryptionSetup);
             m_dwEncryptionRqId = 0;
             delete pMsg;
@@ -484,7 +484,7 @@ void ClientSession::WriteThread(void)
       if (pRawMsg == INVALID_POINTER_VALUE)    // Session termination indicator
          break;
 
-      DebugPrintf("Sending message %s\n", CSCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer));
+      DebugPrintf("Sending message %s\n", NXCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer));
       if (m_pCtx != NULL)
       {
          pEnMsg = CSCPEncryptMessage(m_pCtx, pRawMsg);
@@ -533,7 +533,7 @@ void ClientSession::UpdateThread(void)
       {
          case INFO_CAT_EVENT:
             MutexLock(m_mutexSendEvents, INFINITE);
-            m_pSendQueue->Put(CreateRawCSCPMessage(CMD_EVENT, 0, 0, sizeof(NXC_EVENT), pUpdate->pData, NULL));
+            m_pSendQueue->Put(CreateRawNXCPMessage(CMD_EVENT, 0, 0, sizeof(NXC_EVENT), pUpdate->pData, NULL));
             MutexUnlock(m_mutexSendEvents);
             free(pUpdate->pData);
             break;
@@ -608,7 +608,7 @@ void ClientSession::ProcessingThread(void)
          break;
 
       m_wCurrentCmd = pMsg->GetCode();
-      DebugPrintf("Received message %s\n", CSCPMessageCodeName(m_wCurrentCmd, szBuffer));
+      DebugPrintf("Received message %s\n", NXCPMessageCodeName(m_wCurrentCmd, szBuffer));
       if (!(m_dwFlags & CSF_AUTHENTICATED) && 
           (m_wCurrentCmd != CMD_LOGIN) && 
           (m_wCurrentCmd != CMD_GET_SERVER_INFO) &&
@@ -1587,7 +1587,7 @@ void ClientSession::SendAllEvents(CSCPMessage *pRequest)
          ((WCHAR *)event.szMessage)[MAX_EVENT_MSG_LENGTH - 1] = 0;
 #endif
          SwapWideString((WCHAR *)event.szMessage);
-         m_pSendQueue->Put(CreateRawCSCPMessage(CMD_EVENT, dwRqId, wFlags,
+         m_pSendQueue->Put(CreateRawNXCPMessage(CMD_EVENT, dwRqId, wFlags,
                                                 sizeof(NXC_EVENT), &event, NULL));
       }
       DBFreeAsyncResult(g_hCoreDB, hResult);
@@ -2749,7 +2749,7 @@ void ClientSession::GetCollectedData(CSCPMessage *pRequest)
 
                // Prepare and send raw message with fetched data
                m_pSendQueue->Put(
-                  CreateRawCSCPMessage(CMD_DCI_DATA, pRequest->GetId(), 0,
+                  CreateRawNXCPMessage(CMD_DCI_DATA, pRequest->GetId(), 0,
                                        dwNumRows * m_dwRowSize[iType] + sizeof(DCI_DATA_HEADER),
                                        pData, NULL));
                free(pData);
@@ -3004,7 +3004,7 @@ void ClientSession::SendMIB(DWORD dwRqId)
    // Send compiled MIB file
    strcpy(szBuffer, g_szDataDir);
    strcat(szBuffer, DFILE_COMPILED_MIB);
-   SendFileOverCSCP(m_hSocket, dwRqId, szBuffer, m_pCtx);
+   SendFileOverNXCP(m_hSocket, dwRqId, szBuffer, m_pCtx);
 }
 
 
@@ -6950,7 +6950,7 @@ void ClientSession::SendSubmapBkImage(CSCPMessage *pRequest)
    // Send bitmap file
    if (bSuccess)
    {
-      SendFileOverCSCP(m_hSocket, pRequest->GetId(), szBuffer, m_pCtx);
+      SendFileOverNXCP(m_hSocket, pRequest->GetId(), szBuffer, m_pCtx);
    }
 }
 
index f92dd52..7eb40b8 100644 (file)
@@ -228,6 +228,7 @@ class LIBNXSRV_EXPORTABLE AgentConnection
 {
 private:
    DWORD m_dwAddr;
+   int m_nProtocolVersion;
    int m_iAuthMethod;
    char m_szSecret[MAX_SECRET_LENGTH];
    time_t m_tLastCommandTime;
index 28c9640..5a49e2b 100644 (file)
@@ -90,6 +90,7 @@ AgentConnection::AgentConnection()
    m_iEncryptionPolicy = m_iDefaultEncryptionPolicy;
    m_bUseProxy = FALSE;
    m_dwRecvTimeout = 420000;  // 7 minutes
+   m_nProtocolVersion = NXCP_VERSION;
 }
 
 
@@ -130,6 +131,7 @@ AgentConnection::AgentConnection(DWORD dwAddr, WORD wPort,
    m_iEncryptionPolicy = m_iDefaultEncryptionPolicy;
    m_bUseProxy = FALSE;
    m_dwRecvTimeout = 420000;  // 7 minutes
+   m_nProtocolVersion = NXCP_VERSION;
 }
 
 
@@ -189,7 +191,7 @@ void AgentConnection::ReceiverThread(void)
 
    // Initialize raw message receiving function
    pMsgBuffer = (CSCP_BUFFER *)malloc(sizeof(CSCP_BUFFER));
-   RecvCSCPMessage(0, NULL, pMsgBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, pMsgBuffer, 0, NULL, NULL, 0);
 
    // Allocate space for raw message
    pRawMsg = (CSCP_MESSAGE *)malloc(RECEIVER_BUFFER_SIZE);
@@ -201,7 +203,7 @@ void AgentConnection::ReceiverThread(void)
    while(1)
    {
       // Receive raw message
-      if ((iErr = RecvCSCPMessage(m_hSocket, pRawMsg, pMsgBuffer, RECEIVER_BUFFER_SIZE,
+      if ((iErr = RecvNXCPMessage(m_hSocket, pRawMsg, pMsgBuffer, RECEIVER_BUFFER_SIZE,
                                   &m_pCtx, pDecryptionBuffer, m_dwRecvTimeout)) <= 0)
          break;
 
@@ -209,7 +211,7 @@ void AgentConnection::ReceiverThread(void)
       if (iErr == 1)
       {
          PrintMsg(_T("Received too large message %s (%d bytes)"), 
-                  CSCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
+                  NXCPMessageCodeName(ntohs(pRawMsg->wCode), szBuffer),
                   ntohl(pRawMsg->dwSize));
          continue;
       }
@@ -236,7 +238,7 @@ void AgentConnection::ReceiverThread(void)
       }
 
       // Create message object from raw message
-      pMsg = new CSCPMessage(pRawMsg);
+      pMsg = new CSCPMessage(pRawMsg, m_nProtocolVersion);
       if (pMsg->GetCode() == CMD_TRAP)
       {
          OnTrap(pMsg);
@@ -325,6 +327,12 @@ BOOL AgentConnection::Connect(RSA *pServerKey, BOOL bVerbose, DWORD *pdwError)
       goto connect_cleanup;
    }
 
+   if (!NXCPGetPeerProtocolVersion(m_hSocket, &m_nProtocolVersion))
+   {
+      dwError = ERR_INTERNAL_ERROR;
+      goto connect_cleanup;
+   }
+
    // Start receiver thread
    m_hReceiverThread = ThreadCreateEx(ReceiverThreadStarter, 0, this);
 
@@ -549,7 +557,7 @@ INTERFACE_LIST *AgentConnection::GetInterfaceList(void)
 
 DWORD AgentConnection::GetParameter(TCHAR *pszParam, DWORD dwBufSize, TCHAR *pszBuffer)
 {
-   CSCPMessage msg, *pResponse;
+   CSCPMessage msg(m_nProtocolVersion), *pResponse;
    DWORD dwRqId, dwRetCode;
 
    if (m_bIsConnected)
@@ -651,7 +659,7 @@ ARP_CACHE *AgentConnection::GetArpCache(void)
 
 DWORD AgentConnection::Nop(void)
 {
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    DWORD dwRqId;
 
    dwRqId = m_dwRequestId++;
@@ -736,7 +744,7 @@ void AgentConnection::OnTrap(CSCPMessage *pMsg)
 
 DWORD AgentConnection::GetList(TCHAR *pszParam)
 {
-   CSCPMessage msg, *pResponse;
+   CSCPMessage msg(m_nProtocolVersion), *pResponse;
    DWORD i, dwRqId, dwRetCode;
 
    if (m_bIsConnected)
@@ -786,7 +794,7 @@ DWORD AgentConnection::GetList(TCHAR *pszParam)
 
 DWORD AgentConnection::Authenticate(BOOL bProxyData)
 {
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    DWORD dwRqId;
    BYTE hash[32];
    int iAuthMethod = bProxyData ? m_iProxyAuth : m_iAuthMethod;
@@ -836,7 +844,7 @@ DWORD AgentConnection::Authenticate(BOOL bProxyData)
 
 DWORD AgentConnection::ExecAction(TCHAR *pszAction, int argc, TCHAR **argv)
 {
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    DWORD dwRqId;
    int i;
 
@@ -865,7 +873,7 @@ DWORD AgentConnection::ExecAction(TCHAR *pszAction, int argc, TCHAR **argv)
 DWORD AgentConnection::UploadFile(TCHAR *pszFile)
 {
    DWORD dwRqId, dwResult;
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    int i;
 
    if (!m_bIsConnected)
@@ -890,7 +898,7 @@ DWORD AgentConnection::UploadFile(TCHAR *pszFile)
 
    if (dwResult == ERR_SUCCESS)
    {
-      if (SendFileOverCSCP(m_hSocket, dwRqId, pszFile, m_pCtx))
+      if (SendFileOverNXCP(m_hSocket, dwRqId, pszFile, m_pCtx))
          dwResult = WaitForRCC(dwRqId, m_dwCommandTimeout);
       else
          dwResult = ERR_IO_FAILURE;
@@ -907,7 +915,7 @@ DWORD AgentConnection::UploadFile(TCHAR *pszFile)
 DWORD AgentConnection::StartUpgrade(TCHAR *pszPkgName)
 {
    DWORD dwRqId, dwResult;
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    int i;
 
    if (!m_bIsConnected)
@@ -943,7 +951,7 @@ DWORD AgentConnection::CheckNetworkService(DWORD *pdwStatus, DWORD dwIpAddr, int
                                            TCHAR *pszRequest, TCHAR *pszResponse)
 {
    DWORD dwRqId, dwResult;
-   CSCPMessage msg, *pResponse;
+   CSCPMessage msg(m_nProtocolVersion), *pResponse;
    static WORD m_wDefaultPort[] = { 7, 22, 110, 25, 21, 80 };
 
    if (!m_bIsConnected)
@@ -997,7 +1005,7 @@ DWORD AgentConnection::CheckNetworkService(DWORD *pdwStatus, DWORD dwIpAddr, int
 DWORD AgentConnection::GetSupportedParameters(DWORD *pdwNumParams, NXC_AGENT_PARAM **ppParamList)
 {
    DWORD i, dwId, dwRqId, dwResult;
-   CSCPMessage msg, *pResponse;
+   CSCPMessage msg(m_nProtocolVersion), *pResponse;
 
    *pdwNumParams = 0;
    *ppParamList = NULL;
@@ -1050,7 +1058,7 @@ DWORD AgentConnection::GetSupportedParameters(DWORD *pdwNumParams, NXC_AGENT_PAR
 DWORD AgentConnection::SetupEncryption(RSA *pServerKey)
 {
 #ifdef _WITH_ENCRYPTION
-   CSCPMessage msg, *pResp;
+   CSCPMessage msg(m_nProtocolVersion), *pResp;
    DWORD dwRqId, dwError, dwResult;
 
    dwRqId = m_dwRequestId++;
@@ -1062,7 +1070,7 @@ DWORD AgentConnection::SetupEncryption(RSA *pServerKey)
       pResp = WaitForMessage(CMD_SESSION_KEY, dwRqId, m_dwCommandTimeout);
       if (pResp != NULL)
       {
-         dwResult = SetupEncryptionContext(pResp, &m_pCtx, NULL, pServerKey);
+         dwResult = SetupEncryptionContext(pResp, &m_pCtx, NULL, pServerKey, m_nProtocolVersion);
          switch(dwResult)
          {
             case RCC_SUCCESS:
@@ -1107,7 +1115,7 @@ DWORD AgentConnection::SetupEncryption(RSA *pServerKey)
 DWORD AgentConnection::GetConfigFile(TCHAR **ppszConfig, DWORD *pdwSize)
 {
    DWORD i, dwRqId, dwResult;
-   CSCPMessage msg, *pResponse;
+   CSCPMessage msg(m_nProtocolVersion), *pResponse;
 #ifdef UNICODE
    BYTE *pBuffer;
 #endif
@@ -1174,7 +1182,7 @@ DWORD AgentConnection::GetConfigFile(TCHAR **ppszConfig, DWORD *pdwSize)
 DWORD AgentConnection::UpdateConfigFile(TCHAR *pszConfig)
 {
    DWORD dwRqId, dwResult;
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
 #ifdef UNICODE
    int nChars;
    BYTE *pBuffer;
@@ -1317,7 +1325,7 @@ void AgentConnection::SetProxy(DWORD dwAddr, WORD wPort, int iAuthMethod, TCHAR
 
 DWORD AgentConnection::SetupProxyConnection(void)
 {
-   CSCPMessage msg;
+   CSCPMessage msg(m_nProtocolVersion);
    DWORD dwRqId;
 
    dwRqId = m_dwRequestId++;
index b757e59..aa0a91b 100644 (file)
@@ -82,7 +82,7 @@ BOOL Connect(void)
    // Initialize receiver
    m_pRawMsg = (CSCP_MESSAGE *)malloc(MAX_MSG_SIZE);
    m_pRecvBuffer = (CSCP_BUFFER *)malloc(sizeof(CSCP_BUFFER));
-   RecvCSCPMessage(0, NULL, m_pRecvBuffer, 0, NULL, NULL, 0);
+   RecvNXCPMessage(0, NULL, m_pRecvBuffer, 0, NULL, NULL, 0);
 
    return TRUE;
 }
@@ -128,7 +128,7 @@ CSCPMessage *RecvMsg(void)
 
    do
    {
-      iError = RecvCSCPMessage(g_hSocket, m_pRawMsg, m_pRecvBuffer, MAX_MSG_SIZE, &pDummyCtx, NULL, INFINITE);
+      iError = RecvNXCPMessage(g_hSocket, m_pRawMsg, m_pRecvBuffer, MAX_MSG_SIZE, &pDummyCtx, NULL, INFINITE);
       if (iError <= 0)
          return NULL;   // Communication error or closed connection
    } while(iError == 1);