105 lines
2.8 KiB
C++
105 lines
2.8 KiB
C++
|
|
#include "frer-sequence-encode-decode-function.h"
|
||
|
|
|
||
|
|
#include "ns3/log.h"
|
||
|
|
#include "ns3/packet.h"
|
||
|
|
|
||
|
|
#include "ns3/ethernet-header2.h"
|
||
|
|
|
||
|
|
namespace ns3
|
||
|
|
{
|
||
|
|
|
||
|
|
NS_LOG_COMPONENT_DEFINE("SequenceEncodeDecodeFunction");
|
||
|
|
|
||
|
|
NS_OBJECT_ENSURE_REGISTERED(SequenceEncodeDecodeFunction);
|
||
|
|
|
||
|
|
TypeId
|
||
|
|
SequenceEncodeDecodeFunction::GetTypeId()
|
||
|
|
{
|
||
|
|
static TypeId tid =
|
||
|
|
TypeId("ns3::SequenceEncodeDecodeFunction")
|
||
|
|
.SetParent<Object>()
|
||
|
|
.SetGroupName("tsn")
|
||
|
|
.AddConstructor<SequenceEncodeDecodeFunction>()
|
||
|
|
.AddAttribute("Direction",
|
||
|
|
"A Boolean object indicating whether the Sequence encode/decode function is to be placed on the out-facing (True) or in-facing (False) side of the port",
|
||
|
|
BooleanValue(false),
|
||
|
|
MakeBooleanAccessor(&SequenceEncodeDecodeFunction::m_frerSeqEncDirection),
|
||
|
|
MakeBooleanChecker())
|
||
|
|
.AddAttribute("Active",
|
||
|
|
"A Boolean value specifying whether this frerSeqEncEntry is passive (False) or active (True).",
|
||
|
|
BooleanValue(false),
|
||
|
|
MakeBooleanAccessor(&SequenceEncodeDecodeFunction::m_frerSeqEncActive),
|
||
|
|
MakeBooleanChecker());
|
||
|
|
return tid;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
SequenceEncodeDecodeFunction::SequenceEncodeDecodeFunction()
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
SequenceEncodeDecodeFunction::~SequenceEncodeDecodeFunction()
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
void
|
||
|
|
SequenceEncodeDecodeFunction::SetStreamHandle(std::vector<uint32_t> seqEncStreamList)
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
m_frerSeqEncStreamList = seqEncStreamList;
|
||
|
|
}
|
||
|
|
|
||
|
|
void
|
||
|
|
SequenceEncodeDecodeFunction::SetPort(Ptr<TsnNetDevice> seqEncPort)
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
m_frerSeqEncPort = seqEncPort;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool
|
||
|
|
SequenceEncodeDecodeFunction::IsApplicable(uint32_t streamHandle, Ptr<TsnNetDevice> port, bool direction)
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
if (m_frerSeqEncPort == port && m_frerSeqEncDirection == direction)
|
||
|
|
{
|
||
|
|
for (uint32_t i = 0; i < m_frerSeqEncStreamList.size(); i++)
|
||
|
|
{
|
||
|
|
if(m_frerSeqEncStreamList[i]==streamHandle)
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
void
|
||
|
|
SequenceEncodeDecodeFunction::Encode(Ptr<Packet> p, uint16_t seqNumber)
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
if (m_frerSeqEncActive)
|
||
|
|
{
|
||
|
|
EthernetHeader2 header;
|
||
|
|
p->RemoveHeader(header);
|
||
|
|
header.SetRedundancyTag(seqNumber);
|
||
|
|
p->AddHeader(header);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uint16_t
|
||
|
|
SequenceEncodeDecodeFunction::Decode(Ptr<Packet> p)
|
||
|
|
{
|
||
|
|
NS_LOG_FUNCTION(this);
|
||
|
|
EthernetHeader2 header;
|
||
|
|
p->RemoveHeader(header);
|
||
|
|
uint16_t seqNumber = header.RemoveRedundancyTag();
|
||
|
|
p->AddHeader(header);
|
||
|
|
return seqNumber;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
}
|