@@ -64,38 +64,38 @@ fn create_config() -> Config {
64
64
}
65
65
}
66
66
67
- struct Payload {
67
+ struct Target {
68
68
prefix : IpNet ,
69
69
min_ttl : u8 ,
70
70
max_ttl : u8 ,
71
71
n_flows : u64 ,
72
72
}
73
73
74
- fn decode_payload ( payload : & str ) -> Result < Payload > {
74
+ fn decode_payload ( payload : & str ) -> Result < Target > {
75
75
let parts: Vec < & str > = payload. split ( ',' ) . collect ( ) ;
76
- Ok ( Payload {
76
+ Ok ( Target {
77
77
prefix : parts[ 0 ] . parse ( ) ?,
78
78
min_ttl : parts[ 1 ] . parse ( ) ?,
79
79
max_ttl : parts[ 2 ] . parse ( ) ?,
80
80
n_flows : parts[ 3 ] . parse ( ) ?,
81
81
} )
82
82
}
83
83
84
- fn generate_probes ( payload : & Payload ) -> Result < Vec < Probe > > {
84
+ fn generate_probes ( target : & Target ) -> Result < Vec < Probe > > {
85
85
// TODO: We should pass an iterator instead of a vector.
86
86
let mut probes = vec ! [ ] ;
87
87
88
88
// First start by dividing the prefix into /24s or /64s, if necessary.
89
- let subnets = match payload . prefix {
89
+ let subnets = match target . prefix {
90
90
IpNet :: V4 ( _) => {
91
- let prefix_len = payload . prefix . prefix_len ( ) ;
91
+ let prefix_len = target . prefix . prefix_len ( ) ;
92
92
let target_len = if prefix_len > 24 { prefix_len } else { 24 } ;
93
- payload . prefix . subnets ( target_len)
93
+ target . prefix . subnets ( target_len)
94
94
}
95
95
IpNet :: V6 ( _) => {
96
- let prefix_len = payload . prefix . prefix_len ( ) ;
96
+ let prefix_len = target . prefix . prefix_len ( ) ;
97
97
let target_len = if prefix_len > 64 { prefix_len } else { 64 } ;
98
- payload . prefix . subnets ( target_len)
98
+ target . prefix . subnets ( target_len)
99
99
}
100
100
} ?;
101
101
@@ -106,11 +106,11 @@ fn generate_probes(payload: &Payload) -> Result<Vec<Probe>> {
106
106
// TODO: implement mapper-like generator such as the ones in diamond-miner.
107
107
// https://github.com/dioptra-io/diamond-miner/blob/main/diamond_miner/mappers.py
108
108
let mut prefix_hosts = subnet. hosts ( ) ;
109
- if payload . n_flows > prefix_hosts. count ( ) . try_into ( ) ? {
109
+ if target . n_flows > prefix_hosts. count ( ) . try_into ( ) ? {
110
110
return Err ( anyhow:: anyhow!( "Not enough hosts in the prefix" ) ) ;
111
111
}
112
112
113
- for _ in 0 ..payload . n_flows {
113
+ for _ in 0 ..target . n_flows {
114
114
let dst_addr = prefix_hosts. next ( ) . unwrap ( ) ;
115
115
116
116
// Randomize the probes order within a flow.
@@ -119,7 +119,7 @@ fn generate_probes(payload: &Payload) -> Result<Vec<Probe>> {
119
119
// The rational is to avoid results errors due to path changes.
120
120
// So, for now, probes belonging to the same traceroute flow will be sent close in time.
121
121
// TODO: is this shuffle fast?
122
- let mut ttls: Vec < u8 > = ( payload . min_ttl ..payload . max_ttl ) . collect ( ) ;
122
+ let mut ttls: Vec < u8 > = ( target . min_ttl ..target . max_ttl ) . collect ( ) ;
123
123
ttls. shuffle ( & mut thread_rng ( ) ) ;
124
124
125
125
for i in ttls {
@@ -139,28 +139,21 @@ fn generate_probes(payload: &Payload) -> Result<Vec<Probe>> {
139
139
140
140
pub async fn handle (
141
141
brokers : & str ,
142
+ _in_topics : & str ,
142
143
_in_group_id : & str ,
143
- _in_topics : & [ & str ] ,
144
144
out_topic : & str ,
145
+ target : & str ,
145
146
) -> Result < ( ) > {
146
- let payload = "2606:4700:4700::1111/128,1,32,1" ;
147
-
148
- // Probing
147
+ // Probe Generation
149
148
let config = create_config ( ) ;
150
- let payload = decode_payload ( payload) ?;
151
-
152
- let probes_to_send = generate_probes ( & payload) ;
153
- let probes_to_send = match probes_to_send {
154
- Ok ( probes) => probes,
155
- Err ( e) => {
156
- eprintln ! ( "Error: {}" , e) ;
157
- return Ok ( ( ) ) ;
158
- }
159
- } ;
149
+ let target = decode_payload ( target) ?;
150
+ let probes_to_send = generate_probes ( & target) ?;
160
151
152
+ // Probing
161
153
let result = task:: spawn_blocking ( move || probe ( config, probes_to_send. into_iter ( ) ) ) . await ?;
162
-
163
154
let ( _, _, results) = result?;
155
+
156
+ // Produce the results to Kafka topic
164
157
produce ( brokers, out_topic, results) . await ;
165
158
166
159
Ok ( ( ) )
0 commit comments