152 lines
4.9 KiB
C++

//----------------------------------------------------------------------------
//
// 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 <ace/ACE.h>
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "APF.h"
#include <ace/Message_Block.h>
#include <ace/SOCK_Stream.h>
#include <ace/Recursive_Thread_Mutex.h>
// 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