Skip to content

Commit

Permalink
fix(network): fix codec of peersharing peer address (#589)
Browse files Browse the repository at this point in the history
  • Loading branch information
lancevincentsalera authored Feb 5, 2025
1 parent f53ecb3 commit 510dcb7
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 10 deletions.
43 changes: 35 additions & 8 deletions pallas-network/src/miniprotocols/peersharing/codec.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::net::{Ipv4Addr, Ipv6Addr};

use super::protocol::*;
use pallas_codec::minicbor::{decode, encode, Decode, Encode, Encoder};

Expand All @@ -10,12 +12,25 @@ impl Encode<()> for PeerAddress {
match self {
PeerAddress::V4(address, port) => {
e.array(3)?.u16(0)?;
e.encode(address)?;
let word = address.to_bits();
e.encode(word)?;
e.encode(port)?;
}
PeerAddress::V6(address, port) => {
e.array(3)?.u16(1)?;
e.encode(address)?;
PeerAddress::V6(address, flow_info, scope_id, port) => {
e.array(8)?.u16(1)?;

let bits: u128 = address.to_bits();
let word1: u32 = (bits >> 96) as u32;
let word2: u32 = ((bits >> 64) & 0xFFFF_FFFF) as u32;
let word3: u32 = ((bits >> 32) & 0xFFFF_FFFF) as u32;
let word4: u32 = (bits & 0xFFFF_FFFF) as u32;

e.encode(&word1)?;
e.encode(&word2)?;
e.encode(&word3)?;
e.encode(&word4)?;
e.encode(flow_info)?;
e.encode(scope_id)?;
e.encode(port)?;
}
}
Expand All @@ -34,14 +49,26 @@ impl<'b> Decode<'b, ()> for PeerAddress {

match label {
0 => {
let address = d.decode()?;
let ip: u32 = d.decode()?;
let address = Ipv4Addr::from(ip);
let port = d.decode()?;
Ok(PeerAddress::V4(address, port))
}
1 => {
let address = d.decode()?;
let port = d.decode()?;
Ok(PeerAddress::V6(address, port))
let word1: u32 = d.decode()?;
let word2: u32 = d.decode()?;
let word3: u32 = d.decode()?;
let word4: u32 = d.decode()?;
let bits: u128 = ((word1 as u128) << 96)
| ((word2 as u128) << 64)
| ((word3 as u128) << 32)
| (word4 as u128);

let address = Ipv6Addr::from_bits(bits);
let flow_info: u32 = d.decode()?;
let scope_id: u32 = d.decode()?;
let port: u32 = d.decode()?;
Ok(PeerAddress::V6(address, flow_info, scope_id, port))
}
_ => Err(decode::Error::message("can't decode PeerAddress")),
}
Expand Down
2 changes: 1 addition & 1 deletion pallas-network/src/miniprotocols/peersharing/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub enum State {
#[derive(Debug, PartialEq, Clone)]
pub enum PeerAddress {
V4(Ipv4Addr, Port),
V6(Ipv6Addr, Port),
V6(Ipv6Addr, u32, u32, Port),
}

#[derive(Debug)]
Expand Down
7 changes: 6 additions & 1 deletion pallas-network/tests/protocols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1721,12 +1721,16 @@ pub async fn txsubmission_submit_to_mainnet_peer_n2n() {
#[cfg(unix)]
#[tokio::test]
pub async fn peer_sharing_server_and_client_happy_path() {
use tracing::info;

let _ = tracing_subscriber::fmt::init();

let amount = 3;

let peer_addresses = vec![
PeerAddress::V4(Ipv4Addr::new(127, 0, 0, 1), 3000),
PeerAddress::V4(Ipv4Addr::new(192, 0, 2, 146), 3001),
PeerAddress::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff), 8000),
PeerAddress::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff),123456789, 987654321, 8000),
];

let listener = TcpListener::bind(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 30003))
Expand All @@ -1744,6 +1748,7 @@ pub async fn peer_sharing_server_and_client_happy_path() {

// server receives share request from client

info!("server waiting for share request");
let amount_request = server_ps.recv_share_request().await.unwrap().unwrap();

assert_eq!(amount_request, amount);
Expand Down

0 comments on commit 510dcb7

Please sign in to comment.