11use std:: collections:: { HashSet , VecDeque } ;
22use std:: fmt;
33use std:: net:: SocketAddr ;
4+ use std:: ops:: RangeInclusive ;
45use std:: panic:: { RefUnwindSafe , UnwindSafe } ;
56use std:: sync:: Arc ;
67use std:: time:: { Duration , Instant } ;
@@ -11,7 +12,7 @@ use crate::Sha1HmacProvider;
1112use crate :: preference:: default_local_preference;
1213use crate :: stun:: { Class as StunClass , Method as StunMethod , StunTiming } ;
1314use crate :: stun:: { StunMessage , StunPacket , TransId } ;
14- use str0m_proto:: { DATAGRAM_MTU , DATAGRAM_MTU_WARN , Id , Transmit } ;
15+ use str0m_proto:: { DATAGRAM_MTU_TARGET , DATAGRAM_MTU_WARN , Id , Transmit } ;
1516use str0m_proto:: { NonCryptographicRng , Pii , Protocol } ;
1617
1718use crate :: candidate:: { Candidate , CandidateKind } ;
@@ -106,6 +107,10 @@ pub struct IceAgent {
106107
107108 /// Pluggable calculation of local preference.
108109 local_preference : LocalPreferenceHolder ,
110+
111+ /// Target MTU (start) and warn threshold (end). Buffer sizing uses the
112+ /// target; oversized outgoing datagrams above the warn threshold log a warning.
113+ mtu : RangeInclusive < usize > ,
109114}
110115
111116/// IceAgent contains only static references to thread-safe traits,
@@ -341,9 +346,25 @@ impl IceAgent {
341346 timing_config : StunTiming :: default ( ) ,
342347 local_preference : LocalPreferenceHolder ( Arc :: new ( default_local_preference) ) ,
343348 sha1_hmac_provider,
349+ mtu : DATAGRAM_MTU_TARGET ..=DATAGRAM_MTU_WARN ,
344350 }
345351 }
346352
353+ /// Set the UDP datagram MTU range used for sizing internal buffers (target..=warn).
354+ pub fn set_mtu ( & mut self , mtu : RangeInclusive < usize > ) {
355+ self . mtu = mtu;
356+ }
357+
358+ /// Target MTU used for sizing outgoing STUN buffers.
359+ pub fn mtu ( & self ) -> usize {
360+ * self . mtu . start ( )
361+ }
362+
363+ /// Threshold above which an outgoing datagram triggers an MTU warning.
364+ pub fn mtu_warn ( & self ) -> usize {
365+ * self . mtu . end ( )
366+ }
367+
347368 /// Sets the control tie breaker of this agent.
348369 ///
349370 /// By default, this is randomly generated and per the ICE spec,
@@ -1265,8 +1286,8 @@ impl IceAgent {
12651286 pub fn poll_transmit ( & mut self ) -> Option < Transmit > {
12661287 let x = self . transmit . pop_front ( ) ;
12671288 if let Some ( x) = & x {
1268- if x. contents . len ( ) > DATAGRAM_MTU_WARN {
1269- warn ! ( "ICE above MTU {}: {}" , DATAGRAM_MTU_WARN , x. contents. len( ) ) ;
1289+ if x. contents . len ( ) > self . mtu_warn ( ) {
1290+ warn ! ( "ICE above MTU {}: {}" , self . mtu_warn ( ) , x. contents. len( ) ) ;
12701291 }
12711292 trace ! ( "Poll transmit: {:?}" , x) ;
12721293 }
@@ -1601,7 +1622,7 @@ impl IceAgent {
16011622 local_addr, remote_addr, reply
16021623 ) ;
16031624
1604- let mut buf = vec ! [ 0_u8 ; DATAGRAM_MTU ] ;
1625+ let mut buf = vec ! [ 0_u8 ; self . mtu ( ) ] ;
16051626
16061627 let sha1_hmac =
16071628 |key : & [ u8 ] , payloads : & [ & [ u8 ] ] | self . sha1_hmac_provider . sha1_hmac ( key, payloads) ;
@@ -1632,7 +1653,7 @@ impl IceAgent {
16321653 req. source,
16331654 ) ;
16341655
1635- let mut buf = vec ! [ 0_u8 ; DATAGRAM_MTU ] ;
1656+ let mut buf = vec ! [ 0_u8 ; self . mtu ( ) ] ;
16361657
16371658 let sha1_hmac =
16381659 |key : & [ u8 ] , payloads : & [ & [ u8 ] ] | self . sha1_hmac_provider . sha1_hmac ( key, payloads) ;
@@ -1707,7 +1728,7 @@ impl IceAgent {
17071728 binding
17081729 ) ;
17091730
1710- let mut buf = vec ! [ 0_u8 ; DATAGRAM_MTU ] ;
1731+ let mut buf = vec ! [ 0_u8 ; self . mtu ( ) ] ;
17111732
17121733 let sha1_hmac =
17131734 |key : & [ u8 ] , payloads : & [ & [ u8 ] ] | self . sha1_hmac_provider . sha1_hmac ( key, payloads) ;
@@ -2672,7 +2693,7 @@ mod test {
26722693 /// Serializing will calculate a message integrity for it. You can then re-parse to get a message
26732694 /// that contains that correct integrity value.
26742695 fn serialize_stun_msg ( msg : StunMessage < ' _ > , password : & str ) -> Vec < u8 > {
2675- let mut buf = vec ! [ 0_u8 ; DATAGRAM_MTU ] ;
2696+ let mut buf = vec ! [ 0_u8 ; DATAGRAM_MTU_TARGET ] ;
26762697
26772698 let sha1_hmac =
26782699 |key : & [ u8 ] , payloads : & [ & [ u8 ] ] | DefaultSha1HmacProvider . sha1_hmac ( key, payloads) ;
@@ -2683,4 +2704,15 @@ mod test {
26832704
26842705 buf
26852706 }
2707+
2708+ #[ test]
2709+ fn set_mtu_updates_mtu ( ) {
2710+ let mut agent = IceAgent :: new ( IceCreds :: new ( ) ) ;
2711+ assert_eq ! ( agent. mtu( ) , DATAGRAM_MTU_TARGET ) ;
2712+ assert_eq ! ( agent. mtu_warn( ) , DATAGRAM_MTU_WARN ) ;
2713+
2714+ agent. set_mtu ( 900 ..=1280 ) ;
2715+ assert_eq ! ( agent. mtu( ) , 900 ) ;
2716+ assert_eq ! ( agent. mtu_warn( ) , 1280 ) ;
2717+ }
26862718}
0 commit comments