@@ -3,7 +3,7 @@ use netlink_packet_utils::nla::{DefaultNla, Nla, NlaBuffer};
33use netlink_packet_utils:: parsers:: parse_u32;
44use netlink_packet_utils:: { DecodeError , Parseable } ;
55
6- const TCA_TUNNEL_KEY_ENC_OPT_VXLAN_GPB : u16 = 1 ; /* u32 */
6+ const TCA_TUNNEL_KEY_ENC_OPT_VXLAN_GPB : u16 = 1 ;
77
88#[ derive( Debug , PartialEq , Eq , Clone ) ]
99#[ non_exhaustive]
@@ -92,6 +92,16 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for Gpb {
9292mod tests {
9393 use netlink_packet_utils:: Emitable ;
9494
95+ use crate :: net:: ethernet:: Ethertype ;
96+ use crate :: tc:: flower:: encap:: { OptionsList , vxlan} ;
97+ use crate :: tc:: TcFilterFlowerOption :: {
98+ KeyEncOpts , KeyEncOptsMask , KeyEthType ,
99+ } ;
100+ use crate :: tc:: TcOption :: Flower ;
101+ use crate :: tc:: { TcAttribute , TcFilterFlowerOption , TcFlowerOptionFlags , TcHandle , TcHeader , TcMessage , TcMessageBuffer } ;
102+ use crate :: AddressFamily ;
103+ use crate :: tc:: flower:: encap:: Options :: Vxlan ;
104+
95105 use super :: * ;
96106
97107 #[ test]
@@ -106,7 +116,7 @@ mod tests {
106116
107117 #[ test]
108118 fn parse_back_gpb_example ( ) {
109- let example = Gpb :: new ( 0x12345678 ) ;
119+ let example = Gpb :: new ( 0x12_34_56_78 ) ;
110120 let mut buffer = vec ! [ 0 ; example. buffer_len( ) ] ;
111121 example. emit ( & mut buffer) ;
112122 let parsed =
@@ -126,11 +136,84 @@ mod tests {
126136
127137 #[ test]
128138 fn parse_back_options_example ( ) {
129- let example = Options :: Gpb ( Gpb :: new ( 0x12345678 ) ) ;
139+ let example = Options :: Gpb ( Gpb :: new ( 0x12_34_56_78 ) ) ;
130140 let mut buffer = vec ! [ 0 ; example. buffer_len( ) ] ;
131141 example. emit ( & mut buffer) ;
132142 let parsed =
133143 Options :: parse ( & NlaBuffer :: new_checked ( & buffer) . unwrap ( ) ) . unwrap ( ) ;
134144 assert_eq ! ( example, parsed) ;
135145 }
146+
147+ /// Setup
148+ ///
149+ /// Create a scratch network interface and add a qdisc to it.
150+ ///
151+ /// ```bash
152+ /// ip link add dev dummy type dummy
153+ /// tc qdisc add dev dummy clsact
154+ /// ```
155+ ///
156+ /// Then capture the netlink request for
157+ ///
158+ /// ```bash
159+ /// tc filter add dev vtep ingress protocol ip \
160+ /// flower \
161+ /// vxlan_opts 112
162+ /// ```
163+ ///
164+ /// # Modifications
165+ ///
166+ /// * Removed cooked header (16 bytes)
167+ /// * Removed rtnetlink header (16 bytes)
168+ const RAW_CAP : & str = "000000003900000000000000f2ffffff080000000b000100666c6f776572000034000200100054800c0002800800010070000000100055800c00028008000100ffffffff08001600000000000600080008000000" ;
169+
170+ /// Returns the message we expected to parse from [`RAW_CAP`].
171+ fn expected_message ( ) -> TcMessage {
172+ TcMessage {
173+ header : TcHeader {
174+ family : AddressFamily :: Unspec ,
175+ index : 57 ,
176+ handle : TcHandle { major : 0 , minor : 0 } ,
177+ parent : TcHandle {
178+ major : 65535 ,
179+ minor : 65522 ,
180+ } ,
181+ info : 8 ,
182+ } ,
183+ attributes : vec ! [
184+ TcAttribute :: Kind ( "flower" . to_string( ) ) ,
185+ TcAttribute :: Options ( vec![
186+ Flower ( KeyEncOpts ( OptionsList ( Vxlan ( vec![
187+ Options :: Gpb ( Gpb :: new( 112 ) )
188+ ] ) ) ) ) ,
189+ Flower ( KeyEncOptsMask ( OptionsList ( Vxlan ( vec![
190+ Options :: Gpb ( Gpb :: new( 0xff_ff_ff_ff ) )
191+ ] ) ) ) ) ,
192+ Flower ( TcFilterFlowerOption :: Flags (
193+ TcFlowerOptionFlags :: empty( ) ,
194+ ) ) ,
195+ Flower ( KeyEthType ( Ethertype :: IPv4 ) ) ,
196+ ] ) ,
197+ ] ,
198+ }
199+ }
200+
201+ #[ test]
202+ fn captured_parses_as_expected ( ) {
203+ let raw_cap = hex:: decode ( RAW_CAP ) . unwrap ( ) ;
204+ let expected = expected_message ( ) ;
205+ let parsed =
206+ TcMessage :: parse ( & TcMessageBuffer :: new_checked ( & raw_cap) . unwrap ( ) )
207+ . unwrap ( ) ;
208+ assert_eq ! ( expected, parsed) ;
209+ }
210+
211+ #[ test]
212+ fn expected_emits_as_captured ( ) {
213+ let raw_cap = hex:: decode ( RAW_CAP ) . unwrap ( ) ;
214+ let expected = expected_message ( ) ;
215+ let mut buffer = vec ! [ 0 ; expected. buffer_len( ) ] ;
216+ expected. emit ( & mut buffer) ;
217+ assert_eq ! ( raw_cap, buffer) ;
218+ }
136219}
0 commit comments