rapidio 路由枚举算法

简介: rapidio 路由枚举算法

目录

系统枚举伪代码

主机枚举

邻居节点枚举


系统枚举伪代码


// System enumeration and initialization using the power-on device ID as the hostDeviceID
// —Discover the host first
// —Discover the host’s neighbor recursively
 STATUS rioSystemEnumerate (hostDeviceID)
{
// Discover the host first.
status = rioEnumerateHost (hostDeviceID);
 if (status == ERR_SLAVE) {
 rioClearUp (hostDeviceID);
 return ERR_SLAVE;
 }
// Discover the host neighbor
status = rioEnumerateNeighbor (hostDeviceID, hopCount = 1);
if (status == ERR_SLAVE) {
rioClearUp (hostDeviceID);
return ERR_SLAVE;
}
// If the code advances to this point successfully, the host must acquire the
// HostBaseDeviceIdLock for all devices in the system. When this is done, the Discovered bit
// Master Enable bit, etc. can be set for all devices.
} // end rioSystemEnumerate


主机枚举


STATUS rioEnumerateHost (hostDeviceID)

{
// Try to acquire the lock
rioAcquireDeviceLock (0, hostDeviceID, 0, hostDeviceID);
while (HostBaseDeviceIdLockCSR.HostBaseDeviceID < hostDeviceID) {
// Delay for a while
rioDelay ();
// Retry lock acquisition
rioAcquireDeviceLock (0, hostDeviceID, 0, hostDeviceID, &lockingHost);
}
// Check to see if there is a master with a larger host device ID
if (HostBaseDeviceIdLock.HostBaseDeviceID > hostDeviceID) {
// Release the current lock
rioReleaseDeviceLock (0, hostDeviceID, 0, hostDeviceID);
return ERR_SLAVE;
}
// Lock has been acquired so enumeration can begin
// Assign the default host ID to the host
rioSetBaseDeviceId (0, hostDeviceID, hostDeviceID);
// Increment the available device ID
if (DeviceID == hostDeviceID) {
DeviceID ++;
 }
return RIO_SUCCESS;
} // end rioEnumerateHost


邻居节点枚举


 STATUS rioEnumerateNeighbor (hostDeviceID, hopCount)
{
// The host has already discovered this node if it currently owns the lock
rioGetCurHostLock (0, 0, 0, &owner_device_id);
if (owner_device_id == hostDeviceID) {
return RIO_SUCCESS;
}
// Try to acquire the lock
rioAcquireDeviceLock (0, RIO_GEN_DFLT_DID, hopCount, hostDeviceID, &lockingHost);
while (HostBaseDeviceIdLockCSR.HostBaseDeviceID < hostDeviceID) {
// Delay for a while
rioDelay ();
// Retry lock acquisition
rioAcquireDeviceLock(0, RIO_GEN_DFLT_DID, hopCount, hostDeviceID,&lockingHost);
}
// Check to see if there is a master with a larger host device ID
if (HostBaseDeviceIdLock.HostBaseDeviceID > hostDeviceID) {
return ERR_SLAVE;
}
// Lock has been acquired so enumeration can begin
// Check Source Operation CAR and Destination Operation CAR to see if a Device ID can be
// assigned
rioGetSourceOps (0, RIO_GEN_DFLT_DID, hopCount, &SourceOperationCAR);
rioGetDestOps (0, RIO_GEN_DFLT_DID, hopCount, &DestinationOperationCAR);
if ( (SourceOperationCAR.Read || Write || Atomic) &&
(DestinationOperationCAR.Read || Write || Atomic)) {
// Set the device ID
rioSetBaseDeviceId (0, RIO_GEN_DFLT_DID, DeviceID);
// Increment the available device ID
DeviceID ++;
if (DeviceID == hostDeviceID) {
DeviceID ++;
}
}
// Check to see if the device is a switch
rioGetFeatures (0, RIO_GEN_DFLT_DID, hopCount, &ProcessingElementFeatureCAR);
if (ProcessingElementFeatureCAR.Switch == TRUE) {
// Read the switch information
rioGetSwitchPortInfo (0, RIO_GEN_DFLT_DID, hopCount,&SwitchPortInformationCAR);
// Record the switch device identity
Switches[SwitchID].SwitchIdentity = DeviceIdentityCAR.DeviceIdentity;
// Bookkeeping for the current switch ID
curSwitchID = SwitchID;
// Increment the available switch ID
SwitchID ++;
// Initialize the current switch routing table to add entries for all previously discovered
// devices so that they are routed correctly. Start with the host device ID (0x00) and end with
// DeviceID-1.
for (each deviceID in [0..DeviceID-1]) {
rioRouteAddEntry (0, RIO_GEN_DFLT_DID, hopCount, RIO_GEN_DFLT_DID,
deviceID,
SwitchPortInformationCAR.PortNumber, NULL);
}
// Synchronize the current switch routing table with the global table
for (each deviceID in [0.. DeviceID-1]) {
Switches[curSwitchID].RouteTable.LFT[deviceID] =
SwitchPortInformationCAR.PortNumber;
}
// Update the hopCount to reach the current switch
Switches[curSwitchID].HopCount = hopCount;
for (each portNum in SwitchPortInformationCAR.PortTotal) {
if (SwitchPortInformationCAR.PortNumber == portNum) {
continue;
}、
// Bookkeeping for the current available device ID
curDeviceID = DeviceID;
rioGetPortErrStatus (0, RIO_GEN_DFLT_DID, hopCount, &PortErrorStatusCSR[portNum]);
// Check if it is possible to have a neighbor
if (PortErrorStatusCSR[portNum].PortUninitialized == TRUE) {
continue;
}
else if (PortErrorStatusCSR[portNum].PortOK == TRUE) {
// Check if it is an enumeration boundary port
if (PortControlCSR[portNum].PortEnumerationBoundary == TRUE) {
continue;
}
rioRouteAddEntry(0, RIO_GEN_DFLT_DID, hopCount, RIO_GEN_DFLT_DID, 0, portNumber, NULL);
// Discover the neighbor recursively
if (status = rioEnumerateNeighbor(hopCount + 1) != RIO_SUCCESS) {
return status;
}
// If more than one end point device was found, update the current switch routing table
// entries beginning with the curDeviceID entry and ending with the DeviceID-1
// entry.
if (DeviceID > curDeviceID) {
for (each deviceID in [curDeviceID..DeviceID-1]) {
rioRouteAddEntry(0, RIO_GEN_DFLT_DID, hopCount, deviceID,portNumber);
}
// Synchronize the current switch routing table with the global table
for (each deviceID in [curDeviceID..DeviceID-1]) {
Switches[curSwitchID].RouteTable.LFT[deviceID] = portNumber;
}
// Update the associated Device ID in the path.
Switches[curSwitchID].DeviceID = curDeviceID;
} // end if
} // end else if
} // end for
} // end if (ProcessingElementFeatureCAR.Switch == TRUE)
return RIO_SUCCESS;
} // end rioEnumerateNeighbor


