Skip to content

Commit c3138d5

Browse files
Merge pull request #126 from siddh34/feature/ebpf-core
Feature/ebpf core
2 parents 055dcbc + 5ef2949 commit c3138d5

File tree

10 files changed

+5629
-4678
lines changed

10 files changed

+5629
-4678
lines changed

core/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use aya::{
2+
maps::{
3+
MapData,
4+
perf::{PerfEventArrayBuffer},
5+
}
6+
};
7+
8+
use bytes::BytesMut;
9+
use std::{
10+
sync::{
11+
atomic::{AtomicBool, Ordering},
12+
},
13+
};
14+
15+
use tracing::{error, info};
16+
17+
use crate::structs::NetworkMetrics;
18+
19+
pub async fn display_metrics_map(
20+
mut perf_buffers: Vec<PerfEventArrayBuffer<MapData>>,
21+
running: AtomicBool,
22+
mut buffers: Vec<BytesMut>,
23+
) {
24+
while running.load(Ordering::SeqCst) {
25+
for buf in perf_buffers.iter_mut() {
26+
match buf.read_events(&mut buffers) {
27+
std::result::Result::Ok(events) => {
28+
for i in 0..events.read {
29+
let data = &buffers[i];
30+
if data.len() >= std::mem::size_of::<NetworkMetrics>() {
31+
let net_metrics: NetworkMetrics =
32+
unsafe { std::ptr::read_unaligned(data.as_ptr() as *const _) };
33+
let sk_drop_count = net_metrics.sk_drops;
34+
let sk_err = net_metrics.sk_err;
35+
let sk_err_soft = net_metrics.sk_err_soft;
36+
let sk_backlog_len = net_metrics.sk_backlog_len;
37+
let sk_write_memory_queued = net_metrics.sk_write_memory_queued;
38+
let sk_ack_backlog = net_metrics.sk_ack_backlog;
39+
let sk_receive_buffer_size = net_metrics.sk_receive_buffer_size;
40+
info!(
41+
"sk_drops: {}, sk_err: {}, sk_err_soft: {}, sk_backlog_len: {}, sk_write_memory_queued: {}, sk_ack_backlog: {}, sk_receive_buffer_size: {}",
42+
sk_drop_count, sk_err, sk_err_soft, sk_backlog_len, sk_write_memory_queued, sk_ack_backlog, sk_receive_buffer_size
43+
);
44+
}
45+
}
46+
}
47+
Err(e) => {
48+
error!("Error reading events: {:?}", e);
49+
}
50+
}
51+
}
52+
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
53+
}
54+
}

core/src/components/metrics/src/main.rs

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,34 @@
11
use aya::{
22
Ebpf,
33
maps::{
4-
Map, MapData,
4+
MapData,
55
perf::{PerfEventArray, PerfEventArrayBuffer},
66
},
7-
programs::{KProbe, SchedClassifier, TcAttachType, tc::SchedClassifierLinkId},
7+
programs::{KProbe},
88
util::online_cpus,
99
};
1010

11-
use aya_log::EbpfLogger;
1211
use bytes::BytesMut;
1312
use std::{
1413
convert::TryInto,
1514
env, fs,
16-
net::Ipv4Addr,
1715
path::Path,
1816
sync::{
19-
Arc, Mutex,
20-
atomic::{AtomicBool, Ordering},
17+
atomic::{AtomicBool},
2118
},
2219
};
2320

2421
use anyhow::{Context, Ok};
25-
use tokio::{signal, sync::broadcast::error};
26-
use tracing::{error, info, warn};
22+
use tokio::{signal};
23+
use tracing::{error, info};
2724
use tracing_subscriber::{EnvFilter, fmt::format::FmtSpan};
2825

2926
const BPF_PATH: &str = "BPF_PATH"; //BPF env path
30-
use std::collections::HashMap;
3127

32-
#[repr(C)]
33-
#[derive(Clone, Copy)]
34-
struct NetworkMetrics {
35-
src_addr: u32,
36-
}
28+
mod helpers;
29+
use crate::helpers::display_metrics_map;
30+
31+
mod structs;
3732

3833
#[tokio::main]
3934
async fn main() -> Result<(), anyhow::Error> {
@@ -74,7 +69,7 @@ async fn main() -> Result<(), anyhow::Error> {
7469

7570
match program.attach("tcp_identify_packet_loss", 0) {
7671
std::result::Result::Ok(_) => {
77-
info!("program attacched successfully to the tcp_identify_packet_loss kprobe ")
72+
info!("program attached successfully to the tcp_identify_packet_loss kprobe ")
7873
}
7974
Err(e) => error!(
8075
"An error occured while attaching the program to the tcp_identify_packet_loss kprobe. {:?} ",
@@ -97,36 +92,6 @@ async fn main() -> Result<(), anyhow::Error> {
9792
display_metrics_map(net_perf_buffer, running, buffers).await;
9893
});
9994

100-
10195
signal::ctrl_c().await?;
10296
Ok(())
10397
}
104-
105-
pub async fn display_metrics_map(
106-
mut perf_buffers: Vec<PerfEventArrayBuffer<MapData>>,
107-
running: AtomicBool,
108-
mut buffers: Vec<BytesMut>,
109-
) {
110-
while running.load(Ordering::SeqCst) {
111-
for buf in perf_buffers.iter_mut() {
112-
match buf.read_events(&mut buffers) {
113-
std::result::Result::Ok(events) => {
114-
for i in 0..events.read {
115-
let data = &buffers[i];
116-
if data.len() >= std::mem::size_of::<NetworkMetrics>() {
117-
let net_metrics: NetworkMetrics =
118-
unsafe { std::ptr::read(data.as_ptr() as *const _) };
119-
let src = Ipv4Addr::from(u32::from_be(net_metrics.src_addr));
120-
121-
info!("Detected packet loss SRC: {}", src);
122-
}
123-
}
124-
}
125-
Err(e) => {
126-
error!("Error reading events: {:?}", e);
127-
}
128-
}
129-
}
130-
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
131-
}
132-
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod structs;
2+
mod enums;
3+
mod helpers;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
3+
#[repr(C)]
4+
#[derive(Clone, Copy)]
5+
pub struct NetworkMetrics {
6+
pub sk_err: i32, // Offset 284
7+
pub sk_err_soft: i32, // Offset 600
8+
pub sk_backlog_len: i32, // Offset 196
9+
pub sk_write_memory_queued: i32, // Offset 376
10+
pub sk_receive_buffer_size: i32, // Offset 244
11+
pub sk_ack_backlog: u32, // Offset 604
12+
pub sk_drops: i32, // Offset 136
13+
}

0 commit comments

Comments
 (0)