22// License, v. 2.0. If a copy of the MPL was not distributed with this
33// file, You can obtain one at https://mozilla.org/MPL/2.0/.
44
5- use mg_common:: net:: { IpPrefix , Ipv6Prefix , TunnelOrigin } ;
5+ use mg_common:: net:: TunnelOrigin ;
6+ use oxnet:: { IpNet , Ipv6Net } ;
67use schemars:: { JsonSchema , JsonSchema_repr } ;
78use serde:: { Deserialize , Serialize } ;
89use serde_repr:: { Deserialize_repr , Serialize_repr } ;
@@ -105,10 +106,7 @@ impl Db {
105106 }
106107 }
107108
108- pub fn originate (
109- & self ,
110- prefixes : & HashSet < Ipv6Prefix > ,
111- ) -> Result < ( ) , Error > {
109+ pub fn originate ( & self , prefixes : & HashSet < Ipv6Net > ) -> Result < ( ) , Error > {
112110 let tree = self . persistent_data . open_tree ( ORIGINATE ) ?;
113111 for p in prefixes {
114112 tree. insert ( p. db_key ( ) , "" ) ?;
@@ -130,7 +128,7 @@ impl Db {
130128 Ok ( ( ) )
131129 }
132130
133- pub fn originated ( & self ) -> Result < HashSet < Ipv6Prefix > , Error > {
131+ pub fn originated ( & self ) -> Result < HashSet < Ipv6Net > , Error > {
134132 let tree = self . persistent_data . open_tree ( ORIGINATE ) ?;
135133 let result = tree
136134 . scan_prefix ( vec ! [ ] )
@@ -145,7 +143,7 @@ impl Db {
145143 return None ;
146144 }
147145 } ;
148- Some ( match Ipv6Prefix :: from_db_key ( & key) {
146+ Some ( match Ipv6Net :: from_db_key ( & key) {
149147 Ok ( item) => item,
150148 Err ( e) => {
151149 error ! (
@@ -200,10 +198,7 @@ impl Db {
200198 Ok ( self . originated_tunnel ( ) ?. len ( ) )
201199 }
202200
203- pub fn withdraw (
204- & self ,
205- prefixes : & HashSet < Ipv6Prefix > ,
206- ) -> Result < ( ) , Error > {
201+ pub fn withdraw ( & self , prefixes : & HashSet < Ipv6Net > ) -> Result < ( ) , Error > {
207202 let tree = self . persistent_data . open_tree ( ORIGINATE ) ?;
208203 for p in prefixes {
209204 tree. remove ( p. db_key ( ) ) ?;
@@ -269,7 +264,7 @@ impl Db {
269264
270265 pub fn routes_by_vector (
271266 & self ,
272- dst : Ipv6Prefix ,
267+ dst : Ipv6Net ,
273268 nexthop : Ipv6Addr ,
274269 ) -> Vec < Route > {
275270 let data = self . data . lock ( ) . unwrap ( ) ;
@@ -356,7 +351,7 @@ pub struct TunnelRoute {
356351 Debug , Clone , PartialEq , Eq , Hash , Serialize , Deserialize , JsonSchema ,
357352) ]
358353pub struct Route {
359- pub destination : Ipv6Prefix ,
354+ pub destination : Ipv6Net ,
360355 pub nexthop : Ipv6Addr ,
361356 pub ifname : String ,
362357 pub path : Vec < String > ,
@@ -390,7 +385,7 @@ impl EffectiveTunnelRouteSet {
390385pub fn effective_route_set (
391386 full : & HashSet < TunnelRoute > ,
392387) -> HashSet < TunnelRoute > {
393- let mut sets = HashMap :: < IpPrefix , EffectiveTunnelRouteSet > :: new ( ) ;
388+ let mut sets = HashMap :: < IpNet , EffectiveTunnelRouteSet > :: new ( ) ;
394389 for x in full. iter ( ) {
395390 match sets. get_mut ( & x. origin . overlay_prefix ) {
396391 Some ( set) => {
@@ -458,24 +453,25 @@ trait DbKey: Sized {
458453 fn from_db_key ( v : & [ u8 ] ) -> Result < Self , Error > ;
459454}
460455
461- impl DbKey for Ipv6Prefix {
456+ impl DbKey for Ipv6Net {
462457 fn db_key ( & self ) -> Vec < u8 > {
463- let mut buf: Vec < u8 > = self . addr . octets ( ) . into ( ) ;
464- buf. push ( self . len ) ;
458+ let mut buf: Vec < u8 > = self . addr ( ) . octets ( ) . into ( ) ;
459+ buf. push ( self . width ( ) ) ;
465460 buf
466461 }
467462
468463 fn from_db_key ( v : & [ u8 ] ) -> Result < Self , Error > {
469464 if v. len ( ) < 17 {
470465 Err ( Error :: DbKey ( format ! (
471- "buffer to short for prefix 6 key {} < 17" ,
466+ "buffer too short for prefix 6 key {} < 17" ,
472467 v. len( )
473468 ) ) )
474469 } else {
475- Ok ( Self {
476- addr : Ipv6Addr :: from ( <[ u8 ; 16 ] >:: try_from ( & v[ ..16 ] ) . unwrap ( ) ) ,
477- len : v[ 16 ] ,
478- } )
470+ Self :: new (
471+ Ipv6Addr :: from ( <[ u8 ; 16 ] >:: try_from ( & v[ ..16 ] ) . unwrap ( ) ) ,
472+ v[ 16 ] ,
473+ )
474+ . map_err ( |e| Error :: DbKey ( e. to_string ( ) ) )
479475 }
480476 }
481477}
@@ -494,7 +490,6 @@ impl From<crate::db::TunnelRoute> for TunnelOrigin {
494490#[ cfg( test) ]
495491mod test {
496492 use super :: * ;
497- use mg_common:: net:: { IpPrefix , Ipv4Prefix } ;
498493 use pretty_assertions:: assert_eq;
499494 use std:: collections:: HashSet ;
500495
@@ -503,10 +498,7 @@ mod test {
503498 let mut before = HashSet :: < TunnelRoute > :: new ( ) ;
504499 before. insert ( TunnelRoute {
505500 origin : TunnelOrigin {
506- overlay_prefix : IpPrefix :: V4 ( Ipv4Prefix {
507- addr : "0.0.0.0" . parse ( ) . unwrap ( ) ,
508- len : 0 ,
509- } ) ,
501+ overlay_prefix : "0.0.0.0/0" . parse ( ) . unwrap ( ) ,
510502 boundary_addr : "fd00:a::1" . parse ( ) . unwrap ( ) ,
511503 vni : 99 ,
512504 metric : 0 ,
@@ -515,10 +507,7 @@ mod test {
515507 } ) ;
516508 before. insert ( TunnelRoute {
517509 origin : TunnelOrigin {
518- overlay_prefix : IpPrefix :: V4 ( Ipv4Prefix {
519- addr : "0.0.0.0" . parse ( ) . unwrap ( ) ,
520- len : 0 ,
521- } ) ,
510+ overlay_prefix : "0.0.0.0/0" . parse ( ) . unwrap ( ) ,
522511 boundary_addr : "fd00:b::1" . parse ( ) . unwrap ( ) ,
523512 vni : 99 ,
524513 metric : 0 ,
@@ -530,10 +519,7 @@ mod test {
530519 let mut after = HashSet :: < TunnelRoute > :: new ( ) ;
531520 after. insert ( TunnelRoute {
532521 origin : TunnelOrigin {
533- overlay_prefix : IpPrefix :: V4 ( Ipv4Prefix {
534- addr : "0.0.0.0" . parse ( ) . unwrap ( ) ,
535- len : 0 ,
536- } ) ,
522+ overlay_prefix : "0.0.0.0/0" . parse ( ) . unwrap ( ) ,
537523 boundary_addr : "fd00:a::1" . parse ( ) . unwrap ( ) ,
538524 vni : 99 ,
539525 metric : 0 ,
@@ -542,10 +528,7 @@ mod test {
542528 } ) ;
543529 after. insert ( TunnelRoute {
544530 origin : TunnelOrigin {
545- overlay_prefix : IpPrefix :: V4 ( Ipv4Prefix {
546- addr : "0.0.0.0" . parse ( ) . unwrap ( ) ,
547- len : 0 ,
548- } ) ,
531+ overlay_prefix : "0.0.0.0/0" . parse ( ) . unwrap ( ) ,
549532 boundary_addr : "fd00:b::1" . parse ( ) . unwrap ( ) ,
550533 vni : 99 ,
551534 metric : 100 ,
@@ -570,10 +553,7 @@ mod test {
570553 let mut expected_del = HashSet :: < TunnelRoute > :: new ( ) ;
571554 expected_del. insert ( TunnelRoute {
572555 origin : TunnelOrigin {
573- overlay_prefix : IpPrefix :: V4 ( Ipv4Prefix {
574- addr : "0.0.0.0" . parse ( ) . unwrap ( ) ,
575- len : 0 ,
576- } ) ,
556+ overlay_prefix : "0.0.0.0/0" . parse ( ) . unwrap ( ) ,
577557 boundary_addr : "fd00:a::1" . parse ( ) . unwrap ( ) ,
578558 vni : 99 ,
579559 metric : 0 ,
0 commit comments