//---------------------------------------------------------------------------- // // Copyright (C) Intel Corporation, 2006 - 2007. // // File: TunnelConsumer.h // // Contents: Handles outgoing data on APF tunnel. // // Notes: //---------------------------------------------------------------------------- #ifndef AMT_TUNNEL_CONSUMER_H #define AMT_TUNNEL_CONSUMER_H #include #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "APF.h" #include #include #include // FW declaration class AMT_Tunnel_Handler; class AMT_Tunnel_Supplier; class Channel_Consumer; // Remove class Tcp_Consumer; // Remove class Channel_Manager; // ============================================================================ // = TITLE // Handles outgoing APF packet from SOCKS/tunnel supplier to Intel(R) AMT. // // = DESCRIPTION // Handle outgoing APF messages, reformat messages to APF style. // This consumer must outlive all suppliers that have reference to it, // i.e. it's AMT_Tunnel_Supplier and any Channel_Consumer. // ============================================================================ class AMT_Tunnel_Consumer { friend class AMT_Tunnel_Supplier; friend class AMT_Tunnel_Handler; public: // = Initialization method. AMT_Tunnel_Consumer (AMT_Tunnel_Handler *tunnel_handler); // = Destruction virtual ~AMT_Tunnel_Consumer(void); // Tunnel control messages (functions access by tunnel supplier) STATUS send_APF_message (APF_BasicMessage &msg, PRIORITY prio=PRIO_LOW); STATUS send_APF_message (ACE_UINT8 msg, PRIORITY prio=PRIO_LOW); // Channel specific messages (functions access by channel consumer) STATUS send_channel_open_request ( Channel_Consumer *channel_consumer, Tcp_Consumer *tcp_consumer, ACE_UINT32 connectedAddressStringLen, ACE_CString connectedAddressString, ACE_UINT32 connectedPort, ACE_UINT32 originatorIpAddressLen, ACE_CString originatorIpAddress, ACE_UINT32 originatorPort); STATUS send_channel_close ( ACE_UINT32 recipent_channel); STATUS send_channel_data ( ACE_UINT32 recipent_channel, ACE_Message_Block *data); STATUS channelOpenDirectRep ( bool status, ACE_INT32 amt_id, Channel_Consumer *channel_consumer, Tcp_Consumer *tcp_consumer, ACE_INT32 mps_id= -1); // Handle the outgoing message queue. virtual STATUS handle_output(); // Handle close message from reactor void handle_close(); // Put close message in my queue STATUS hangup(); protected: ACE_SOCK_Stream& getPeer(void) const; Channel_Manager& channel_manager() const; // This function remove all messages from queue and handles // channel open request by replying with channel open failure. void empty_queue(); // Put message in this tunnel handler queue and initiate write io. STATUS putq_wrapper(ACE_Message_Block *mb, PRIORITY prio = PRIO_LOW, ACE_Time_Value *tv=0); int tunnelState (void) const; void tunnelState (int state); STATUS send_data(ACE_Message_Block *mb); // Handle internal messages STATUS handle_channel_open_request (ACE_Message_Block *mb); STATUS handle_channel_close (ACE_Message_Block *mb); STATUS handle_channel_open_reply (ACE_Message_Block *mb); virtual const char* identifier(); // ACE_Recursive_Thread_Mutex& socket_mutex(); private: AMT_Tunnel_Handler* tunnel_handler_; // Reference to the tunnel Tunnel_Handler ACE_UINT32 _msg_counter; //for debug purpose only protected: // Define internal messaging protocol // Class for Channel_Open request class Internal_Channel_Open_Msg : public ACE_Message_Block { public: Internal_Channel_Open_Msg(): ACE_Message_Block(0,MB_CHANNEL_OPEN), channel_consumer(), tcp_consumer(), connectedAddressStringLen(), connectedPort(), originatorIpAddressLen(), originatorPort(){}; Channel_Consumer *channel_consumer; Tcp_Consumer *tcp_consumer; ACE_UINT32 connectedAddressStringLen; ACE_CString connectedAddressString; ACE_UINT32 connectedPort; ACE_UINT32 originatorIpAddressLen; ACE_CString originatorIpAddress; ACE_UINT32 originatorPort; }; // Class for Channel_Close request class Internal_Channel_Close_Msg : public ACE_Message_Block { public: Internal_Channel_Close_Msg(): ACE_Message_Block(0,MB_CHANNEL_CLOSE), recipent_channel(){}; ACE_UINT32 recipent_channel; }; // Class for Channel_Open_Reply class Internal_Channel_Open_Reply_Msg : public ACE_Message_Block { public: Internal_Channel_Open_Reply_Msg(): ACE_Message_Block(0,MB_CHANNEL_OPEN_REPLY), status(), MPS_id(), AMT_id(), channel_consumer(), tcp_consumer(){}; bool status; ACE_INT32 MPS_id; ACE_INT32 AMT_id; Channel_Consumer *channel_consumer; Tcp_Consumer *tcp_consumer; }; }; #endif // AMT_TUNNEL_CONSUMER_H