Update real-device objects
This commit is contained in:
@@ -18,7 +18,7 @@ EvbLan9668::GetTypeId()
|
||||
{
|
||||
static TypeId tid =
|
||||
TypeId("ns3::EvbLan9668")
|
||||
.SetParent<Object>()
|
||||
.SetParent<RealSwitch>()
|
||||
.SetGroupName("real-device")
|
||||
.AddConstructor<EvbLan9668>();
|
||||
return tid;
|
||||
@@ -27,6 +27,8 @@ EvbLan9668::GetTypeId()
|
||||
EvbLan9668::EvbLan9668()
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
UpdateParentHardwareCharacteristics();
|
||||
|
||||
m_node = CreateObject<TsnNode>();
|
||||
m_node->AddClock(CreateObject<Clock>()); //Add perfect clock
|
||||
|
||||
@@ -69,199 +71,54 @@ EvbLan9668::~EvbLan9668()
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::SetHardwareLimits()
|
||||
EvbLan9668::UpdateParentHardwareCharacteristics()
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
//FDB
|
||||
m_switch_net_device->SetAttribute("MaxPortNumber", UintegerValue(m_portNumber));
|
||||
m_switch_net_device->SetAttribute("MaxFdbEntryNumber", UintegerValue(m_maxFdbEntryNumber));
|
||||
m_switch_net_device->SetAttribute("MinForwardingLatency", TimeValue(m_minForwardingLatency));
|
||||
m_switch_net_device->SetAttribute("MaxForwardingLatency", TimeValue(m_maxForwardingLatency));
|
||||
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
|
||||
|
||||
//TAS
|
||||
for (int i = 0; i < (int)m_net_devices.size(); i++){
|
||||
m_net_devices[i]->GetTas()->SetAttribute("MaxGclEntryNumber", UintegerValue(m_maxGclEntryNumber));
|
||||
m_net_devices[i]->GetTas()->SetAttribute("MaxGclCycleDuration", TimeValue(m_maxGclCycleDuration));
|
||||
m_net_devices[i]->GetTas()->SetAttribute("MaxGclTimeInterval", TimeValue(m_maxGclTimeInterval));
|
||||
}
|
||||
//CBS
|
||||
m_maxIddleSlope = DataRate("3.282Gb/s");
|
||||
m_minCBSLatencyOverhead = NanoSeconds(0); //-25ns
|
||||
m_maxCBSLatencyOverhead = NanoSeconds(0); //-9ns
|
||||
|
||||
//Stream identification
|
||||
m_node->SetAttribute("MaxSidEntryNumber", UintegerValue(m_maxSidEntryNumber));
|
||||
//Tas
|
||||
m_maxGclEntryNumber = 256;
|
||||
m_maxGclCycleDuration = NanoSeconds(999999999);
|
||||
m_maxGclTimeInterval = NanoSeconds(999999999);
|
||||
m_minTASLatencyOverhead = NanoSeconds(0);
|
||||
m_maxTASLatencyOverhead = NanoSeconds(0);
|
||||
|
||||
//PSFP
|
||||
m_node->SetAttribute("MaxPsfpFilterEntryNumber", UintegerValue(m_maxPsfpFilterEntryNumber));
|
||||
m_node->SetAttribute("MaxPsfpStreamGateEntryNumber", UintegerValue(m_maxPsfpStreamGateEntryNumber));
|
||||
m_node->SetAttribute("MaxPsfpFlowMeterEntryNumber", UintegerValue(m_maxPsfpFlowMeterEntryNumber));
|
||||
//Stream identification
|
||||
m_maxSidEntryNumber = 127;
|
||||
m_minNullSIDLatencyOverhead = NanoSeconds(0); //-9ns
|
||||
m_maxNullSIDLatencyOverhead = NanoSeconds(0); //-13ns
|
||||
m_minSourceMacSIDLatencyOverhead = NanoSeconds(0);
|
||||
m_maxSourceMacSIDLatencyOverhead = NanoSeconds(0);
|
||||
|
||||
//FRER
|
||||
m_node->SetAttribute("MaxFrerSeqGenEntryNumber", UintegerValue(m_maxFrerSeqGenEntryNumber));
|
||||
m_node->SetAttribute("MaxFrerSeqRcvyEntryNumber", UintegerValue(m_maxFrerSeqRcvyEntryNumber));
|
||||
m_node->SetAttribute("MaxFrerSeqEncEntryNumber", UintegerValue(m_maxFrerSeqEncEntryNumber));
|
||||
//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
|
||||
}
|
||||
|
||||
|
||||
Ptr<TsnNetDevice>
|
||||
EvbLan9668::GetPort(int port_id)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
NS_ASSERT(port_id < (int) m_net_devices.size());
|
||||
return m_net_devices[port_id];
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::SetPortDatarate(int port_id, DataRate d)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
NS_ASSERT_MSG(d == DataRate("10Mb/s") || d == DataRate("100Mb/s") || d == DataRate("1Gb/s"), "Trying to use a datarate not supported on this device (i.e 10Mb/s, 100Mb/s and 1Gb/s)");
|
||||
GetPort(port_id)->SetAttribute("DataRate", DataRateValue(d));
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddForwardingTableEntry(Mac48Address dest, uint16_t vlan_id, std::vector<uint32_t> output_port_ids){
|
||||
NS_LOG_FUNCTION(this);
|
||||
std::vector<Ptr<NetDevice>> output_ports = {};
|
||||
for (int i = 0; i < (int)output_port_ids.size(); i++){
|
||||
output_ports.insert(output_ports.end(), GetPort(output_port_ids[i]));
|
||||
}
|
||||
m_switch_net_device->AddForwardingTableEntry(dest, vlan_id, output_ports);
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddCbs(uint32_t port_id, uint32_t queue_id, DataRate iddle_slope, DataRate port_transmit_rate)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
NS_ASSERT(queue_id < m_queuesPerPort);
|
||||
Ptr<Cbs> cbs = CreateObject<Cbs>();
|
||||
cbs->SetTsnNetDevice(GetPort(port_id));
|
||||
cbs->SetAttribute("IdleSlope", DataRateValue(iddle_slope));
|
||||
cbs->SetAttribute("MaxIdleSlope", DataRateValue(m_maxIddleSlope));
|
||||
cbs->SetAttribute("portTransmitRate", DataRateValue(port_transmit_rate));
|
||||
cbs->SetAttribute("MinLatencyOverhead", TimeValue(m_minCBSLatencyOverhead));
|
||||
cbs->SetAttribute("MaxLatencyOverhead", TimeValue(m_maxCBSLatencyOverhead));
|
||||
|
||||
Ptr<DropTailQueue<Packet>> q = CreateObject<DropTailQueue<Packet>>();
|
||||
q->SetAttribute("MaxSize", QueueSizeValue(m_fifoSize));
|
||||
|
||||
GetPort(port_id)->UpdateQueue(queue_id, q, cbs);
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddGclEntry(uint32_t port_id, Time interval, uint8_t state)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
GetPort(port_id)->AddGclEntry(interval, state);
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::StartTas()
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
for (int i = 0; i < (int)m_net_devices.size(); i++){
|
||||
m_net_devices[i]->StartTas();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddNullStreamIdentificationFunction(
|
||||
uint32_t streamHandle,
|
||||
Ptr<NullStreamIdentificationFunction> streamIdentificationFunction,
|
||||
std::vector<uint32_t> outFacInputPortIds,
|
||||
std::vector<uint32_t> inFacInputPortIds,
|
||||
std::vector<uint32_t> inFacOutputPortIds,
|
||||
std::vector<uint32_t> outFacOutputPortIds)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
|
||||
std::vector<Ptr<TsnNetDevice>> outFacInputPortList = {};
|
||||
for (int i = 0; i < (int)outFacInputPortIds.size(); i++){
|
||||
outFacInputPortList.insert(outFacInputPortList.end(), GetPort(outFacInputPortIds[i]));
|
||||
}
|
||||
|
||||
std::vector<Ptr<TsnNetDevice>> inFacInputPortList = {};
|
||||
for (int i = 0; i < (int)inFacInputPortIds.size(); i++){
|
||||
inFacInputPortList.insert(inFacInputPortList.end(), GetPort(inFacInputPortIds[i]));
|
||||
}
|
||||
|
||||
std::vector<Ptr<TsnNetDevice>> inFacOutputPortList = {};
|
||||
for (int i = 0; i < (int)inFacOutputPortIds.size(); i++){
|
||||
inFacOutputPortList.insert(inFacOutputPortList.end(), GetPort(inFacOutputPortIds[i]));
|
||||
}
|
||||
|
||||
std::vector<Ptr<TsnNetDevice>> outFacOutputPortList = {};
|
||||
for (int i = 0; i < (int)outFacOutputPortIds.size(); i++){
|
||||
outFacOutputPortList.insert(outFacOutputPortList.end(), GetPort(outFacOutputPortIds[i]));
|
||||
}
|
||||
|
||||
streamIdentificationFunction->SetAttribute("MinLatencyOverhead", TimeValue(m_minNullSIDLatencyOverhead));
|
||||
streamIdentificationFunction->SetAttribute("MaxLatencyOverhead", TimeValue(m_maxNullSIDLatencyOverhead));
|
||||
|
||||
m_node->AddStreamIdentificationFunction(
|
||||
streamHandle,
|
||||
streamIdentificationFunction,
|
||||
outFacInputPortList,
|
||||
inFacInputPortList,
|
||||
inFacOutputPortList,
|
||||
outFacOutputPortList);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
EvbLan9668::AddStreamFilter(Ptr<StreamFilterInstance> streamFilterInstance)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
m_node->AddStreamFilter(streamFilterInstance);
|
||||
}
|
||||
|
||||
uint16_t
|
||||
EvbLan9668::AddFlowMeter(Ptr<FlowMeterInstance> flowMeterInstance)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
return m_node->AddFlowMeter(flowMeterInstance);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
EvbLan9668::AddSequenceGenerationFunction(Ptr<SequenceGenerationFunction> entry)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
m_node->AddSequenceGenerationFunction(entry);
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddSequenceRecoveryFunction(Ptr<SequenceRecoveryFunction> rcvy, Ptr<BaseRecoveryFunction> algo, Ptr<LatentErrorDetectionFunction> lat, std::vector<uint32_t> port_ids)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
rcvy->SetAttribute("MinLatencyOverhead", TimeValue(m_minFrerRcvyLatencyOverhead));
|
||||
rcvy->SetAttribute("MaxLatencyOverhead", TimeValue(m_maxFrerRcvyLatencyOverhead));
|
||||
|
||||
algo->SetAttribute("MinResetTimer", TimeValue(m_minFrerSeqRcvyResetDuration));
|
||||
algo->SetAttribute("MaxResetTimer", TimeValue(m_maxFrerSeqRcvyResetDuration));
|
||||
|
||||
lat->SetAttribute("MinTestTimer", TimeValue(m_minFrerLatErrorTestDuration));
|
||||
lat->SetAttribute("MaxTestTimer", TimeValue(m_maxFrerLatErrorTestDuration));
|
||||
lat->SetAttribute("MinResetTimer", TimeValue(m_minFrerLatErrorResetDuration));
|
||||
lat->SetAttribute("MaxResetTimer", TimeValue(m_maxFrerLatErrorResetDuration));
|
||||
|
||||
std::vector<Ptr<TsnNetDevice>> ports = {};
|
||||
for (int i = 0; i < (int)port_ids.size(); i++){
|
||||
ports.insert(ports.end(), GetPort(port_ids[i]));
|
||||
}
|
||||
|
||||
rcvy->SetPorts(ports);
|
||||
rcvy->SetRecoveryFunction(algo);
|
||||
lat->SetRecoveryFunction(algo);
|
||||
rcvy->SetLatentErrorDetectionFunction(lat);
|
||||
|
||||
m_node->AddSequenceRecoveryFunction(rcvy);
|
||||
}
|
||||
|
||||
void
|
||||
EvbLan9668::AddSequenceEncodeDecodeFunction(Ptr<SequenceEncodeDecodeFunction> entry, uint32_t port_id)
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
entry->SetPort(GetPort(port_id));
|
||||
m_node->AddSequenceEncodeDecodeFunction(entry);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user