Skip to content

Commit 6d67b90

Browse files
move address discovery role from an enum to a simplified struct
1 parent 5f0214b commit 6d67b90

File tree

4 files changed

+69
-115
lines changed

4 files changed

+69
-115
lines changed

quinn-proto/src/address_discovery.rs

Lines changed: 20 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -7,120 +7,48 @@ use crate::VarInt;
77
///
88
/// When enabled, this is reported as a transport parameter.
99
#[derive(PartialEq, Eq, Clone, Copy, Debug, Default)]
10-
pub(crate) enum Role {
11-
/// Is able to report observer addresses to other peers, but it's not interested in receiving
12-
/// reports about its own address.
13-
SendOnly,
14-
/// Is interested on reports about its own observed address, but will not report back to other
15-
/// peers.
16-
ReceiveOnly,
17-
/// Will both report and receive reports of observed addresses.
18-
Both,
19-
/// Address discovery is disabled.
20-
#[default]
21-
Disabled,
10+
pub(crate) struct Role {
11+
pub(crate) send_reports: bool,
12+
pub(crate) receive_reports: bool,
2213
}
2314

2415
impl TryFrom<VarInt> for Role {
2516
type Error = crate::transport_parameters::Error;
2617

2718
fn try_from(value: VarInt) -> Result<Self, Self::Error> {
19+
let mut role = Self::default();
2820
match value.0 {
29-
0 => Ok(Self::SendOnly),
30-
1 => Ok(Self::ReceiveOnly),
31-
2 => Ok(Self::Both),
32-
_ => Err(crate::transport_parameters::Error::IllegalValue),
21+
0 => role.send_reports = true,
22+
1 => role.receive_reports = true,
23+
2 => {
24+
role.send_reports = true;
25+
role.receive_reports = true;
26+
}
27+
_ => return Err(crate::transport_parameters::Error::IllegalValue),
3328
}
29+
30+
Ok(role)
3431
}
3532
}
3633

3734
impl Role {
3835
/// Whether address discovery is disabled.
3936
pub(crate) fn is_disabled(&self) -> bool {
40-
matches!(self, Self::Disabled)
41-
}
42-
43-
/// Whether this peer's role allows for address reporting to other peers.
44-
fn is_reporter(&self) -> bool {
45-
matches!(self, Self::SendOnly | Self::Both)
46-
}
47-
48-
/// Whether this peer's role accepts observed address reports.
49-
fn receives_reports(&self) -> bool {
50-
matches!(self, Self::ReceiveOnly | Self::Both)
37+
!self.receive_reports && !self.send_reports
5138
}
5239

5340
/// Whether this peer should report observed addresses to the other peer.
5441
pub(crate) fn should_report(&self, other: &Self) -> bool {
55-
self.is_reporter() && other.receives_reports()
56-
}
57-
58-
/// Sets whether this peer should provide observed addresses to other peers.
59-
pub(crate) fn send_reports_to_peers(&mut self, provide: bool) {
60-
if provide {
61-
self.enable_sending_reports_to_peers()
62-
} else {
63-
self.disable_sending_reports_to_peers()
64-
}
65-
}
66-
67-
/// Enables sending reports of observed addresses to other peers.
68-
fn enable_sending_reports_to_peers(&mut self) {
69-
match self {
70-
Self::SendOnly => {} // already enabled
71-
Self::ReceiveOnly => *self = Self::Both,
72-
Self::Both => {} // already enabled
73-
Self::Disabled => *self = Self::SendOnly,
74-
}
75-
}
76-
77-
/// Disables sending reports of observed addresses to other peers.
78-
fn disable_sending_reports_to_peers(&mut self) {
79-
match self {
80-
Self::SendOnly => *self = Self::Disabled,
81-
Self::ReceiveOnly => {} // already disabled
82-
Self::Both => *self = Self::ReceiveOnly,
83-
Self::Disabled => {} // already disabled
84-
}
85-
}
86-
87-
/// Sets whether this peer should accept received reports of observed addresses from other
88-
/// peers.
89-
pub(crate) fn receive_reports_from_peers(&mut self, receive: bool) {
90-
if receive {
91-
self.enable_receiving_reports_from_peers()
92-
} else {
93-
self.disable_receiving_reports_from_peers()
94-
}
95-
}
96-
97-
/// Enables receiving reports of observed addresses from other peers.
98-
fn enable_receiving_reports_from_peers(&mut self) {
99-
match self {
100-
Self::SendOnly => *self = Self::Both,
101-
Self::ReceiveOnly => {} // already enabled
102-
Self::Both => {} // already enabled
103-
Self::Disabled => *self = Self::ReceiveOnly,
104-
}
105-
}
106-
107-
/// Disables receiving reports of observed addresses from other peers.
108-
fn disable_receiving_reports_from_peers(&mut self) {
109-
match self {
110-
Self::SendOnly => {} // already disabled
111-
Self::ReceiveOnly => *self = Self::Disabled,
112-
Self::Both => *self = Self::SendOnly,
113-
Self::Disabled => {} // already disabled
114-
}
42+
self.send_reports && other.receive_reports
11543
}
11644

11745
/// Gives the [`VarInt`] representing this [`Role`] as a transport parameter.
11846
pub(crate) fn as_transport_parameter(&self) -> Option<VarInt> {
119-
match self {
120-
Self::SendOnly => Some(VarInt(0)),
121-
Self::ReceiveOnly => Some(VarInt(1)),
122-
Self::Both => Some(VarInt(2)),
123-
Self::Disabled => None,
47+
match (self.send_reports, self.receive_reports) {
48+
(true, true) => Some(VarInt(2)),
49+
(true, false) => Some(VarInt(0)),
50+
(false, true) => Some(VarInt(1)),
51+
(false, false) => None,
12452
}
12553
}
12654
}

quinn-proto/src/config/transport.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ impl TransportConfig {
325325
/// This will aid peers in inferring their reachable address, which in most NATd networks
326326
/// will not be easily available to them.
327327
pub fn send_observed_address_reports(&mut self, enabled: bool) -> &mut Self {
328-
self.address_discovery_role.send_reports_to_peers(enabled);
328+
self.address_discovery_role.send_reports = enabled;
329329
self
330330
}
331331

@@ -336,8 +336,7 @@ impl TransportConfig {
336336
/// reports cannot be trusted. This, however, can aid the current endpoint in inferring its
337337
/// reachable address, which in most NATd networks will not be easily available.
338338
pub fn receive_observed_address_reports(&mut self, enabled: bool) -> &mut Self {
339-
self.address_discovery_role
340-
.receive_reports_from_peers(enabled);
339+
self.address_discovery_role.receive_reports = enabled;
341340
self
342341
}
343342
}

quinn-proto/src/tests/mod.rs

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3191,15 +3191,21 @@ fn address_discovery() {
31913191

31923192
let server = ServerConfig {
31933193
transport: Arc::new(TransportConfig {
3194-
address_discovery_role: crate::address_discovery::Role::Both,
3194+
address_discovery_role: crate::address_discovery::Role {
3195+
send_reports: true,
3196+
receive_reports: true,
3197+
},
31953198
..TransportConfig::default()
31963199
}),
31973200
..server_config()
31983201
};
31993202
let mut pair = Pair::new(Default::default(), server);
32003203
let client_config = ClientConfig {
32013204
transport: Arc::new(TransportConfig {
3202-
address_discovery_role: crate::address_discovery::Role::Both,
3205+
address_discovery_role: crate::address_discovery::Role {
3206+
send_reports: true,
3207+
receive_reports: true,
3208+
},
32033209
..TransportConfig::default()
32043210
}),
32053211
..client_config()
@@ -3236,7 +3242,10 @@ fn address_discovery_zero_rtt_accepted() {
32363242
let _guard = subscribe();
32373243
let server = ServerConfig {
32383244
transport: Arc::new(TransportConfig {
3239-
address_discovery_role: crate::address_discovery::Role::Both,
3245+
address_discovery_role: crate::address_discovery::Role {
3246+
send_reports: true,
3247+
receive_reports: true,
3248+
},
32403249
..TransportConfig::default()
32413250
}),
32423251
..server_config()
@@ -3246,16 +3255,16 @@ fn address_discovery_zero_rtt_accepted() {
32463255
pair.server.incoming_connection_behavior = IncomingConnectionBehavior::Validate;
32473256
let client_cfg = ClientConfig {
32483257
transport: Arc::new(TransportConfig {
3249-
address_discovery_role: crate::address_discovery::Role::Both,
3258+
address_discovery_role: crate::address_discovery::Role {
3259+
send_reports: true,
3260+
receive_reports: true,
3261+
},
32503262
..TransportConfig::default()
32513263
}),
32523264
..client_config()
32533265
};
32543266
let alt_client_cfg = ClientConfig {
3255-
transport: Arc::new(TransportConfig {
3256-
address_discovery_role: crate::address_discovery::Role::Disabled,
3257-
..TransportConfig::default()
3258-
}),
3267+
transport: Arc::new(TransportConfig::default()),
32593268
..client_cfg.clone()
32603269
};
32613270

@@ -3317,23 +3326,26 @@ fn address_discovery_zero_rtt_accepted() {
33173326
fn address_discovery_zero_rtt_rejection() {
33183327
let _guard = subscribe();
33193328
let server_cfg = ServerConfig {
3320-
transport: Arc::new(TransportConfig {
3321-
address_discovery_role: crate::address_discovery::Role::Disabled,
3322-
..TransportConfig::default()
3323-
}),
3329+
transport: Default::default(),
33243330
..server_config()
33253331
};
33263332
let alt_server_cfg = ServerConfig {
33273333
transport: Arc::new(TransportConfig {
3328-
address_discovery_role: crate::address_discovery::Role::SendOnly,
3334+
address_discovery_role: crate::address_discovery::Role {
3335+
send_reports: true,
3336+
..Default::default()
3337+
},
33293338
..TransportConfig::default()
33303339
}),
33313340
..server_cfg.clone()
33323341
};
33333342
let mut pair = Pair::new(Default::default(), server_cfg);
33343343
let client_cfg = ClientConfig {
33353344
transport: Arc::new(TransportConfig {
3336-
address_discovery_role: crate::address_discovery::Role::Both,
3345+
address_discovery_role: crate::address_discovery::Role {
3346+
send_reports: true,
3347+
receive_reports: true,
3348+
},
33373349
..TransportConfig::default()
33383350
}),
33393351
..client_config()
@@ -3387,15 +3399,21 @@ fn address_discovery_retransmission() {
33873399

33883400
let server = ServerConfig {
33893401
transport: Arc::new(TransportConfig {
3390-
address_discovery_role: crate::address_discovery::Role::Both,
3402+
address_discovery_role: crate::address_discovery::Role {
3403+
send_reports: true,
3404+
receive_reports: true,
3405+
},
33913406
..TransportConfig::default()
33923407
}),
33933408
..server_config()
33943409
};
33953410
let mut pair = Pair::new(Default::default(), server);
33963411
let client_config = ClientConfig {
33973412
transport: Arc::new(TransportConfig {
3398-
address_discovery_role: crate::address_discovery::Role::Both,
3413+
address_discovery_role: crate::address_discovery::Role {
3414+
send_reports: true,
3415+
receive_reports: true,
3416+
},
33993417
..TransportConfig::default()
34003418
}),
34013419
..client_config()
@@ -3423,15 +3441,21 @@ fn address_discovery_rebind_retransmission() {
34233441

34243442
let server = ServerConfig {
34253443
transport: Arc::new(TransportConfig {
3426-
address_discovery_role: crate::address_discovery::Role::Both,
3444+
address_discovery_role: crate::address_discovery::Role {
3445+
send_reports: true,
3446+
receive_reports: true,
3447+
},
34273448
..TransportConfig::default()
34283449
}),
34293450
..server_config()
34303451
};
34313452
let mut pair = Pair::new(Default::default(), server);
34323453
let client_config = ClientConfig {
34333454
transport: Arc::new(TransportConfig {
3434-
address_discovery_role: crate::address_discovery::Role::Both,
3455+
address_discovery_role: crate::address_discovery::Role {
3456+
send_reports: true,
3457+
receive_reports: true,
3458+
},
34353459
..TransportConfig::default()
34363460
}),
34373461
..client_config()

quinn-proto/src/transport_parameters.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ macro_rules! make_struct {
138138
grease_transport_parameter: None,
139139
write_order: None,
140140

141-
address_discovery_role: address_discovery::Role::Disabled,
141+
address_discovery_role: address_discovery::Role::default(),
142142
}
143143
}
144144
}
@@ -778,7 +778,10 @@ mod test {
778778
}),
779779
grease_quic_bit: true,
780780
min_ack_delay: Some(2_000u32.into()),
781-
address_discovery_role: address_discovery::Role::SendOnly,
781+
address_discovery_role: address_discovery::Role {
782+
send_reports: true,
783+
..Default::default()
784+
},
782785
..TransportParameters::default()
783786
};
784787
params.write(&mut buf);

0 commit comments

Comments
 (0)