udp: improve code in send_response

This commit is contained in:
Joakim Frostegård 2022-07-04 08:45:13 +02:00
parent 8f37459298
commit 9d3420ba1c

View file

@ -76,69 +76,68 @@ fn send_response(
) { ) {
let mut cursor = Cursor::new(buffer); let mut cursor = Cursor::new(buffer);
match response.write(&mut cursor) { if let Err(err) = response.write(&mut cursor) {
Ok(()) => { ::log::error!("Converting response to bytes failed: {:#}", err);
let amt = cursor.position() as usize;
let canonical_addr_is_ipv4 = canonical_addr.is_ipv4(); return;
}
let addr = if config.network.address.is_ipv4() { let bytes_written = cursor.position() as usize;
canonical_addr
.get_ipv4() let addr = if config.network.address.is_ipv4() {
.expect("found peer ipv6 address while running bound to ipv4 address") canonical_addr
.get_ipv4()
.expect("found peer ipv6 address while running bound to ipv4 address")
} else {
canonical_addr.get_ipv6_mapped()
};
match socket.send_to(&cursor.get_ref()[..bytes_written], addr) {
Ok(amt) if config.statistics.active() => {
let stats = if canonical_addr.is_ipv4() {
&state.statistics_ipv4
} else { } else {
canonical_addr.get_ipv6_mapped() &state.statistics_ipv6
}; };
match socket.send_to(&cursor.get_ref()[..amt], addr) { stats.bytes_sent.fetch_add(amt, Ordering::Relaxed);
Ok(amt) if config.statistics.active() => {
let stats = if canonical_addr_is_ipv4 {
&state.statistics_ipv4
} else {
&state.statistics_ipv6
};
stats.bytes_sent.fetch_add(amt, Ordering::Relaxed); match response {
Response::Connect(_) => {
match response { stats.responses_sent_connect.fetch_add(1, Ordering::Relaxed);
Response::Connect(_) => { }
stats.responses_sent_connect.fetch_add(1, Ordering::Relaxed); Response::AnnounceIpv4(_) | Response::AnnounceIpv6(_) => {
} stats
Response::AnnounceIpv4(_) | Response::AnnounceIpv6(_) => { .responses_sent_announce
stats .fetch_add(1, Ordering::Relaxed);
.responses_sent_announce }
.fetch_add(1, Ordering::Relaxed); Response::Scrape(_) => {
} stats.responses_sent_scrape.fetch_add(1, Ordering::Relaxed);
Response::Scrape(_) => { }
stats.responses_sent_scrape.fetch_add(1, Ordering::Relaxed); Response::Error(_) => {
} stats.responses_sent_error.fetch_add(1, Ordering::Relaxed);
Response::Error(_) => {
stats.responses_sent_error.fetch_add(1, Ordering::Relaxed);
}
}
} }
Ok(_) => (),
Err(err) => match resend_buffer {
Some(resend_buffer)
if (err.raw_os_error() == Some(ENOBUFS))
|| (err.kind() == ErrorKind::WouldBlock) =>
{
if resend_buffer.len() < config.network.resend_buffer_max_len {
::log::info!("Adding response to resend queue, since sending it to {} failed with: {:#}", addr, err);
resend_buffer.push((response, canonical_addr));
} else {
::log::warn!("Response resend buffer full, dropping response");
}
}
_ => {
::log::warn!("Sending response to {} failed: {:#}", addr, err);
}
},
} }
} }
Ok(_) => (),
Err(err) => { Err(err) => {
::log::error!("Converting response to bytes failed: {:#}", err); match resend_buffer {
Some(resend_buffer)
if (err.raw_os_error() == Some(ENOBUFS))
|| (err.kind() == ErrorKind::WouldBlock) =>
{
if resend_buffer.len() < config.network.resend_buffer_max_len {
::log::info!("Adding response to resend queue, since sending it to {} failed with: {:#}", addr, err);
resend_buffer.push((response, canonical_addr));
} else {
::log::warn!("Response resend buffer full, dropping response");
}
}
_ => {
::log::warn!("Sending response to {} failed: {:#}", addr, err);
}
}
} }
} }
} }