3
3
use std:: net:: { Ipv4Addr , Ipv6Addr } ;
4
4
use std:: str:: FromStr ;
5
5
6
- use netlink_packet_utils:: { Emitable , Parseable } ;
6
+ use netlink_packet_utils:: { nla :: DefaultNla , Emitable , Parseable } ;
7
7
8
8
use crate :: link:: {
9
- InfoData , InfoIpTunnel , InfoKind , LinkAttribute , LinkFlags , LinkHeader ,
10
- LinkInfo , LinkLayerType , LinkMessage , LinkMessageBuffer , TunnelEncapFlags ,
11
- TunnelEncapType , TunnelFlags ,
9
+ InfoData , InfoIpTunnel , InfoKind , InfoSitTun , LinkAttribute , LinkFlags ,
10
+ LinkHeader , LinkInfo , LinkLayerType , LinkMessage , LinkMessageBuffer ,
11
+ TunnelEncapFlags , TunnelEncapType ,
12
12
} ;
13
13
14
14
use crate :: { AddressFamily , IpProtocol } ;
@@ -124,7 +124,7 @@ fn test_iptunnel_ipip6_link_info() {
124
124
InfoIpTunnel :: Ttl ( 64 ) ,
125
125
InfoIpTunnel :: EncapLimit ( 4 ) ,
126
126
InfoIpTunnel :: FlowInfo ( 0 ) ,
127
- InfoIpTunnel :: Flags ( TunnelFlags :: from_bits_retain ( 0x30000 ) ) ,
127
+ InfoIpTunnel :: Ipv6Flags ( 0x30000 ) ,
128
128
InfoIpTunnel :: Protocol ( IpProtocol :: Ipip ) ,
129
129
InfoIpTunnel :: FwMark ( 0 ) ,
130
130
InfoIpTunnel :: EncapType ( TunnelEncapType :: None ) ,
@@ -193,7 +193,7 @@ fn test_iptunnel_ip6ip6_link_info() {
193
193
InfoIpTunnel :: Ttl ( 64 ) ,
194
194
InfoIpTunnel :: EncapLimit ( 4 ) ,
195
195
InfoIpTunnel :: FlowInfo ( 0 ) ,
196
- InfoIpTunnel :: Flags ( TunnelFlags :: from_bits_retain ( 0x30000 ) ) ,
196
+ InfoIpTunnel :: Ipv6Flags ( 0x30000 ) ,
197
197
InfoIpTunnel :: Protocol ( IpProtocol :: Ipv6 ) ,
198
198
InfoIpTunnel :: FwMark ( 0 ) ,
199
199
InfoIpTunnel :: EncapType ( TunnelEncapType :: None ) ,
@@ -215,3 +215,73 @@ fn test_iptunnel_ip6ip6_link_info() {
215
215
216
216
assert_eq ! ( buf, raw) ;
217
217
}
218
+
219
+ #[ test]
220
+ fn test_iptunnel_sit_link_info ( ) {
221
+ let raw: Vec < u8 > = vec ! [
222
+ 0x00 , 0x00 , // AF_UNSPEC and reserved
223
+ 0x00 , 0x03 , // Link Layer Type IPTUNNEL (768)
224
+ 0x07 , 0x00 , 0x00 , 0x00 , // iface ifindex 7
225
+ 0x90 , 0x00 , 0x00 , 0x00 , // flags
226
+ 0x00 , 0x00 , 0x00 , 0x00 , // changed flags
227
+ 0xa4 , 0x00 , // length = 164
228
+ 0x12 , 0x00 , // IFLA_LINK_INFO (18)
229
+ 0x08 , 0x00 , 0x01 , 0x00 , b's' , b'i' , b't' , 0x00 , // "sit\0"
230
+ 0x98 , 0x00 , 0x02 , 0x00 , // IFLA_INFO_DATA nested
231
+ 0x08 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x08 , 0x00 , 0x02 , 0x00 ,
232
+ 0xc0 , 0xa8 , 0x7a , 0xb7 , 0x08 , 0x00 , 0x03 , 0x00 , 0x0a , 0xff , 0xfe , 0x02 ,
233
+ 0x05 , 0x00 , 0x04 , 0x00 , 0x40 , 0x00 , 0x00 , 0x00 , 0x05 , 0x00 , 0x05 , 0x00 ,
234
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x05 , 0x00 , 0x0a , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 ,
235
+ 0x05 , 0x00 , 0x09 , 0x00 , 0x29 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00 , 0x08 , 0x00 ,
236
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x08 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
237
+ 0x14 , 0x00 , 0x0b , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
238
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x08 , 0x00 , 0x0c , 0x00 ,
239
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00 , 0x0d , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
240
+ 0x06 , 0x00 , 0x0e , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00 , 0x0f , 0x00 ,
241
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
242
+ 0x06 , 0x00 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00 , 0x10 , 0x00 ,
243
+ 0x00 , 0x00 , 0x00 , 0x00 ,
244
+ ] ;
245
+
246
+ let expected = LinkMessage {
247
+ header : LinkHeader {
248
+ interface_family : AddressFamily :: Unspec ,
249
+ index : 7 ,
250
+ link_layer_type : LinkLayerType :: Tunnel ,
251
+ flags : LinkFlags :: Noarp | LinkFlags :: Pointopoint ,
252
+ change_mask : LinkFlags :: empty ( ) ,
253
+ } ,
254
+ attributes : vec ! [ LinkAttribute :: LinkInfo ( vec![
255
+ LinkInfo :: Kind ( InfoKind :: SitTun ) ,
256
+ LinkInfo :: Data ( InfoData :: SitTun ( vec![
257
+ InfoSitTun :: Other ( DefaultNla :: new( 1 , vec![ 0 , 0 , 0 , 0 ] ) ) ,
258
+ InfoSitTun :: Other ( DefaultNla :: new( 2 , vec![ 192 , 168 , 122 , 183 ] ) ) ,
259
+ InfoSitTun :: Other ( DefaultNla :: new( 3 , vec![ 10 , 255 , 254 , 2 ] ) ) ,
260
+ InfoSitTun :: Other ( DefaultNla :: new( 4 , vec![ 64 ] ) ) ,
261
+ InfoSitTun :: Other ( DefaultNla :: new( 5 , vec![ 0 ] ) ) ,
262
+ InfoSitTun :: Other ( DefaultNla :: new( 10 , vec![ 1 ] ) ) ,
263
+ InfoSitTun :: Other ( DefaultNla :: new( 9 , vec![ 41 ] ) ) ,
264
+ InfoSitTun :: Other ( DefaultNla :: new( 8 , vec![ 0 , 0 ] ) ) ,
265
+ InfoSitTun :: Other ( DefaultNla :: new( 20 , vec![ 0 , 0 , 0 , 0 ] ) ) ,
266
+ InfoSitTun :: Other ( DefaultNla :: new( 11 , vec![ 0 ; 16 ] ) ) ,
267
+ InfoSitTun :: Other ( DefaultNla :: new( 12 , vec![ 0 , 0 , 0 , 0 ] ) ) ,
268
+ InfoSitTun :: Other ( DefaultNla :: new( 13 , vec![ 0 , 0 ] ) ) ,
269
+ InfoSitTun :: Other ( DefaultNla :: new( 14 , vec![ 0 , 0 ] ) ) ,
270
+ InfoSitTun :: Other ( DefaultNla :: new( 15 , vec![ 0 , 0 ] ) ) ,
271
+ InfoSitTun :: Other ( DefaultNla :: new( 17 , vec![ 0 , 0 ] ) ) ,
272
+ InfoSitTun :: Other ( DefaultNla :: new( 18 , vec![ 0 , 0 ] ) ) ,
273
+ InfoSitTun :: Other ( DefaultNla :: new( 16 , vec![ 0 , 0 ] ) ) ,
274
+ ] ) ) ,
275
+ ] ) ] ,
276
+ } ;
277
+
278
+ assert_eq ! (
279
+ expected,
280
+ LinkMessage :: parse( & LinkMessageBuffer :: new( & raw) ) . unwrap( )
281
+ ) ;
282
+
283
+ let mut buf = vec ! [ 0 ; expected. buffer_len( ) ] ;
284
+ expected. emit ( & mut buf) ;
285
+
286
+ assert_eq ! ( buf, raw) ;
287
+ }
0 commit comments