aquatic_udp: validate requests in socket workers

Also, don't send error responses for unconnected requests
This commit is contained in:
Joakim Frostegård 2021-10-18 01:14:32 +02:00
parent fc90c71a56
commit 7616df9686
11 changed files with 88 additions and 259 deletions

View file

@ -1,4 +1,4 @@
use std::net::SocketAddr;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
use std::time::{Duration, Instant};
use crossbeam_channel::{Receiver, Sender};
@ -13,15 +13,14 @@ use crate::common::*;
use crate::config::BenchConfig;
pub fn bench_announce_handler(
state: &State,
bench_config: &BenchConfig,
aquatic_config: &Config,
request_sender: &Sender<(Request, SocketAddr)>,
request_sender: &Sender<(ConnectedRequest, SocketAddr)>,
response_receiver: &Receiver<(Response, SocketAddr)>,
rng: &mut impl Rng,
info_hashes: &[InfoHash],
) -> (usize, Duration) {
let requests = create_requests(state, rng, info_hashes, bench_config.num_announce_requests);
let requests = create_requests(rng, info_hashes, bench_config.num_announce_requests);
let p = aquatic_config.handlers.max_requests_per_iter * bench_config.num_threads;
let mut num_responses = 0usize;
@ -37,7 +36,7 @@ pub fn bench_announce_handler(
for round in (0..bench_config.num_rounds).progress_with(pb) {
for request_chunk in requests.chunks(p) {
for (request, src) in request_chunk {
request_sender.send((request.clone().into(), *src)).unwrap();
request_sender.send((ConnectedRequest::Announce(request.clone()), *src)).unwrap();
}
while let Ok((Response::Announce(r), _)) = response_receiver.try_recv() {
@ -72,7 +71,6 @@ pub fn bench_announce_handler(
}
pub fn create_requests(
state: &State,
rng: &mut impl Rng,
info_hashes: &[InfoHash],
number: usize,
@ -83,15 +81,11 @@ pub fn create_requests(
let mut requests = Vec::new();
let connections = state.connections.lock();
let connection_keys: Vec<ConnectionKey> = connections.keys().take(number).cloned().collect();
for connection_key in connection_keys.into_iter() {
for _ in 0..number {
let info_hash_index = pareto_usize(rng, pareto, max_index);
let request = AnnounceRequest {
connection_id: connection_key.connection_id,
connection_id: ConnectionId(0),
transaction_id: TransactionId(rng.gen()),
info_hash: info_hashes[info_hash_index],
peer_id: PeerId(rng.gen()),
@ -105,7 +99,7 @@ pub fn create_requests(
port: Port(rng.gen()),
};
requests.push((request, connection_key.socket_addr));
requests.push((request, SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 1))));
}
requests