617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/*******************************************************************************
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
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 *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Redistributions of source code must retain the above copyright notice,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * this list of conditions and the following disclaimer.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
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 *
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 *
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
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef HAVE_CONFIG_H
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "config.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <cerrno>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "types.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "LMEConnection.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "LMS_if.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "Lock.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "glue.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#if defined(__sun) || defined(_LINUX)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <netinet/in.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define _strnicmp strncasecmp
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif // __sun || _LINUX
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define HECI_IO_TIMEOUT 5000
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganextern glue plugin;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganconst GUID LMEConnection::_guid = {0x6733a4db, 0x0476, 0x4e7b, {0xb3, 0xaf, 0xbc, 0xfc, 0x29, 0xbe, 0xe7, 0xa7}};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganconst UINT32 LMEConnection::RX_WINDOW_SIZE = 1024;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark LoganLMEConnection::LMEConnection(bool verbose) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_reqID(0),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_txBuffer(NULL),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_rxThread(NULL),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_cb(NULL),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_cbParam(NULL),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_initState(INIT_STATE_DISCONNECTED),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_heci(_guid, verbose),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_heciCompat(_guidCompat, verbose),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan_pHeci(NULL)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark LoganLMEConnection::~LMEConnection()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::IsInitialized()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Lock il(_initLock);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return ((_initState == INIT_STATE_CONNECTED) ? true : false);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::Init(HECICallback cb, void *param)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Lock il(_initLock);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_initState == INIT_STATE_CONNECTING) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_CONNECTING;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb = cb;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cbParam = param;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_heci.Init(LMS_PROCOL_VERSION)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protocolVer = _heci.GetProtocolVersion();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _pHeci = &_heci;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else if (_heciCompat.Init()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protocolVer = _heciCompat.GetProtocolVersion();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (protocolVer > LMS_PROCOL_VERSION_COMPAT) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _heciCompat.Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_DISCONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _pHeci = &_heciCompat;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_DISCONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_CONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan plugin.version(protocolVer);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // launch RX thread
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _txBuffer = new unsigned char[_pHeci->GetBufferSize()];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _rxThread = new Thread(_rxThreadFunc, this);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _rxThread->start();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _threadStartedEvent.wait();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::Deinit()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Lock il(_initLock);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_DISCONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_pHeci != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _pHeci->Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _pHeci = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_rxThread != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete _rxThread;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _rxThread = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_txBuffer != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete[] _txBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _txBuffer = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::Disconnect(APF_DISCONNECT_REASON_CODE reasonCode)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf[sizeof(APF_DISCONNECT_MESSAGE)];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_DISCONNECT_MESSAGE *disconnectMessage = (APF_DISCONNECT_MESSAGE *)buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memset(disconnectMessage, 0, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan disconnectMessage->MessageType = APF_DISCONNECT;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan disconnectMessage->ReasonCode = htonl(reasonCode);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending disconnect to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(buf, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ServiceAccept(std::string serviceName)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 if (buf == NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Failed to allocate memory for ServiceAccept.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *pCurrent = buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *pCurrent = APF_SERVICE_ACCEPT;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ++pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(serviceName.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += 4;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, serviceName.c_str(), serviceName.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += serviceName.size();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending service accept to LME: %s\n", serviceName.c_str());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int len = pCurrent - buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(buf, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete [] buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::UserAuthSuccess()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf = APF_USERAUTH_SUCCESS;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending user authentication success to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(&buf, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ProtocolVersion(const LMEProtocolVersionMessage versionMessage)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_PROTOCOL_VERSION_MESSAGE protVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memset(&protVersion, 0, sizeof(protVersion));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MessageType = APF_PROTOCOLVERSION;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MajorVersion = htonl(versionMessage.MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MinorVersion = htonl(versionMessage.MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.TriggerReason = htonl(versionMessage.TriggerReason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(protVersion));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardReplySuccess(UINT32 port)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_TCP_FORWARD_REPLY_MESSAGE message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_REQUEST_SUCCESS;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.PortBound = htonl(port);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardReplyFailure()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf = APF_REQUEST_FAILURE;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward replay failure to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(&buf, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardCancelReplySuccess()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf = APF_REQUEST_SUCCESS;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward cancel replay success to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(&buf, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::TcpForwardCancelReplyFailure()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf = APF_REQUEST_FAILURE;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending TCP forward cancel replay failure to LME.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(&buf, sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenForwardedRequest(UINT32 senderChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 connectedPort,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string originatorIP,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 originatorPort)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char buf[5 + APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED) + 16 +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF("127.0.0.1") + 8 + 16 + 4];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *pCurrent = buf;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (originatorIP.size() > 16) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *pCurrent = APF_CHANNEL_OPEN;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ++pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_FORWARDED));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(senderChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(RX_WINDOW_SIZE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = 0xFFFFFFFF;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(APF_STR_SIZE_OF("127.0.0.1"));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(connectedPort);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl((UINT32)originatorIP.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(pCurrent, originatorIP.c_str(), originatorIP.size());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += originatorIP.size();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *((UINT32 *)pCurrent) = htonl(originatorPort);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel open request to LME. Address: %s, requested port: %d.\n",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan originatorIP.c_str(), connectedPort);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage(buf, (int)(pCurrent - buf));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == pCurrent - buf);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenReplaySuccess(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 senderChannel)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_CHANNEL_OPEN_CONFIRMATION;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.SenderChannel = htonl(senderChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.InitialWindowSize = htonl(RX_WINDOW_SIZE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.Reserved = 0xFFFFFFFF;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelOpenReplayFailure(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 reason)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_OPEN_FAILURE_MESSAGE message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_CHANNEL_OPEN_FAILURE;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.ReasonCode = htonl(reason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.Reserved = 0x00000000;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.Reserved2 = 0x00000000;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelClose(UINT32 recipientChannel)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_CLOSE_MESSAGE message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_CHANNEL_CLOSE;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Sending channel close to LME. Recipient: %d.\n", recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int res = _sendMessage((unsigned char *)&message, sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::ChannelData(UINT32 recipientChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len, unsigned char *buffer)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_DATA_MESSAGE *message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (len > _heci.GetBufferSize() - sizeof(APF_CHANNEL_DATA_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message = (APF_CHANNEL_DATA_MESSAGE *)_txBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message->MessageType = APF_CHANNEL_DATA;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message->RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message->DataLength = htonl(len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(message->Data, buffer, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::ChannelWindowAdjust(UINT32 recipientChannel, UINT32 len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("State: not connected to HECI.\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_WINDOW_ADJUST_MESSAGE message;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.MessageType = APF_CHANNEL_WINDOW_ADJUST;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.RecipientChannel = htonl(recipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan message.BytesToAdd = htonl(len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (res == sizeof(message));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::_receiveMessage(unsigned char *buffer, int len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int result;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan result = _pHeci->ReceiveMessage(buffer, len, WAIT_INFINITE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (result < 0 && errno == ENOENT) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Lock il(_initLock);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_DISCONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return result;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint LMEConnection::_sendMessage(unsigned char *buffer, int len)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int result;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _sendMessageLock.acquire();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan result = _pHeci->SendMessage(buffer, len, HECI_IO_TIMEOUT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _sendMessageLock.release();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (result < 0 && errno == ENOENT) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Lock il(_initLock);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _initState = INIT_STATE_DISCONNECTED;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return result;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_rxThreadFunc(void *param)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEConnection *connection = (LMEConnection *)param;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan try {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (LMS_PROCOL_VERSION == connection->protocolVer) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan connection->_doRX();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else if (LMS_PROCOL_VERSION_COMPAT == connection->protocolVer) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan connection->_doRXCompat();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan catch (...) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("LMEConnection do RX exception\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pthread_exit(NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool LMEConnection::_checkMinMsgSize(unsigned char *buf, unsigned int bytesRead)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan switch (buf[0]) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_DISCONNECT:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_DISCONNECT_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_SERVICE_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_SERVICE_REQUEST)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_SERVICE_REQUEST) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_SERVICE_REQUEST_MESSAGE *)buf)->ServiceNameLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_USERAUTH_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (3 * sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_GLOBAL_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_GENERIC_HEADER) + sizeof(UINT8) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_GENERIC_HEADER)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_GENERIC_HEADER *)buf)->StringLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN_CONFIRMATION:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN_FAILURE:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_OPEN_FAILURE_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_CLOSE:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_CLOSE_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_DATA:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_CHANNEL_DATA_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(APF_CHANNEL_DATA_MESSAGE) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(((APF_CHANNEL_DATA_MESSAGE *)buf)->DataLength))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_WINDOW_ADJUST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_WINDOW_ADJUST_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_PROTOCOLVERSION:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_PROTOCOL_VERSION_MESSAGE)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan default:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_doRX()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int bytesRead;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int status = 1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _threadStartedEvent.set();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *rxBuffer = new unsigned char[_heci.GetBufferSize()];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan while (true) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead = (unsigned int)_receiveMessage(rxBuffer, _heci.GetBufferSize());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((int)bytesRead < 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // ERROR
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan continue;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Received from LME %d bytes (msg type %02d)\n", bytesRead, rxBuffer[0]);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!_checkMinMsgSize(rxBuffer, bytesRead)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (plugin.preprocess(rxBuffer, bytesRead) == LMS_DROPPED) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan continue;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan switch (rxBuffer[0]) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_DISCONNECT:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEDisconnectMessage disconnectMessage(
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_DISCONNECT_REASON_CODE)ntohl(
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ((APF_DISCONNECT_MESSAGE *)rxBuffer)->ReasonCode));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &disconnectMessage, sizeof(disconnectMessage), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_SERVICE_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_SERVICE_REQUEST_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_SERVICE_REQUEST_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEServiceRequestMessage serviceRequestMessage;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan serviceRequestMessage.ServiceName.append(
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (char *)(pMessage->ServiceName),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(pMessage->ServiceNameLength));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &serviceRequestMessage, sizeof(serviceRequestMessage), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_USERAUTH_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfUserAuthRequest(rxBuffer, bytesRead, &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_GLOBAL_REQUEST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfGlobalRequest(rxBuffer, bytesRead, &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfChannelOpen(rxBuffer, bytesRead, &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN_CONFIRMATION:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_CHANNEL_OPEN_CONFIRMATION_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplaySuccessMessage channelOpenReply;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
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 }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_OPEN_FAILURE:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_OPEN_FAILURE_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_CHANNEL_OPEN_FAILURE_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplayFailureMessage channelOpenReply;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenReply.ReasonCode =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (OPEN_FAILURE_REASON)(ntohl(pMessage->ReasonCode));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelOpenReply, sizeof(channelOpenReply), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_CLOSE:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_CLOSE_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_CHANNEL_CLOSE_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelCloseMessage channelClose;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelClose.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelClose, sizeof(channelClose), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_DATA:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_CHANNEL_DATA_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_CHANNEL_DATA_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelDataMessage channelData(ntohl(pMessage->RecipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(pMessage->DataLength),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pMessage->Data);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelData, sizeof(channelData), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_CHANNEL_WINDOW_ADJUST:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_WINDOW_ADJUST_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_WINDOW_ADJUST_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelWindowAdjustMessage channelWindowAdjust;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelWindowAdjust.RecipientChannel = ntohl(pMessage->RecipientChannel);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelWindowAdjust.BytesToAdd = ntohl(pMessage->BytesToAdd);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelWindowAdjust, sizeof(channelWindowAdjust), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan case APF_PROTOCOLVERSION:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_PROTOCOL_VERSION_MESSAGE *pMessage =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_PROTOCOL_VERSION_MESSAGE *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEProtocolVersionMessage protVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MajorVersion = ntohl(pMessage->MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.MinorVersion = ntohl(pMessage->MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan protVersion.TriggerReason =
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan (APF_TRIGGER_REASON)ntohl(pMessage->TriggerReason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &protVersion, sizeof(protVersion), &status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan default:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Uknown request. Ignore
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan break;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan plugin.postprocess(rxBuffer, bytesRead, status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (rxBuffer != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete[] rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfChannelOpen(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_strnicmp((char *)pHeader->String,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_OPEN_CHANNEL_REQUEST_DIRECT,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 senderChannel = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfChannelOpenDirect(rxBuffer, bytesRead, &senderChannel, status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (IsInitialized() && (*status == 1)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (plugin.retry(rxBuffer, bytesRead) != LMS_DROPPED) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _apfChannelOpenDirect(rxBuffer, bytesRead, NULL, status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (IsInitialized() && (*status == 1)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ChannelOpenReplayFailure(senderChannel,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan OPEN_FAILURE_REASON_CONNECT_FAILED);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfChannelOpenDirect(unsigned char *rxBuffer, unsigned int bytesRead, UINT32 *senderChannel, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ntohl(pHeader->StringLength) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan 7 + (5 * sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent = rxBuffer + sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_OPEN_CHANNEL_REQUEST_DIRECT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenRequestMessage channelOpenRequest;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.ChannelType = LMEChannelOpenRequestMessage::DIRECT;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.SenderChannel = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (senderChannel) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *senderChannel = channelOpenRequest.SenderChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.InitialWindow = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += 2 * sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan channelOpenRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &channelOpenRequest, sizeof(channelOpenRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfGlobalRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_strnicmp((char *)pHeader->String,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST)) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMETcpForwardRequestMessage tcpForwardRequest;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int hsize = sizeof(APF_GENERIC_HEADER) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST) +
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sizeof(UINT8);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent = rxBuffer + hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &tcpForwardRequest, sizeof(tcpForwardRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else if (_strnicmp((char *)pHeader->String,
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 sizeof(UINT8);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent = rxBuffer + hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardCancelRequest.Address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan tcpForwardCancelRequest.Port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &tcpForwardCancelRequest, sizeof(tcpForwardCancelRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else if (_strnicmp((char *)pHeader->String,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_GLOBAL_REQUEST_STR_UDP_SEND_TO,
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 sizeof(UINT8);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent = rxBuffer + hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= hsize;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string address;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan address.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 port = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Skip Originator IP and Port
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Retrieve Data
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (bytesRead < (sizeof(UINT32) + len)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEUdpSendToMessage udpSendTo(address, port, len, pCurrent);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &udpSendTo, sizeof(udpSendTo), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid LMEConnection::_apfUserAuthRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *pCurrent = rxBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ++pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEUserAuthRequestMessage userAuthRequest;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((bytesRead - (pCurrent - rxBuffer)) < len) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.Username.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((bytesRead - (pCurrent - rxBuffer)) < len) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.ServiceName.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((bytesRead - (pCurrent - rxBuffer)) < len) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.MethodName.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_strnicmp(userAuthRequest.MethodName.c_str(), APF_AUTH_PASSWORD,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.MethodName.size()) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((unsigned int)(bytesRead - (pCurrent - rxBuffer)) < sizeof(UINT32) + 1) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ++pCurrent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan len = ntohl(*((UINT32 *)pCurrent));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += sizeof(UINT32);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((bytesRead - (pCurrent - rxBuffer)) < len) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("Error receiving data from HECI\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan AuthPasswordData authData;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan authData.Password.append((char *)pCurrent, len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pCurrent += len;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan userAuthRequest.MethodData = &authData;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _cb(_cbParam, &userAuthRequest, sizeof(userAuthRequest), status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganunsigned int LMEConnection::GetHeciBufferSize() const
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_pHeci == NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return _pHeci->GetBufferSize();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan