mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 18:55:32 +00:00
udp: use only PeerId for peer map key, skip ip address
Having the ip to avoid collisions likely doesn't adress any meaningful threat.
This commit is contained in:
parent
6bd63c2f5d
commit
853ed91638
2 changed files with 18 additions and 30 deletions
|
|
@ -158,13 +158,7 @@ impl<I: Ip> Peer<I> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
|
pub type PeerMap<I> = AHashIndexMap<PeerId, Peer<I>>;
|
||||||
pub struct PeerMapKey<I: Ip> {
|
|
||||||
pub ip: I,
|
|
||||||
pub peer_id: PeerId,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub type PeerMap<I> = AHashIndexMap<PeerMapKey<I>, Peer<I>>;
|
|
||||||
|
|
||||||
pub struct TorrentData<I: Ip> {
|
pub struct TorrentData<I: Ip> {
|
||||||
pub peers: PeerMap<I>,
|
pub peers: PeerMap<I>,
|
||||||
|
|
|
||||||
|
|
@ -138,11 +138,6 @@ fn handle_announce_request_inner<I: Ip>(
|
||||||
peer_ip: I,
|
peer_ip: I,
|
||||||
peer_valid_until: ValidUntil,
|
peer_valid_until: ValidUntil,
|
||||||
) -> ProtocolAnnounceResponse<I> {
|
) -> ProtocolAnnounceResponse<I> {
|
||||||
let peer_key = PeerMapKey {
|
|
||||||
ip: peer_ip,
|
|
||||||
peer_id: request.peer_id,
|
|
||||||
};
|
|
||||||
|
|
||||||
let peer_status = PeerStatus::from_event_and_bytes_left(request.event, request.bytes_left);
|
let peer_status = PeerStatus::from_event_and_bytes_left(request.event, request.bytes_left);
|
||||||
|
|
||||||
let peer = Peer {
|
let peer = Peer {
|
||||||
|
|
@ -158,14 +153,14 @@ fn handle_announce_request_inner<I: Ip>(
|
||||||
PeerStatus::Leeching => {
|
PeerStatus::Leeching => {
|
||||||
torrent_data.num_leechers += 1;
|
torrent_data.num_leechers += 1;
|
||||||
|
|
||||||
torrent_data.peers.insert(peer_key, peer)
|
torrent_data.peers.insert(request.peer_id, peer)
|
||||||
}
|
}
|
||||||
PeerStatus::Seeding => {
|
PeerStatus::Seeding => {
|
||||||
torrent_data.num_seeders += 1;
|
torrent_data.num_seeders += 1;
|
||||||
|
|
||||||
torrent_data.peers.insert(peer_key, peer)
|
torrent_data.peers.insert(request.peer_id, peer)
|
||||||
}
|
}
|
||||||
PeerStatus::Stopped => torrent_data.peers.remove(&peer_key),
|
PeerStatus::Stopped => torrent_data.peers.remove(&request.peer_id),
|
||||||
};
|
};
|
||||||
|
|
||||||
match opt_removed_peer.map(|peer| peer.status) {
|
match opt_removed_peer.map(|peer| peer.status) {
|
||||||
|
|
@ -184,7 +179,7 @@ fn handle_announce_request_inner<I: Ip>(
|
||||||
rng,
|
rng,
|
||||||
&torrent_data.peers,
|
&torrent_data.peers,
|
||||||
max_num_peers_to_take,
|
max_num_peers_to_take,
|
||||||
peer_key,
|
request.peer_id,
|
||||||
Peer::to_response_peer,
|
Peer::to_response_peer,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -269,22 +264,20 @@ mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
fn gen_peer_map_key_and_value(i: u32) -> (PeerMapKey<Ipv4Addr>, Peer<Ipv4Addr>) {
|
fn gen_peer_id(i: u32) -> PeerId {
|
||||||
let ip_address = Ipv4Addr::from(i.to_be_bytes());
|
let mut peer_id = PeerId([0; 20]);
|
||||||
let peer_id = PeerId([0; 20]);
|
|
||||||
|
|
||||||
let key = PeerMapKey {
|
peer_id.0[0..4].copy_from_slice(&i.to_ne_bytes());
|
||||||
ip: ip_address,
|
|
||||||
peer_id,
|
peer_id
|
||||||
};
|
}
|
||||||
let value = Peer {
|
fn gen_peer(i: u32) -> Peer<Ipv4Addr> {
|
||||||
ip_address,
|
Peer {
|
||||||
|
ip_address: Ipv4Addr::from(i.to_be_bytes()),
|
||||||
port: Port(1),
|
port: Port(1),
|
||||||
status: PeerStatus::Leeching,
|
status: PeerStatus::Leeching,
|
||||||
valid_until: ValidUntil::new(0),
|
valid_until: ValidUntil::new(0),
|
||||||
};
|
}
|
||||||
|
|
||||||
(key, value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -299,7 +292,8 @@ mod tests {
|
||||||
let mut opt_sender_peer = None;
|
let mut opt_sender_peer = None;
|
||||||
|
|
||||||
for i in 0..gen_num_peers {
|
for i in 0..gen_num_peers {
|
||||||
let (key, value) = gen_peer_map_key_and_value((i << 16) + i);
|
let key = gen_peer_id(i);
|
||||||
|
let value = gen_peer((i << 16) + i);
|
||||||
|
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
opt_sender_key = Some(key);
|
opt_sender_key = Some(key);
|
||||||
|
|
@ -315,7 +309,7 @@ mod tests {
|
||||||
&mut rng,
|
&mut rng,
|
||||||
&peer_map,
|
&peer_map,
|
||||||
req_num_peers,
|
req_num_peers,
|
||||||
opt_sender_key.unwrap_or_else(|| gen_peer_map_key_and_value(1).0),
|
opt_sender_key.unwrap_or_else(|| gen_peer_id(1)),
|
||||||
Peer::to_response_peer,
|
Peer::to_response_peer,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue