Skip to content

Commit

Permalink
Merge pull request #77 from imsnif/average
Browse files Browse the repository at this point in the history
Display weighted average of bandwidth
  • Loading branch information
zhangxp1998 authored Jan 12, 2020
2 parents 21938b6 + 358e3f0 commit b843e18
Show file tree
Hide file tree
Showing 38 changed files with 263 additions and 220 deletions.
4 changes: 2 additions & 2 deletions src/display/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ where
utilization: Utilization,
ip_to_host: HashMap<Ipv4Addr, String>,
) {
self.state = UIState::new(connections_to_procs, utilization);
self.ip_to_host = ip_to_host;
self.state.update(connections_to_procs, utilization);
self.ip_to_host.extend(ip_to_host);
}
pub fn end(&mut self) {
self.terminal.clear().unwrap();
Expand Down
109 changes: 76 additions & 33 deletions src/display/ui_state.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
use ::std::collections::{BTreeMap, HashMap};
use ::std::collections::{BTreeMap, HashMap, VecDeque};
use ::std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

use crate::network::{Connection, LocalSocket, Utilization};

static RECALL_LENGTH: usize = 5;

pub trait Bandwidth {
fn get_total_bytes_downloaded(&self) -> u128;
fn get_total_bytes_uploaded(&self) -> u128;
Expand All @@ -23,6 +25,20 @@ pub struct ConnectionData {
pub interface_name: String,
}

impl NetworkData {
pub fn divide_by(&mut self, amount: usize) {
self.total_bytes_downloaded /= amount as u128;
self.total_bytes_uploaded /= amount as u128;
}
}

impl ConnectionData {
pub fn divide_by(&mut self, amount: usize) {
self.total_bytes_downloaded /= amount as u128;
self.total_bytes_uploaded /= amount as u128;
}
}

impl Bandwidth for ConnectionData {
fn get_total_bytes_uploaded(&self) -> u128 {
self.total_bytes_uploaded
Expand All @@ -41,13 +57,19 @@ impl Bandwidth for NetworkData {
}
}

pub struct UtilizationData {
connections_to_procs: HashMap<LocalSocket, String>,
network_utilization: Utilization,
}

#[derive(Default)]
pub struct UIState {
pub processes: BTreeMap<String, NetworkData>,
pub remote_addresses: BTreeMap<Ipv4Addr, NetworkData>,
pub connections: BTreeMap<Connection, ConnectionData>,
pub total_bytes_downloaded: u128,
pub total_bytes_uploaded: u128,
utilization_data: VecDeque<UtilizationData>,
}

impl UIState {
Expand All @@ -71,48 +93,69 @@ impl UIState {
})
}
}
pub fn new(
pub fn update(
&mut self,
connections_to_procs: HashMap<LocalSocket, String>,
network_utilization: Utilization,
) -> Self {
) {
self.utilization_data.push_back(UtilizationData {
connections_to_procs,
network_utilization,
});
if self.utilization_data.len() > RECALL_LENGTH {
self.utilization_data.pop_front();
}
let mut processes: BTreeMap<String, NetworkData> = BTreeMap::new();
let mut remote_addresses: BTreeMap<Ipv4Addr, NetworkData> = BTreeMap::new();
let mut connections: BTreeMap<Connection, ConnectionData> = BTreeMap::new();
let mut total_bytes_downloaded: u128 = 0;
let mut total_bytes_uploaded: u128 = 0;
for (connection, connection_info) in network_utilization.connections {
let connection_data = connections.entry(connection).or_default();
for state in self.utilization_data.iter().rev() {
let connections_to_procs = &state.connections_to_procs;
let network_utilization = &state.network_utilization;
for (connection, connection_info) in &network_utilization.connections {
let connection_data = connections.entry(connection.clone()).or_default();
let data_for_remote_address = remote_addresses
.entry(connection.remote_socket.ip)
.or_default();
connection_data.total_bytes_downloaded += connection_info.total_bytes_downloaded;
connection_data.total_bytes_uploaded += connection_info.total_bytes_uploaded;
connection_data.interface_name = connection_info.interface_name.clone();
data_for_remote_address.total_bytes_downloaded +=
connection_info.total_bytes_downloaded;
data_for_remote_address.total_bytes_uploaded +=
connection_info.total_bytes_uploaded;
data_for_remote_address.connection_count += 1;
total_bytes_downloaded += connection_info.total_bytes_downloaded;
total_bytes_uploaded += connection_info.total_bytes_uploaded;

if let Some(process_name) =
UIState::get_proc_name(&connections_to_procs, &connection.local_socket)
{
let data_for_process = processes.entry(process_name.clone()).or_default();
data_for_process.total_bytes_downloaded += connection_info.total_bytes_downloaded;
data_for_process.total_bytes_uploaded += connection_info.total_bytes_uploaded;
data_for_process.connection_count += 1;
connection_data.process_name = process_name.clone();
} else {
connection_data.process_name = String::from("<UNKNOWN>");
if let Some(process_name) =
UIState::get_proc_name(&connections_to_procs, &connection.local_socket)
{
let data_for_process = processes.entry(process_name.clone()).or_default();
data_for_process.total_bytes_downloaded +=
connection_info.total_bytes_downloaded;
data_for_process.total_bytes_uploaded += connection_info.total_bytes_uploaded;
data_for_process.connection_count += 1;
connection_data.process_name = process_name.clone();
} else {
connection_data.process_name = String::from("<UNKNOWN>");
}
}
let data_for_remote_address = remote_addresses
.entry(connection.remote_socket.ip)
.or_default();
connection_data.total_bytes_downloaded += connection_info.total_bytes_downloaded;
connection_data.total_bytes_uploaded += connection_info.total_bytes_uploaded;
connection_data.interface_name = connection_info.interface_name;
data_for_remote_address.total_bytes_downloaded +=
connection_info.total_bytes_downloaded;
data_for_remote_address.total_bytes_uploaded += connection_info.total_bytes_uploaded;
data_for_remote_address.connection_count += 1;
total_bytes_downloaded += connection_info.total_bytes_downloaded;
total_bytes_uploaded += connection_info.total_bytes_uploaded;
}
UIState {
processes,
remote_addresses,
connections,
total_bytes_downloaded,
total_bytes_uploaded,
for (_, network_data) in processes.iter_mut() {
network_data.divide_by(self.utilization_data.len())
}
for (_, network_data) in remote_addresses.iter_mut() {
network_data.divide_by(self.utilization_data.len())
}
for (_, connection_data) in connections.iter_mut() {
connection_data.divide_by(self.utilization_data.len())
}
self.processes = processes;
self.remote_addresses = remote_addresses;
self.connections = connections;
self.total_bytes_downloaded = total_bytes_downloaded;
self.total_bytes_uploaded = total_bytes_uploaded;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 49/51 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 49/51 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 49/51 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 24/25 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 24/25 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 24/25 connections: 1

Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/95 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/44 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/51 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/95 connections: 2
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/47 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/25 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/47 connections: 2

Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/44 connections: 1
process: <TIMESTAMP_REMOVED> "4" up/down Bps: 0/39 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 2.2.2.2:12345 (tcp) up/down Bps: 0/44 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4434 => 2.2.2.2:54321 (tcp) up/down Bps: 0/39 process: "4"
remote_address: <TIMESTAMP_REMOVED> 2.2.2.2 up/down Bps: 0/83 connections: 2
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/22 connections: 1
process: <TIMESTAMP_REMOVED> "4" up/down Bps: 0/19 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 2.2.2.2:12345 (tcp) up/down Bps: 0/22 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4434 => 2.2.2.2:54321 (tcp) up/down Bps: 0/19 process: "4"
remote_address: <TIMESTAMP_REMOVED> 2.2.2.2 up/down Bps: 0/41 connections: 2

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/91 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/91 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/91 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/45 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/45 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/45 connections: 1

Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/44 connections: 1
process: <TIMESTAMP_REMOVED> "2" up/down Bps: 0/42 connections: 1
process: <TIMESTAMP_REMOVED> "4" up/down Bps: 0/53 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/45 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/44 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4434 => 2.2.2.2:54321 (tcp) up/down Bps: 0/53 process: "4"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/45 process: "5"
connection: <TIMESTAMP_REMOVED> <interface_name>:4432 => 4.4.4.4:1337 (tcp) up/down Bps: 0/42 process: "2"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/44 connections: 1
remote_address: <TIMESTAMP_REMOVED> 2.2.2.2 up/down Bps: 0/53 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/45 connections: 1
remote_address: <TIMESTAMP_REMOVED> 4.4.4.4 up/down Bps: 0/42 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/22 connections: 1
process: <TIMESTAMP_REMOVED> "2" up/down Bps: 0/21 connections: 1
process: <TIMESTAMP_REMOVED> "4" up/down Bps: 0/26 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/22 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4434 => 2.2.2.2:54321 (tcp) up/down Bps: 0/26 process: "4"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/22 process: "5"
connection: <TIMESTAMP_REMOVED> <interface_name>:4432 => 4.4.4.4:1337 (tcp) up/down Bps: 0/21 process: "2"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/22 connections: 1
remote_address: <TIMESTAMP_REMOVED> 2.2.2.2 up/down Bps: 0/26 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/22 connections: 1
remote_address: <TIMESTAMP_REMOVED> 4.4.4.4 up/down Bps: 0/21 connections: 1

24 changes: 12 additions & 12 deletions src/tests/cases/snapshots/raw_mode__no_resolve_mode.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 57/61 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 34/37 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 57/61 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 34/37 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 57/61 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 34/37 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 37/36 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 32/46 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 37/36 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 32/46 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 37/36 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 32/46 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 28/30 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 17/18 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 28/30 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 17/18 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 28/30 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 17/18 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 31/32 connections: 2
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 22/27 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 31/32 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 22/27 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 31/32 connections: 2
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 22/27 connections: 2

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 42/0 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 42/0 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 42/0 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 21/0 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 21/0 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 21/0 connections: 1

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 42/0 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 42/0 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 42/0 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 21/0 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 21/0 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 21/0 connections: 1

Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/92 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/44 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/48 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/92 connections: 2
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/46 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/24 process: "1"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/46 connections: 2

Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
source: src/tests/cases/raw_mode.rs
expression: formatted
---
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/44 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/39 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/44 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/39 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/44 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/39 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/61 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/51 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/61 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/51 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/61 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/51 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/22 connections: 1
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/19 connections: 1
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/19 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/22 connections: 1
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/19 connections: 1
process: <TIMESTAMP_REMOVED> "1" up/down Bps: 0/35 connections: 2
process: <TIMESTAMP_REMOVED> "5" up/down Bps: 0/30 connections: 2
connection: <TIMESTAMP_REMOVED> <interface_name>:443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/35 process: "1"
connection: <TIMESTAMP_REMOVED> <interface_name>:4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/30 process: "5"
remote_address: <TIMESTAMP_REMOVED> 1.1.1.1 up/down Bps: 0/35 connections: 2
remote_address: <TIMESTAMP_REMOVED> 3.3.3.3 up/down Bps: 0/30 connections: 2

Loading

0 comments on commit b843e18

Please sign in to comment.