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", "type": "guint64",
"writable": true "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": { "initial-mtu": {
"blurb": "Initial value to be used as the maximum UDP payload size", "blurb": "Initial value to be used as the maximum UDP payload size",
"conditionally-available": false, "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_UDP_PAYLOAD_SIZE: u16 = 1452;
pub(crate) static DEFAULT_MIN_UDP_PAYLOAD_SIZE: u16 = 1200; pub(crate) static DEFAULT_MIN_UDP_PAYLOAD_SIZE: u16 = 1200;
pub(crate) static DEFAULT_MAX_UDP_PAYLOAD_SIZE: u16 = 65527; pub(crate) static DEFAULT_MAX_UDP_PAYLOAD_SIZE: u16 = 65527;
pub(crate) static DEFAULT_DROP_BUFFER_FOR_DATAGRAM: bool = false;
/* /*
* For QUIC transport parameters * For QUIC transport parameters

View file

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