Files
eden-sim/contrib/tsn/model/frer-sequence-encode-decode-function.cc

105 lines
2.8 KiB
C++
Raw Permalink Normal View History

2025-12-01 15:56:02 +01:00
#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;
}
}