617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/*******************************************************************************
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * Redistribution and use in source and binary forms, with or without
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * modification, are permitted provided that the following conditions are met:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Redistributions of source code must retain the above copyright notice,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * this list of conditions and the following disclaimer.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Redistributions in binary form must reproduce the above copyright notice,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * this list of conditions and the following disclaimer in the documentation
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * and/or other materials provided with the distribution.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Neither the name of Intel Corp. nor the names of its
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * contributors may be used to endorse or promote products derived from this
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * software without specific prior written permission.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * POSSIBILITY OF SUCH DAMAGE.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *******************************************************************************/
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif // __sun || _LINUX
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganconst GUID LMEConnection::_guid = {0x6733a4db, 0x0476, 0x4e7b, {0xb3, 0xaf, 0xbc, 0xfc, 0x29, 0xbe, 0xe7, 0xa7}};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganconst UINT32 LMEConnection::RX_WINDOW_SIZE = 1024;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return ((_initState == INIT_STATE_CONNECTED) ? true : false);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::Init(HECICallback cb, void *param)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // launch RX thread
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _txBuffer = new unsigned char[_pHeci->GetBufferSize()];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::Disconnect(APF_DISCONNECT_REASON_CODE reasonCode)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf[sizeof(APF_DISCONNECT_MESSAGE)];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_DISCONNECT_MESSAGE *disconnectMessage = (APF_DISCONNECT_MESSAGE *)buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan disconnectMessage->ReasonCode = htonl(reasonCode);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ServiceAccept(std::string serviceName)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //APF_SERVICE_ACCEPT_MESSAGE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //memcpy(pCurrent, "127.0.0.1", APF_STR_SIZE_OF("127.0.0.1"));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //pCurrent += APF_STR_SIZE_OF("127.0.0.1");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *buf = new unsigned char[sizeof(APF_SERVICE_ACCEPT_MESSAGE) + serviceName.length()];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Failed to allocate memory for ServiceAccept.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(serviceName.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, serviceName.c_str(), serviceName.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending service accept to LME: %s\n", serviceName.c_str());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending user authentication success to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ProtocolVersion(const LMEProtocolVersionMessage versionMessage)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MajorVersion = htonl(versionMessage.MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MinorVersion = htonl(versionMessage.MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.TriggerReason = htonl(versionMessage.TriggerReason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending protocol version to LME: %d.%d\n", versionMessage.MajorVersion, versionMessage.MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&protVersion, sizeof(protVersion));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardReplySuccess(UINT32 port)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward replay success to LME: Port %d.\n", port);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward replay failure to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardCancelReplySuccess()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward cancel replay success to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardCancelReplyFailure()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward cancel replay failure to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenForwardedRequest(UINT32 senderChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf[5 + APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED) + 16 +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, APF_OPEN_CHANNEL_REQUEST_FORWARDED, APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF("127.0.0.1"));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, "127.0.0.1", APF_STR_SIZE_OF("127.0.0.1"));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl((UINT32)originatorIP.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, originatorIP.c_str(), originatorIP.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel open request to LME. Address: %s, requested port: %d.\n",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(buf, (int)(pCurrent - buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenReplaySuccess(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_CHANNEL_OPEN_CONFIRMATION;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.InitialWindowSize = htonl(RX_WINDOW_SIZE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel open replay success to LME. Recipient: %d.\n", recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenReplayFailure(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel open replay failure to LME. Recipient: %d, Reason: %d.\n", recipientChannel, reason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelClose(UINT32 recipientChannel)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel close to LME. Recipient: %d.\n", recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::ChannelData(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (len > _heci.GetBufferSize() - sizeof(APF_CHANNEL_DATA_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message->RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending %d bytes to recipient channel %d.\n", len, recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return _sendMessage((unsigned char *)message, sizeof(APF_CHANNEL_DATA_MESSAGE) + len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelWindowAdjust(UINT32 recipientChannel, UINT32 len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending Window Adjust with %d bytes to recipient channel %d.\n", len, recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::_receiveMessage(unsigned char *buffer, int len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan result = _pHeci->ReceiveMessage(buffer, len, WAIT_INFINITE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::_sendMessage(unsigned char *buffer, int len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan result = _pHeci->SendMessage(buffer, len, HECI_IO_TIMEOUT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEConnection *connection = (LMEConnection *)param;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (LMS_PROCOL_VERSION == connection->protocolVer) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else if (LMS_PROCOL_VERSION_COMPAT == connection->protocolVer) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan catch (...) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::_checkMinMsgSize(unsigned char *buf, unsigned int bytesRead)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan switch (buf[0]) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_DISCONNECT_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_SERVICE_REQUEST_MESSAGE *)buf)->ServiceNameLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_OPEN_FAILURE_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_CLOSE_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_DATA_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_CHANNEL_DATA_MESSAGE) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_CHANNEL_DATA_MESSAGE *)buf)->DataLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_WINDOW_ADJUST_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_PROTOCOL_VERSION_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *rxBuffer = new unsigned char[_heci.GetBufferSize()];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan while (true) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead = (unsigned int)_receiveMessage(rxBuffer, _heci.GetBufferSize());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((int)bytesRead < 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Received from LME %d bytes (msg type %02d)\n", bytesRead, rxBuffer[0]);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (plugin.preprocess(rxBuffer, bytesRead) == LMS_DROPPED) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan switch (rxBuffer[0]) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ((APF_DISCONNECT_MESSAGE *)rxBuffer)->ReasonCode));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &disconnectMessage, sizeof(disconnectMessage), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &serviceRequestMessage, sizeof(serviceRequestMessage), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfUserAuthRequest(rxBuffer, bytesRead, &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplaySuccessMessage channelOpenReply;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.SenderChannel = ntohl(pMessage->SenderChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.InitialWindow = ntohl(pMessage->InitialWindowSize);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelOpenReply, sizeof(channelOpenReply), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplayFailureMessage channelOpenReply;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (OPEN_FAILURE_REASON)(ntohl(pMessage->ReasonCode));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelOpenReply, sizeof(channelOpenReply), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelClose.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelClose, sizeof(channelClose), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelDataMessage channelData(ntohl(pMessage->RecipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelData, sizeof(channelData), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelWindowAdjustMessage channelWindowAdjust;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelWindowAdjust.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelWindowAdjust.BytesToAdd = ntohl(pMessage->BytesToAdd);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelWindowAdjust, sizeof(channelWindowAdjust), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MajorVersion = ntohl(pMessage->MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MinorVersion = ntohl(pMessage->MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_TRIGGER_REASON)ntohl(pMessage->TriggerReason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &protVersion, sizeof(protVersion), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Uknown request. Ignore
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfChannelOpen(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfChannelOpenDirect(rxBuffer, bytesRead, &senderChannel, status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (plugin.retry(rxBuffer, bytesRead) != LMS_DROPPED) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfChannelOpenDirect(rxBuffer, bytesRead, NULL, status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfChannelOpenDirect(unsigned char *rxBuffer, unsigned int bytesRead, UINT32 *senderChannel, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent = rxBuffer + sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.ChannelType = LMEChannelOpenRequestMessage::DIRECT;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.SenderChannel = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *senderChannel = channelOpenRequest.SenderChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.InitialWindow = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelOpenRequest, sizeof(channelOpenRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfGlobalRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &tcpForwardRequest, sizeof(tcpForwardRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMETcpForwardCancelRequestMessage tcpForwardCancelRequest;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardCancelRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardCancelRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &tcpForwardCancelRequest, sizeof(tcpForwardCancelRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Skip Originator IP and Port
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Retrieve Data
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEUdpSendToMessage udpSendTo(address, port, len, pCurrent);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &udpSendTo, sizeof(udpSendTo), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfUserAuthRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.Username.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.ServiceName.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.MethodName.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_strnicmp(userAuthRequest.MethodName.c_str(), APF_AUTH_PASSWORD,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32) + 1) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &userAuthRequest, sizeof(userAuthRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganunsigned int LMEConnection::GetHeciBufferSize() const