forked from noahsug/CSMA-CD-emulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRouter.cpp
50 lines (40 loc) · 1.5 KB
/
Router.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "Router.h"
#include <cassert>
#include <iostream>
#include "Environment.h"
#include "Clock.h"
using namespace std;
Router Router::instance_;
void Router::OnPacketGenerated(Computer* comp) {
queue<unsigned long long>& q = packetGeneratedTimes_[comp];
q.push(Clock::GetTime());
}
void Router::OnPacketDropped(Computer* comp) {
queue<unsigned long long>& q = packetGeneratedTimes_[comp];
assert(!q.empty());
packetsDropped_++;
q.pop();
}
void Router::OnPacketTransmitted(Computer* comp) {
queue<unsigned long long>& q = packetGeneratedTimes_[comp];
assert(!q.empty());
packetsArrived_++;
unsigned long long delay = Clock::GetTime() - q.front();
q.pop();
totalPacketDelay_ += delay;
}
void Router::PrintStatistics() {
double totalTime = (Clock::GetTime() / (Environment::LAN_SPEED * 1000000));
cout << "Received " << packetsArrived_ << " packets" << endl;
cout << "Dropped " << packetsDropped_ << " packets" << endl;
cout << "Took " << totalTime << " sec (" << Clock::GetTime() << " bit-time)" << endl;
double delayTime = 0;
double delayTimeInSecs = 0;
if (packetsArrived_ > 0) {
delayTime = (double)totalPacketDelay_ / packetsArrived_;
delayTimeInSecs = delayTime / (Environment::LAN_SPEED * 1000000);
}
cout << "Average delay time: " << delayTimeInSecs << " secs (" << delayTime << " bit-time)" << endl;
double throughput = Environment::PACKET_LENGTH * ((double) packetsArrived_ / totalTime) / 1000000;
cout << "Throughput: " << throughput << " Mbps" << endl;
}