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
51
52
53
54
55
56
57
58
59
pub mod epidemic;
pub mod flooding;
pub mod sink;
use crate::cla::ClaSender;
use crate::core::bundlepack::BundlePack;
use bp7::Bundle;
use bp7::EndpointID;
use derive_more::*;
use enum_dispatch::enum_dispatch;
use epidemic::EpidemicRoutingAgent;
use flooding::FloodingRoutingAgent;
use sink::SinkRoutingAgent;
use std::fmt::Debug;
use std::fmt::Display;
pub enum RoutingNotifcation<'a> {
SendingFailed(&'a str, &'a str),
IncomingBundle(&'a Bundle),
IncomingBundleWithoutPreviousNode(&'a str, &'a str),
EncounteredPeer(&'a EndpointID),
}
#[enum_dispatch]
#[derive(Debug, Display)]
pub enum RoutingAgentsEnum {
EpidemicRoutingAgent,
FloodingRoutingAgent,
SinkRoutingAgent,
}
#[enum_dispatch(RoutingAgentsEnum)]
pub trait RoutingAgent: Debug + Display {
fn notify(&mut self, _notification: RoutingNotifcation) {}
fn sender_for_bundle(&mut self, _bp: &BundlePack) -> (Vec<ClaSender>, bool) {
unimplemented!();
}
}
pub fn routing_algorithms() -> Vec<&'static str> {
vec!["epidemic", "flooding", "sink"]
}
pub fn new(routingagent: &str) -> RoutingAgentsEnum {
match routingagent {
"flooding" => FloodingRoutingAgent::new().into(),
"epidemic" => EpidemicRoutingAgent::new().into(),
"sink" => sink::SinkRoutingAgent::new().into(),
_ => panic!("Unknown routing agent {}", routingagent),
}
}