pre-alloc routing table
[dnsseed-rust] / src / bgp_client.rs
index dc5c6736a923fdfdbc2487d0fc51e2718034a40e..5f436b1ca106f12d132952436961cd5df0db07a7 100644 (file)
@@ -22,7 +22,7 @@ use futures::sync::mpsc;
 use crate::printer::{Printer, Stat};
 use crate::timeout_stream::TimeoutStream;
 
-const PATH_SUFFIX_LEN: usize = 2;
+const PATH_SUFFIX_LEN: usize = 3;
 #[derive(Clone)]
 struct Route { // 32 bytes with a path id u32
        path_suffix: [u32; PATH_SUFFIX_LEN],
@@ -31,7 +31,7 @@ struct Route { // 32 bytes with a path id u32
        med: u32,
 }
 #[allow(dead_code)]
-const ROUTE_LEN: usize = 32 - std::mem::size_of::<(u32, Route)>();
+const ROUTE_LEN: usize = 36 - std::mem::size_of::<(u32, Route)>();
 
 // To keep memory tight (and since we dont' need such close alignment), newtype the v4/v6 routing
 // table entries to make sure they are aligned to single bytes.
@@ -84,8 +84,8 @@ struct RoutingTable {
 impl RoutingTable {
        fn new() -> Self {
                Self {
-                       v4_table: HashMap::new(),
-                       v6_table: HashMap::new(),
+                       v4_table: HashMap::with_capacity(900_000),
+                       v6_table: HashMap::with_capacity(100_000),
                }
        }
 
@@ -145,7 +145,6 @@ impl RoutingTable {
                        NLRIEncoding::IP_MPLS_WITH_PATH_ID(_) => (),
                        NLRIEncoding::IP_VPN_MPLS(_) => (),
                        NLRIEncoding::L2VPN(_) => (),
-                       NLRIEncoding::FLOWSPEC(_) => (),
                };
        }
 
@@ -176,7 +175,6 @@ impl RoutingTable {
                        NLRIEncoding::IP_MPLS_WITH_PATH_ID(_) => (),
                        NLRIEncoding::IP_VPN_MPLS(_) => (),
                        NLRIEncoding::L2VPN(_) => (),
-                       NLRIEncoding::FLOWSPEC(_) => (),
                };
        }
 }
@@ -222,6 +220,9 @@ impl codec::Decoder for MsgCoder {
                match reader.read() {
                        Ok((_header, msg)) => {
                                decoder.buf.advance(decoder.pos);
+                               if let Message::Open(ref o) = &msg {
+                                       self.0 = Some(Capabilities::from_parameters(o.parameters.clone()));
+                               }
                                Ok(Some(msg))
                        },
                        Err(e) => match e.kind() {