305 lines
9.9 KiB
C++
305 lines
9.9 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Intel Corporation, 2006 - 2007.
|
|
//
|
|
// File: APF.cpp
|
|
//
|
|
// Contents: APF (Intel(R) AMT Port Forwarding protocol).
|
|
//
|
|
// Notes: Version 1.0
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "APF.h"
|
|
#include "global.h"
|
|
#include "OptionsUtils.h"
|
|
|
|
// Messages serialization
|
|
STATUS APF_Disconnect::read (ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR(stream, reason);
|
|
READ_ERROR(stream, reserved);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ServiceRequest::read (ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, serviceNameLength, APF_MAX_SERVICE_NAME_LENGTH);
|
|
READ_STR_ERROR(stream, serviceName, serviceNameLength);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_UserauthRequest::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, usernameLength, APF_MAX_USERNAME_LENGTH);
|
|
READ_STR_ERROR(stream, username, usernameLength);
|
|
|
|
READ_MAX_ERROR(stream, serviceNameLength, APF_MAX_SERVICE_NAME_LENGTH);
|
|
READ_STR_ERROR(stream, serviceName, serviceNameLength);
|
|
|
|
READ_MAX_ERROR(stream, methodNameLength, APF_MAX_METHOD_NAME_LENGTH);
|
|
READ_STR_ERROR(stream, methodName, methodNameLength);
|
|
|
|
if (methodName.compare(APF_USERAUTH_NONE) == 0)
|
|
return STATUS_SUCCESS;
|
|
|
|
if (methodName.compare(APF_USERAUTH_PASSWORD) != 0)
|
|
return STATUS_ILLEGAL_APF_MESSAGE;
|
|
|
|
// If method name = "password"
|
|
READ_ERROR (stream, reserved);
|
|
READ_MAX_ERROR (stream, passwordLength, APF_MAX_PASSWORD_LENGTH);
|
|
READ_STR_ERROR (stream, password, passwordLength);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
STATUS APF_GlobalRequestHeader::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR (stream, stringLen, APF_MAX_GLOBAL_STRING_LENGTH);
|
|
READ_STR_ERROR (stream, requestString, stringLen);
|
|
READ_ERROR (stream, wantReply);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ProtocolVersion::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
int res;
|
|
READ_ERROR(stream, majorVersion);
|
|
READ_ERROR(stream, minorVersion);
|
|
READ_ERROR(stream, triggerReason);
|
|
const time_t &timeout = *getMaxTunnelTimeout();
|
|
if ((res = stream.recv_n(systemId,16,&ACE_Time_Value(timeout)))<=0)
|
|
return STATUS_NETWORK_ERROR;
|
|
if ((res = stream.recv_n(reserved,64,&ACE_Time_Value(timeout)))<=0)
|
|
return STATUS_NETWORK_ERROR;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_TcpForwardRequest::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, addressToBindLength, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, addressToBind, addressToBindLength);
|
|
READ_ERROR (stream, port);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_TcpForwardCancelRequest::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, addressToBindLength, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, addressToBind, addressToBindLength);
|
|
READ_ERROR (stream, port);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_UdpSendTo::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, hostStrLen, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, hostStr, hostStrLen);
|
|
READ_ERROR (stream, port);
|
|
READ_MAX_ERROR(stream, originatorIpAddressLen, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, originatorIpAddress, originatorIpAddressLen);
|
|
READ_ERROR (stream, originatorPort);
|
|
READ_ERROR (stream, dataLength);
|
|
READ_STR_ERROR(stream, data, dataLength);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ChannelOpenDirectRequest::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_MAX_ERROR(stream, channelTypeStringLen, APF_MAX_CHANNEL_TYPE_STRING);
|
|
READ_STR_ERROR(stream, channelTypeString, channelTypeStringLen);
|
|
READ_ERROR (stream, senderChannel);
|
|
READ_ERROR (stream, initialWindowSize);
|
|
READ_ERROR (stream, reserved);
|
|
READ_MAX_ERROR(stream, targetHostStringLen, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, targetHostString, targetHostStringLen);
|
|
READ_ERROR (stream, targetPort);
|
|
READ_MAX_ERROR(stream, originatorIpAddressLen, APF_MAX_ADDRESS_SIZE);
|
|
READ_STR_ERROR(stream, originatorIpAddress, originatorIpAddressLen);
|
|
READ_ERROR (stream, originatorPort);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ChannelOpenReply::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR (stream, recipientChannel);
|
|
READ_ERROR (stream, senderChannel);
|
|
READ_ERROR (stream, initialWindowSize);
|
|
READ_ERROR (stream, reserved);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ChannelClose::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR(stream, recipientChannel);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
STATUS APF_ChannelData::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR (stream, recipientChannel);
|
|
READ_ERROR (stream, dataLen);
|
|
READ_STR_ERROR(stream, data, dataLen);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_ChannelWindowAdjust::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR (stream, recipientChannel);
|
|
READ_ERROR (stream, bytesToAdd);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_KeepAliveReq::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR (stream, _cookie);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
STATUS APF_KeepAliveOptionReq::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR (stream, _keepalive_interval);
|
|
READ_ERROR (stream, _read_timeout);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
// Messages deserialization
|
|
void APF_Disconnect::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_DISCONNECT);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8) APF_DISCONNECT);
|
|
Protocol_BasicMessage::write(mb, reason);
|
|
Protocol_BasicMessage::write(mb, reserved);
|
|
}
|
|
|
|
void APF_ServiceAccept::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8) APF_SERVICE_ACCEPT);
|
|
Protocol_BasicMessage::write(mb, serviceNameLength);
|
|
Protocol_BasicMessage::write(mb, serviceName, serviceNameLength);
|
|
}
|
|
|
|
void APF_GlobalRequestHeader::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8) APF_GLOBAL_REQUEST);
|
|
Protocol_BasicMessage::write(mb, stringLen);
|
|
Protocol_BasicMessage::write(mb, requestString, stringLen);
|
|
Protocol_BasicMessage::write(mb, wantReply);
|
|
}
|
|
|
|
void APF_ProtocolVersion::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb,(ACE_UINT8)APF_PROTOCOLVERSION);
|
|
Protocol_BasicMessage::write(mb, majorVersion);
|
|
Protocol_BasicMessage::write(mb, minorVersion);
|
|
Protocol_BasicMessage::write(mb, triggerReason);
|
|
for (int i=0; i < 16; i++)
|
|
Protocol_BasicMessage::write(mb, systemId[i]);
|
|
for (int i=0; i < 16; i++)
|
|
Protocol_BasicMessage::write(mb, reserved[i]);
|
|
|
|
}
|
|
|
|
void APF_TcpForwardReply::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, status);
|
|
if (status == APF_REQUEST_SUCCESS) {
|
|
Protocol_BasicMessage::write(mb, portBound);
|
|
}
|
|
}
|
|
|
|
void APF_ChannelOpenForwardedRequest::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_CHANNEL_OPEN);
|
|
Protocol_BasicMessage::write(mb, channelTypeStringLen);
|
|
Protocol_BasicMessage::write(mb, channelTypeString, channelTypeStringLen);
|
|
Protocol_BasicMessage::write(mb, senderChannel);
|
|
Protocol_BasicMessage::write(mb, initialWindowSize);
|
|
Protocol_BasicMessage::write(mb, reserved);
|
|
Protocol_BasicMessage::write(mb, connectedAddressStringLen);
|
|
Protocol_BasicMessage::write(mb, connectedAddressString, connectedAddressStringLen);
|
|
Protocol_BasicMessage::write(mb, connectedPort);
|
|
Protocol_BasicMessage::write(mb, originatorIpAddressLen);
|
|
Protocol_BasicMessage::write(mb, originatorIpAddress, originatorIpAddressLen);
|
|
Protocol_BasicMessage::write(mb, originatorPort);
|
|
}
|
|
|
|
void APF_ChannelOpenReply::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, openChannelStatus);
|
|
Protocol_BasicMessage::write(mb, recipientChannel);
|
|
Protocol_BasicMessage::write(mb, senderChannel);
|
|
Protocol_BasicMessage::write(mb, initialWindowSize);
|
|
Protocol_BasicMessage::write(mb, reserved);
|
|
}
|
|
|
|
void APF_ChannelClose::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_CHANNEL_CLOSE);
|
|
Protocol_BasicMessage::write(mb, recipientChannel);
|
|
}
|
|
|
|
void APF_ChannelData::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_CHANNEL_DATA);
|
|
Protocol_BasicMessage::write(mb, recipientChannel);
|
|
Protocol_BasicMessage::write(mb, dataLen);
|
|
Protocol_BasicMessage::write(mb, data, dataLen);
|
|
}
|
|
|
|
void APF_ChannelWindowAdjust::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_CHANNEL_WINDOW_ADJUST);
|
|
Protocol_BasicMessage::write(mb, recipientChannel);
|
|
Protocol_BasicMessage::write(mb, bytesToAdd);
|
|
}
|
|
|
|
void APF_KeepAliveReply::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_KEEPALIVE_REPLY);
|
|
Protocol_BasicMessage::write(mb, _cookie);
|
|
}
|
|
|
|
void APF_KeepAliveOptionReply::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_KEEPALIVE_OPTIONS_RESPONS);
|
|
Protocol_BasicMessage::write(mb, _keepalive_interval);
|
|
Protocol_BasicMessage::write(mb, _read_timeout);
|
|
}
|
|
|
|
void APF_UserauthFailure::write(ACE_Message_Block *&mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(),
|
|
MB_APF_MESSAGE);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)APF_USERAUTH_FAILURE);
|
|
Protocol_BasicMessage::write(mb, methodNameListLength);
|
|
Protocol_BasicMessage::write(mb, methodNameList, methodNameListLength);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8)0x0);
|
|
}
|
|
///////////////
|