1use alloc::vec::Vec;
17use core::net::{IpAddr, SocketAddr};
18use core::ops::Range;
19use core::time::Duration;
20use stun_proto::agent::StunAgentBuilder;
21use stun_proto::auth::Feature;
22use turn_types::prelude::DelayedTransmitBuild;
23use turn_types::stun::message::IntegrityAlgorithm;
24pub use turn_types::transmit::TransmitBuild;
25use turn_types::transmit::{DelayedChannel, DelayedMessage};
26
27pub use stun_proto::agent::Transmit;
28pub use stun_proto::types::data::Data;
29use stun_proto::types::TransportType;
30use stun_proto::Instant;
31use turn_types::{AddressFamily, TurnCredentials};
32
33pub trait TurnClientApi: core::fmt::Debug + Send {
35 fn transport(&self) -> TransportType;
37
38 fn local_addr(&self) -> SocketAddr;
40
41 fn remote_addr(&self) -> SocketAddr;
43
44 fn relayed_addresses(&self) -> impl Iterator<Item = (TransportType, SocketAddr)> + '_;
46
47 fn permissions(
49 &self,
50 transport: TransportType,
51 relayed: SocketAddr,
52 ) -> impl Iterator<Item = IpAddr> + '_;
53
54 fn delete(&mut self, now: Instant) -> Result<(), DeleteError>;
56
57 fn create_permission(
59 &mut self,
60 transport: TransportType,
61 peer_addr: IpAddr,
62 now: Instant,
63 ) -> Result<(), CreatePermissionError>;
64
65 fn have_permission(&self, transport: TransportType, to: IpAddr) -> bool;
68
69 fn bind_channel(
71 &mut self,
72 transport: TransportType,
73 peer_addr: SocketAddr,
74 now: Instant,
75 ) -> Result<(), BindChannelError>;
76
77 fn tcp_connect(&mut self, peer_addr: SocketAddr, now: Instant) -> Result<(), TcpConnectError>;
81
82 fn allocated_tcp_socket(
87 &mut self,
88 id: u32,
89 five_tuple: Socket5Tuple,
90 peer_addr: SocketAddr,
91 local_addr: Option<SocketAddr>,
92 now: Instant,
93 ) -> Result<(), TcpAllocateError>;
94
95 fn tcp_closed(&mut self, local_addr: SocketAddr, remote_addr: SocketAddr, now: Instant);
97
98 fn send_to<T: AsRef<[u8]> + core::fmt::Debug>(
104 &mut self,
105 transport: TransportType,
106 to: SocketAddr,
107 data: T,
108 now: Instant,
109 ) -> Result<Option<TransmitBuild<DelayedMessageOrChannelSend<T>>>, SendError>;
110
111 fn recv<T: AsRef<[u8]> + core::fmt::Debug>(
115 &mut self,
116 transmit: Transmit<T>,
117 now: Instant,
118 ) -> TurnRecvRet<T>;
119
120 fn poll_recv(&mut self, now: Instant) -> Option<TurnPeerData<Vec<u8>>>;
122
123 fn poll(&mut self, now: Instant) -> TurnPollRet;
125
126 fn poll_transmit(&mut self, now: Instant) -> Option<Transmit<Data<'static>>>;
128
129 fn poll_event(&mut self) -> Option<TurnEvent>;
131
132 fn protocol_error(&mut self);
134}
135
136#[derive(Debug, Clone, PartialEq, Eq)]
143pub struct TurnConfig {
144 allocation_transport: TransportType,
145 address_families: smallvec::SmallVec<[AddressFamily; 2]>,
146 credentials: TurnCredentials,
147 supported_integrity: smallvec::SmallVec<[IntegrityAlgorithm; 2]>,
148 anonymous_username: Feature,
149 rto: Option<RequestRto>,
150}
151
152#[derive(Debug, Clone, PartialEq, Eq)]
153pub(crate) struct RequestRto {
154 initial: Duration,
155 max: Duration,
156 retransmits: u32,
157 final_retransmit_timeout: Duration,
158}
159
160impl RequestRto {}
161
162impl TurnConfig {
163 pub fn new(credentials: TurnCredentials) -> Self {
179 Self {
180 allocation_transport: TransportType::Udp,
181 address_families: smallvec::smallvec![AddressFamily::IPV4],
182 credentials,
183 supported_integrity: smallvec::smallvec![IntegrityAlgorithm::Sha1],
184 anonymous_username: Feature::Auto,
185 rto: None,
186 }
187 }
188
189 pub fn set_allocation_transport(&mut self, allocation_transport: TransportType) {
202 self.allocation_transport = allocation_transport;
203 }
204
205 pub fn allocation_transport(&self) -> TransportType {
207 self.allocation_transport
208 }
209
210 pub fn add_address_family(&mut self, family: AddressFamily) {
229 if !self.address_families.contains(&family) {
230 self.address_families.push(family);
231 }
232 }
233
234 pub fn set_address_family(&mut self, family: AddressFamily) {
250 self.address_families = smallvec::smallvec![family];
251 }
252
253 pub fn address_families(&self) -> &[AddressFamily] {
255 &self.address_families
256 }
257
258 pub fn credentials(&self) -> &TurnCredentials {
260 &self.credentials
261 }
262
263 pub fn add_supported_integrity(&mut self, integrity: IntegrityAlgorithm) {
265 if !self.supported_integrity.contains(&integrity) {
266 self.supported_integrity.push(integrity);
267 }
268 }
269
270 pub fn set_supported_integrity(&mut self, integrity: IntegrityAlgorithm) {
272 self.supported_integrity = smallvec::smallvec![integrity];
273 }
274
275 pub fn supported_integrity(&self) -> &[IntegrityAlgorithm] {
277 &self.supported_integrity
278 }
279
280 pub fn set_anonymous_username(&mut self, anon: Feature) {
285 self.anonymous_username = anon;
286 }
287
288 pub fn anonymous_username(&self) -> Feature {
293 self.anonymous_username
294 }
295
296 pub fn set_request_retransmits(
312 &mut self,
313 initial: Duration,
314 max: Duration,
315 retransmits: u32,
316 final_retransmit_timeout: Duration,
317 ) {
318 let rto = self.rto.get_or_insert(RequestRto {
319 initial,
320 max,
321 retransmits,
322 final_retransmit_timeout,
323 });
324 rto.initial = initial;
325 rto.max = max;
326 rto.retransmits = retransmits;
327 rto.final_retransmit_timeout = final_retransmit_timeout;
328 }
329
330 pub(crate) fn apply_to_stun_builder(&self, builder: StunAgentBuilder) -> StunAgentBuilder {
331 if let Some(rto) = self.rto.as_ref() {
332 builder.request_retransmits(
333 rto.initial,
334 rto.max,
335 rto.retransmits,
336 rto.final_retransmit_timeout,
337 )
338 } else {
339 builder
340 }
341 }
342}
343
344#[derive(Debug)]
346pub enum TurnPollRet {
347 WaitUntil(Instant),
350 AllocateTcpSocket {
353 id: u32,
355 socket: Socket5Tuple,
357 peer_addr: SocketAddr,
359 },
360 TcpClose {
364 local_addr: SocketAddr,
366 remote_addr: SocketAddr,
368 },
369 Closed,
371}
372
373#[derive(Clone, Copy, Debug, PartialEq, Eq)]
375pub struct Socket5Tuple {
376 pub transport: TransportType,
378 pub from: SocketAddr,
380 pub to: SocketAddr,
382}
383
384#[derive(Debug)]
386pub enum TurnRecvRet<T: AsRef<[u8]> + core::fmt::Debug> {
387 Handled,
389 Ignored(Transmit<T>),
391 PeerData(TurnPeerData<T>),
393 PeerIcmp {
395 transport: TransportType,
397 peer: SocketAddr,
399 icmp_type: u8,
401 icmp_code: u8,
403 icmp_data: u32,
405 },
406}
407
408#[derive(Debug)]
410pub struct TurnPeerData<T: AsRef<[u8]> + core::fmt::Debug> {
411 pub(crate) data: DataRangeOrOwned<T>,
413 pub transport: TransportType,
415 pub peer: SocketAddr,
417}
418
419impl<T: AsRef<[u8]> + core::fmt::Debug> TurnPeerData<T> {
420 pub fn into_owned<R: AsRef<[u8]> + core::fmt::Debug>(self) -> TurnPeerData<R> {
422 TurnPeerData {
423 data: self.data.into_owned(),
424 transport: self.transport,
425 peer: self.peer,
426 }
427 }
428}
429
430impl<T: AsRef<[u8]> + core::fmt::Debug> TurnPeerData<T> {
431 pub fn data(&self) -> &[u8] {
433 self.data.as_ref()
434 }
435}
436
437impl<T: AsRef<[u8]> + core::fmt::Debug> AsRef<[u8]> for TurnPeerData<T> {
438 fn as_ref(&self) -> &[u8] {
439 self.data.as_ref()
440 }
441}
442
443#[derive(Debug)]
445pub enum TurnEvent {
446 AllocationCreated(TransportType, SocketAddr),
449 AllocationCreateFailed(AddressFamily),
451 PermissionCreated(TransportType, IpAddr),
453 PermissionCreateFailed(TransportType, IpAddr),
455 ChannelCreated(TransportType, SocketAddr),
457 ChannelCreateFailed(TransportType, SocketAddr),
459 TcpConnected(SocketAddr),
461 TcpConnectFailed(SocketAddr),
463}
464
465#[derive(Debug, thiserror::Error)]
467#[non_exhaustive]
468pub enum BindChannelError {
469 #[error("The channel identifier already exists and cannot be recreated.")]
471 AlreadyExists,
472 #[error("The channel for requested peer address has expired and cannot be recreated until {}.", .0)]
474 ExpiredChannelExists(Instant),
475 #[error("There is no connection to the TURN server that can handle this channel.")]
477 NoAllocation,
478}
479
480#[derive(Debug, thiserror::Error)]
482#[non_exhaustive]
483pub enum CreatePermissionError {
484 #[error("The permission already exists and cannot be recreated.")]
486 AlreadyExists,
487 #[error("There is no connection to the TURN server that can handle this permission")]
489 NoAllocation,
490}
491
492#[derive(Debug, thiserror::Error)]
494#[non_exhaustive]
495pub enum DeleteError {
496 #[error("There is no connection to the TURN server")]
498 NoAllocation,
499}
500
501#[derive(Debug, thiserror::Error)]
503#[non_exhaustive]
504pub enum SendError {
505 #[error("There is no connection to the TURN server")]
507 NoAllocation,
508 #[error("There is no permission installed for the requested peer")]
510 NoPermission,
511 #[error("There is no local TCP socket for the requested peer")]
513 NoTcpSocket,
514}
515
516#[derive(Debug, thiserror::Error)]
518#[non_exhaustive]
519pub enum TcpConnectError {
520 #[error("The TCP connection already exists and cannot be recreated.")]
522 AlreadyExists,
523 #[error("There is no connection to the TURN server that can handle this TCP socket.")]
525 NoAllocation,
526 #[error("There is no permission installed for the requested peer")]
528 NoPermission,
529}
530
531#[derive(Debug, thiserror::Error)]
533#[non_exhaustive]
534pub enum TcpAllocateError {
535 #[error("The TCP connection already exists and cannot be recreated.")]
537 AlreadyExists,
538 #[error("There is no connection to the TURN server that can handle this TCP socket.")]
540 NoAllocation,
541}
542
543#[derive(Debug)]
545pub enum DataRangeOrOwned<T: AsRef<[u8]> + core::fmt::Debug> {
546 Range {
548 data: T,
550 range: Range<usize>,
552 },
553 Owned(Vec<u8>),
555}
556
557impl<T: AsRef<[u8]> + core::fmt::Debug> AsRef<[u8]> for DataRangeOrOwned<T> {
558 fn as_ref(&self) -> &[u8] {
559 match self {
560 Self::Range { data, range } => &data.as_ref()[range.start..range.end],
561 Self::Owned(owned) => owned,
562 }
563 }
564}
565
566impl<T: AsRef<[u8]> + core::fmt::Debug> DataRangeOrOwned<T> {
567 pub(crate) fn into_owned<R: AsRef<[u8]> + core::fmt::Debug>(self) -> DataRangeOrOwned<R> {
568 DataRangeOrOwned::Owned(match self {
569 Self::Range { data: _, range: _ } => self.as_ref().to_vec(),
570 Self::Owned(owned) => owned,
571 })
572 }
573}
574
575#[derive(Debug)]
577pub struct DelayedTransmit<T: AsRef<[u8]> + core::fmt::Debug> {
578 data: T,
579 range: Range<usize>,
580}
581
582impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmit<T> {
583 fn data(&self) -> &[u8] {
584 &self.data.as_ref()[self.range.clone()]
585 }
586}
587
588impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmitBuild for DelayedTransmit<T> {
589 fn len(&self) -> usize {
590 self.range.len()
591 }
592
593 fn build(self) -> Vec<u8> {
594 self.data().to_vec()
595 }
596
597 fn write_into(self, data: &mut [u8]) -> usize {
598 data.copy_from_slice(self.data());
599 self.len()
600 }
601}
602
603#[derive(Debug)]
605pub enum DelayedMessageOrChannelSend<T: AsRef<[u8]> + core::fmt::Debug> {
606 Channel(DelayedChannel<T>),
608 Message(DelayedMessage<T>),
610 Data(T),
612 OwnedData(Vec<u8>),
614}
615
616impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedMessageOrChannelSend<T> {
617 pub(crate) fn new_channel(data: T, channel_id: u16) -> Self {
618 Self::Channel(DelayedChannel::new(channel_id, data))
619 }
620
621 pub(crate) fn new_message(data: T, peer_addr: SocketAddr) -> Self {
622 Self::Message(DelayedMessage::for_server(peer_addr, data))
623 }
624}
625
626impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmitBuild for DelayedMessageOrChannelSend<T> {
627 fn len(&self) -> usize {
628 match self {
629 Self::Channel(channel) => channel.len(),
630 Self::Message(msg) => msg.len(),
631 Self::Data(data) => data.as_ref().len(),
632 Self::OwnedData(owned) => owned.len(),
633 }
634 }
635
636 fn build(self) -> Vec<u8> {
637 match self {
638 Self::Channel(channel) => channel.build(),
639 Self::Message(msg) => msg.build(),
640 Self::Data(data) => data.as_ref().to_vec(),
641 Self::OwnedData(owned) => owned,
642 }
643 }
644
645 fn write_into(self, data: &mut [u8]) -> usize {
646 match self {
647 Self::Channel(channel) => channel.write_into(data),
648 Self::Message(msg) => msg.write_into(data),
649 Self::Data(slice) => {
650 data.copy_from_slice(slice.as_ref());
651 slice.as_ref().len()
652 }
653 Self::OwnedData(owned) => {
654 data.copy_from_slice(&owned);
655 owned.len()
656 }
657 }
658 }
659}
660
661#[cfg(test)]
662pub(crate) mod tests {
663 use alloc::vec;
664
665 use super::*;
666 use turn_types::stun::message::Message;
667 use turn_types::{
668 attribute::{Data as AData, XorPeerAddress},
669 channel::ChannelData,
670 };
671
672 pub(crate) fn generate_addresses() -> (SocketAddr, SocketAddr) {
673 (
674 "192.168.0.1:1000".parse().unwrap(),
675 "10.0.0.2:2000".parse().unwrap(),
676 )
677 }
678
679 #[test]
680 fn test_delayed_message() {
681 let (local_addr, remote_addr) = generate_addresses();
682 let data = [5; 5];
683 let peer_addr = "127.0.0.1:1".parse().unwrap();
684 let transmit = TransmitBuild::new(
685 DelayedMessageOrChannelSend::Message(DelayedMessage::for_server(peer_addr, data)),
686 TransportType::Udp,
687 local_addr,
688 remote_addr,
689 );
690 assert!(!transmit.data.is_empty());
691 let len = transmit.data.len();
692 let out = transmit.build();
693 assert_eq!(len, out.data.len());
694 let msg = Message::from_bytes(&out.data).unwrap();
695 let addr = msg.attribute::<XorPeerAddress>().unwrap();
696 assert_eq!(addr.addr(msg.transaction_id()), peer_addr);
697 let out_data = msg.attribute::<AData>().unwrap();
698 assert_eq!(out_data.data(), data.as_ref());
699 let transmit = TransmitBuild::new(
700 DelayedMessageOrChannelSend::Message(DelayedMessage::for_server(peer_addr, data)),
701 TransportType::Udp,
702 local_addr,
703 remote_addr,
704 );
705 let mut out2 = vec![0; len];
706 transmit.write_into(&mut out2);
707 let msg = Message::from_bytes(&out2).unwrap();
708 let addr = msg.attribute::<XorPeerAddress>().unwrap();
709 assert_eq!(addr.addr(msg.transaction_id()), peer_addr);
710 let out_data = msg.attribute::<AData>().unwrap();
711 assert_eq!(out_data.data(), data.as_ref());
712 }
713
714 #[test]
715 fn test_delayed_channel() {
716 let (local_addr, remote_addr) = generate_addresses();
717 let data = [5; 5];
718 let channel_id = 0x4567;
719 let transmit = TransmitBuild::new(
720 DelayedMessageOrChannelSend::Channel(DelayedChannel::new(channel_id, data)),
721 TransportType::Udp,
722 local_addr,
723 remote_addr,
724 );
725 assert!(!transmit.data.is_empty());
726 let len = transmit.data.len();
727 let out = transmit.build();
728 assert_eq!(len, out.data.len());
729 let channel = ChannelData::parse(&out.data).unwrap();
730 assert_eq!(channel.id(), channel_id);
731 assert_eq!(channel.data(), data.as_ref());
732 let transmit = TransmitBuild::new(
733 DelayedMessageOrChannelSend::Channel(DelayedChannel::new(channel_id, data)),
734 TransportType::Udp,
735 local_addr,
736 remote_addr,
737 );
738 let mut out2 = vec![0; len];
739 transmit.write_into(&mut out2);
740 assert_eq!(len, out2.len());
741 let channel = ChannelData::parse(&out2).unwrap();
742 assert_eq!(channel.id(), channel_id);
743 assert_eq!(channel.data(), data.as_ref());
744 }
745
746 #[test]
747 fn test_delayed_owned() {
748 let (local_addr, remote_addr) = generate_addresses();
749 let data = vec![7; 7];
750 let transmit = TransmitBuild::new(
751 DelayedMessageOrChannelSend::<Vec<u8>>::Data(data.clone()),
752 TransportType::Udp,
753 local_addr,
754 remote_addr,
755 );
756 assert!(!transmit.data.is_empty());
757 let len = transmit.data.len();
758 let out = transmit.build();
759 assert_eq!(len, out.data.len());
760 assert_eq!(data, out.data);
761 let transmit = TransmitBuild::new(
762 DelayedMessageOrChannelSend::<Vec<u8>>::Data(data.clone()),
763 TransportType::Udp,
764 local_addr,
765 remote_addr,
766 );
767 let mut out2 = vec![0; len];
768 transmit.write_into(&mut out2);
769 assert_eq!(len, out2.len());
770 assert_eq!(data, out2);
771 }
772}