33use std:: net:: { Ipv4Addr , Ipv6Addr } ;
44use std:: str:: FromStr ;
55
6- use netlink_packet_utils:: { Emitable , Parseable } ;
6+ use netlink_packet_utils:: { nla :: DefaultNla , Emitable , Parseable } ;
77
88use 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 ,
1212} ;
1313
1414use crate :: { AddressFamily , IpProtocol } ;
@@ -124,7 +124,7 @@ fn test_iptunnel_ipip6_link_info() {
124124 InfoIpTunnel :: Ttl ( 64 ) ,
125125 InfoIpTunnel :: EncapLimit ( 4 ) ,
126126 InfoIpTunnel :: FlowInfo ( 0 ) ,
127- InfoIpTunnel :: Flags ( TunnelFlags :: from_bits_retain ( 0x30000 ) ) ,
127+ InfoIpTunnel :: Ipv6Flags ( 0x30000 ) ,
128128 InfoIpTunnel :: Protocol ( IpProtocol :: Ipip ) ,
129129 InfoIpTunnel :: FwMark ( 0 ) ,
130130 InfoIpTunnel :: EncapType ( TunnelEncapType :: None ) ,
@@ -193,7 +193,7 @@ fn test_iptunnel_ip6ip6_link_info() {
193193 InfoIpTunnel :: Ttl ( 64 ) ,
194194 InfoIpTunnel :: EncapLimit ( 4 ) ,
195195 InfoIpTunnel :: FlowInfo ( 0 ) ,
196- InfoIpTunnel :: Flags ( TunnelFlags :: from_bits_retain ( 0x30000 ) ) ,
196+ InfoIpTunnel :: Ipv6Flags ( 0x30000 ) ,
197197 InfoIpTunnel :: Protocol ( IpProtocol :: Ipv6 ) ,
198198 InfoIpTunnel :: FwMark ( 0 ) ,
199199 InfoIpTunnel :: EncapType ( TunnelEncapType :: None ) ,
@@ -215,3 +215,73 @@ fn test_iptunnel_ip6ip6_link_info() {
215215
216216 assert_eq ! ( buf, raw) ;
217217}
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 (NoARP | POINTOPOINT)
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