@@ -8,29 +8,37 @@ use crate::subnet::Subnet;
88use 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 ) ]
1515pub struct RouteRequest {
1616 /// The prefix being requested
1717 prefix : Option < Subnet > ,
18+ /// The requests' generation
19+ generation : u8 ,
1820}
1921
2022impl 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 ) ;
0 commit comments