Skip to content

Commit

Permalink
Merge pull request #5 from Atercatus/modify_fama
Browse files Browse the repository at this point in the history
i fixed fama.cc
  • Loading branch information
rmartin5 committed Aug 7, 2018
2 parents 3a2addb + 32dc48c commit a3b7e5c
Showing 1 changed file with 102 additions and 34 deletions.
136 changes: 102 additions & 34 deletions model/aqua-sim-mac-fama.cc
Expand Up @@ -38,10 +38,10 @@ NS_OBJECT_ENSURE_REGISTERED(AquaSimFama);


AquaSimFama::AquaSimFama(): FamaStatus(PASSIVE), m_NDPeriod(4.0), m_maxBurst(1),
m_dataPktInterval(0.00001), m_estimateError(0.001),m_dataPktSize(1600),
m_neighborId(0), m_waitCTSTimer(Timer::CANCEL_ON_DESTROY),
m_dataPktInterval(0.0001), m_estimateError(0.001),m_dataPktSize(1600),
m_neighborId(0), m_waitCTSTimer(Timer::CHECK_ON_DESTROY),//(Timer::CANCEL_ON_DESTROY),
m_backoffTimer(Timer::CANCEL_ON_DESTROY), m_remoteTimer(Timer::CANCEL_ON_DESTROY),
m_remoteExpireTime(-1), m_famaNDCounter(4)
m_remoteExpireTime(-1), m_famaNDCounter(2)
//, backoff_timer(this), status_handler(this), NDTimer(this),
//WaitCTSTimer(this),DataBackoffTimer(this),RemoteTimer(this), CallBack_Handler(this)
{
Expand All @@ -54,6 +54,8 @@ AquaSimFama::AquaSimFama(): FamaStatus(PASSIVE), m_NDPeriod(4.0), m_maxBurst(1),

m_rand = CreateObject<UniformRandomVariable> ();
Simulator::Schedule(Seconds(m_rand->GetValue(0.0,m_NDPeriod)+0.000001), &AquaSimFama::NDTimerExpire, this);


}

AquaSimFama::~AquaSimFama()
Expand Down Expand Up @@ -85,7 +87,7 @@ AquaSimFama::AssignStreams (int64_t stream)
void
AquaSimFama::NDTimerExpire()
{
NS_LOG_FUNCTION(this);
NS_LOG_FUNCTION(AquaSimAddress::ConvertFrom(m_device->GetAddress()));
SendPkt(MakeND());
m_famaNDCounter--;

Expand All @@ -97,12 +99,14 @@ AquaSimFama::NDTimerExpire()
void
AquaSimFama::SendPkt(Ptr<Packet> pkt)
{
NS_LOG_FUNCTION(this);
NS_LOG_FUNCTION(AquaSimAddress::ConvertFrom(m_device->GetAddress()));

AquaSimHeader asHeader;
pkt->RemoveHeader(asHeader);

asHeader.SetDirection(AquaSimHeader::DOWN);


Time txtime = asHeader.GetTxTime();

switch( m_device->GetTransmissionStatus() ) {
Expand All @@ -116,13 +120,16 @@ AquaSimFama::SendPkt(Ptr<Packet> pkt)
break;
case RECV:
NS_LOG_WARN("RECV-SEND Collision!!!!!");


pkt=0;
break;
default:
//status is SEND
NS_LOG_INFO("SendPkt node:" << m_device->GetNode() << " send data too fast");
pkt=0;
}


return;
}

Expand Down Expand Up @@ -169,6 +176,7 @@ AquaSimFama::TxProcess(Ptr<Packet> pkt)
pkt->AddPacketTag(ptag);
PktQ.push(pkt);


//fill the next hop when sending out the packet;
if( (PktQ.size() == 1) /*the pkt is the first one*/
&& FamaStatus == PASSIVE ) {
Expand All @@ -187,7 +195,9 @@ AquaSimFama::TxProcess(Ptr<Packet> pkt)
bool
AquaSimFama::RecvProcess(Ptr<Packet> pkt)
{
NS_LOG_FUNCTION(this);


NS_LOG_FUNCTION("Call: " << AquaSimAddress::ConvertFrom(m_device->GetAddress()) << "m_waitCTSTimer : " << m_waitCTSTimer.GetDelayLeft());

AquaSimHeader asHeader;
MacHeader mach;
Expand All @@ -200,7 +210,9 @@ AquaSimFama::RecvProcess(Ptr<Packet> pkt)
pkt->AddHeader(mach);
pkt->AddHeader(asHeader);
AquaSimAddress dst = FamaH.GetDA();


NS_LOG_FUNCTION("FamaH: " << FamaH);


if( m_backoffTimer.IsRunning() ) {
m_backoffTimer.Cancel();
Expand All @@ -221,7 +233,6 @@ AquaSimFama::RecvProcess(Ptr<Packet> pkt)

if( asHeader.GetErrorFlag() )
{
NS_LOG_INFO("RecvProcess: pkt:" << pkt << " is corrupted at time " << Simulator::Now().GetSeconds());
//if(drop_)
//drop_->recv(pkt,"Error/Collision");
//else
Expand All @@ -231,43 +242,82 @@ AquaSimFama::RecvProcess(Ptr<Packet> pkt)
return false;
}


/*
if( m_waitCTSTimer.IsRunning() ) {
//printf("%f: node %d receive RTS\n", NOW, index_);
//printf("%f: node %d receive RTS\n", NOW, index_);
//NS_LOG_INFO("time: " << Simulator::Now().GetSeconds() << " node: " << AquaSimAddress::ConvertFrom(m_device->GetAddress()) << "receive RTS-------------------------------------");
NS_LOG_FUNCTION("CTSTimer.IsRunning()");
NS_LOG_FUNCTION("NextHop : " << asHeader.GetNextHop());
NS_LOG_FUNCTION("Address : " << m_device->GetAddress());
NS_LOG_FUNCTION("ptag.GetPacketType(): " << ptag.GetPacketType());
NS_LOG_FUNCTION("FamaH.GetPType(): " << unsigned(FamaH.GetPType()));
NS_LOG_FUNCTION("FamaHeader::CTS" << FamaHeader::CTS);
NS_LOG_FUNCTION("m_device->GetAddress(): " << m_device->GetAddress());
m_waitCTSTimer.Cancel();
if(dst == m_device->GetAddress()) {
SendDataPkt();
}
if(( ptag.GetPacketType() == AquaSimPtTag::PT_FAMA )&&(FamaH.GetPType()==FamaHeader::CTS)
&& (asHeader.GetNextHop() == m_device->GetAddress())) {
&& (dst == m_device->GetAddress())) {
//receiving the CTS
NS_LOG_INFO("Receiving the CTS");
SendDataPkt();
}
else {
//NS_LOG_INFO("Before DoBackoff");
DoBackoff();
}
pkt=0;
return true;
}

*/

if( ptag.GetPacketType() == AquaSimPtTag::PT_FAMA ) {
switch( FamaH.GetPType() ) {
case FamaHeader::RTS:
//printf("%f: node %d receive RTS\n", NOW, index_);
if( dst == m_device->GetAddress() ) {


if( dst == m_device->GetAddress() ) {
ProcessRTS(FamaH.GetSA());
}
DoRemote(m_CTSTxTime+2*m_maxPropDelay+m_estimateError);
break;

case FamaHeader::CTS:
//printf("%f: node %d receive CTS\n", NOW, index_);
// this CTS must not be for this node
DoRemote(2*m_maxPropDelay+m_estimateError);
break;
if(m_waitCTSTimer.IsRunning()) {
m_waitCTSTimer.Cancel();

if(dst == m_device->GetAddress()) {
SendDataPkt();
}
else {
DoBackoff();
}
}

// this CTS must not be for this node
DoRemote(2*m_maxPropDelay+m_estimateError);

break;
default:
//printf("%f: node %d receive DATA\n", NOW, index_);
//process Data packet
//NS_LOG_INFO("time: " << Simulator::Now().GetSeconds() << " node: " << AquaSimAddress::ConvertFrom(m_device->GetAddress()) << "receive DATA------------------------------------");

//process Data packet
if( dst == m_device->GetAddress() ) {
//ptag.SetPacketType(UpperLayerPktType);
//:w
//ptag.SetPacketType(UpperLayerPktType);

NS_LOG_INFO("Process Data Packet!!!!");
//NS_LOG_INFO("Send UP");

SendUp(pkt);
return true;
}
Expand All @@ -283,7 +333,7 @@ AquaSimFama::RecvProcess(Ptr<Packet> pkt)
void
AquaSimFama::SendDataPkt()
{
NS_LOG_FUNCTION(this);
NS_LOG_FUNCTION("Call: " << AquaSimAddress::ConvertFrom(m_device->GetAddress()));

int PktQ_Size = PktQ.size();
int SentPkt = 0;
Expand All @@ -293,14 +343,26 @@ AquaSimFama::SendDataPkt()
PktQ.front()->PeekHeader(asHeader);
AquaSimAddress recver = asHeader.GetNextHop();
Ptr<Packet> tmp;


for(int i=0; i<PktQ_Size && SentPkt<m_maxBurst; i++) {
tmp = PktQ.front();


tmp->PeekHeader(asHeader);
PktQ.pop();
if( asHeader.GetNextHop() == recver ) {
SentPkt++;

NS_LOG_FUNCTION("StartTime: " << StartTime);
NS_LOG_FUNCTION("Simulator::Now(): " << Simulator::Now());
NS_LOG_FUNCTION("StartTime - Simulator::Now() => " << StartTime - Simulator::Now());
Simulator::Schedule(StartTime-Simulator::Now(),&AquaSimFama::ProcessDataSendTimer, this, tmp);
PktQ.front()->PeekHeader(asHeader);
//Simulator::Schedule(Seconds(0), &AquaSimFama::ProcessDataSendTimer, this, tmp);

//PktQ.front()->PeekHeader(asHeader);


if( !PktQ.empty() ) {
StartTime += asHeader.GetTxTime() + m_dataPktInterval;
}
Expand Down Expand Up @@ -339,7 +401,7 @@ AquaSimFama::ProcessDataBackoffTimer()
Ptr<Packet>
AquaSimFama::MakeND()
{
NS_LOG_FUNCTION(this);
NS_LOG_FUNCTION(AquaSimAddress::ConvertFrom(m_device->GetAddress()));

Ptr<Packet> pkt = Create<Packet>();
AquaSimHeader asHeader;
Expand Down Expand Up @@ -378,8 +440,7 @@ AquaSimFama::ProcessND(AquaSimAddress sa)
Ptr<Packet>
AquaSimFama::MakeRTS(AquaSimAddress Recver)
{
NS_LOG_FUNCTION(this);

NS_LOG_FUNCTION(AquaSimAddress::ConvertFrom(m_device->GetAddress()));
Ptr<Packet> pkt = Create<Packet>();
AquaSimHeader asHeader;
MacHeader mach;
Expand Down Expand Up @@ -408,15 +469,16 @@ AquaSimFama::MakeRTS(AquaSimAddress Recver)
void
AquaSimFama::SendRTS(Time DeltaTime)
{
NS_LOG_FUNCTION(this);

NS_LOG_FUNCTION(AquaSimAddress::ConvertFrom(m_device->GetAddress()));
AquaSimHeader asHeader;
PktQ.front()->PeekHeader(asHeader);
SendPkt( MakeRTS(asHeader.GetNextHop()) );

NS_LOG_FUNCTION("After SendPkt");
FamaStatus = WAIT_CTS;
m_waitCTSTimer.SetDelay(DeltaTime);
NS_LOG_FUNCTION("m_waitCTSTimer : " << m_waitCTSTimer.GetDelayLeft());
NS_LOG_FUNCTION("DeltaTIme : " << DeltaTime);
m_waitCTSTimer.SetFunction(&AquaSimFama::DoBackoff,this);
m_waitCTSTimer.Schedule(DeltaTime);
}


Expand All @@ -434,7 +496,7 @@ AquaSimFama::ProcessRTS(AquaSimAddress sa)
Ptr<Packet>
AquaSimFama::MakeCTS(AquaSimAddress RTS_Sender)
{
NS_LOG_FUNCTION(this << RTS_Sender);
NS_LOG_FUNCTION("Call : " << AquaSimAddress::ConvertFrom (m_device->GetAddress()) << "RTS Sender : " << RTS_Sender);

Ptr<Packet> pkt = Create<Packet>();
AquaSimHeader asHeader;
Expand Down Expand Up @@ -475,13 +537,17 @@ void
AquaSimFama::DoBackoff()
{
Time backoffTime = MilliSeconds(m_rand->GetValue(0.0,10 * m_RTSTxTime.ToDouble(Time::MS)));


FamaStatus = BACKOFF;
if( m_backoffTimer.IsRunning() ) {
m_backoffTimer.Cancel();
}

m_backoffTimer.SetDelay(backoffTime);
//m_backoffTimer.SetDelay(backoffTime);
NS_LOG_FUNCTION("m_backoffTimer.GetDelay() : " << m_backoffTimer.GetDelayLeft());
m_backoffTimer.SetFunction(&AquaSimFama::BackoffTimerExpire,this);
m_backoffTimer.Schedule(backoffTime);
}


Expand All @@ -495,8 +561,10 @@ AquaSimFama::DoRemote(Time DeltaTime)
if( m_remoteTimer.IsRunning() ) {
m_remoteTimer.Cancel();
}
m_remoteTimer.SetDelay(DeltaTime);
//m_remoteTimer.SetDelay(DeltaTime);
m_remoteTimer.SetFunction(&AquaSimFama::ProcessRemoteTimer,this);
m_remoteTimer.Schedule(DeltaTime);
NS_LOG_FUNCTION("m_remoteTimer.GetDelay() : " << m_remoteTimer.GetDelayLeft());
}
}

Expand Down Expand Up @@ -529,4 +597,4 @@ void AquaSimFama::DoDispose()
AquaSimMac::DoDispose();
}

} // namespace ns3
} // namespace ns2

0 comments on commit a3b7e5c

Please sign in to comment.