1use alloc::vec::Vec;
17use core::net::{IpAddr, SocketAddr};
18use core::ops::Range;
19use stun_proto::auth::Feature;
20use turn_types::prelude::DelayedTransmitBuild;
21use turn_types::stun::message::IntegrityAlgorithm;
22pub use turn_types::transmit::TransmitBuild;
23use turn_types::transmit::{DelayedChannel, DelayedMessage};
24
25pub use stun_proto::agent::Transmit;
26pub use stun_proto::types::data::Data;
27use stun_proto::types::TransportType;
28use stun_proto::Instant;
29use turn_types::{AddressFamily, TurnCredentials};
30
31pub trait TurnClientApi: core::fmt::Debug + Send {
33 fn transport(&self) -> TransportType;
35
36 fn local_addr(&self) -> SocketAddr;
38
39 fn remote_addr(&self) -> SocketAddr;
41
42 fn relayed_addresses(&self) -> impl Iterator<Item = (TransportType, SocketAddr)> + '_;
44
45 fn permissions(
47 &self,
48 transport: TransportType,
49 relayed: SocketAddr,
50 ) -> impl Iterator<Item = IpAddr> + '_;
51
52 fn delete(&mut self, now: Instant) -> Result<(), DeleteError>;
54
55 fn create_permission(
57 &mut self,
58 transport: TransportType,
59 peer_addr: IpAddr,
60 now: Instant,
61 ) -> Result<(), CreatePermissionError>;
62
63 fn have_permission(&self, transport: TransportType, to: IpAddr) -> bool;
66
67 fn bind_channel(
69 &mut self,
70 transport: TransportType,
71 peer_addr: SocketAddr,
72 now: Instant,
73 ) -> Result<(), BindChannelError>;
74
75 fn tcp_connect(&mut self, peer_addr: SocketAddr, now: Instant) -> Result<(), TcpConnectError>;
79
80 fn allocated_tcp_socket(
85 &mut self,
86 id: u32,
87 five_tuple: Socket5Tuple,
88 peer_addr: SocketAddr,
89 local_addr: Option<SocketAddr>,
90 now: Instant,
91 ) -> Result<(), TcpAllocateError>;
92
93 fn tcp_closed(&mut self, local_addr: SocketAddr, remote_addr: SocketAddr, now: Instant);
95
96 fn send_to<T: AsRef<[u8]> + core::fmt::Debug>(
102 &mut self,
103 transport: TransportType,
104 to: SocketAddr,
105 data: T,
106 now: Instant,
107 ) -> Result<Option<TransmitBuild<DelayedMessageOrChannelSend<T>>>, SendError>;
108
109 fn recv<T: AsRef<[u8]> + core::fmt::Debug>(
113 &mut self,
114 transmit: Transmit<T>,
115 now: Instant,
116 ) -> TurnRecvRet<T>;
117
118 fn poll_recv(&mut self, now: Instant) -> Option<TurnPeerData<Vec<u8>>>;
120
121 fn poll(&mut self, now: Instant) -> TurnPollRet;
123
124 fn poll_transmit(&mut self, now: Instant) -> Option<Transmit<Data<'static>>>;
126
127 fn poll_event(&mut self) -> Option<TurnEvent>;
129
130 fn protocol_error(&mut self);
132}
133
134#[derive(Debug, Clone, PartialEq, Eq)]
141pub struct TurnConfig {
142 allocation_transport: TransportType,
143 address_families: smallvec::SmallVec<[AddressFamily; 2]>,
144 credentials: TurnCredentials,
145 supported_integrity: smallvec::SmallVec<[IntegrityAlgorithm; 2]>,
146 anonymous_username: Feature,
147}
148
149impl TurnConfig {
150 pub fn new(credentials: TurnCredentials) -> Self {
166 Self {
167 allocation_transport: TransportType::Udp,
168 address_families: smallvec::smallvec![AddressFamily::IPV4],
169 credentials,
170 supported_integrity: smallvec::smallvec![IntegrityAlgorithm::Sha1],
171 anonymous_username: Feature::Auto,
172 }
173 }
174
175 pub fn set_allocation_transport(&mut self, allocation_transport: TransportType) {
188 self.allocation_transport = allocation_transport;
189 }
190
191 pub fn allocation_transport(&self) -> TransportType {
193 self.allocation_transport
194 }
195
196 pub fn add_address_family(&mut self, family: AddressFamily) {
215 if !self.address_families.contains(&family) {
216 self.address_families.push(family);
217 }
218 }
219
220 pub fn set_address_family(&mut self, family: AddressFamily) {
236 self.address_families = smallvec::smallvec![family];
237 }
238
239 pub fn address_families(&self) -> &[AddressFamily] {
241 &self.address_families
242 }
243
244 pub fn credentials(&self) -> &TurnCredentials {
246 &self.credentials
247 }
248
249 pub fn add_supported_integrity(&mut self, integrity: IntegrityAlgorithm) {
251 if !self.supported_integrity.contains(&integrity) {
252 self.supported_integrity.push(integrity);
253 }
254 }
255
256 pub fn set_supported_integrity(&mut self, integrity: IntegrityAlgorithm) {
258 self.supported_integrity = smallvec::smallvec![integrity];
259 }
260
261 pub fn supported_integrity(&self) -> &[IntegrityAlgorithm] {
263 &self.supported_integrity
264 }
265
266 pub fn set_anonymous_username(&mut self, anon: Feature) {
271 self.anonymous_username = anon;
272 }
273
274 pub fn anonymous_username(&self) -> Feature {
279 self.anonymous_username
280 }
281}
282
283#[derive(Debug)]
285pub enum TurnPollRet {
286 WaitUntil(Instant),
289 AllocateTcpSocket {
292 id: u32,
294 socket: Socket5Tuple,
296 peer_addr: SocketAddr,
298 },
299 TcpClose {
303 local_addr: SocketAddr,
305 remote_addr: SocketAddr,
307 },
308 Closed,
310}
311
312#[derive(Clone, Copy, Debug, PartialEq, Eq)]
314pub struct Socket5Tuple {
315 pub transport: TransportType,
317 pub from: SocketAddr,
319 pub to: SocketAddr,
321}
322
323#[derive(Debug)]
325pub enum TurnRecvRet<T: AsRef<[u8]> + core::fmt::Debug> {
326 Handled,
328 Ignored(Transmit<T>),
330 PeerData(TurnPeerData<T>),
332 PeerIcmp {
334 transport: TransportType,
336 peer: SocketAddr,
338 icmp_type: u8,
340 icmp_code: u8,
342 icmp_data: u32,
344 },
345}
346
347#[derive(Debug)]
349pub struct TurnPeerData<T: AsRef<[u8]> + core::fmt::Debug> {
350 pub(crate) data: DataRangeOrOwned<T>,
352 pub transport: TransportType,
354 pub peer: SocketAddr,
356}
357
358impl<T: AsRef<[u8]> + core::fmt::Debug> TurnPeerData<T> {
359 pub fn into_owned<R: AsRef<[u8]> + core::fmt::Debug>(self) -> TurnPeerData<R> {
361 TurnPeerData {
362 data: self.data.into_owned(),
363 transport: self.transport,
364 peer: self.peer,
365 }
366 }
367}
368
369impl<T: AsRef<[u8]> + core::fmt::Debug> TurnPeerData<T> {
370 pub fn data(&self) -> &[u8] {
372 self.data.as_ref()
373 }
374}
375
376impl<T: AsRef<[u8]> + core::fmt::Debug> AsRef<[u8]> for TurnPeerData<T> {
377 fn as_ref(&self) -> &[u8] {
378 self.data.as_ref()
379 }
380}
381
382#[derive(Debug)]
384pub enum TurnEvent {
385 AllocationCreated(TransportType, SocketAddr),
388 AllocationCreateFailed(AddressFamily),
390 PermissionCreated(TransportType, IpAddr),
392 PermissionCreateFailed(TransportType, IpAddr),
394 ChannelCreated(TransportType, SocketAddr),
396 ChannelCreateFailed(TransportType, SocketAddr),
398 TcpConnected(SocketAddr),
400 TcpConnectFailed(SocketAddr),
402}
403
404#[derive(Debug, thiserror::Error)]
406#[non_exhaustive]
407pub enum BindChannelError {
408 #[error("The channel identifier already exists and cannot be recreated.")]
410 AlreadyExists,
411 #[error("The channel for requested peer address has expired and cannot be recreated until {}.", .0)]
413 ExpiredChannelExists(Instant),
414 #[error("There is no connection to the TURN server that can handle this channel.")]
416 NoAllocation,
417}
418
419#[derive(Debug, thiserror::Error)]
421#[non_exhaustive]
422pub enum CreatePermissionError {
423 #[error("The permission already exists and cannot be recreated.")]
425 AlreadyExists,
426 #[error("There is no connection to the TURN server that can handle this permission")]
428 NoAllocation,
429}
430
431#[derive(Debug, thiserror::Error)]
433#[non_exhaustive]
434pub enum DeleteError {
435 #[error("There is no connection to the TURN server")]
437 NoAllocation,
438}
439
440#[derive(Debug, thiserror::Error)]
442#[non_exhaustive]
443pub enum SendError {
444 #[error("There is no connection to the TURN server")]
446 NoAllocation,
447 #[error("There is no permission installed for the requested peer")]
449 NoPermission,
450 #[error("There is no local TCP socket for the requested peer")]
452 NoTcpSocket,
453}
454
455#[derive(Debug, thiserror::Error)]
457#[non_exhaustive]
458pub enum TcpConnectError {
459 #[error("The TCP connection already exists and cannot be recreated.")]
461 AlreadyExists,
462 #[error("There is no connection to the TURN server that can handle this TCP socket.")]
464 NoAllocation,
465 #[error("There is no permission installed for the requested peer")]
467 NoPermission,
468}
469
470#[derive(Debug, thiserror::Error)]
472#[non_exhaustive]
473pub enum TcpAllocateError {
474 #[error("The TCP connection already exists and cannot be recreated.")]
476 AlreadyExists,
477 #[error("There is no connection to the TURN server that can handle this TCP socket.")]
479 NoAllocation,
480}
481
482#[derive(Debug)]
484pub enum DataRangeOrOwned<T: AsRef<[u8]> + core::fmt::Debug> {
485 Range {
487 data: T,
489 range: Range<usize>,
491 },
492 Owned(Vec<u8>),
494}
495
496impl<T: AsRef<[u8]> + core::fmt::Debug> AsRef<[u8]> for DataRangeOrOwned<T> {
497 fn as_ref(&self) -> &[u8] {
498 match self {
499 Self::Range { data, range } => &data.as_ref()[range.start..range.end],
500 Self::Owned(owned) => owned,
501 }
502 }
503}
504
505impl<T: AsRef<[u8]> + core::fmt::Debug> DataRangeOrOwned<T> {
506 pub(crate) fn into_owned<R: AsRef<[u8]> + core::fmt::Debug>(self) -> DataRangeOrOwned<R> {
507 DataRangeOrOwned::Owned(match self {
508 Self::Range { data: _, range: _ } => self.as_ref().to_vec(),
509 Self::Owned(owned) => owned,
510 })
511 }
512}
513
514#[derive(Debug)]
516pub struct DelayedTransmit<T: AsRef<[u8]> + core::fmt::Debug> {
517 data: T,
518 range: Range<usize>,
519}
520
521impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmit<T> {
522 fn data(&self) -> &[u8] {
523 &self.data.as_ref()[self.range.clone()]
524 }
525}
526
527impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmitBuild for DelayedTransmit<T> {
528 fn len(&self) -> usize {
529 self.range.len()
530 }
531
532 fn build(self) -> Vec<u8> {
533 self.data().to_vec()
534 }
535
536 fn write_into(self, data: &mut [u8]) -> usize {
537 data.copy_from_slice(self.data());
538 self.len()
539 }
540}
541
542#[derive(Debug)]
544pub enum DelayedMessageOrChannelSend<T: AsRef<[u8]> + core::fmt::Debug> {
545 Channel(DelayedChannel<T>),
547 Message(DelayedMessage<T>),
549 Data(T),
551 OwnedData(Vec<u8>),
553}
554
555impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedMessageOrChannelSend<T> {
556 pub(crate) fn new_channel(data: T, channel_id: u16) -> Self {
557 Self::Channel(DelayedChannel::new(channel_id, data))
558 }
559
560 pub(crate) fn new_message(data: T, peer_addr: SocketAddr) -> Self {
561 Self::Message(DelayedMessage::for_server(peer_addr, data))
562 }
563}
564
565impl<T: AsRef<[u8]> + core::fmt::Debug> DelayedTransmitBuild for DelayedMessageOrChannelSend<T> {
566 fn len(&self) -> usize {
567 match self {
568 Self::Channel(channel) => channel.len(),
569 Self::Message(msg) => msg.len(),
570 Self::Data(data) => data.as_ref().len(),
571 Self::OwnedData(owned) => owned.len(),
572 }
573 }
574
575 fn build(self) -> Vec<u8> {
576 match self {
577 Self::Channel(channel) => channel.build(),
578 Self::Message(msg) => msg.build(),
579 Self::Data(data) => data.as_ref().to_vec(),
580 Self::OwnedData(owned) => owned,
581 }
582 }
583
584 fn write_into(self, data: &mut [u8]) -> usize {
585 match self {
586 Self::Channel(channel) => channel.write_into(data),
587 Self::Message(msg) => msg.write_into(data),
588 Self::Data(slice) => {
589 data.copy_from_slice(slice.as_ref());
590 slice.as_ref().len()
591 }
592 Self::OwnedData(owned) => {
593 data.copy_from_slice(&owned);
594 owned.len()
595 }
596 }
597 }
598}
599
600#[cfg(test)]
601pub(crate) mod tests {
602 use alloc::vec;
603
604 use super::*;
605 use turn_types::stun::message::Message;
606 use turn_types::{
607 attribute::{Data as AData, XorPeerAddress},
608 channel::ChannelData,
609 };
610
611 pub(crate) fn generate_addresses() -> (SocketAddr, SocketAddr) {
612 (
613 "192.168.0.1:1000".parse().unwrap(),
614 "10.0.0.2:2000".parse().unwrap(),
615 )
616 }
617
618 #[test]
619 fn test_delayed_message() {
620 let (local_addr, remote_addr) = generate_addresses();
621 let data = [5; 5];
622 let peer_addr = "127.0.0.1:1".parse().unwrap();
623 let transmit = TransmitBuild::new(
624 DelayedMessageOrChannelSend::Message(DelayedMessage::for_server(peer_addr, data)),
625 TransportType::Udp,
626 local_addr,
627 remote_addr,
628 );
629 assert!(!transmit.data.is_empty());
630 let len = transmit.data.len();
631 let out = transmit.build();
632 assert_eq!(len, out.data.len());
633 let msg = Message::from_bytes(&out.data).unwrap();
634 let addr = msg.attribute::<XorPeerAddress>().unwrap();
635 assert_eq!(addr.addr(msg.transaction_id()), peer_addr);
636 let out_data = msg.attribute::<AData>().unwrap();
637 assert_eq!(out_data.data(), data.as_ref());
638 let transmit = TransmitBuild::new(
639 DelayedMessageOrChannelSend::Message(DelayedMessage::for_server(peer_addr, data)),
640 TransportType::Udp,
641 local_addr,
642 remote_addr,
643 );
644 let mut out2 = vec![0; len];
645 transmit.write_into(&mut out2);
646 let msg = Message::from_bytes(&out2).unwrap();
647 let addr = msg.attribute::<XorPeerAddress>().unwrap();
648 assert_eq!(addr.addr(msg.transaction_id()), peer_addr);
649 let out_data = msg.attribute::<AData>().unwrap();
650 assert_eq!(out_data.data(), data.as_ref());
651 }
652
653 #[test]
654 fn test_delayed_channel() {
655 let (local_addr, remote_addr) = generate_addresses();
656 let data = [5; 5];
657 let channel_id = 0x4567;
658 let transmit = TransmitBuild::new(
659 DelayedMessageOrChannelSend::Channel(DelayedChannel::new(channel_id, data)),
660 TransportType::Udp,
661 local_addr,
662 remote_addr,
663 );
664 assert!(!transmit.data.is_empty());
665 let len = transmit.data.len();
666 let out = transmit.build();
667 assert_eq!(len, out.data.len());
668 let channel = ChannelData::parse(&out.data).unwrap();
669 assert_eq!(channel.id(), channel_id);
670 assert_eq!(channel.data(), data.as_ref());
671 let transmit = TransmitBuild::new(
672 DelayedMessageOrChannelSend::Channel(DelayedChannel::new(channel_id, data)),
673 TransportType::Udp,
674 local_addr,
675 remote_addr,
676 );
677 let mut out2 = vec![0; len];
678 transmit.write_into(&mut out2);
679 assert_eq!(len, out2.len());
680 let channel = ChannelData::parse(&out2).unwrap();
681 assert_eq!(channel.id(), channel_id);
682 assert_eq!(channel.data(), data.as_ref());
683 }
684
685 #[test]
686 fn test_delayed_owned() {
687 let (local_addr, remote_addr) = generate_addresses();
688 let data = vec![7; 7];
689 let transmit = TransmitBuild::new(
690 DelayedMessageOrChannelSend::<Vec<u8>>::Data(data.clone()),
691 TransportType::Udp,
692 local_addr,
693 remote_addr,
694 );
695 assert!(!transmit.data.is_empty());
696 let len = transmit.data.len();
697 let out = transmit.build();
698 assert_eq!(len, out.data.len());
699 assert_eq!(data, out.data);
700 let transmit = TransmitBuild::new(
701 DelayedMessageOrChannelSend::<Vec<u8>>::Data(data.clone()),
702 TransportType::Udp,
703 local_addr,
704 remote_addr,
705 );
706 let mut out2 = vec![0; len];
707 transmit.write_into(&mut out2);
708 assert_eq!(len, out2.len());
709 assert_eq!(data, out2);
710 }
711}