mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 02:35:31 +00:00
udp: improve code in send_response
This commit is contained in:
parent
8f37459298
commit
9d3420ba1c
1 changed files with 52 additions and 53 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue