summaryrefslogtreecommitdiff
path: root/usr/src/cmd/lms/LMEConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/lms/LMEConnection.cpp')
-rw-r--r--usr/src/cmd/lms/LMEConnection.cpp1049
1 files changed, 0 insertions, 1049 deletions
diff --git a/usr/src/cmd/lms/LMEConnection.cpp b/usr/src/cmd/lms/LMEConnection.cpp
deleted file mode 100644
index e0a669de8e..0000000000
--- a/usr/src/cmd/lms/LMEConnection.cpp
+++ /dev/null
@@ -1,1049 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * - Neither the name of Intel Corp. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *******************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <cerrno>
-#include "types.h"
-#include "LMEConnection.h"
-#include "LMS_if.h"
-#include "Lock.h"
-#include "glue.h"
-
-#if defined(__sun) || defined(_LINUX)
-#include <netinet/in.h>
-#define _strnicmp strncasecmp
-#endif // __sun || _LINUX
-
-#define HECI_IO_TIMEOUT 5000
-
-extern glue plugin;
-
-const GUID LMEConnection::_guid = {0x6733a4db, 0x0476, 0x4e7b, {0xb3, 0xaf, 0xbc, 0xfc, 0x29, 0xbe, 0xe7, 0xa7}};
-
-const UINT32 LMEConnection::RX_WINDOW_SIZE = 1024;
-
-LMEConnection::LMEConnection(bool verbose) :
-_reqID(0),
-_txBuffer(NULL),
-_rxThread(NULL),
-_cb(NULL),
-_cbParam(NULL),
-_initState(INIT_STATE_DISCONNECTED),
-_heci(_guid, verbose),
-_heciCompat(_guidCompat, verbose),
-_pHeci(NULL)
-{
-}
-
-LMEConnection::~LMEConnection()
-{
-}
-
-bool LMEConnection::IsInitialized()
-{
- Lock il(_initLock);
- return ((_initState == INIT_STATE_CONNECTED) ? true : false);
-}
-
-bool LMEConnection::Init(HECICallback cb, void *param)
-{
- Lock il(_initLock);
-
- if (_initState == INIT_STATE_CONNECTING) {
- return false;
- }
- _initState = INIT_STATE_CONNECTING;
-
- _cb = cb;
- _cbParam = param;
-
- if (_heci.Init(LMS_PROCOL_VERSION)) {
- protocolVer = _heci.GetProtocolVersion();
- _pHeci = &_heci;
- } else if (_heciCompat.Init()) {
- protocolVer = _heciCompat.GetProtocolVersion();
- if (protocolVer > LMS_PROCOL_VERSION_COMPAT) {
- _heciCompat.Deinit();
- _initState = INIT_STATE_DISCONNECTED;
- return false;
- }
- _pHeci = &_heciCompat;
- } else {
- _initState = INIT_STATE_DISCONNECTED;
- return false;
- }
-
- _initState = INIT_STATE_CONNECTED;
-
- plugin.version(protocolVer);
-
- // launch RX thread
- _txBuffer = new unsigned char[_pHeci->GetBufferSize()];
- _rxThread = new Thread(_rxThreadFunc, this);
- _rxThread->start();
-
- _threadStartedEvent.wait();
- return true;
-}
-
-void LMEConnection::Deinit()
-{
- Lock il(_initLock);
-
- _initState = INIT_STATE_DISCONNECTED;
-
- if (_pHeci != NULL) {
- _pHeci->Deinit();
- _pHeci = NULL;
- }
-
- if (_rxThread != NULL) {
- delete _rxThread;
- _rxThread = NULL;
- }
-
- if (_txBuffer != NULL) {
- delete[] _txBuffer;
- _txBuffer = NULL;
- }
-}
-
-bool LMEConnection::Disconnect(APF_DISCONNECT_REASON_CODE reasonCode)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf[sizeof(APF_DISCONNECT_MESSAGE)];
-
- APF_DISCONNECT_MESSAGE *disconnectMessage = (APF_DISCONNECT_MESSAGE *)buf;
-
- memset(disconnectMessage, 0, sizeof(buf));
- disconnectMessage->MessageType = APF_DISCONNECT;
- disconnectMessage->ReasonCode = htonl(reasonCode);
-
- PRINT("Sending disconnect to LME.\n");
- int res = _sendMessage(buf, sizeof(buf));
-
- return (res == sizeof(buf));
-}
-
-bool LMEConnection::ServiceAccept(std::string serviceName)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- //APF_SERVICE_ACCEPT_MESSAGE
- //memcpy(pCurrent, "127.0.0.1", APF_STR_SIZE_OF("127.0.0.1"));
- //pCurrent += APF_STR_SIZE_OF("127.0.0.1");
- unsigned char *buf = new unsigned char[sizeof(APF_SERVICE_ACCEPT_MESSAGE) + serviceName.length()];
- if (buf == NULL) {
- PRINT("Failed to allocate memory for ServiceAccept.\n");
- return false;
- }
-
- unsigned char *pCurrent = buf;
- *pCurrent = APF_SERVICE_ACCEPT;
- ++pCurrent;
- *((UINT32 *)pCurrent) = htonl(serviceName.size());
- pCurrent += 4;
-
- memcpy(pCurrent, serviceName.c_str(), serviceName.size());
- pCurrent += serviceName.size();
-
- PRINT("Sending service accept to LME: %s\n", serviceName.c_str());
- int len = pCurrent - buf;
- int res = _sendMessage(buf, len);
-
- delete [] buf;
-
- return (res == len);
-}
-
-bool LMEConnection::UserAuthSuccess()
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf = APF_USERAUTH_SUCCESS;
-
- PRINT("Sending user authentication success to LME.\n");
- int res = _sendMessage(&buf, sizeof(buf));
-
- return (res == sizeof(buf));
-}
-
-bool LMEConnection::ProtocolVersion(const LMEProtocolVersionMessage versionMessage)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_PROTOCOL_VERSION_MESSAGE protVersion;
- memset(&protVersion, 0, sizeof(protVersion));
-
- protVersion.MessageType = APF_PROTOCOLVERSION;
- protVersion.MajorVersion = htonl(versionMessage.MajorVersion);
- protVersion.MinorVersion = htonl(versionMessage.MinorVersion);
- protVersion.TriggerReason = htonl(versionMessage.TriggerReason);
-
- PRINT("Sending protocol version to LME: %d.%d\n", versionMessage.MajorVersion, versionMessage.MinorVersion);
- int res = _sendMessage((unsigned char *)&protVersion, sizeof(protVersion));
-
- return (res == sizeof(protVersion));
-}
-
-bool LMEConnection::TcpForwardReplySuccess(UINT32 port)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_TCP_FORWARD_REPLY_MESSAGE message;
-
- message.MessageType = APF_REQUEST_SUCCESS;
- message.PortBound = htonl(port);
-
- PRINT("Sending TCP forward replay success to LME: Port %d.\n", port);
- int res = _sendMessage((unsigned char *)&message, sizeof(message));
-
- return (res == sizeof(message));
-}
-
-bool LMEConnection::TcpForwardReplyFailure()
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf = APF_REQUEST_FAILURE;
-
- PRINT("Sending TCP forward replay failure to LME.\n");
- int res = _sendMessage(&buf, sizeof(buf));
-
- return (res == sizeof(buf));
-}
-
-bool LMEConnection::TcpForwardCancelReplySuccess()
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf = APF_REQUEST_SUCCESS;
-
- PRINT("Sending TCP forward cancel replay success to LME.\n");
- int res = _sendMessage(&buf, sizeof(buf));
-
- return (res == sizeof(buf));
-}
-
-bool LMEConnection::TcpForwardCancelReplyFailure()
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf = APF_REQUEST_FAILURE;
-
- PRINT("Sending TCP forward cancel replay failure to LME.\n");
- int res = _sendMessage(&buf, sizeof(buf));
-
- return (res == sizeof(buf));
-}
-
-bool LMEConnection::ChannelOpenForwardedRequest(UINT32 senderChannel,
- UINT32 connectedPort,
- std::string originatorIP,
- UINT32 originatorPort)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- unsigned char buf[5 + APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED) + 16 +
- APF_STR_SIZE_OF("127.0.0.1") + 8 + 16 + 4];
- unsigned char *pCurrent = buf;
-
- if (originatorIP.size() > 16) {
- return false;
- }
-
- *pCurrent = APF_CHANNEL_OPEN;
- ++pCurrent;
-
- *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED));
- pCurrent += sizeof(UINT32);
-
- memcpy(pCurrent, APF_OPEN_CHANNEL_REQUEST_FORWARDED, APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED));
- pCurrent += APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED);
-
- *((UINT32 *)pCurrent) = htonl(senderChannel);
- pCurrent += sizeof(UINT32);
-
- *((UINT32 *)pCurrent) = htonl(RX_WINDOW_SIZE);
- pCurrent += sizeof(UINT32);
-
- *((UINT32 *)pCurrent) = 0xFFFFFFFF;
- pCurrent += sizeof(UINT32);
-
- *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF("127.0.0.1"));
- pCurrent += sizeof(UINT32);
-
- memcpy(pCurrent, "127.0.0.1", APF_STR_SIZE_OF("127.0.0.1"));
- pCurrent += APF_STR_SIZE_OF("127.0.0.1");
-
- *((UINT32 *)pCurrent) = htonl(connectedPort);
- pCurrent += sizeof(UINT32);
-
- *((UINT32 *)pCurrent) = htonl((UINT32)originatorIP.size());
- pCurrent += sizeof(UINT32);
-
- memcpy(pCurrent, originatorIP.c_str(), originatorIP.size());
- pCurrent += originatorIP.size();
-
- *((UINT32 *)pCurrent) = htonl(originatorPort);
- pCurrent += sizeof(UINT32);
-
- PRINT("Sending channel open request to LME. Address: %s, requested port: %d.\n",
- originatorIP.c_str(), connectedPort);
- int res = _sendMessage(buf, (int)(pCurrent - buf));
-
- return (res == pCurrent - buf);
-}
-
-bool LMEConnection::ChannelOpenReplaySuccess(UINT32 recipientChannel,
- UINT32 senderChannel)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE message;
-
- message.MessageType = APF_CHANNEL_OPEN_CONFIRMATION;
- message.RecipientChannel = htonl(recipientChannel);
- message.SenderChannel = htonl(senderChannel);
- message.InitialWindowSize = htonl(RX_WINDOW_SIZE);
- message.Reserved = 0xFFFFFFFF;
-
- PRINT("Sending channel open replay success to LME. Recipient: %d.\n", recipientChannel);
- int res = _sendMessage((unsigned char *)&message, sizeof(message));
-
- return (res == sizeof(message));
-}
-
-bool LMEConnection::ChannelOpenReplayFailure(UINT32 recipientChannel,
- UINT32 reason)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_CHANNEL_OPEN_FAILURE_MESSAGE message;
-
- message.MessageType = APF_CHANNEL_OPEN_FAILURE;
- message.RecipientChannel = htonl(recipientChannel);
- message.ReasonCode = htonl(reason);
- message.Reserved = 0x00000000;
- message.Reserved2 = 0x00000000;
-
- PRINT("Sending channel open replay failure to LME. Recipient: %d, Reason: %d.\n", recipientChannel, reason);
- int res = _sendMessage((unsigned char *)&message, sizeof(message));
-
- return (res == sizeof(message));
-}
-
-bool LMEConnection::ChannelClose(UINT32 recipientChannel)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_CHANNEL_CLOSE_MESSAGE message;
-
- message.MessageType = APF_CHANNEL_CLOSE;
- message.RecipientChannel = htonl(recipientChannel);
-
- PRINT("Sending channel close to LME. Recipient: %d.\n", recipientChannel);
- int res = _sendMessage((unsigned char *)&message, sizeof(message));
-
- return (res == sizeof(message));
-}
-
-int LMEConnection::ChannelData(UINT32 recipientChannel,
- UINT32 len, unsigned char *buffer)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_CHANNEL_DATA_MESSAGE *message;
-
- if (len > _heci.GetBufferSize() - sizeof(APF_CHANNEL_DATA_MESSAGE)) {
- return -1;
- }
-
- message = (APF_CHANNEL_DATA_MESSAGE *)_txBuffer;
- message->MessageType = APF_CHANNEL_DATA;
- message->RecipientChannel = htonl(recipientChannel);
- message->DataLength = htonl(len);
- memcpy(message->Data, buffer, len);
-
- PRINT("Sending %d bytes to recipient channel %d.\n", len, recipientChannel);
- return _sendMessage((unsigned char *)message, sizeof(APF_CHANNEL_DATA_MESSAGE) + len);
-}
-
-bool LMEConnection::ChannelWindowAdjust(UINT32 recipientChannel, UINT32 len)
-{
- if (!IsInitialized()) {
- PRINT("State: not connected to HECI.\n");
- return false;
- }
-
- APF_WINDOW_ADJUST_MESSAGE message;
-
- message.MessageType = APF_CHANNEL_WINDOW_ADJUST;
- message.RecipientChannel = htonl(recipientChannel);
- message.BytesToAdd = htonl(len);
-
- PRINT("Sending Window Adjust with %d bytes to recipient channel %d.\n", len, recipientChannel);
- int res = _sendMessage((unsigned char *)&message, sizeof(message));
-
- return (res == sizeof(message));
-}
-
-int LMEConnection::_receiveMessage(unsigned char *buffer, int len)
-{
- int result;
-
- if (!IsInitialized()) {
- return -1;
- }
-
- result = _pHeci->ReceiveMessage(buffer, len, WAIT_INFINITE);
-
- if (result < 0 && errno == ENOENT) {
- Lock il(_initLock);
- _initState = INIT_STATE_DISCONNECTED;
- }
-
- return result;
-}
-
-int LMEConnection::_sendMessage(unsigned char *buffer, int len)
-{
- int result;
-
- if (!IsInitialized()) {
- return -1;
- }
-
- _sendMessageLock.acquire();
- result = _pHeci->SendMessage(buffer, len, HECI_IO_TIMEOUT);
- _sendMessageLock.release();
-
- if (result < 0 && errno == ENOENT) {
- Lock il(_initLock);
- _initState = INIT_STATE_DISCONNECTED;
- }
-
- return result;
-}
-
-void LMEConnection::_rxThreadFunc(void *param)
-{
- LMEConnection *connection = (LMEConnection *)param;
-
- try {
- if (LMS_PROCOL_VERSION == connection->protocolVer) {
- connection->_doRX();
- } else if (LMS_PROCOL_VERSION_COMPAT == connection->protocolVer) {
- connection->_doRXCompat();
- }
- }
- catch (...) {
- PRINT("LMEConnection do RX exception\n");
- }
- pthread_exit(NULL);
-}
-
-bool LMEConnection::_checkMinMsgSize(unsigned char *buf, unsigned int bytesRead)
-{
- switch (buf[0]) {
- case APF_DISCONNECT:
- if (bytesRead < sizeof(APF_DISCONNECT_MESSAGE)) {
- return false;
- }
- break;
- case APF_SERVICE_REQUEST:
- if (bytesRead < sizeof(APF_SERVICE_REQUEST)) {
- return false;
- }
- if (bytesRead < (sizeof(APF_SERVICE_REQUEST) +
- ntohl(((APF_SERVICE_REQUEST_MESSAGE *)buf)->ServiceNameLength))) {
- return false;
- }
- break;
- case APF_USERAUTH_REQUEST:
- if (bytesRead < (3 * sizeof(UINT32))) {
- return false;
- }
- break;
- case APF_GLOBAL_REQUEST:
- if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8))) {
- return false;
- }
- if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8) +
- ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
- return false;
- }
- break;
- case APF_CHANNEL_OPEN:
- if (bytesRead < sizeof(APF_GENERIC_HEADER)) {
- return false;
- }
- if (bytesRead < (sizeof(APF_GENERIC_HEADER) +
- ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
- return false;
- }
- break;
- case APF_CHANNEL_OPEN_CONFIRMATION:
- if (bytesRead < sizeof(APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE)) {
- return false;
- }
- break;
- case APF_CHANNEL_OPEN_FAILURE:
- if (bytesRead < sizeof(APF_CHANNEL_OPEN_FAILURE_MESSAGE)) {
- return false;
- }
- break;
- case APF_CHANNEL_CLOSE:
- if (bytesRead < sizeof(APF_CHANNEL_CLOSE_MESSAGE)) {
- return false;
- }
- break;
- case APF_CHANNEL_DATA:
- if (bytesRead < sizeof(APF_CHANNEL_DATA_MESSAGE)) {
- return false;
- }
- if (bytesRead < (sizeof(APF_CHANNEL_DATA_MESSAGE) +
- ntohl(((APF_CHANNEL_DATA_MESSAGE *)buf)->DataLength))) {
- return false;
- }
- break;
- case APF_CHANNEL_WINDOW_ADJUST:
- if (bytesRead < sizeof(APF_WINDOW_ADJUST_MESSAGE)) {
- return false;
- }
- break;
- case APF_PROTOCOLVERSION:
- if (bytesRead < sizeof(APF_PROTOCOL_VERSION_MESSAGE)) {
- return false;
- }
- break;
- default:
- return false;
- }
- return true;
-}
-
-void LMEConnection::_doRX()
-{
- unsigned int bytesRead;
- int status = 1;
-
- _threadStartedEvent.set();
-
- unsigned char *rxBuffer = new unsigned char[_heci.GetBufferSize()];
-
- while (true) {
- bytesRead = (unsigned int)_receiveMessage(rxBuffer, _heci.GetBufferSize());
-
- if ((int)bytesRead < 0) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- break;
- }
-
- if (bytesRead == 0) {
- // ERROR
- continue;
- }
-
- PRINT("Received from LME %d bytes (msg type %02d)\n", bytesRead, rxBuffer[0]);
-
- if (!_checkMinMsgSize(rxBuffer, bytesRead)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- break;
- }
-
- if (plugin.preprocess(rxBuffer, bytesRead) == LMS_DROPPED) {
- continue;
- }
-
- switch (rxBuffer[0]) {
- case APF_DISCONNECT:
- {
- LMEDisconnectMessage disconnectMessage(
- (APF_DISCONNECT_REASON_CODE)ntohl(
- ((APF_DISCONNECT_MESSAGE *)rxBuffer)->ReasonCode));
-
- _cb(_cbParam, &disconnectMessage, sizeof(disconnectMessage), &status);
- }
- break;
-
- case APF_SERVICE_REQUEST:
- {
- APF_SERVICE_REQUEST_MESSAGE *pMessage =
- (APF_SERVICE_REQUEST_MESSAGE *)rxBuffer;
- LMEServiceRequestMessage serviceRequestMessage;
-
- serviceRequestMessage.ServiceName.append(
- (char *)(pMessage->ServiceName),
- ntohl(pMessage->ServiceNameLength));
-
- _cb(_cbParam, &serviceRequestMessage, sizeof(serviceRequestMessage), &status);
- }
- break;
-
- case APF_USERAUTH_REQUEST:
- _apfUserAuthRequest(rxBuffer, bytesRead, &status);
- break;
-
- case APF_GLOBAL_REQUEST:
- _apfGlobalRequest(rxBuffer, bytesRead, &status);
- break;
-
- case APF_CHANNEL_OPEN:
- _apfChannelOpen(rxBuffer, bytesRead, &status);
- break;
-
- case APF_CHANNEL_OPEN_CONFIRMATION:
- {
- APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *pMessage =
- (APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *)rxBuffer;
- LMEChannelOpenReplaySuccessMessage channelOpenReply;
-
- channelOpenReply.RecipientChannel = ntohl(pMessage->RecipientChannel);
- channelOpenReply.SenderChannel = ntohl(pMessage->SenderChannel);
- channelOpenReply.InitialWindow = ntohl(pMessage->InitialWindowSize);
- _cb(_cbParam, &channelOpenReply, sizeof(channelOpenReply), &status);
- }
- break;
-
- case APF_CHANNEL_OPEN_FAILURE:
- {
- APF_CHANNEL_OPEN_FAILURE_MESSAGE *pMessage =
- (APF_CHANNEL_OPEN_FAILURE_MESSAGE *)rxBuffer;
- LMEChannelOpenReplayFailureMessage channelOpenReply;
-
- channelOpenReply.RecipientChannel = ntohl(pMessage->RecipientChannel);
- channelOpenReply.ReasonCode =
- (OPEN_FAILURE_REASON)(ntohl(pMessage->ReasonCode));
- _cb(_cbParam, &channelOpenReply, sizeof(channelOpenReply), &status);
- }
- break;
-
- case APF_CHANNEL_CLOSE:
- {
- APF_CHANNEL_CLOSE_MESSAGE *pMessage =
- (APF_CHANNEL_CLOSE_MESSAGE *)rxBuffer;
- LMEChannelCloseMessage channelClose;
-
- channelClose.RecipientChannel = ntohl(pMessage->RecipientChannel);
- _cb(_cbParam, &channelClose, sizeof(channelClose), &status);
- }
- break;
-
- case APF_CHANNEL_DATA:
- {
- APF_CHANNEL_DATA_MESSAGE *pMessage =
- (APF_CHANNEL_DATA_MESSAGE *)rxBuffer;
- LMEChannelDataMessage channelData(ntohl(pMessage->RecipientChannel),
- ntohl(pMessage->DataLength),
- pMessage->Data);
- _cb(_cbParam, &channelData, sizeof(channelData), &status);
- }
- break;
-
- case APF_CHANNEL_WINDOW_ADJUST:
- {
- APF_WINDOW_ADJUST_MESSAGE *pMessage =
- (APF_WINDOW_ADJUST_MESSAGE *)rxBuffer;
- LMEChannelWindowAdjustMessage channelWindowAdjust;
-
- channelWindowAdjust.RecipientChannel = ntohl(pMessage->RecipientChannel);
- channelWindowAdjust.BytesToAdd = ntohl(pMessage->BytesToAdd);
- _cb(_cbParam, &channelWindowAdjust, sizeof(channelWindowAdjust), &status);
- }
- break;
-
- case APF_PROTOCOLVERSION:
- {
- APF_PROTOCOL_VERSION_MESSAGE *pMessage =
- (APF_PROTOCOL_VERSION_MESSAGE *)rxBuffer;
- LMEProtocolVersionMessage protVersion;
-
- protVersion.MajorVersion = ntohl(pMessage->MajorVersion);
- protVersion.MinorVersion = ntohl(pMessage->MinorVersion);
- protVersion.TriggerReason =
- (APF_TRIGGER_REASON)ntohl(pMessage->TriggerReason);
- _cb(_cbParam, &protVersion, sizeof(protVersion), &status);
- }
- break;
-
- default:
- // Uknown request. Ignore
- break;
- }
-
- if (IsInitialized()) {
- plugin.postprocess(rxBuffer, bytesRead, status);
- }
- }
-
- if (rxBuffer != NULL) {
- delete[] rxBuffer;
- }
-}
-
-void LMEConnection::_apfChannelOpen(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
-{
- APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
-
- if (_strnicmp((char *)pHeader->String,
- APF_OPEN_CHANNEL_REQUEST_DIRECT,
- APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT)) == 0) {
-
- UINT32 senderChannel = 0;
-
- _apfChannelOpenDirect(rxBuffer, bytesRead, &senderChannel, status);
- if (IsInitialized() && (*status == 1)) {
- if (plugin.retry(rxBuffer, bytesRead) != LMS_DROPPED) {
- _apfChannelOpenDirect(rxBuffer, bytesRead, NULL, status);
- }
- }
- if (IsInitialized() && (*status == 1)) {
- ChannelOpenReplayFailure(senderChannel,
- OPEN_FAILURE_REASON_CONNECT_FAILED);
- }
- }
-}
-
-void LMEConnection::_apfChannelOpenDirect(unsigned char *rxBuffer, unsigned int bytesRead, UINT32 *senderChannel, int *status)
-{
- unsigned char *pCurrent;
- APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
-
- if (bytesRead < sizeof(APF_GENERIC_HEADER) +
- ntohl(pHeader->StringLength) +
- 7 + (5 * sizeof(UINT32))) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- pCurrent = rxBuffer + sizeof(APF_GENERIC_HEADER) +
- APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT);
-
- LMEChannelOpenRequestMessage channelOpenRequest;
- channelOpenRequest.ChannelType = LMEChannelOpenRequestMessage::DIRECT;
-
- channelOpenRequest.SenderChannel = ntohl(*((UINT32 *)pCurrent));
- if (senderChannel) {
- *senderChannel = channelOpenRequest.SenderChannel;
- }
- pCurrent += sizeof(UINT32);
- channelOpenRequest.InitialWindow = ntohl(*((UINT32 *)pCurrent));
- pCurrent += 2 * sizeof(UINT32);
-
- UINT32 len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
- channelOpenRequest.Address.append((char *)pCurrent, len);
- pCurrent += len;
- channelOpenRequest.Port = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- _cb(_cbParam, &channelOpenRequest, sizeof(channelOpenRequest), status);
-}
-
-void LMEConnection::_apfGlobalRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
-{
- unsigned char *pCurrent;
- APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
-
- if (_strnicmp((char *)pHeader->String,
- APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST,
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST)) == 0) {
- LMETcpForwardRequestMessage tcpForwardRequest;
- unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST) +
- sizeof(UINT8);
- pCurrent = rxBuffer + hsize;
- bytesRead -= hsize;
-
- if (bytesRead < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- UINT32 len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- tcpForwardRequest.Address.append((char *)pCurrent, len);
- pCurrent += len;
- tcpForwardRequest.Port = ntohl(*((UINT32 *)pCurrent));
-
- _cb(_cbParam, &tcpForwardRequest, sizeof(tcpForwardRequest), status);
- }
- else if (_strnicmp((char *)pHeader->String,
- APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST,
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST)) == 0) {
- LMETcpForwardCancelRequestMessage tcpForwardCancelRequest;
- unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST) +
- sizeof(UINT8);
- pCurrent = rxBuffer + hsize;
- bytesRead -= hsize;
-
- if (bytesRead < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- UINT32 len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- tcpForwardCancelRequest.Address.append((char *)pCurrent, len);
- pCurrent += len;
- tcpForwardCancelRequest.Port = ntohl(*((UINT32 *)pCurrent));
-
- _cb(_cbParam, &tcpForwardCancelRequest, sizeof(tcpForwardCancelRequest), status);
- }
- else if (_strnicmp((char *)pHeader->String,
- APF_GLOBAL_REQUEST_STR_UDP_SEND_TO,
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO)) == 0) {
- unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
- APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO) +
- sizeof(UINT8);
- pCurrent = rxBuffer + hsize;
- bytesRead -= hsize;
-
- if (bytesRead < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- UINT32 len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
- bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
-
- std::string address;
- address.append((char *)pCurrent, len);
- pCurrent += len;
- UINT32 port = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- // Skip Originator IP and Port
- len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
- bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
-
- pCurrent += len;
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- // Retrieve Data
- len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if (bytesRead < (sizeof(UINT32) + len)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- LMEUdpSendToMessage udpSendTo(address, port, len, pCurrent);
-
- _cb(_cbParam, &udpSendTo, sizeof(udpSendTo), status);
- }
-}
-
-void LMEConnection::_apfUserAuthRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
-{
- unsigned char *pCurrent = rxBuffer;
-
- ++pCurrent;
-
- LMEUserAuthRequestMessage userAuthRequest;
-
- UINT32 len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if ((bytesRead - (pCurrent - rxBuffer)) < len) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- userAuthRequest.Username.append((char *)pCurrent, len);
- pCurrent += len;
-
- if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if ((bytesRead - (pCurrent - rxBuffer)) < len) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- userAuthRequest.ServiceName.append((char *)pCurrent, len);
- pCurrent += len;
-
- if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if ((bytesRead - (pCurrent - rxBuffer)) < len) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- userAuthRequest.MethodName.append((char *)pCurrent, len);
- pCurrent += len;
-
- if (_strnicmp(userAuthRequest.MethodName.c_str(), APF_AUTH_PASSWORD,
- userAuthRequest.MethodName.size()) == 0) {
-
- if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32) + 1) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- ++pCurrent;
-
- len = ntohl(*((UINT32 *)pCurrent));
- pCurrent += sizeof(UINT32);
-
- if ((bytesRead - (pCurrent - rxBuffer)) < len) {
- PRINT("Error receiving data from HECI\n");
- Deinit();
- return;
- }
-
- AuthPasswordData authData;
- authData.Password.append((char *)pCurrent, len);
- pCurrent += len;
-
- userAuthRequest.MethodData = &authData;
- }
-
- _cb(_cbParam, &userAuthRequest, sizeof(userAuthRequest), status);
-}
-
-unsigned int LMEConnection::GetHeciBufferSize() const
-{
- if (_pHeci == NULL) {
- return 0;
- }
- return _pHeci->GetBufferSize();
-}
-