From 8be534c0863bb20778447aa9141abdafc421bbdd Mon Sep 17 00:00:00 2001 From: mirsal Date: Sun, 28 Mar 2021 08:31:32 +0000 Subject: [PATCH 1/2] Listen on IPv6 for peer discovery broadcasts The Future --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 886c4a5..742f947 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,7 +39,7 @@ async fn main() { let keypair = Keypair::read_or_generate(path.join("secret")).await; println!("{}", keypair.to_json().pretty(2)); - let socket = UdpSocket::bind("0.0.0.0:8008").await.unwrap(); + let socket = UdpSocket::bind(":::8008").await.unwrap(); let mut buf = [0u8; 1024]; loop { -- 2.30.2 From 0cfc123011fcba72b3cae51fe09829351222d88b Mon Sep 17 00:00:00 2001 From: mirsal Date: Wed, 31 Mar 2021 08:40:39 +0000 Subject: [PATCH 2/2] Quick and dirty peer discovery broadcast mock implementation * Use `async_std::task` for network loops * Send the generated public key over ipv4 udp broadcast frames (peer discovery is not functional yet, although multiple instances connected to the same link can now talk to each other, so yay.) --- src/main.rs | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index 742f947..137a4b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,48 @@ -use async_std::fs; +use async_std::{fs, task}; use async_std::net::UdpSocket; use async_std::path::PathBuf; +use async_std::sync::Arc; use clap::{load_yaml, App}; use ed25519_dalek::Keypair; mod keypair; -use keypair::SSBKeypair; +use keypair::{SSBKeypair, SSBPublicKey}; mod network; use network::Peer; type Config = toml::map::Map; +async fn peer_discovery_recv() { + let socket = UdpSocket::bind(":::8008").await.unwrap(); + let mut buf = [0u8; 1024]; + + loop { + let (amt, peer) = socket.recv_from(&mut buf).await.unwrap(); + let buf = &mut buf[..amt]; + let packet = String::from_utf8(buf.to_vec()).unwrap(); + println!( + "{} {}", + peer, + Peer::from_discovery_packet(&packet).to_discovery_packet() + ); + } +} + +async fn peer_discovery_send(pubkey: Arc) { + let socket = UdpSocket::bind(":::0").await.unwrap(); + let msg = format!("net:1.2.3.4:8023~shs:{}", &pubkey); + let buf = msg.as_bytes(); + + socket.set_broadcast(true).unwrap(); + + loop { + println!("Sending packet: {:?}", &msg); + socket.send_to(&buf, "255.255.255.255:8008").await.unwrap(); + task::sleep(std::time::Duration::from_secs(1)).await; + } +} + #[async_std::main] async fn main() { let options = load_yaml!("options.yaml"); @@ -39,17 +70,8 @@ async fn main() { let keypair = Keypair::read_or_generate(path.join("secret")).await; println!("{}", keypair.to_json().pretty(2)); - let socket = UdpSocket::bind(":::8008").await.unwrap(); - let mut buf = [0u8; 1024]; + let pubkey = keypair.public.to_base64(); - loop { - let (amt, peer) = socket.recv_from(&mut buf).await.unwrap(); - let buf = &mut buf[..amt]; - let packet = String::from_utf8(buf.to_vec()).unwrap(); - println!( - "{} {}", - peer, - Peer::from_discovery_packet(&packet).to_discovery_packet() - ); - } + task::spawn(peer_discovery_recv()); + task::spawn(peer_discovery_send(Arc::new(pubkey))).await; } -- 2.30.2