1mod dlci;
7pub use dlci::{DLCI, ServerChannel};
8
9mod error;
11pub use error::Error as RfcommError;
12
13pub mod frame;
15
16pub mod profile;
18
19#[derive(Copy, Clone, Debug, PartialEq)]
21pub enum Role {
22 Unassigned,
24 Negotiating,
26 Initiator,
29 Responder,
31}
32
33impl Role {
34 pub fn opposite_role(&self) -> Self {
36 match self {
37 Role::Initiator => Role::Responder,
38 Role::Responder => Role::Initiator,
39 role => *role,
40 }
41 }
42
43 pub fn is_multiplexer_started(&self) -> bool {
45 *self == Role::Initiator || *self == Role::Responder
46 }
47}
48
49pub fn max_packet_size_from_l2cap_mtu(mtu: u16) -> u16 {
52 let max_from_mtu = mtu.saturating_sub(crate::frame::MAX_RFCOMM_HEADER_SIZE as u16);
53 std::cmp::min(max_from_mtu, crate::frame::MAX_INFORMATION_LENGTH as u16)
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_convert_to_opposite_role() {
62 let role = Role::Initiator;
63 assert_eq!(role.opposite_role(), Role::Responder);
64
65 let role = Role::Responder;
66 assert_eq!(role.opposite_role(), Role::Initiator);
67
68 let role = Role::Unassigned;
69 assert_eq!(role.opposite_role(), Role::Unassigned);
70
71 let role = Role::Negotiating;
72 assert_eq!(role.opposite_role(), Role::Negotiating);
73 }
74
75 #[test]
76 fn max_packet_size_capped_for_large_l2cap_mtu() {
77 let l2cap_mtu = 65535;
78 assert_eq!(max_packet_size_from_l2cap_mtu(l2cap_mtu), 32767);
79 }
80}