1
1
// SPDX-License-Identifier: MIT
2
2
3
- use std:: net:: { IpAddr , Ipv6Addr } ;
3
+ use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
4
4
5
5
use anyhow:: Context ;
6
6
use byteorder:: { BigEndian , ByteOrder , NativeEndian } ;
@@ -50,14 +50,14 @@ pub enum InfoIpTunnel {
50
50
Protocol ( IpProtocol ) ,
51
51
PMtuDisc ( bool ) ,
52
52
Ipv6RdPrefix ( Ipv6Addr ) ,
53
- Ipv6RdRelayPrefix ( Ipv6Addr ) ,
53
+ Ipv6RdRelayPrefix ( Ipv4Addr ) ,
54
54
Ipv6RdPrefixLen ( u16 ) ,
55
55
Ipv6RdRelayPrefixLen ( u16 ) ,
56
56
EncapType ( TunnelEncapType ) ,
57
57
EncapFlags ( TunnelEncapFlags ) ,
58
58
EncapSPort ( u16 ) ,
59
59
EncapDPort ( u16 ) ,
60
- CollectMetada ( bool ) ,
60
+ CollectMetadata ( bool ) ,
61
61
FwMark ( u32 ) ,
62
62
Other ( DefaultNla ) ,
63
63
}
@@ -66,7 +66,8 @@ impl Nla for InfoIpTunnel {
66
66
fn value_len ( & self ) -> usize {
67
67
use self :: InfoIpTunnel :: * ;
68
68
match self {
69
- Ipv6RdPrefix ( _) | Ipv6RdRelayPrefix ( _) => 16 ,
69
+ Ipv6RdPrefix ( _) => 16 ,
70
+ Ipv6RdRelayPrefix ( _) => 4 ,
70
71
Local ( value) | Remote ( value) => match value {
71
72
IpAddr :: V4 ( _) => 4 ,
72
73
IpAddr :: V6 ( _) => 16 ,
@@ -80,18 +81,17 @@ impl Nla for InfoIpTunnel {
80
81
| EncapDPort ( _)
81
82
| Ipv6RdPrefixLen ( _)
82
83
| Ipv6RdRelayPrefixLen ( _) => 2 ,
83
- Ttl ( _) | Tos ( _) | Protocol ( _) | PMtuDisc ( _) | CollectMetada ( _ )
84
- | EncapLimit ( _) => 1 ,
84
+ Ttl ( _) | Tos ( _) | Protocol ( _) | PMtuDisc ( _)
85
+ | CollectMetadata ( _ ) | EncapLimit ( _) => 1 ,
85
86
Other ( nla) => nla. value_len ( ) ,
86
87
}
87
88
}
88
89
89
90
fn emit_value ( & self , buffer : & mut [ u8 ] ) {
90
91
use self :: InfoIpTunnel :: * ;
91
92
match self {
92
- Ipv6RdPrefix ( value) | Ipv6RdRelayPrefix ( value) => {
93
- buffer. copy_from_slice ( & value. octets ( ) )
94
- }
93
+ Ipv6RdPrefix ( value) => buffer. copy_from_slice ( & value. octets ( ) ) ,
94
+ Ipv6RdRelayPrefix ( value) => buffer. copy_from_slice ( & value. octets ( ) ) ,
95
95
Link ( value) | FwMark ( value) | FlowInfo ( value) => {
96
96
NativeEndian :: write_u32 ( buffer, * value)
97
97
}
@@ -117,7 +117,7 @@ impl Nla for InfoIpTunnel {
117
117
}
118
118
Protocol ( value) => buffer[ 0 ] = u8:: from ( * value) ,
119
119
Ttl ( value) | Tos ( value) | EncapLimit ( value) => buffer[ 0 ] = * value,
120
- PMtuDisc ( value) | CollectMetada ( value) => {
120
+ PMtuDisc ( value) | CollectMetadata ( value) => {
121
121
buffer[ 0 ] = if * value { 1 } else { 0 }
122
122
}
123
123
Other ( nla) => nla. emit_value ( buffer) ,
@@ -145,7 +145,7 @@ impl Nla for InfoIpTunnel {
145
145
EncapFlags ( _) => IFLA_IPTUN_ENCAP_FLAGS ,
146
146
EncapSPort ( _) => IFLA_IPTUN_ENCAP_SPORT ,
147
147
EncapDPort ( _) => IFLA_IPTUN_ENCAP_DPORT ,
148
- CollectMetada ( _) => IFLA_IPTUN_COLLECT_METADATA ,
148
+ CollectMetadata ( _) => IFLA_IPTUN_COLLECT_METADATA ,
149
149
FwMark ( _) => IFLA_IPTUN_FWMARK ,
150
150
Other ( nla) => nla. kind ( ) ,
151
151
}
@@ -231,14 +231,14 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
231
231
}
232
232
}
233
233
IFLA_IPTUN_6RD_RELAY_PREFIX => {
234
- if payload. len ( ) == 16 {
235
- let mut data = [ 0u8 ; 16 ] ;
236
- data. copy_from_slice ( & payload[ 0 ..16 ] ) ;
237
- Self :: Ipv6RdRelayPrefix ( Ipv6Addr :: from ( data) )
234
+ if payload. len ( ) == 4 {
235
+ let mut data = [ 0u8 ; 4 ] ;
236
+ data. copy_from_slice ( & payload[ 0 ..4 ] ) ;
237
+ Self :: Ipv6RdRelayPrefix ( Ipv4Addr :: from ( data) )
238
238
} else {
239
239
return Err ( DecodeError :: from ( format ! (
240
240
"Invalid IFLA_IPTUN_6RD_RELAY_PREFIX, got unexpected \
241
- length of IPv6 address payload {payload:?}"
241
+ length of IPv4 address payload {payload:?}"
242
242
) ) ) ;
243
243
}
244
244
}
@@ -269,7 +269,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
269
269
parse_u16_be ( payload)
270
270
. context ( "invalid IFLA_IPTUN_ENCAP_DPORT value" ) ?,
271
271
) ,
272
- IFLA_IPTUN_COLLECT_METADATA => CollectMetada (
272
+ IFLA_IPTUN_COLLECT_METADATA => CollectMetadata (
273
273
parse_u8 ( payload)
274
274
. context ( "invalid IFLA_IPTUN_COLLECT_METADATA value" ) ?
275
275
> 0 ,
0 commit comments