2025-12-01 15:56:02 +01:00
|
|
|
#include "evb-lan9668.h"
|
|
|
|
|
|
|
|
|
|
#include "ns3/names.h"
|
|
|
|
|
#include "ns3/drop-tail-queue.h"
|
|
|
|
|
|
|
|
|
|
#include "ns3/cbs.h"
|
|
|
|
|
#include "ns3/tas.h"
|
|
|
|
|
|
|
|
|
|
namespace ns3
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
NS_LOG_COMPONENT_DEFINE("EvbLan9668");
|
|
|
|
|
|
|
|
|
|
NS_OBJECT_ENSURE_REGISTERED(EvbLan9668);
|
|
|
|
|
|
|
|
|
|
TypeId
|
|
|
|
|
EvbLan9668::GetTypeId()
|
|
|
|
|
{
|
|
|
|
|
static TypeId tid =
|
|
|
|
|
TypeId("ns3::EvbLan9668")
|
2026-03-10 11:04:50 +01:00
|
|
|
.SetParent<RealSwitch>()
|
2025-12-01 15:56:02 +01:00
|
|
|
.SetGroupName("real-device")
|
|
|
|
|
.AddConstructor<EvbLan9668>();
|
|
|
|
|
return tid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EvbLan9668::EvbLan9668()
|
|
|
|
|
{
|
|
|
|
|
NS_LOG_FUNCTION(this);
|
2026-03-10 11:04:50 +01:00
|
|
|
UpdateParentHardwareCharacteristics();
|
|
|
|
|
|
2025-12-01 15:56:02 +01:00
|
|
|
m_node = CreateObject<TsnNode>();
|
|
|
|
|
m_node->AddClock(CreateObject<Clock>()); //Add perfect clock
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<m_portNumber; ++i){
|
|
|
|
|
Ptr<TsnNetDevice> net = CreateObject<TsnNetDevice>();
|
|
|
|
|
for (int j=0; j<m_queuesPerPort; ++j){
|
|
|
|
|
Ptr<DropTailQueue<Packet>> q = CreateObject<DropTailQueue<Packet>>();
|
|
|
|
|
q->SetAttribute("MaxSize", QueueSizeValue(m_fifoSize));
|
|
|
|
|
net->SetQueue(q);
|
|
|
|
|
}
|
|
|
|
|
m_node->AddDevice(net);
|
|
|
|
|
m_net_devices.insert(m_net_devices.end(), net);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_switch_net_device = CreateObject<SwitchNetDevice>();
|
|
|
|
|
m_switch_net_device->SetAddress(Mac48Address::Allocate());
|
|
|
|
|
m_node->AddDevice(m_switch_net_device);
|
|
|
|
|
for (int i = 0; i < (int)m_net_devices.size(); i++){
|
|
|
|
|
m_switch_net_device->AddSwitchPort(m_net_devices[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_node->AddDevice(m_switch_net_device);
|
|
|
|
|
|
|
|
|
|
SetHardwareLimits();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EvbLan9668::EvbLan9668(std::string name): EvbLan9668()
|
|
|
|
|
{
|
|
|
|
|
NS_LOG_FUNCTION(this);
|
|
|
|
|
|
|
|
|
|
Names::Add(name, m_node);
|
|
|
|
|
for (int i = 0; i < (int)m_net_devices.size(); i++){
|
|
|
|
|
Names::Add(name + "-" + std::to_string(i) , m_net_devices[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EvbLan9668::~EvbLan9668()
|
|
|
|
|
{
|
|
|
|
|
NS_LOG_FUNCTION(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2026-03-10 11:04:50 +01:00
|
|
|
EvbLan9668::UpdateParentHardwareCharacteristics()
|
2025-12-01 15:56:02 +01:00
|
|
|
{
|
2026-03-10 11:04:50 +01:00
|
|
|
NS_LOG_FUNCTION(this);
|
|
|
|
|
|
|
|
|
|
//Hardware limits
|
|
|
|
|
m_portNumber = 8;
|
|
|
|
|
m_queuesPerPort = 8;
|
|
|
|
|
m_maxFdbEntryNumber = 64;
|
|
|
|
|
m_fifoSize = QueueSize("102p");
|
|
|
|
|
m_minForwardingLatency = NanoSeconds(2660); //2660
|
|
|
|
|
m_maxForwardingLatency = NanoSeconds(2370); //2370
|
|
|
|
|
|
|
|
|
|
//CBS
|
|
|
|
|
m_maxIddleSlope = DataRate("3.282Gb/s");
|
|
|
|
|
m_minCBSLatencyOverhead = NanoSeconds(0); //-25ns
|
|
|
|
|
m_maxCBSLatencyOverhead = NanoSeconds(0); //-9ns
|
|
|
|
|
|
|
|
|
|
//Tas
|
|
|
|
|
m_maxGclEntryNumber = 256;
|
|
|
|
|
m_maxGclCycleDuration = NanoSeconds(999999999);
|
|
|
|
|
m_maxGclTimeInterval = NanoSeconds(999999999);
|
|
|
|
|
m_minTASLatencyOverhead = NanoSeconds(0);
|
|
|
|
|
m_maxTASLatencyOverhead = NanoSeconds(0);
|
|
|
|
|
|
|
|
|
|
//Stream identification
|
|
|
|
|
m_maxSidEntryNumber = 127;
|
|
|
|
|
m_minNullSIDLatencyOverhead = NanoSeconds(0); //-9ns
|
|
|
|
|
m_maxNullSIDLatencyOverhead = NanoSeconds(0); //-13ns
|
|
|
|
|
m_minSourceMacSIDLatencyOverhead = NanoSeconds(0);
|
|
|
|
|
m_maxSourceMacSIDLatencyOverhead = NanoSeconds(0);
|
|
|
|
|
|
|
|
|
|
//PSFP
|
|
|
|
|
m_maxPsfpFilterEntryNumber = 176;
|
|
|
|
|
m_maxPsfpStreamGateEntryNumber = 176;
|
|
|
|
|
m_maxPsfpFlowMeterEntryNumber = 240;
|
|
|
|
|
|
|
|
|
|
//FRER
|
|
|
|
|
m_maxFrerSeqGenEntryNumber = 99;
|
|
|
|
|
m_maxFrerSeqRcvyEntryNumber = 99;
|
|
|
|
|
m_maxFrerSeqEncEntryNumber = 99;
|
|
|
|
|
m_minFrerSeqRcvyResetDuration = MilliSeconds(1);
|
|
|
|
|
m_maxFrerSeqRcvyResetDuration = Seconds(4.095);
|
|
|
|
|
m_minFrerLatErrorTestDuration = Seconds(1);
|
|
|
|
|
m_maxFrerLatErrorTestDuration = Seconds(86400);
|
|
|
|
|
m_minFrerLatErrorResetDuration = Seconds(1);
|
|
|
|
|
m_maxFrerLatErrorResetDuration = Seconds(86400);
|
|
|
|
|
m_minFrerRcvyLatencyOverhead = NanoSeconds(40); //40ns
|
|
|
|
|
m_maxFrerRcvyLatencyOverhead = NanoSeconds(40); //40ns
|
2025-12-01 15:56:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|