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#ifndef __LME_CONNECTION_H__
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define __LME_CONNECTION_H__
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#if defined(__sun) || defined(_LINUX)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "HECIUnix.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "HECIWin.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <map>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <string>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "LMS_if.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "Thread.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "Semaphore.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "Event.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "ATNetworkTool.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct AuthMethodData {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct AuthPasswordData : AuthMethodData {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Password;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_MESSAGE_TYPE type) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan MessageType(type) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan const APF_MESSAGE_TYPE MessageType;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEDisconnectMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEDisconnectMessage(APF_DISCONNECT_REASON_CODE reasonCode) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_DISCONNECT),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ReasonCode(reasonCode) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_DISCONNECT_REASON_CODE ReasonCode;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEServiceRequestMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEServiceRequestMessage(std::string serviceName = "") :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_SERVICE_REQUEST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ServiceName(serviceName) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string ServiceName;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEGlobalRequestMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan enum REQUEST_TYPE {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan TCP_FORWARD_REQUEST,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan TCP_FORWARD_CANCEL_REQUEST,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UDP_SEND_TO
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan };
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEGlobalRequestMessage(REQUEST_TYPE type) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_GLOBAL_REQUEST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RequestType(type) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan const REQUEST_TYPE RequestType;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEProtocolVersionMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEProtocolVersionMessage(UINT32 majorVersion = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 minorVersion = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_TRIGGER_REASON triggerReason = LME_REQUEST) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_PROTOCOLVERSION),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan MajorVersion(majorVersion),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan MinorVersion(minorVersion),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan TriggerReason(triggerReason) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 MajorVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 MinorVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan APF_TRIGGER_REASON TriggerReason;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan struct LMEProtocolVersionMessage &operator=(const struct LMEProtocolVersionMessage &y)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (this != &y) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan this->MajorVersion = y.MajorVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan this->MinorVersion = y.MinorVersion;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return *this;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan };
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool operator<(const struct LMEProtocolVersionMessage &y) const
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (this->MajorVersion != y.MajorVersion) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (this->MajorVersion < y.MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (this->MinorVersion < y.MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool operator>(const struct LMEProtocolVersionMessage &y) const
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (this->MajorVersion != y.MajorVersion) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (this->MajorVersion > y.MajorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return (this->MinorVersion > y.MinorVersion);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEUserAuthRequestMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEUserAuthRequestMessage(std::string username = "",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string serviceName = "",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string methodName = "",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan AuthMethodData *methodData = NULL) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_USERAUTH_REQUEST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Username(username),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ServiceName(ServiceName),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan MethodName(methodName),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan MethodData(methodData) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Username;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string ServiceName;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string MethodName;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan AuthMethodData *MethodData;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMETcpForwardRequestMessage : LMEGlobalRequestMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMETcpForwardRequestMessage(std::string address = "", UINT32 port = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEGlobalRequestMessage(TCP_FORWARD_REQUEST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Address(address),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Port(port) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Address;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 Port;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMETcpForwardCancelRequestMessage : LMEGlobalRequestMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMETcpForwardCancelRequestMessage(std::string address = "", UINT32 port = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEGlobalRequestMessage(TCP_FORWARD_CANCEL_REQUEST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Address(address),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Port(port) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Address;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 Port;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEUdpSendToMessage : LMEGlobalRequestMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEUdpSendToMessage(std::string address = "", UINT32 port = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 dataLength = 0, UINT8 *data = NULL) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEGlobalRequestMessage(UDP_SEND_TO),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Address(address),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Port(port),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan DataLength(dataLength)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((data != NULL) && (dataLength != 0)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = new UINT8[dataLength];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(Data, data, dataLength);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ~LMEUdpSendToMessage()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (Data != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete[] Data;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Address;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 Port;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 DataLength;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT8 *Data;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelOpenRequestMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan enum CHANNEL_TYPE {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan FORWARDED,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan DIRECT
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan };
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenRequestMessage(CHANNEL_TYPE channelType = FORWARDED,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 senderChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 initialWindow = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string address = "", UINT32 port = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_OPEN),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ChannelType(channelType),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan SenderChannel(senderChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan InitialWindow(initialWindow),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Address(address),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Port(port) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan CHANNEL_TYPE ChannelType;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 SenderChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 InitialWindow;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string Address;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 Port;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelOpenReplaySuccessMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplaySuccessMessage(UINT32 recipientChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 senderChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 initialWindow = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_OPEN_CONFIRMATION),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RecipientChannel(recipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan SenderChannel(senderChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan InitialWindow(initialWindow) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 RecipientChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 SenderChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 InitialWindow;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelOpenReplayFailureMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelOpenReplayFailureMessage(UINT32 recipientChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan OPEN_FAILURE_REASON reasonCode = OPEN_FAILURE_REASON_ADMINISTRATIVELY_PROHIBITED) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_OPEN_FAILURE),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RecipientChannel(recipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ReasonCode(reasonCode) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 RecipientChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan OPEN_FAILURE_REASON ReasonCode;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelCloseMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelCloseMessage(UINT32 recipientChannel = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_CLOSE),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RecipientChannel(recipientChannel) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 RecipientChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelDataMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelDataMessage(UINT32 recipientChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 dataLength = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT8 *data = NULL) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_DATA),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RecipientChannel(recipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan DataLength(dataLength)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if ((data != NULL) && (dataLength != 0)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = new UINT8[dataLength];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan memcpy(Data, data, dataLength);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ~LMEChannelDataMessage()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (Data != NULL) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan delete[] Data;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Data = NULL;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan const UINT32 RecipientChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan const UINT32 DataLength;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT8 *Data;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganstruct LMEChannelWindowAdjustMessage : LMEMessage {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEChannelWindowAdjustMessage(UINT32 recipientChannel = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 bytesToAdd = 0) :
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEMessage(APF_CHANNEL_WINDOW_ADJUST),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan RecipientChannel(recipientChannel),
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan BytesToAdd(bytesToAdd) {}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 RecipientChannel;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT32 BytesToAdd;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logantypedef void (*HECICallback)(void *param, void *buffer, unsigned int len, int *status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganclass LMEConnection
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganpublic:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan LMEConnection(bool verbose = false);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ~LMEConnection();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool Init(HECICallback cb, void *param);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool IsInitialized();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool Disconnect(APF_DISCONNECT_REASON_CODE reasonCode);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ServiceAccept(std::string serviceName);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool UserAuthSuccess();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ProtocolVersion(const LMEProtocolVersionMessage versionMessage);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool TcpForwardReplySuccess(UINT32 port);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool TcpForwardReplyFailure();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool TcpForwardCancelReplySuccess();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool TcpForwardCancelReplyFailure();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ChannelOpenForwardedRequest(UINT32 sender, UINT32 connectedPort,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan std::string originatorIP, UINT32 originatorPort);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ChannelOpenReplaySuccess(UINT32 recipient, UINT32 sender);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ChannelOpenReplayFailure(UINT32 recipient, UINT32 reason);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ChannelClose(UINT32 recipient);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int ChannelData(UINT32 recipient, UINT32 len, unsigned char *buffer);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool ChannelWindowAdjust(UINT32 recipient, UINT32 len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //BACKWARD COMPATIBLE PUBLIC - BEGIN
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool CompatProtocolVersion();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool CompatRequestIPFQDN();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool CompatOpenConnection(in_port_t mePort, ATAddress addr, unsigned int &connID);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int CompatSendMessage(UINT8 connID, UINT32 len, unsigned char *buffer);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void CompatCloseConnection(int connID, int status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //BACKWARD COMPATIBLE PUBLIC - END
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned int GetHeciBufferSize() const;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan enum INIT_STATES {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan INIT_STATE_DISCONNECTED = 0,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan INIT_STATE_CONNECTING,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan INIT_STATE_CONNECTED
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan };
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan static const UINT32 RX_WINDOW_SIZE;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char protocolVer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganprivate:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan static const GUID _guid;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan static void _rxThreadFunc(void *param);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _doRX();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int _receiveMessage(unsigned char *buffer, int len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int _sendMessage(unsigned char *buffer, int len);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool _checkMinMsgSize(unsigned char *buf, unsigned int bytesRead);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _apfGlobalRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _apfUserAuthRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _apfChannelOpen(unsigned char *rxBuffer, unsigned int bytesRead, int *status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _apfChannelOpenDirect(unsigned char *rxBuffer, unsigned int bytesRead, UINT32 *senderChannel, int *status);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char _reqID;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unsigned char *_txBuffer;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Thread *_rxThread;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECICallback _cb;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void *_cbParam;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Semaphore _initLock;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Semaphore _sendMessageLock;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan INIT_STATES _initState;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Event _threadStartedEvent;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#if defined(__sun) || defined(_LINUX)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECILinux _heci;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECIWin _heci;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //BACKWARD COMPATIBLE PRIVATE - BEGIN
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan static const GUID _guidCompat;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan void _doRXCompat();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan struct CompatConnection {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Event *event;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int connID;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan UINT8 status;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan };
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan typedef std::map<int, CompatConnection> CompatConnMap;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan CompatConnMap _compatPendingConnections;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan Semaphore _compatMapLock;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#if defined(__sun) || defined(_LINUX)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECILinux _heciCompat;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECIWin _heciCompat;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //BACKWARD COMPATIBLE PRIVATE - END
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan HECI *_pHeci;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan};
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif