PEX: Announce support and message definition

This commit is contained in:
Ivan 2024-08-24 18:18:07 +02:00 committed by Igor Katson
parent c758d0022d
commit bbc951733f
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
7 changed files with 213 additions and 35 deletions

View file

@ -14,10 +14,7 @@ use librqbit_core::{
};
use parking_lot::RwLock;
use peer_binary_protocol::{
extended::{
handshake::{ExtendedHandshake, YourIP},
ExtendedMessage,
},
extended::{handshake::ExtendedHandshake, ExtendedMessage},
serialize_piece_preamble, Handshake, Message, MessageOwned, PIECE_MESSAGE_DEFAULT_LEN,
};
use serde::{Deserialize, Serialize};
@ -248,14 +245,14 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
let supports_extended = handshake_supports_extended;
if supports_extended {
let your_ip = self.addr.ip();
let mut my_extended = ExtendedHandshake::new();
my_extended.yourip = Some(YourIP(your_ip));
self.handler
.update_my_extended_handshake(&mut my_extended)?;
let my_extended = Message::Extended(ExtendedMessage::Handshake(my_extended));
trace!("sending extended handshake: {:?}", &my_extended);
my_extended.serialize(&mut write_buf, &|| None).unwrap();
my_extended
.serialize(&mut write_buf, &|| Default::default())
.unwrap();
with_timeout(rwtimeout, conn.write_all(&write_buf))
.await
.context("error writing extended handshake")?;
@ -318,7 +315,8 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
extended_handshake_ref
.read()
.as_ref()
.and_then(|e| e.ut_metadata())
.map(|e| e.peer_extended_messages())
.unwrap_or_default()
})?,
WriterRequest::ReadChunkRequest(chunk) => {
#[allow(unused_mut)]
@ -397,7 +395,6 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
if let Message::Extended(ExtendedMessage::Handshake(h)) = &message {
*extended_handshake_ref.write() = Some(h.clone_to_owned(None));
self.handler.on_extended_handshake(h)?;
trace!("remembered extended handshake for future serializing");
} else {
self.handler
.on_received_message(message)

View file

@ -57,7 +57,7 @@ impl ReadBuf {
anyhow::bail!("peer disconnected while reading handshake");
}
let (h, size) = Handshake::deserialize(&self.buf[..self.filled])
.map_err(|e| anyhow::anyhow!("error deserializing handshake: {:?}", e))?;
.map_err(|e| anyhow::anyhow!("error deserializing handshake: {:?} hadshake data {:?}", e, &self.buf[..self.filled.min(19)]))?;
self.processed = size;
Ok(h)
}

View file

@ -67,7 +67,7 @@ use librqbit_core::{
};
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use peer_binary_protocol::{
extended::{handshake::ExtendedHandshake, ut_metadata::UtMetadata, ExtendedMessage},
extended::{handshake::{ExtendedHandshake, YourIP}, ut_metadata::UtMetadata, ExtendedMessage},
Handshake, Message, MessageOwned, Piece, Request,
};
use peers::stats::atomic::AggregatePeerStatsAtomic;
@ -877,6 +877,9 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
self.send_metadata_piece(metadata_piece_id)
.with_context(|| format!("error sending metadata piece {metadata_piece_id}"))?;
}
Message::Extended(ExtendedMessage::UtPex(pex)) => {
trace!("received ut_pex: {:?} added peers v4: {:?}", pex, pex.added_peers().unwrap().collect::<Vec<_>>());
}
message => {
warn!("received unsupported message {:?}, ignoring", message);
}
@ -887,7 +890,7 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
fn serialize_bitfield_message_to_buf(&self, buf: &mut Vec<u8>) -> anyhow::Result<usize> {
let g = self.state.lock_read("serialize_bitfield_message_to_buf");
let msg = Message::Bitfield(ByteBuf(g.get_chunks()?.get_have_pieces().as_bytes()));
let len = msg.serialize(buf, &|| None)?;
let len = msg.serialize(buf, &|| Default::default())?;
trace!("sending: {:?}, length={}", &msg, len);
Ok(len)
}
@ -914,7 +917,10 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
self.state.file_ops().read_chunk(self.addr, chunk, buf)
}
fn on_extended_handshake(&self, _: &ExtendedHandshake<ByteBuf>) -> anyhow::Result<()> {
fn on_extended_handshake(&self, hs: &ExtendedHandshake<ByteBuf>) -> anyhow::Result<()> {
if let Some(peer_pex_msg_id) = hs.ut_pex() {
trace!("peer supports pex at {peer_pex_msg_id}");
}
Ok(())
}
@ -937,6 +943,8 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
&self,
handshake: &mut ExtendedHandshake<ByteBuf>,
) -> anyhow::Result<()> {
let your_ip = self.addr.ip();
handshake.yourip = Some(YourIP(your_ip));
let info_bytes = &self.state.torrent().info_bytes;
if !info_bytes.is_empty() {
if let Ok(len) = info_bytes.len().try_into() {