Skip to content

Commit 727036e

Browse files
committed
Add generation to route request packet
Signed-off-by: Lee Smet <lee.smet@hotmail.com>
1 parent ad358dd commit 727036e

File tree

3 files changed

+57
-30
lines changed

3 files changed

+57
-30
lines changed

mycelium/src/babel.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,13 @@ mod tests {
299299
let mut sender = Framed::new(tx, super::Codec::new());
300300
let mut receiver = Framed::new(rx, super::Codec::new());
301301

302-
let rr = super::RouteRequest::new(Some(
303-
Subnet::new(Ipv6Addr::new(0x400, 1, 2, 3, 0, 0, 0, 0).into(), 64)
304-
.expect("64 is a valid IPv6 prefix size; qed"),
305-
));
302+
let rr = super::RouteRequest::new(
303+
Some(
304+
Subnet::new(Ipv6Addr::new(0x400, 1, 2, 3, 0, 0, 0, 0).into(), 64)
305+
.expect("64 is a valid IPv6 prefix size; qed"),
306+
),
307+
13,
308+
);
306309

307310
sender
308311
.send(rr.clone().into())

mycelium/src/babel/route_request.rs

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,37 @@ use crate::subnet::Subnet;
88
use super::{AE_IPV4, AE_IPV6, AE_IPV6_LL, AE_WILDCARD};
99

1010
/// Base wire size of a [`RouteRequest`] without variable length address encoding.
11-
const ROUTE_REQUEST_BASE_WIRE_SIZE: u8 = 2;
11+
const ROUTE_REQUEST_BASE_WIRE_SIZE: u8 = 3;
1212

1313
/// Seqno request TLV body as defined in https://datatracker.ietf.org/doc/html/rfc8966#name-route-request
1414
#[derive(Debug, Clone, PartialEq)]
1515
pub struct RouteRequest {
1616
/// The prefix being requested
1717
prefix: Option<Subnet>,
18+
/// The requests' generation
19+
generation: u8,
1820
}
1921

2022
impl RouteRequest {
2123
/// Creates a new `RouteRequest` for the given [`prefix`]. If no [`prefix`] is given, a full
2224
/// route table dumb in requested.
2325
///
2426
/// [`prefix`]: Subnet
25-
pub fn new(prefix: Option<Subnet>) -> Self {
26-
Self { prefix }
27+
pub fn new(prefix: Option<Subnet>, generation: u8) -> Self {
28+
Self { prefix, generation }
2729
}
2830

2931
/// Return the [`prefix`](Subnet) associated with this `RouteRequest`.
3032
pub fn prefix(&self) -> Option<Subnet> {
3133
self.prefix
3234
}
3335

36+
/// Return the generation of the `RouteRequest`, which is the amount of times it has been
37+
/// forwarded already.
38+
pub fn generation(&self) -> u8 {
39+
self.generation
40+
}
41+
3442
/// Calculates the size on the wire of this `RouteRequest`.
3543
pub fn wire_size(&self) -> u8 {
3644
ROUTE_REQUEST_BASE_WIRE_SIZE
@@ -48,6 +56,7 @@ impl RouteRequest {
4856
/// This function will panic if there are insufficient bytes present in the provided buffer to
4957
/// decode a complete `RouteRequest`.
5058
pub fn from_bytes(src: &mut bytes::BytesMut, len: u8) -> Option<Self> {
59+
let generation = src.get_u8();
5160
let ae = src.get_u8();
5261
let plen = src.get_u8();
5362

@@ -87,7 +96,7 @@ impl RouteRequest {
8796
_ => {
8897
// Invalid AE type, skip reamining data and ignore
8998
trace!("Invalid AE type in route_request packet, drop packet");
90-
src.advance(len as usize - 2);
99+
src.advance(len as usize - 3);
91100
return None;
92101
}
93102
};
@@ -96,11 +105,12 @@ impl RouteRequest {
96105

97106
trace!("Read route_request tlv body");
98107

99-
Some(RouteRequest { prefix })
108+
Some(RouteRequest { prefix, generation })
100109
}
101110

102111
/// Encode this `RouteRequest` tlv as part of a packet.
103112
pub fn write_bytes(&self, dst: &mut bytes::BytesMut) {
113+
dst.put_u8(self.generation);
104114
if let Some(prefix) = self.prefix {
105115
dst.put_u8(match prefix.address() {
106116
IpAddr::V4(_) => AE_IPV4,
@@ -137,12 +147,13 @@ mod tests {
137147
Subnet::new(Ipv6Addr::new(512, 25, 26, 27, 28, 0, 0, 29).into(), 64)
138148
.expect("64 is a valid IPv6 prefix size; qed"),
139149
),
150+
generation: 2,
140151
};
141152

142153
rr.write_bytes(&mut buf);
143154

144-
assert_eq!(buf.len(), 10);
145-
assert_eq!(buf[..10], [2, 64, 2, 0, 0, 25, 0, 26, 0, 27]);
155+
assert_eq!(buf.len(), 11);
156+
assert_eq!(buf[..11], [2, 2, 64, 2, 0, 0, 25, 0, 26, 0, 27]);
146157

147158
let mut buf = bytes::BytesMut::new();
148159

@@ -151,28 +162,35 @@ mod tests {
151162
Subnet::new(Ipv4Addr::new(10, 101, 4, 1).into(), 32)
152163
.expect("32 is a valid IPv4 prefix size; qed"),
153164
),
165+
generation: 3,
154166
};
155167

156168
rr.write_bytes(&mut buf);
157169

158-
assert_eq!(buf.len(), 6);
159-
assert_eq!(buf[..6], [1, 32, 10, 101, 4, 1]);
170+
assert_eq!(buf.len(), 7);
171+
assert_eq!(buf[..7], [3, 1, 32, 10, 101, 4, 1]);
160172

161173
let mut buf = bytes::BytesMut::new();
162174

163-
let rr = super::RouteRequest { prefix: None };
175+
let rr = super::RouteRequest {
176+
prefix: None,
177+
generation: 0,
178+
};
164179

165180
rr.write_bytes(&mut buf);
166181

167-
assert_eq!(buf.len(), 2);
168-
assert_eq!(buf[..2], [0, 0]);
182+
assert_eq!(buf.len(), 3);
183+
assert_eq!(buf[..3], [0, 0, 0]);
169184
}
170185

171186
#[test]
172187
fn decoding() {
173-
let mut buf = bytes::BytesMut::from(&[0, 0][..]);
188+
let mut buf = bytes::BytesMut::from(&[12, 0, 0][..]);
174189

175-
let rr = super::RouteRequest { prefix: None };
190+
let rr = super::RouteRequest {
191+
prefix: None,
192+
generation: 12,
193+
};
176194

177195
let buf_len = buf.len();
178196
assert_eq!(
@@ -181,13 +199,14 @@ mod tests {
181199
);
182200
assert_eq!(buf.remaining(), 0);
183201

184-
let mut buf = bytes::BytesMut::from(&[1, 24, 10, 15, 19][..]);
202+
let mut buf = bytes::BytesMut::from(&[24, 1, 24, 10, 15, 19][..]);
185203

186204
let rr = super::RouteRequest {
187205
prefix: Some(
188206
Subnet::new(Ipv4Addr::new(10, 15, 19, 0).into(), 24)
189207
.expect("24 is a valid IPv4 prefix size; qed"),
190208
),
209+
generation: 24,
191210
};
192211

193212
let buf_len = buf.len();
@@ -197,13 +216,14 @@ mod tests {
197216
);
198217
assert_eq!(buf.remaining(), 0);
199218

200-
let mut buf = bytes::BytesMut::from(&[2, 64, 0, 10, 0, 20, 0, 30, 0, 40][..]);
219+
let mut buf = bytes::BytesMut::from(&[7, 2, 64, 0, 10, 0, 20, 0, 30, 0, 40][..]);
201220

202221
let rr = super::RouteRequest {
203222
prefix: Some(
204223
Subnet::new(Ipv6Addr::new(10, 20, 30, 40, 0, 0, 0, 0).into(), 64)
205224
.expect("64 is a valid IPv6 prefix size; qed"),
206225
),
226+
generation: 7,
207227
};
208228

209229
let buf_len = buf.len();
@@ -213,13 +233,14 @@ mod tests {
213233
);
214234
assert_eq!(buf.remaining(), 0);
215235

216-
let mut buf = bytes::BytesMut::from(&[3, 64, 0, 10, 0, 20, 0, 30, 0, 40][..]);
236+
let mut buf = bytes::BytesMut::from(&[4, 3, 64, 0, 10, 0, 20, 0, 30, 0, 40][..]);
217237

218238
let rr = super::RouteRequest {
219239
prefix: Some(
220240
Subnet::new(Ipv6Addr::new(0xfe80, 0, 0, 0, 10, 20, 30, 40).into(), 64)
221241
.expect("64 is a valid IPv6 prefix size; qed"),
222242
),
243+
generation: 4,
223244
};
224245

225246
let buf_len = buf.len();
@@ -236,7 +257,7 @@ mod tests {
236257
// test to fail if we forget to update something
237258
let mut buf = bytes::BytesMut::from(
238259
&[
239-
4, 64, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
260+
0, 4, 64, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
240261
][..],
241262
);
242263

@@ -255,13 +276,16 @@ mod tests {
255276
fn roundtrip() {
256277
let mut buf = bytes::BytesMut::new();
257278

258-
let seqno_src = super::RouteRequest::new(Some(
259-
Subnet::new(
260-
Ipv6Addr::new(0x21f, 0x4025, 0xabcd, 0xdead, 0, 0, 0, 0).into(),
261-
64,
262-
)
263-
.expect("64 is a valid IPv6 prefix size; qed"),
264-
));
279+
let seqno_src = super::RouteRequest::new(
280+
Some(
281+
Subnet::new(
282+
Ipv6Addr::new(0x21f, 0x4025, 0xabcd, 0xdead, 0, 0, 0, 0).into(),
283+
64,
284+
)
285+
.expect("64 is a valid IPv6 prefix size; qed"),
286+
),
287+
27,
288+
);
265289
seqno_src.write_bytes(&mut buf);
266290
let buf_len = buf.len();
267291
let decoded = super::RouteRequest::from_bytes(&mut buf, buf_len as u8);

mycelium/src/router.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ where
207207
"Requesting route table dump from {}",
208208
peer.connection_identifier()
209209
);
210-
if let Err(e) = peer.send_control_packet(RouteRequest::new(None).into()) {
210+
if let Err(e) = peer.send_control_packet(RouteRequest::new(None, 0).into()) {
211211
error!(
212212
"Failed to request route table dump from {}: {e}",
213213
peer.connection_identifier()

0 commit comments

Comments
 (0)