#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() .SetGroupName("tsn") .AddConstructor() .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 seqEncStreamList) { NS_LOG_FUNCTION(this); m_frerSeqEncStreamList = seqEncStreamList; } void SequenceEncodeDecodeFunction::SetPort(Ptr seqEncPort) { NS_LOG_FUNCTION(this); m_frerSeqEncPort = seqEncPort; } bool SequenceEncodeDecodeFunction::IsApplicable(uint32_t streamHandle, Ptr 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 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 p) { NS_LOG_FUNCTION(this); EthernetHeader2 header; p->RemoveHeader(header); uint16_t seqNumber = header.RemoveRedundancyTag(); p->AddHeader(header); return seqNumber; } }