Files
eden-sim/contrib/real-device/model/evb-lan9668.cc

125 lines
3.4 KiB
C++
Raw Normal View History

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
}
}