#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") .SetParent() .SetGroupName("real-device") .AddConstructor(); return tid; } EvbLan9668::EvbLan9668() { NS_LOG_FUNCTION(this); UpdateParentHardwareCharacteristics(); m_node = CreateObject(); m_node->AddClock(CreateObject()); //Add perfect clock for (int i=0; i net = CreateObject(); for (int j=0; j> q = CreateObject>(); 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(); 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 EvbLan9668::UpdateParentHardwareCharacteristics() { 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 } }