in astra-sim-alibabacloud/astra-sim/network_frontend/ns3/common.h [242:300]
void CalculateRoute(Ptr<Node> host) {
vector<Ptr<Node>> q;
map<Ptr<Node>, int> dis;
map<Ptr<Node>, uint64_t> delay;
map<Ptr<Node>, uint64_t> txDelay;
map<Ptr<Node>, uint64_t> bw;
q.push_back(host);
dis[host] = 0;
delay[host] = 0;
txDelay[host] = 0;
bw[host] = 0xfffffffffffffffflu;
for (int i = 0; i < (int)q.size(); i++) {
Ptr<Node> now = q[i];
int d = dis[now];
for (auto it = nbr2if[now].begin(); it != nbr2if[now].end(); it++) {
if (!it->second.up)
continue;
Ptr<Node> next = it->first;
if (dis.find(next) == dis.end()) {
dis[next] = d + 1;
delay[next] = delay[now] + it->second.delay;
txDelay[next] = txDelay[now] +
packet_payload_size * 1000000000lu * 8 / it->second.bw;
bw[next] = std::min(bw[now], it->second.bw);
if (next->GetNodeType() == 1 || next->GetNodeType() == 2) {
q.push_back(next);
}
}
bool via_nvswitch = false;
if (d + 1 == dis[next]) {
for(auto x : nextHop[next][host]) {
if(x->GetNodeType() == 2) via_nvswitch = true;
}
if(via_nvswitch == false) {
if(now->GetNodeType() == 2) {
while(nextHop[next][host].size() != 0)
nextHop[next][host].pop_back();
}
nextHop[next][host].push_back(now);
} else if(via_nvswitch == true && now->GetNodeType() == 2) {
nextHop[next][host].push_back(now);
}
if(next->GetNodeType() == 0 && nextHop[next][now].size() == 0) {
nextHop[next][now].push_back(now);
pairBw[next->GetId()][now->GetId()] = pairBw[now->GetId()][next->GetId()] = it->second.bw;
}
}
}
}
for (auto it : delay) {
pairDelay[it.first][host] = it.second;
}
for (auto it : txDelay)
pairTxDelay[it.first][host] = it.second;
for (auto it : bw) {
pairBw[it.first->GetId()][host->GetId()] = it.second;
}
}