390 lines
12 KiB
C++
390 lines
12 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Intel Corporation, 2006 - 2007.
|
|
//
|
|
// File: APF.h
|
|
//
|
|
// Contents: APF (Intel(R) AMT Port Forwarding protocol).
|
|
//
|
|
// Notes: Version 1.0
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef _APF_H__
|
|
#define _APF_H__
|
|
|
|
//ace headers
|
|
#include <ace/SOCK_Stream.h>
|
|
#include <ace/Message_Block.h>
|
|
#include <ace/SString.h>
|
|
|
|
//mps headers:
|
|
#include "OptionsUtils.h"
|
|
#include "ProtocolBasicMessage.h"
|
|
#define APF_ZERO_RESERVE 0x0000
|
|
//TODO:
|
|
// Message Block types
|
|
static const ACE_Message_Block::ACE_Message_Type MB_APF_MESSAGE = 0x01;
|
|
static const ACE_Message_Block::ACE_Message_Type MB_DISCONNECT = 0x02;
|
|
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_OPEN = 0x03;
|
|
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_OPEN_REPLY = 0x04;
|
|
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_CLOSE = 0x05;
|
|
|
|
// message codes
|
|
#define APF_DISCONNECT 1
|
|
#define APF_SERVICE_REQUEST 5
|
|
#define APF_SERVICE_ACCEPT 6
|
|
#define APF_USERAUTH_REQUEST 50
|
|
#define APF_USERAUTH_FAILURE 51
|
|
#define APF_USERAUTH_SUCCESS 52
|
|
#define APF_GLOBAL_REQUEST 80
|
|
#define APF_REQUEST_SUCCESS 81
|
|
#define APF_REQUEST_FAILURE 82
|
|
#define APF_CHANNEL_OPEN 90
|
|
#define APF_CHANNEL_OPEN_CONFIRMATION 91
|
|
#define APF_CHANNEL_OPEN_FAILURE 92
|
|
#define APF_CHANNEL_WINDOW_ADJUST 93
|
|
#define APF_CHANNEL_DATA 94
|
|
#define APF_CHANNEL_CLOSE 97
|
|
#define APF_PROTOCOLVERSION 192
|
|
#define APF_KEEPALIVE_REQUEST 208
|
|
#define APF_KEEPALIVE_REPLY 209
|
|
#define APF_KEEPALIVE_OPTIONS_REQ 210
|
|
#define APF_KEEPALIVE_OPTIONS_RESPONS 211
|
|
|
|
// APF_DISCONNECT reason code
|
|
#define APF_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1
|
|
#define APF_DISCONNECT_PROTOCOL_ERROR 2
|
|
#define APF_DISCONNECT_KEY_EXCHANGE_FAILED 3
|
|
#define APF_DISCONNECT_RESERVED 4
|
|
#define APF_DISCONNECT_MAC_ERROR 5
|
|
#define APF_DISCONNECT_COMPRESSION_ERROR 6
|
|
#define APF_DISCONNECT_SERVICE_NOT_AVAILABLE 7
|
|
#define APF_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8
|
|
#define APF_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9
|
|
#define APF_DISCONNECT_CONNECTION_LOST 10
|
|
#define APF_DISCONNECT_BY_APPLICATION 11
|
|
#define APF_DISCONNECT_TOO_MANY_CONNECTIONS 12
|
|
#define APF_DISCONNECT_AUTH_CANCELLED_BY_USER 13
|
|
#define APF_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14
|
|
#define APF_DISCONNECT_ILLEGAL_USER_NAME 15
|
|
#define APF_DISCONNECT_CONNECTION_TIMED_OUT 16
|
|
#define APF_DISCONNECT_BY_POLICY 17
|
|
#define APF_DISCONNECT_TEMPORARILY_UNAVAILABLE 18
|
|
|
|
|
|
// error codes for failure to open channel
|
|
#define OPEN_ADMINISTRATIVELY_PROHIBITED 1
|
|
#define OPEN_CONNECT_FAILED 2
|
|
#define OPEN_UNKNOWN_CHANNEL_TYPE 3
|
|
#define OPEN_RESOURCE_SHORTAGE 4
|
|
|
|
// APF service names
|
|
#define APF_SERVICE_PFWD "pfwd@amt.intel.com"
|
|
#define APF_SERVICE_AUTH "auth@amt.intel.com"
|
|
|
|
// Global Requests string identifiers
|
|
#define APF_PROTOCOL_VERSION "protocol-version@amt.intel.com"
|
|
#define APF_TCP_FORWARD_REQUEST "tcpip-forward"
|
|
#define APF_TCP_FORWARD_CANCEL "cancel-tcpip-forward"
|
|
#define APF_UDP_SENDTO "udp-send-to@amt.intel.com"
|
|
#define APF_CHANNEL_OPEN_FORWARD "forwarded-tcpip"
|
|
#define APF_CHANNEL_OPEN_DIRECT_FORWARD "direct-tcpip"
|
|
#define APF_USERAUTH_FAILURE_STR "password"
|
|
|
|
// Trigger reason code
|
|
#define USER_INITIATED_REQUEST 1
|
|
#define ALERT_REQUSET 2
|
|
#define HIT_PROVISIONING_REQUEST 3
|
|
#define PERIODIC_REQUEST 4
|
|
#define LME_REQUEST 254
|
|
|
|
// APF authentication methods
|
|
#define APF_USERAUTH_NONE "none"
|
|
#define APF_USERAUTH_PASSWORD "password"
|
|
|
|
// Protocol version this implementation support.
|
|
#define APF_PROTOCOL_VERSION_MAJOR 1
|
|
#define APF_PROTOCOL_VERSION_MINOR 0
|
|
|
|
// Define max values for APF message fields
|
|
#define APF_MAX_STRING_SIZE 256
|
|
#define APF_MAX_SERVICE_NAME_LENGTH 32
|
|
#define APF_MAX_USERNAME_LENGTH 64
|
|
#define APF_MAX_PASSWORD_LENGTH 64
|
|
#define APF_MAX_METHOD_NAME_LENGTH 16
|
|
#define APF_MAX_GLOBAL_STRING_LENGTH 32
|
|
#define APF_MAX_ADDRESS_SIZE 256
|
|
#define APF_MAX_CHANNEL_TYPE_STRING 32
|
|
|
|
|
|
#define TRIGER_REASON_NUM 5
|
|
static const char* TRIGGER_REASON[TRIGER_REASON_NUM] =
|
|
{
|
|
"USER INITIATED REQUEST",
|
|
"ALERT REQUSET",
|
|
"HIT PROVISIONING REQUEST",
|
|
"PERIODIC REQUEST",
|
|
"LME REQUEST",
|
|
};
|
|
|
|
// Basic APF message class contain the basic type serialization/deserialization
|
|
class APF_BasicMessage : public Protocol_BasicMessage{
|
|
public:
|
|
unsigned int maxSize() {return *getMaximumWindowSize(); }
|
|
};
|
|
|
|
// Transport Layer Messages
|
|
class APF_Disconnect: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 reason = 0;
|
|
ACE_UINT16 reserved = 0;
|
|
size_t size() {return 7;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_ServiceRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 serviceNameLength;
|
|
ACE_CString serviceName;
|
|
size_t size() {return 5+serviceNameLength;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {};
|
|
};
|
|
|
|
class APF_ServiceAccept: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 serviceNameLength;
|
|
ACE_CString serviceName;
|
|
size_t size() {return 5+serviceNameLength;}
|
|
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
// Protocol version message
|
|
class APF_ProtocolVersion: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 majorVersion = 0; // Major version
|
|
ACE_UINT32 minorVersion = 0; // Minor version
|
|
ACE_UINT32 triggerReason = 0; // Open session reason
|
|
ACE_UINT8 systemId[16]; // Machine Id (UUID for Enterprise
|
|
// or CID for Home ).
|
|
ACE_UINT32 reserved[16];
|
|
size_t size() {return 93;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
// Authentication Messages
|
|
class APF_UserauthRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 usernameLength;
|
|
ACE_CString username;
|
|
ACE_UINT32 serviceNameLength;
|
|
ACE_CString serviceName;
|
|
ACE_UINT32 methodNameLength;
|
|
ACE_CString methodName;
|
|
|
|
// If method name = "password"
|
|
ACE_UINT8 reserved;
|
|
ACE_UINT32 passwordLength;
|
|
ACE_CString password;
|
|
size_t size() {return usernameLength +
|
|
serviceNameLength +
|
|
methodNameLength +
|
|
passwordLength + 18;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {}
|
|
};
|
|
|
|
class APF_UserauthFailure: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 methodNameListLength;
|
|
ACE_CString methodNameList;
|
|
ACE_UINT8 reserved; // must be zero
|
|
size_t size() {return methodNameListLength + 6;}
|
|
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
// Global messages
|
|
class APF_GlobalRequestHeader: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 stringLen = 0; // Request string length
|
|
ACE_CString requestString; // Request string
|
|
ACE_UINT8 wantReply; // Want reply: 0=No-Reply, 1=Reply.
|
|
size_t size() {return 6+stringLen;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_TcpForwardRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 addressToBindLength;// Address to bind string length
|
|
ACE_CString addressToBind; // Address to bind string
|
|
ACE_UINT32 port; // Port number to bind
|
|
size_t size() {return 8+addressToBindLength;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {}
|
|
};
|
|
|
|
class APF_TcpForwardReply: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT8 status = 0; // APF_REQUEST_SUCCESS or APF_REQUEST_FAILURE
|
|
ACE_UINT32 portBound = 0; // Port bound: The TCP port that was bound on the server
|
|
size_t size() {return (status == APF_REQUEST_SUCCESS ? 5 : 1);}
|
|
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write(ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_TcpForwardCancelRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 addressToBindLength;// Address to bind string length
|
|
ACE_CString addressToBind; // Address to bind string
|
|
ACE_UINT32 port; // Port number to bind
|
|
size_t size() {return 8+addressToBindLength;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {}
|
|
};
|
|
|
|
class APF_UdpSendTo: public APF_BasicMessage {
|
|
public:
|
|
|
|
ACE_UINT32 hostStrLen; // Host to connect string length (M)
|
|
ACE_CString hostStr; // Host to connect string
|
|
ACE_UINT32 port; // Port number to connect
|
|
ACE_UINT32 originatorIpAddressLen; // Originator IP address string length
|
|
ACE_CString originatorIpAddress; // Originator IP address string
|
|
ACE_UINT32 originatorPort; // Originator port
|
|
ACE_UINT32 dataLength; // Data length
|
|
ACE_Message_Block *data; // Data
|
|
size_t size() {return 20+
|
|
hostStrLen+
|
|
originatorIpAddressLen+
|
|
dataLength;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {}
|
|
};
|
|
|
|
// Channel Messages
|
|
class APF_ChannelOpenForwardedRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 channelTypeStringLen;
|
|
ACE_CString channelTypeString;
|
|
ACE_UINT32 senderChannel;
|
|
ACE_UINT32 initialWindowSize;
|
|
ACE_UINT32 reserved; //0xffffffff
|
|
|
|
ACE_UINT32 connectedAddressStringLen;
|
|
ACE_CString connectedAddressString;
|
|
ACE_UINT32 connectedPort;
|
|
|
|
ACE_UINT32 originatorIpAddressLen;
|
|
ACE_CString originatorIpAddress;
|
|
ACE_UINT32 originatorPort;
|
|
size_t size() {return 33 +
|
|
channelTypeStringLen +
|
|
connectedAddressStringLen +
|
|
originatorIpAddressLen;}
|
|
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_ChannelOpenDirectRequest: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 channelTypeStringLen;
|
|
ACE_CString channelTypeString;
|
|
ACE_UINT32 senderChannel;
|
|
ACE_UINT32 initialWindowSize;
|
|
ACE_UINT32 reserved; //0xffffffff
|
|
|
|
ACE_UINT32 targetHostStringLen;
|
|
ACE_CString targetHostString;
|
|
ACE_UINT32 targetPort;
|
|
|
|
ACE_UINT32 originatorIpAddressLen;
|
|
ACE_CString originatorIpAddress;
|
|
ACE_UINT32 originatorPort;
|
|
size_t size() {return 33 +
|
|
channelTypeStringLen +
|
|
targetHostStringLen +
|
|
originatorIpAddressLen;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb) {}
|
|
};
|
|
|
|
class APF_ChannelOpenReply: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT8 openChannelStatus = 0;
|
|
ACE_UINT32 recipientChannel = 0;
|
|
ACE_UINT32 senderChannel = 0; // or failure code !
|
|
ACE_UINT32 initialWindowSize = 0; // or 0xf..f in failure !
|
|
ACE_UINT32 reserved = 0; // 0xf...f
|
|
size_t size() {return 17;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
|
|
class APF_ChannelClose: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 recipientChannel = 0;
|
|
size_t size() {return 5;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
|
|
class APF_ChannelData: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 recipientChannel = 0;
|
|
ACE_UINT32 dataLen = 0;
|
|
ACE_Message_Block *data = NULL;
|
|
size_t size() {return 9+dataLen;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_ChannelWindowAdjust: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 recipientChannel = 0;
|
|
ACE_UINT32 bytesToAdd = 0;
|
|
size_t size() {return 9;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_KeepAliveReq: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 _cookie = 0;
|
|
size_t size() {return 4;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb){}
|
|
};
|
|
class APF_KeepAliveReply: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 _cookie = 0;
|
|
size_t size() {return 5;}
|
|
STATUS read (ACE_SOCK_Stream &stream){return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
class APF_KeepAliveOptionReq: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 _keepalive_interval = 0;
|
|
ACE_UINT32 _read_timeout = 0;
|
|
size_t size() {return 9;}
|
|
STATUS read (ACE_SOCK_Stream &stream);
|
|
void write (ACE_Message_Block *&mb){}
|
|
};
|
|
|
|
class APF_KeepAliveOptionReply: public APF_BasicMessage {
|
|
public:
|
|
ACE_UINT32 _keepalive_interval = 0;
|
|
ACE_UINT32 _read_timeout = 0;
|
|
size_t size() {return 9;}
|
|
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
|
|
void write (ACE_Message_Block *&mb);
|
|
};
|
|
|
|
#endif // _APF_H__
|