//---------------------------------------------------------------------------- // // 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 #include #include //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__