} else { None }
}
- fn connect_given_client(addr: SocketAddr, timeout: Duration, printer: &'static Printer, client: Arc<BGPClient>) {
+ fn connect_given_client(remote_asn: u32, addr: SocketAddr, timeout: Duration, printer: &'static Printer, client: Arc<BGPClient>) {
tokio::spawn(Delay::new(Instant::now() + timeout / 4).then(move |_| {
let connect_timeout = Delay::new(Instant::now() + timeout.clone()).then(|_| {
future::err(std::io::Error::new(std::io::ErrorKind::TimedOut, "timeout reached"))
.then(|_| {
future::err(())
}));
+ let peer_asn = if remote_asn > u16::max_value() as u32 { 23456 } else { remote_asn as u16 };
let _ = sender.try_send(Message::Open(Open {
version: 4,
- peer_asn: 23456,
+ peer_asn,
hold_timer: timeout.as_secs() as u16,
- identifier: 0x453b1215, // 69.59.18.21
+ identifier: 0x453b1215, // 69.59.18.21. Note that you never actually need to change this.
parameters: vec![OpenParameter::Capabilities(vec![
OpenCapability::MultiProtocol((AFI::IPV4, SAFI::Unicast)),
OpenCapability::MultiProtocol((AFI::IPV6, SAFI::Unicast)),
- OpenCapability::FourByteASN(397444),
+ OpenCapability::FourByteASN(remote_asn),
OpenCapability::RouteRefresh,
OpenCapability::AddPath(vec![
(AFI::IPV4, SAFI::Unicast, AddPathDirection::ReceivePaths),
})
}).then(move |_| {
if !client_reconn.shutdown.load(Ordering::Relaxed) {
- BGPClient::connect_given_client(addr, timeout, printer, client_reconn);
+ BGPClient::connect_given_client(remote_asn, addr, timeout, printer, client_reconn);
}
future::ok(())
})
);
}
- pub fn new(addr: SocketAddr, timeout: Duration, printer: &'static Printer) -> Arc<BGPClient> {
+ pub fn new(remote_asn: u32, addr: SocketAddr, timeout: Duration, printer: &'static Printer) -> Arc<BGPClient> {
let client = Arc::new(BGPClient {
routes: Mutex::new(RoutingTable::new()),
shutdown: AtomicBool::new(false),
});
- BGPClient::connect_given_client(addr, timeout, printer, Arc::clone(&client));
+ BGPClient::connect_given_client(remote_asn, addr, timeout, printer, Arc::clone(&client));
client
}
}
}
fn main() {
- if env::args().len() != 5 {
- println!("USAGE: dnsseed-rust datastore localPeerAddress tor_proxy_addr bgp_peer");
+ if env::args().len() != 6 {
+ println!("USAGE: dnsseed-rust datastore localPeerAddress tor_proxy_addr bgp_peer bgp_peer_asn");
return;
}
unsafe { TOR_PROXY = Some(tor_socks5_sockaddr); }
let bgp_sockaddr: SocketAddr = args.next().unwrap().parse().unwrap();
+ let bgp_peerasn: u32 = args.next().unwrap().parse().unwrap();
Store::new(path).and_then(move |store| {
unsafe { DATA_STORE = Some(Box::new(store)) };
let store = unsafe { DATA_STORE.as_ref().unwrap() };
unsafe { PRINTER = Some(Box::new(Printer::new(store))) };
- let bgp_client = BGPClient::new(bgp_sockaddr, Duration::from_secs(60), unsafe { PRINTER.as_ref().unwrap() });
+ let bgp_client = BGPClient::new(bgp_peerasn, bgp_sockaddr, Duration::from_secs(60), unsafe { PRINTER.as_ref().unwrap() });
make_trusted_conn(trusted_sockaddr, Arc::clone(&bgp_client));
reader::read(store, unsafe { PRINTER.as_ref().unwrap() }, bgp_client);