77 * 3. Track veth creation and deletion events
88 *
99 */
10- #![ allow( warnings) ]
1110#![ allow( unused_mut) ]
11+ #![ allow( warnings) ]
1212
1313mod enums;
1414mod helpers;
1515mod structs;
1616use aya:: {
17+ Bpf ,
1718 maps:: {
18- perf:: { PerfEventArray , PerfEventArrayBuffer } , Map , MapData
19- } , programs:: { tc:: SchedClassifierLinkId , KProbe , SchedClassifier , TcAttachType } , util:: online_cpus, Bpf , Ebpf
19+ Map , MapData ,
20+ perf:: { PerfEventArray , PerfEventArrayBuffer } ,
21+ } ,
22+ programs:: { KProbe , SchedClassifier , TcAttachType , tc:: SchedClassifierLinkId } ,
23+ util:: online_cpus,
2024} ;
2125
22- use crate :: enums:: IpProtocols ;
2326use crate :: helpers:: { display_events, display_veth_events, get_veth_channels} ;
2427use bytes:: BytesMut ;
2528use std:: {
2629 convert:: TryInto ,
2730 path:: Path ,
2831 sync:: {
29- atomic:: { AtomicBool , Ordering } , Arc , Mutex
32+ Arc , Mutex ,
33+ atomic:: { AtomicBool , Ordering } ,
3034 } ,
3135} ;
3236
3337use anyhow:: { Context , Ok } ;
34- use tokio:: { fs, signal, sync :: broadcast :: error } ;
35- use tracing:: { error, info, warn } ;
38+ use tokio:: { fs, signal} ;
39+ use tracing:: { error, info} ;
3640use tracing_subscriber:: { EnvFilter , fmt:: format:: FmtSpan } ;
3741
3842const BPF_PATH : & str = "BPF_PATH" ; //BPF env path
3943use std:: collections:: HashMap ;
40- use std:: result:: Result :: Ok as Okk ;
4144
4245#[ tokio:: main]
4346async fn main ( ) -> Result < ( ) , anyhow:: Error > {
@@ -68,25 +71,35 @@ async fn main() -> Result<(), anyhow::Error> {
6871 //init bpf data
6972 let bpf = Arc :: new ( Mutex :: new ( Bpf :: load ( & data) ?) ) ;
7073
71- //load veth_trace program ref veth_trace.rs
72- init_veth_tracer ( bpf . clone ( ) ) ;
73- let bpf_maps = init_bpf_maps ( bpf. clone ( ) ) . unwrap ( ) ;
74+ match init_bpf_maps ( bpf . clone ( ) ) {
75+ std :: result :: Result :: Ok ( bpf_maps ) => {
76+ info ! ( "Successfully loaded bpf maps" ) ;
7477
75- let interfaces = get_veth_channels ( ) ;
78+ //load veth_trace program ref veth_trace.rs
79+ init_veth_tracer ( bpf. clone ( ) ) . await ?;
7680
77- info ! ( "Found interfaces: {:?}" , interfaces) ;
78- init_tc_classifier ( bpf. clone ( ) , interfaces, link_ids. clone ( ) )
79- . context ( "An error occured during the execution of attach_bpf_program function" ) ?;
81+ let interfaces = get_veth_channels ( ) ;
8082
81- event_listener ( bpf_maps, link_ids. clone ( ) , bpf. clone ( ) )
82- . await
83- . context ( "Error initializing event_listener" ) ?;
83+ info ! ( "Found interfaces: {:?}" , interfaces) ;
84+ init_tc_classifier ( bpf. clone ( ) , interfaces, link_ids. clone ( ) )
85+ . await
86+ . context ( "An error occured during the execution of attach_bpf_program function" ) ?;
87+
88+ event_listener ( bpf_maps, link_ids. clone ( ) , bpf. clone ( ) )
89+ . await
90+ . context ( "Error initializing event_listener" ) ?;
91+ }
92+ Err ( e) => {
93+ error ! ( "Error while loading bpf maps {}" , e) ;
94+ signal:: ctrl_c ( ) ;
95+ }
96+ }
8497
8598 Ok ( ( ) )
8699}
87100
88101//attach the tc classifier program to a vector of interfaces
89- pub fn init_tc_classifier (
102+ async fn init_tc_classifier (
90103 bpf : Arc < Mutex < Bpf > > ,
91104 ifaces : Vec < String > ,
92105 link_ids : Arc < Mutex < HashMap < String , SchedClassifierLinkId > > > ,
@@ -108,7 +121,7 @@ pub fn init_tc_classifier(
108121
109122 for interface in ifaces {
110123 match program. attach ( & interface, TcAttachType :: Ingress ) {
111- Okk ( link_id) => {
124+ std :: result :: Result :: Ok ( link_id) => {
112125 info ! (
113126 "Program 'identity_classifier' attached to interface {}" ,
114127 interface
@@ -126,7 +139,7 @@ pub fn init_tc_classifier(
126139 Ok ( ( ) )
127140}
128141
129- fn init_veth_tracer ( bpf : Arc < Mutex < Bpf > > ) -> Result < ( ) , anyhow:: Error > {
142+ async fn init_veth_tracer ( bpf : Arc < Mutex < Bpf > > ) -> Result < ( ) , anyhow:: Error > {
130143 //this functions init the veth_tracer used to make the InterfacesRegistry
131144
132145 let mut bpf_new = bpf. lock ( ) . unwrap ( ) ;
@@ -138,7 +151,10 @@ fn init_veth_tracer(bpf: Arc<Mutex<Bpf>>) -> Result<(), anyhow::Error> {
138151 . try_into ( ) ?;
139152 veth_creation_tracer. load ( ) ?;
140153
141- veth_creation_tracer. attach ( "register_netdevice" , 0 ) ?;
154+ match veth_creation_tracer. attach ( "register_netdevice" , 0 ) {
155+ std:: result:: Result :: Ok ( _) => info ! ( "veth_creation_tracer program attached successfully" ) ,
156+ Err ( e) => error ! ( "Error attaching veth_creation_tracer program {:?}" , e) ,
157+ }
142158
143159 //deletion tracer
144160 let veth_deletion_tracer: & mut KProbe = bpf_new
@@ -188,7 +204,11 @@ fn init_bpf_maps(bpf: Arc<Mutex<Bpf>>) -> Result<(Map, Map), anyhow::Error> {
188204 Ok ( ( events_map, veth_map) )
189205}
190206
191- async fn event_listener ( bpf_maps : ( Map , Map ) , link_ids : Arc < Mutex < HashMap < String , SchedClassifierLinkId > > > , bpf : Arc < Mutex < Bpf > > ) -> Result < ( ) , anyhow:: Error > {
207+ async fn event_listener (
208+ bpf_maps : ( Map , Map ) ,
209+ link_ids : Arc < Mutex < HashMap < String , SchedClassifierLinkId > > > ,
210+ bpf : Arc < Mutex < Bpf > > ,
211+ ) -> Result < ( ) , anyhow:: Error > {
192212 // this function init the event listener. Listens for veth events (creation/deletion) and network events (pod to pod communications)
193213 /* Doc:
194214
@@ -230,7 +250,14 @@ async fn event_listener(bpf_maps: (Map, Map), link_ids: Arc<Mutex<HashMap<String
230250
231251 //display_events(perf_buffers, running, buffers).await;
232252 let veth_events_displayer = tokio:: spawn ( async move {
233- display_veth_events ( bpf. clone ( ) , perf_veth_buffer, veth_running, veth_buffers, veth_link_ids, ) . await ;
253+ display_veth_events (
254+ bpf. clone ( ) ,
255+ perf_veth_buffer,
256+ veth_running,
257+ veth_buffers,
258+ veth_link_ids,
259+ )
260+ . await ;
234261 } ) ;
235262 let net_events_displayer = tokio:: spawn ( async move {
236263 display_events ( perf_net_events_buffer, net_events_running, events_buffers) . await ;
0 commit comments