#ifndef _OPNET_PROTO_SIM_PROCESS
#define _OPNET_PROTO_SIM_PROCESS
#include "protoSimAgent.h"
#include "protoSocket.h"
#include "protoTimer.h"
#include "opnet.h"
#include <tcp_api_v3.h>
#include "mgen.h"
#define SELF_INTRT_CODE_TIMEOUT_EVENT 0
class OpnetProtoSimProcess : public ProtoSimAgent
{
public:
~OpnetProtoSimProcess();
virtual bool OnStartup(int argc, const char*const* argv) = 0;
virtual bool ProcessCommands(int argc, const char*const* argv) = 0;
virtual void OnShutdown() = 0;
void ActivateTimer(ProtoTimer& theTimer)
{ProtoSimAgent::ActivateTimer(theTimer);}
void DeactivateTimer(ProtoTimer& theTimer)
{ProtoSimAgent::DeactivateTimer(theTimer);}
ProtoSocket::Notifier& GetSocketNotifier()
{return ProtoSimAgent::GetSocketNotifier();}
ProtoTimerMgr& GetTimerMgr()
{return ProtoSimAgent::GetTimerMgr();}
virtual bool GetLocalAddress(ProtoAddress& localAddr)
{
localAddr.SimSetAddress((unsigned int)op_id_self());
return true;
}
void OnSystemTimeout() {ProtoSimAgent::OnSystemTimeout();}
void SetUdpProcessId(Objid udpProcessId)
{udp_process_id = udpProcessId;}
void SetTcpHostAddress(ProtoAddress hostAddr)
{tcp_host_addr = hostAddr;}
void SetTcpRemAddress(ProtoAddress remAddr) {tcp_ind_rem_addr = remAddr;}
void SetTcpHandle(ApiT_Tcp_App_Handle tcpHandle)
{tcp_handle = tcpHandle;}
void OnReceive(int strm_indx); SocketProxy* FindProxyByConn(int connId)
{return socket_proxy_list.FindProxyByConn(connId);}
virtual void ReceivePacketMonitor(Ici* ici, Packet* pkt) {}
virtual void TransmitPacketMonitor(Ici* ici, Packet* pkt) {}
virtual void HandleMgenMessage(char* buffer,
unsigned int len,
const ProtoAddress& srcAddr) {};
protected:
OpnetProtoSimProcess();
bool UpdateSystemTimer(ProtoTimer::Command command,
double delay)
{
switch (command)
{
case ProtoTimer::MODIFY:
op_ev_cancel(timer_handle);
case ProtoTimer::INSTALL:
timer_handle =
op_intrpt_schedule_self(op_sim_time() + delay, SELF_INTRT_CODE_TIMEOUT_EVENT);
break;
case ProtoTimer::REMOVE:
op_ev_cancel(timer_handle);
break;
} return true;
}
class UdpSocketProxy;
friend UdpSocketProxy;
class UdpSocketProxy : public ProtoSimAgent::SocketProxy
{
friend class OpnetProtoSimProcess;
public:
UdpSocketProxy(OpnetProtoSimProcess* sim_process); virtual ~UdpSocketProxy();
bool Bind(UINT16& thePort);
bool Connect(const ProtoAddress& theAddress){return false;}
bool Listen(UINT16 thePort){return false;}
bool Accept(ProtoSocket* theSocket){return false;}
bool RecvFrom(char* buffer, unsigned int& numBytes, ProtoAddress& srcAddr);
bool JoinGroup(const ProtoAddress& groupAddr);
bool LeaveGroup(const ProtoAddress& groupAddr);
void SetTTL(unsigned char ttl) {mcast_ttl = ttl;}
void SetLoopback(bool loopback) {mcast_loopback = loopback;}
void SetStream(int theStream) {strm_index = theStream;}
virtual bool SendTo(const char* buffer,
unsigned int& numBytes,
const ProtoAddress& dstAddr);
void OnReceive(char* recvData,
unsigned int recvLen,
const ProtoAddress& srcAddr,
const ProtoAddress& dstAddr);
int GetConn(){return 0;}
protected:
OpnetProtoSimProcess* sim_process; unsigned char mcast_ttl;
bool mcast_loopback;
char* recv_data;
UINT16 recv_data_len;
ProtoAddress src_addr;
Ici* udp_command_ici; int strm_index; };
class TcpSocketProxy;
friend TcpSocketProxy;
class TcpSocketProxy : public ProtoSimAgent::SocketProxy
{
friend class OpnetProtoSimProcess;
public:
TcpSocketProxy(OpnetProtoSimProcess* sim_process); virtual ~TcpSocketProxy();
bool Bind(UINT16& thePort);
bool Connect(const ProtoAddress& theAddress);
bool Listen(UINT16 thePort);
bool Accept(ProtoSocket* theSocket);
bool RecvFrom(char* buffer, unsigned int& numBytes, ProtoAddress& srcAddr);
bool JoinGroup(const ProtoAddress& groupAddr);
bool LeaveGroup(const ProtoAddress& groupAddr);
void SetTTL(unsigned char ttl) {}
void SetLoopback(bool loopback) {}
void SetStream(int theStream) {strm_index = theStream;}
virtual bool SendTo(const char* buffer,
unsigned int& numBytes,
const ProtoAddress& dstAddr);
void OnReceive(char* recvData,
unsigned int recvLen,
const ProtoAddress& srcAddr,
const ProtoAddress& dstAddr);
UINT16 GetPort(){return local_port;}
ProtoAddress GetTcpHostAddress(){return sim_process->tcp_host_addr;}
ProtoAddress GetTcpRemAddress(){return sim_process->tcp_ind_rem_addr;}
bool Send(const char* buffer,
unsigned int& numBytes);
bool Recv(char* buffer,
unsigned int& numBytes);
int GetConn(){return conn_id;}
protected:
class TcpSockList : public ProtoSimAgent::SocketProxy::List
{
public:
TcpSockList(){}
~TcpSockList(){}
SocketProxy* FindProxyByConn(int connId);
};
friend class TcpSockList;
OpnetProtoSimProcess* sim_process;
char* recv_data;
UINT16 recv_data_len;
ProtoAddress src_addr;
Ici* tcp_command_ici;
int strm_index;
int conn_id;
UINT16 local_port;
};
ProtoSimAgent::SocketProxy* OpenSocket(ProtoSocket& theSocket);
void CloseSocket(ProtoSocket& theSocket);
Objid GetUdpProcId() {return udp_process_id;}
ApiT_Tcp_App_Handle* GetTcpHandle(){return &tcp_handle;}
Objid udp_process_id;
ProtoAddress tcp_host_addr;
ProtoAddress tcp_ind_rem_addr;
TcpSocketProxy::TcpSockList socket_proxy_list;
Evhandle timer_handle;
ApiT_Tcp_App_Handle tcp_handle;
};
#endif