@@ -14,7 +14,7 @@ pub struct WgConfig {
1414 pub private_key : String ,
1515 pub listen_port : u16 ,
1616 pub ip : Ipv4Net ,
17- pub reserved_net : Ipv4Net ,
17+ pub reserved_net : Vec < Ipv4Net > ,
1818 pub client_ip_range : Ipv4Net ,
1919 pub interface : String ,
2020 pub config_path : String ,
@@ -23,18 +23,20 @@ pub struct WgConfig {
2323
2424impl WgConfig {
2525 fn validate ( & self ) -> Result < ( ) > {
26- validate ( self . ip , self . reserved_net , self . client_ip_range )
26+ validate ( self . ip , & self . reserved_net , self . client_ip_range )
2727 }
2828}
2929
30- fn validate ( ip : Ipv4Net , reserved_net : Ipv4Net , client_ip_range : Ipv4Net ) -> Result < ( ) > {
30+ fn validate ( ip : Ipv4Net , reserved_net : & [ Ipv4Net ] , client_ip_range : Ipv4Net ) -> Result < ( ) > {
3131 // The reserved net must be in the network
32- if !ip. contains ( & reserved_net) {
33- bail ! ( "Reserved net is not in the network" ) ;
32+ for net in reserved_net {
33+ if !ip. contains ( net) {
34+ bail ! ( "Reserved net is not in the network" ) ;
35+ }
3436 }
3537
36- // The ip must be in the reserved net
37- if !reserved_net. contains ( & ip. addr ( ) ) {
38+ // The ip must be in one of the reserved net
39+ if !reserved_net. iter ( ) . any ( |net| net . contains ( & ip. addr ( ) ) ) {
3840 bail ! ( "Wg peer IP is not in the reserved net" ) ;
3941 }
4042
@@ -294,7 +296,7 @@ mod tests {
294296 let reserved_net = Ipv4Net :: from_str ( "10.1.2.0/30" ) . unwrap ( ) ;
295297 let result = validate (
296298 ip,
297- reserved_net,
299+ & [ reserved_net] ,
298300 Ipv4Net :: from_str ( "10.1.2.128/25" ) . unwrap ( ) ,
299301 ) ;
300302 assert ! ( result. is_ok( ) ) ;
@@ -304,7 +306,7 @@ mod tests {
304306 let reserved_net = Ipv4Net :: from_str ( "10.1.0.0/16" ) . unwrap ( ) ;
305307 let result = validate (
306308 ip,
307- reserved_net,
309+ & [ reserved_net] ,
308310 Ipv4Net :: from_str ( "10.2.0.128/25" ) . unwrap ( ) ,
309311 ) ;
310312 assert ! ( result. is_err( ) ) ;
@@ -318,7 +320,7 @@ mod tests {
318320 let reserved_net = Ipv4Net :: from_str ( "10.1.2.0/30" ) . unwrap ( ) ;
319321 let result = validate (
320322 ip,
321- reserved_net,
323+ & [ reserved_net] ,
322324 Ipv4Net :: from_str ( "10.1.2.128/25" ) . unwrap ( ) ,
323325 ) ;
324326 assert ! ( result. is_err( ) ) ;
@@ -332,7 +334,7 @@ mod tests {
332334 let reserved_net = Ipv4Net :: from_str ( "10.1.2.0/30" ) . unwrap ( ) ;
333335 let result = validate (
334336 ip,
335- reserved_net,
337+ & [ reserved_net] ,
336338 Ipv4Net :: from_str ( "10.1.3.128/25" ) . unwrap ( ) ,
337339 ) ;
338340 assert ! ( result. is_err( ) ) ;
0 commit comments