net/quinn: Allow dropping buffers when buffer size exceeds maximum datagram size

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1613>
This commit is contained in:
Sanchayan Maity 2024-06-15 13:52:16 +05:30
parent e00ebca63f
commit 0bd98e2c34
3 changed files with 35 additions and 5 deletions

View file

@ -4099,6 +4099,18 @@
"type": "guint64",
"writable": true
},
"drop-buffer-for-datagram": {
"blurb": "Drop buffers when using datagram if buffer size > max datagram size",
"conditionally-available": false,
"construct": false,
"construct-only": false,
"controllable": false,
"default": "false",
"mutable": "null",
"readable": true,
"type": "gboolean",
"writable": true
},
"initial-mtu": {
"blurb": "Initial value to be used as the maximum UDP payload size",
"conditionally-available": false,

View file

@ -20,6 +20,7 @@ pub(crate) static DEFAULT_MAX_UPPER_BOUND_MTU: u16 = 65527;
pub(crate) static DEFAULT_UDP_PAYLOAD_SIZE: u16 = 1452;
pub(crate) static DEFAULT_MIN_UDP_PAYLOAD_SIZE: u16 = 1200;
pub(crate) static DEFAULT_MAX_UDP_PAYLOAD_SIZE: u16 = 65527;
pub(crate) static DEFAULT_DROP_BUFFER_FOR_DATAGRAM: bool = false;
/*
* For QUIC transport parameters

View file

@ -59,6 +59,7 @@ struct Settings {
certificate_file: Option<PathBuf>,
private_key_file: Option<PathBuf>,
transport_config: QuinnQuicTransportConfig,
drop_buffer_for_datagram: bool,
}
impl Default for Settings {
@ -78,6 +79,7 @@ impl Default for Settings {
certificate_file: None,
private_key_file: None,
transport_config: QuinnQuicTransportConfig::default(),
drop_buffer_for_datagram: DEFAULT_DROP_BUFFER_FOR_DATAGRAM,
}
}
}
@ -268,7 +270,12 @@ impl ObjectImpl for QuinnQuicSink {
.nick("Connection statistics")
.blurb("Connection statistics")
.read_only()
.build()
.build(),
glib::ParamSpecBoolean::builder("drop-buffer-for-datagram")
.nick("Drop buffer for datagram")
.blurb("Drop buffers when using datagram if buffer size > max datagram size")
.default_value(DEFAULT_DROP_BUFFER_FOR_DATAGRAM)
.build(),
]
});
@ -356,6 +363,9 @@ impl ObjectImpl for QuinnQuicSink {
let value = value.get::<u64>().expect("type checked upstream");
settings.transport_config.datagram_send_buffer_size = value as usize;
}
"drop-buffer-for-datagram" => {
settings.drop_buffer_for_datagram = value.get().expect("type checked upstream");
}
_ => unimplemented!(),
}
}
@ -414,6 +424,7 @@ impl ObjectImpl for QuinnQuicSink {
State::Stopped => get_stats(None).to_value(),
}
}
"drop-buffer-for-datagram" => settings.drop_buffer_for_datagram.to_value(),
_ => unimplemented!(),
}
}
@ -569,6 +580,7 @@ impl QuinnQuicSink {
let settings = self.settings.lock().unwrap();
let timeout = settings.timeout;
let use_datagram = settings.use_datagram;
let drop_buffer_for_datagram = settings.drop_buffer_for_datagram;
drop(settings);
let mut state = self.state.lock().unwrap();
@ -590,10 +602,15 @@ impl QuinnQuicSink {
match conn.max_datagram_size() {
Some(size) => {
if src.len() > size {
return Err(Some(gst::error_msg!(
gst::ResourceError::Failed,
["Sending data failed, current max datagram size: {size}, buffer size: {}", src.len()]
)));
if drop_buffer_for_datagram {
gst::warning!(CAT, imp: self, "Buffer dropped, current max datagram size: {size} > buffer size: {}", src.len());
return Ok(());
} else {
return Err(Some(gst::error_msg!(
gst::ResourceError::Failed,
["Sending data failed, current max datagram size: {size}, buffer size: {}", src.len()]
)));
}
}
match conn.send_datagram(Bytes::copy_from_slice(src)) {