目录
相关文章
|
4月前
|
算法
基于多路径路由的全局感知网络流量分配优化算法matlab仿真
本文提出一种全局感知网络流量分配优化算法,针对现代网络中多路径路由的需求,旨在均衡分配流量、减轻拥塞并提升吞吐量。算法基于网络模型G(N, M),包含N节点与M连接,并考虑K种不同优先级的流量。通过迭代调整每种流量在各路径上的分配比例,依据带宽利用率um=Σ(xm,k * dk) / cm来优化网络性能,确保高优先级流量的有效传输同时最大化利用网络资源。算法设定收敛条件以避免陷入局部最优解。
|
4月前
|
负载均衡 算法 网络协议
动态路由的主流算法
【8月更文挑战第3天】BGP 协议使用的算法是路径矢量路由协议(path-vector protocol)。它是距离矢量路由协议的升级版。
|
6月前
|
缓存 算法
基于机会网络编码(COPE)的卫星网络路由算法matlab仿真
**摘要:** 该程序实现了一个基于机会网络编码(COPE)的卫星网络路由算法,旨在提升无线网络的传输效率和吞吐量。在MATLAB2022a中测试,结果显示了不同数据流个数下的网络吞吐量。算法通过Dijkstra函数寻找路径,计算编码机会(Nab和Nx),并根据编码机会减少传输次数。当有编码机会时,中间节点执行编码和解码操作,优化传输路径。结果以图表形式展示,显示数据流与吞吐量的关系,并保存为`R0.mat`。COPE算法预测和利用编码机会,适应卫星网络的动态特性,提高数据传输的可靠性和效率。
|
5月前
|
存储 传感器 算法
基于ACO蚁群优化算法的WSN网络路由优化matlab仿真
摘要(Markdown格式): - 📈 ACO算法应用于WSN路由优化,MATLAB2022a中实现,动态显示迭代过程,输出最短路径。 - 🐜 算法模拟蚂蚁寻找食物,信息素更新与蚂蚁选择策略确定路径。信息素增量Δτ += α*τ*η,节点吸引力P ∝ τ / d^α。 - 🔁 算法流程:初始化→蚂蚁路径选择→信息素更新→判断结束条件→输出最优路由。优化WSN能量消耗,降低传输成本。
|
6月前
|
传感器 算法 安全
基于WSN网络的定向步幻影路由算法matlab仿真
该文探讨了无线传感器网络中的位置隐私保护,对比了NDRW路由与定向步幻影路由在安全时间和能耗方面的性能。在MATLAB2022a中进行测试,结果显示NDRW路由提供最长的安全时间,尤其在长距离传输时,且在近距离下能耗低于幻影路由。幻影路由虽消耗更多能量,但通过随机步创造幻影源以增强安全性。NDRW路由利用非确定性随机游走策略,避免拥堵并提高效率,而幻影路由则引入方向性控制,通过启发式算法优化路径选择。
|
6月前
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
35 0
|
7月前
|
网络协议 算法 数据库
【专栏】OSPF是广泛应用的链路状态路由协议,通过分层网络结构和SPF算法实现高效路由。强烈建议收藏!
【4月更文挑战第28天】OSPF是广泛应用的链路状态路由协议,通过分层网络结构和SPF算法实现高效路由。其关键特性包括区域划分、链路状态数据库、邻居关系和路由更新。工作过程涉及邻居发现、信息交换、数据库构建、路由计算及收敛。理解OSPF对于网络管理和规划具有重要意义。
134 1
|
7月前
|
算法 网络协议 数据建模
【计算机网络】—— IP协议及动态路由算法(下)
【计算机网络】—— IP协议及动态路由算法(下)
|
7月前
|
算法 网络协议 数据建模
【计算机网络】—— IP协议及动态路由算法(上)
【计算机网络】—— IP协议及动态路由算法(上)
|
7月前
|
网络协议 算法 数据库
【专栏】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法
【4月更文挑战第28天】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法。其特点是分层设计、快速收敛、高效资源利用和强故障恢复能力。在现代网络中,IS-IS广泛应用于服务提供商、企业网络及与其他协议的融合,是构建稳定、高效网络的关键。了解和应用IS-IS能提升网络系统的可靠性和效率。
133 0