mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-10-02 08:42:15 +00:00
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:
parent
e00ebca63f
commit
0bd98e2c34
3 changed files with 35 additions and 5 deletions
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,10 +602,15 @@ impl QuinnQuicSink {
|
||||||
match conn.max_datagram_size() {
|
match conn.max_datagram_size() {
|
||||||
Some(size) => {
|
Some(size) => {
|
||||||
if src.len() > size {
|
if src.len() > size {
|
||||||
return Err(Some(gst::error_msg!(
|
if drop_buffer_for_datagram {
|
||||||
gst::ResourceError::Failed,
|
gst::warning!(CAT, imp: self, "Buffer dropped, current max datagram size: {size} > buffer size: {}", src.len());
|
||||||
["Sending data failed, 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)) {
|
match conn.send_datagram(Bytes::copy_from_slice(src)) {
|
||||||
|
|
Loading…
Reference in a new issue