154 lines
4.7 KiB
C++
154 lines
4.7 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Intel Corporation, 2006 - 2007.
|
|
//
|
|
// File: ChannelManager.h
|
|
//
|
|
// Contents: Manages the channels in the MPS
|
|
//
|
|
// Notes:
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef CHANNEL_MGR
|
|
#define CHANNEL_MGR
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <ace/RW_Thread_Mutex.h>
|
|
#include <ace/Recursive_Thread_Mutex.h>
|
|
#include <ace/SString.h>
|
|
|
|
#include "global.h"
|
|
|
|
using namespace std;
|
|
// FW declaration
|
|
class AMT_Channel;
|
|
class Channel_Consumer;
|
|
class Tcp_Consumer;
|
|
|
|
// ============================================================================
|
|
// = TITLE
|
|
// Channel container
|
|
//
|
|
// = DESCRIPTION
|
|
// The Channel_Manager hold instances of AMT_Channel
|
|
// Each channel has two keys: AMT endpoint and MPS endpoint.
|
|
//
|
|
// ============================================================================
|
|
class Channel_Manager
|
|
{
|
|
public:
|
|
typedef enum {
|
|
MPS_ENDPOINT = 0 , AMT_ENDPOINT = 1
|
|
} CHANNEL_ENDPOINT;
|
|
|
|
typedef enum {
|
|
ACTIVE , NOT_ACTIVE
|
|
} CHANNEL_MGR_STATE;
|
|
|
|
// = Initialization and termination methods.
|
|
Channel_Manager (int size);
|
|
~Channel_Manager (void);
|
|
|
|
//===================================================
|
|
// Public Function
|
|
//===================================================
|
|
|
|
// Create a new channel with the next available mps id.
|
|
AMT_Channel* create_channel ();
|
|
|
|
//Create channel holding @amt_id and the next available mps id:
|
|
AMT_Channel* create_channel (const ACE_UINT32 id);
|
|
|
|
// Add a new key to a given channel, this method is called after open reply.
|
|
int add_amt_id ( const ACE_UINT32 mps_id,
|
|
const ACE_UINT32 amt_id);
|
|
|
|
// Find a channel according to ID and endpoint
|
|
AMT_Channel* find_channel(const ACE_UINT32 id, CHANNEL_ENDPOINT endpoint);
|
|
|
|
// Delete channel from only one map (according to endpoint)
|
|
int remove_channel_from_endpoint(const ACE_UINT32 id, CHANNEL_ENDPOINT endpoint);
|
|
|
|
// Delete channel from all maps
|
|
int remove_channel(const ACE_UINT32 id, CHANNEL_ENDPOINT endpoint);
|
|
|
|
// Get next available mps id
|
|
ACE_INT32 get_available_mps_handle();
|
|
|
|
// Read/Write guard
|
|
ACE_Recursive_Thread_Mutex& guard() {return mutex_;}
|
|
|
|
void close_all_channels();
|
|
private:
|
|
// Read/Write lock of this container
|
|
ACE_Recursive_Thread_Mutex mutex_;
|
|
|
|
// Vector of availability
|
|
vector<AMT_Channel*> all_channels_;
|
|
|
|
// = Make life easier by defining typedefs.
|
|
typedef map<int, AMT_Channel*> CHANNEL_MAP;
|
|
|
|
// Two table that maps amt and mps handles to channel
|
|
CHANNEL_MAP channel_map_[2];
|
|
CHANNEL_MGR_STATE _state;
|
|
};
|
|
|
|
|
|
/***************************************************************
|
|
// class AMT_Channel
|
|
//
|
|
// Channels are identified by numbers at each end. This class
|
|
// holds the information on a channel.
|
|
/**************************************************************/
|
|
class AMT_Channel
|
|
{
|
|
public:
|
|
typedef enum {
|
|
CLOSED, PENDING_OPEN, OPEN, TUNNEL_CLOSED, MC_CLOSED, CLOSE
|
|
} CHANNEL_STATE;
|
|
|
|
//= CTOR/DTOR
|
|
AMT_Channel(): _channel_consumer(NULL),
|
|
_tcp_consumer(NULL),
|
|
_MPS_ID(DFLT_NEGETIVE_VALUE),
|
|
_AMT_ID(DFLT_ZERO),
|
|
_window_size(DFLT_ZERO),
|
|
_state(PENDING_OPEN) {};
|
|
~AMT_Channel(void) {};
|
|
|
|
//===================================================
|
|
// Public Functions
|
|
//===================================================
|
|
Channel_Consumer* getChannelConsumer() {return _channel_consumer;}
|
|
Tcp_Consumer* getTcpConsumer() {return _tcp_consumer;}
|
|
ACE_UINT32 getAMTid() { return _AMT_ID; }
|
|
ACE_UINT32 getMPSid() { return _MPS_ID; }
|
|
ACE_UINT32 getWindowSize() { return _window_size; }
|
|
CHANNEL_STATE getState() { return _state; }
|
|
|
|
void setChannelConsumer(Channel_Consumer* consumer){ _channel_consumer = consumer;}
|
|
void setTcpConsumer (Tcp_Consumer *tcp_consumer){ _tcp_consumer = tcp_consumer;}
|
|
void setAMTid (ACE_UINT32 amtID ) { _AMT_ID = amtID; }
|
|
void setMPSid (ACE_UINT32 mpsID ) { _MPS_ID = mpsID; }
|
|
void setWindowSize (ACE_UINT32 windowSize) { _window_size = windowSize;}
|
|
void setState (CHANNEL_STATE state) { _state = state; }
|
|
|
|
private:
|
|
//===================================================
|
|
// Data Members
|
|
//===================================================
|
|
// This channel consumer MUST exists until it gets a 'channel close' message
|
|
// from the tunnel supplier.
|
|
Channel_Consumer* _channel_consumer; // Pointer to this channel consumer
|
|
Tcp_Consumer* _tcp_consumer; // Pointer to this channel tcp consumer
|
|
int _MPS_ID; // This is MC ID
|
|
ACE_UINT32 _AMT_ID; // This is AMT ID
|
|
ACE_UINT32 _window_size; // Number of bytes in the recipient window (MPS)
|
|
CHANNEL_STATE _state; // Channel state
|
|
|
|
};
|
|
#endif /* CHANNEL_MGR */
|