142 lines
5.6 KiB
C++
Executable File
142 lines
5.6 KiB
C++
Executable File
#ifndef _NORM_SIM_AGENT
|
|
#define _NORM_SIM_AGENT
|
|
|
|
// normSimAgent.h - Generic (base class) NORM simulation agent
|
|
|
|
#include "normSession.h"
|
|
#include "protokit.h"
|
|
#include "protoSimAgent.h"
|
|
|
|
// Base class for Norm simulation agents (e.g. ns-2, OPNET, etc)
|
|
class NormSimAgent : public NormController, public ProtoMessageSink
|
|
{
|
|
public:
|
|
virtual ~NormSimAgent();
|
|
|
|
bool ProcessCommand(const char* cmd, const char* val);
|
|
|
|
// Note: don't allow receiver _and_ sender operation at same time
|
|
bool StartSender(); // start sender
|
|
bool StartReceiver(); // start receiver
|
|
bool IsActive() {return (NULL != session);}
|
|
void Stop();
|
|
|
|
|
|
bool SendMessage(unsigned int len, const char* txBuffer);
|
|
|
|
enum NormCC
|
|
{
|
|
NORM_FIXED, // fixed-rate (no congestion control)
|
|
NORM_CC, // "normal" TCP-friendly congestion control
|
|
NORM_CCE, // strict ECN-based congestion control
|
|
NORM_CCL // "loss-tolerant" congestion control
|
|
};
|
|
|
|
// These functions support ACK-based flow-controlled streaming using
|
|
// some additional state variables (stream_buffer_max, stream_buffer_count, etc)
|
|
static unsigned int ComputeStreamBufferSegmentCount(unsigned int bufferBytes, UINT16 segmentSize, UINT16 blockSize);
|
|
unsigned int WriteToStream(const char* buffer, unsigned int numBytes);
|
|
bool AddAckingNode(NormNodeId nodeId);
|
|
|
|
protected:
|
|
NormSimAgent(ProtoTimerMgr& timerMgr,
|
|
ProtoSocket::Notifier& socketNotifier);
|
|
enum CmdType {CMD_INVALID, CMD_NOARG, CMD_ARG};
|
|
CmdType CommandType(const char* cmd);
|
|
virtual unsigned long GetAgentId() = 0;
|
|
ProtoMessageSink* msg_sink;
|
|
|
|
#ifdef OPNET
|
|
void HandleMessage(char* buffer,
|
|
unsigned int len,
|
|
const ProtoAddress& srcAddr);
|
|
void SetSink(ProtoMessageSink* sink){msg_sink=sink;}
|
|
#endif //OPNET
|
|
|
|
private:
|
|
void OnInputReady();
|
|
bool FlushStream(bool eom);// = true);
|
|
virtual void Notify(NormController::Event event,
|
|
class NormSessionMgr* sessionMgr,
|
|
class NormSession* session,
|
|
class NormSenderNode* sender,
|
|
class NormObject* object);
|
|
|
|
void ActivateTimer(ProtoTimer& theTimer)
|
|
{session_mgr.ActivateTimer(theTimer);}
|
|
|
|
bool OnIntervalTimeout(ProtoTimer& theTimer);
|
|
|
|
void SetCCMode(NormCC ccMode);
|
|
|
|
static const char* const cmd_list[];
|
|
|
|
NormSessionMgr session_mgr;
|
|
NormSession* session;
|
|
|
|
// session parameters
|
|
char* address; // session address
|
|
UINT16 port; // session port number
|
|
UINT8 ttl;
|
|
double tx_rate; // bits/sec
|
|
unsigned int probe_count;
|
|
bool cc_enable;
|
|
bool ecn_enable;
|
|
NormCC cc_mode;
|
|
bool unicast_nacks;
|
|
bool silent_receiver;
|
|
double backoff_factor;
|
|
UINT16 segment_size;
|
|
UINT8 ndata;
|
|
UINT8 nparity;
|
|
UINT8 auto_parity;
|
|
UINT8 extra_parity;
|
|
double group_size;
|
|
double grtt_estimate;
|
|
unsigned long tx_buffer_size; // bytes
|
|
unsigned long tx_cache_min;
|
|
unsigned long tx_cache_max;
|
|
NormObjectSize tx_cache_size;
|
|
|
|
unsigned long rx_buffer_size; // bytes
|
|
unsigned long rx_cache_max; // rx object max_pending count
|
|
|
|
// for simulated transmission (streams or files)
|
|
unsigned long tx_object_size;
|
|
double tx_object_interval;
|
|
unsigned long tx_object_size_min;
|
|
unsigned long tx_object_size_max;
|
|
int tx_repeat_count;
|
|
double tx_repeat_interval;
|
|
int tx_requeue;
|
|
int tx_requeue_count;
|
|
|
|
NormStreamObject* stream;
|
|
bool auto_stream;
|
|
unsigned int stream_buffer_max;
|
|
unsigned int stream_buffer_count;
|
|
unsigned int stream_bytes_remain;
|
|
bool watermark_pending;
|
|
bool flow_control;
|
|
|
|
bool push_mode;
|
|
NormStreamObject::FlushMode flush_mode;
|
|
char* tx_msg_buffer;
|
|
unsigned int tx_msg_len;
|
|
unsigned int tx_msg_index;
|
|
char mgen_buffer[64];
|
|
bool msg_sync;
|
|
unsigned int mgen_bytes;
|
|
unsigned int mgen_pending_bytes;
|
|
ProtoTimer interval_timer;
|
|
|
|
// protocol debug parameters
|
|
bool tracing;
|
|
FILE* log_file_ptr;
|
|
double tx_loss;
|
|
double rx_loss;
|
|
|
|
}; // end class NormSimAgent
|
|
|
|
#endif // NORM_SIM_AGENT
|