@@ -17,6 +17,7 @@ use crate::{
1717 dcb:: DstCtrlBlock ,
1818 error:: * ,
1919 network:: NetworkManager ,
20+ opt:: Targets ,
2021 prober:: ProbePhase ,
2122 prober:: ProbeResult ,
2223 prober:: Prober ,
@@ -46,31 +47,14 @@ pub struct Tracerouter {
4647
4748impl Tracerouter {
4849 pub fn new ( ) -> Result < Self > {
49- if OPT . grain > ( OPT . targets . max_prefix_len ( ) - OPT . targets . prefix_len ( ) ) {
50- return Err ( Error :: BadGrainOrNet ( OPT . grain , OPT . targets ) ) ;
51- }
52-
5350 log:: info!(
5451 "Using interface `{}` ({})" ,
5552 OPT . interface. name,
5653 crate :: utils:: get_interface_ipv4_addr( & OPT . interface) . unwrap( )
5754 ) ;
5855
59- log:: info!( "Generating targets..." ) ;
60- let all_count = Self :: targets_count ( ) ;
61- let mut targets = DcbMap :: with_capacity ( all_count) ;
62- for addr in Self :: random_targets ( ) {
63- targets. insert (
64- Self :: addr_to_key ( addr) ,
65- DstCtrlBlock :: new ( addr, OPT . default_ttl ) ,
66- ) ;
67- }
68- let filtered_count = targets. len ( ) ;
69- log:: info!(
70- "Generated {} targets, {} removed" ,
71- filtered_count,
72- all_count - filtered_count
73- ) ;
56+ log:: info!( "Initializing targets..." ) ;
57+ let targets = Self :: generate_targets ( ) ?;
7458
7559 Ok ( Self {
7660 targets : Arc :: new ( targets) ,
@@ -83,28 +67,67 @@ impl Tracerouter {
8367 ( u >> ( OPT . grain ) ) as AddrKey
8468 }
8569
86- fn targets_count ( ) -> usize {
87- 1 << ( ( OPT . targets . max_prefix_len ( ) - OPT . targets . prefix_len ( ) ) - OPT . grain )
88- }
70+ fn generate_targets ( ) -> Result < DcbMap > {
71+ match OPT . targets . clone ( ) {
72+ Targets :: Net ( net) => {
73+ if OPT . grain > ( net. max_prefix_len ( ) - net. prefix_len ( ) ) {
74+ return Err ( Error :: BadGrainOrNet ( OPT . grain , net) ) ;
75+ }
8976
90- fn random_targets ( ) -> impl Iterator < Item = Ipv4Addr > {
91- let mut rng = StdRng :: seed_from_u64 ( OPT . seed ) ;
92- let subnets = OPT
93- . targets
94- . subnets ( OPT . targets . max_prefix_len ( ) - OPT . grain )
95- . unwrap ( ) ;
96-
97- subnets
98- . map ( move |net| net. addr ( ) . saturating_add ( rng. gen_range ( 0 , 1 << OPT . grain ) ) )
99- . filter ( |addr| {
100- if OPT . global_only && OPT . allow_private {
101- addr. is_bz_global ( ) || addr. is_private ( )
102- } else if OPT . global_only {
103- addr. is_bz_global ( )
104- } else {
105- true
77+ let mut rng = StdRng :: seed_from_u64 ( OPT . seed ) ;
78+ let subnets = net. subnets ( net. max_prefix_len ( ) - OPT . grain ) . unwrap ( ) ;
79+
80+ let iter = subnets
81+ . map ( move |net| net. addr ( ) . saturating_add ( rng. gen_range ( 0 , 1 << OPT . grain ) ) )
82+ . filter ( |addr| {
83+ if OPT . global_only && OPT . allow_private {
84+ addr. is_bz_global ( ) || addr. is_private ( )
85+ } else if OPT . global_only {
86+ addr. is_bz_global ( )
87+ } else {
88+ true
89+ }
90+ } ) ;
91+
92+ let all_count = 1 << ( ( net. max_prefix_len ( ) - net. prefix_len ( ) ) - OPT . grain ) ;
93+ let mut generated_targets = DcbMap :: with_capacity ( all_count) ;
94+ for addr in iter {
95+ generated_targets. insert (
96+ Self :: addr_to_key ( addr) ,
97+ DstCtrlBlock :: new ( addr, OPT . default_ttl ) ,
98+ ) ;
10699 }
107- } )
100+ let filtered_count = generated_targets. len ( ) ;
101+ log:: info!(
102+ "Generated {} targets, {} removed" ,
103+ filtered_count,
104+ all_count - filtered_count
105+ ) ;
106+
107+ Ok ( generated_targets)
108+ }
109+
110+ Targets :: List ( path) => {
111+ let mut generated_targets = DcbMap :: new ( ) ;
112+
113+ let content = std:: fs:: read_to_string ( path) ?;
114+ for line in content. lines ( ) {
115+ if line. is_empty ( ) {
116+ continue ;
117+ }
118+ let addr = line
119+ . parse ( )
120+ . or ( Err ( Error :: InvalidIpv4Addr ( line. to_owned ( ) ) ) ) ?;
121+ generated_targets. insert (
122+ Self :: addr_to_key ( addr) ,
123+ DstCtrlBlock :: new ( addr, OPT . default_ttl ) ,
124+ ) ;
125+ }
126+ log:: info!( "Imported {} targets from file" , generated_targets. len( ) ) ;
127+
128+ Ok ( generated_targets)
129+ }
130+ }
108131 }
109132}
110133
@@ -349,13 +372,14 @@ mod test {
349372 #[ test]
350373 fn test_generation ( ) {
351374 let tr = Tracerouter :: new ( ) . unwrap ( ) ;
352- assert_eq ! (
353- tr. targets. len( ) ,
354- 1 << ( 32 - OPT . targets. prefix_len( ) - OPT . grain)
355- ) ;
356- assert ! ( tr
357- . targets
358- . values( )
359- . all( |dcb| OPT . targets. contains( & dcb. addr) ) ) ;
375+ if let Targets :: Net ( targets) = OPT . targets {
376+ assert_eq ! (
377+ tr. targets. len( ) ,
378+ 1 << ( 32 - targets. prefix_len( ) - OPT . grain)
379+ ) ;
380+ assert ! ( tr. targets. values( ) . all( |dcb| targets. contains( & dcb. addr) ) ) ;
381+ } else {
382+ panic ! ( ) ;
383+ }
360384 }
361385}
0 commit comments