@@ -8,7 +8,7 @@ use byteorder::{ByteOrder, NativeEndian};
8
8
use netlink_packet_utils:: {
9
9
nla:: { DefaultNla , Nla , NlaBuffer } ,
10
10
parsers:: { parse_u16, parse_u32, parse_u8} ,
11
- traits:: Parseable ,
11
+ traits:: { Parseable , ParseableParametrized } ,
12
12
DecodeError ,
13
13
} ;
14
14
@@ -45,7 +45,9 @@ pub enum InfoIpTunnel {
45
45
Tos ( u8 ) ,
46
46
EncapLimit ( u8 ) ,
47
47
FlowInfo ( u32 ) ,
48
- Flags ( TunnelFlags ) ,
48
+ Ipv6SitFlags ( u16 ) ,
49
+ Ipv4Flags ( u16 ) ,
50
+ Ipv6Flags ( u32 ) ,
49
51
Protocol ( IpProtocol ) ,
50
52
PMtuDisc ( bool ) ,
51
53
Ipv6RdPrefix ( Ipv6Addr ) ,
@@ -70,8 +72,10 @@ impl Nla for InfoIpTunnel {
70
72
IpAddr :: V4 ( _) => 4 ,
71
73
IpAddr :: V6 ( _) => 16 ,
72
74
} ,
73
- Link ( _) | FwMark ( _) | FlowInfo ( _) | Flags ( _) => 4 ,
74
- EncapType ( _)
75
+ Link ( _) | FwMark ( _) | FlowInfo ( _) | Ipv6Flags ( _) => 4 ,
76
+ Ipv6SitFlags ( _)
77
+ | Ipv4Flags ( _)
78
+ | EncapType ( _)
75
79
| EncapFlags ( _)
76
80
| EncapSPort ( _)
77
81
| EncapDPort ( _)
@@ -92,8 +96,11 @@ impl Nla for InfoIpTunnel {
92
96
Link ( value) | FwMark ( value) | FlowInfo ( value) => {
93
97
NativeEndian :: write_u32 ( buffer, * value)
94
98
}
95
- Flags ( f) => {
96
- NativeEndian :: write_u32 ( buffer, f. bits ( ) ) ;
99
+ Ipv6Flags ( val) => {
100
+ NativeEndian :: write_u32 ( buffer, * val) ;
101
+ }
102
+ Ipv6SitFlags ( val) | Ipv4Flags ( val) => {
103
+ NativeEndian :: write_u16 ( buffer, * val) ;
97
104
}
98
105
Local ( value) | Remote ( value) => match value {
99
106
IpAddr :: V4 ( ipv4) => buffer. copy_from_slice ( & ipv4. octets ( ) ) ,
@@ -109,7 +116,7 @@ impl Nla for InfoIpTunnel {
109
116
| Ipv6RdRelayPrefixLen ( value) => {
110
117
NativeEndian :: write_u16 ( buffer, * value)
111
118
}
112
- Protocol ( value) => buffer[ 0 ] = i32 :: from ( * value) as u8 ,
119
+ Protocol ( value) => buffer[ 0 ] = u8 :: from ( * value) ,
113
120
Ttl ( value) | Tos ( value) | EncapLimit ( value) => buffer[ 0 ] = * value,
114
121
PMtuDisc ( value) | CollectMetada ( value) => {
115
122
buffer[ 0 ] = if * value { 1 } else { 0 }
@@ -128,7 +135,7 @@ impl Nla for InfoIpTunnel {
128
135
Tos ( _) => IFLA_IPTUN_TOS ,
129
136
EncapLimit ( _) => IFLA_IPTUN_ENCAP_LIMIT ,
130
137
FlowInfo ( _) => IFLA_IPTUN_FLOWINFO ,
131
- Flags ( _) => IFLA_IPTUN_FLAGS ,
138
+ Ipv6SitFlags ( _ ) | Ipv4Flags ( _ ) | Ipv6Flags ( _) => IFLA_IPTUN_FLAGS ,
132
139
Protocol ( _) => IFLA_IPTUN_PROTO ,
133
140
PMtuDisc ( _) => IFLA_IPTUN_PMTUDISC ,
134
141
Ipv6RdPrefix ( _) => IFLA_IPTUN_6RD_PREFIX ,
@@ -146,8 +153,13 @@ impl Nla for InfoIpTunnel {
146
153
}
147
154
}
148
155
149
- impl < ' a , T : AsRef < [ u8 ] > + ?Sized > Parseable < NlaBuffer < & ' a T > > for InfoIpTunnel {
150
- fn parse ( buf : & NlaBuffer < & ' a T > ) -> Result < Self , DecodeError > {
156
+ impl < ' a , T : AsRef < [ u8 ] > + ?Sized >
157
+ ParseableParametrized < NlaBuffer < & ' a T > , super :: InfoKind > for InfoIpTunnel
158
+ {
159
+ fn parse_with_param (
160
+ buf : & NlaBuffer < & ' a T > ,
161
+ kind : super :: InfoKind ,
162
+ ) -> Result < Self , DecodeError > {
151
163
use self :: InfoIpTunnel :: * ;
152
164
let payload = buf. value ( ) ;
153
165
Ok ( match buf. kind ( ) {
@@ -202,12 +214,27 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoIpTunnel {
202
214
parse_u32 ( payload)
203
215
. context ( "invalid IFLA_IPTUN_FLOWINFO value" ) ?,
204
216
) ,
205
- IFLA_IPTUN_FLAGS => Flags ( TunnelFlags :: from_bits_retain (
206
- parse_u32 ( payload) . context ( "invalid IFLA_IPTUN_FLAGS value" ) ?,
207
- ) ) ,
217
+ IFLA_IPTUN_FLAGS => match kind {
218
+ super :: InfoKind :: SitTun => InfoIpTunnel :: Ipv6SitFlags (
219
+ parse_u16 ( payload)
220
+ . context ( "invalid IFLA_IPTUN_FLAGS for SIT" ) ?,
221
+ ) ,
222
+ super :: InfoKind :: Tun => InfoIpTunnel :: Ipv4Flags (
223
+ parse_u16 ( payload)
224
+ . context ( "invalid IFLA_IPTUN_FLAGS for IPIP" ) ?,
225
+ ) ,
226
+ super :: InfoKind :: Ip6Tnl => InfoIpTunnel :: Ipv6Flags (
227
+ parse_u32 ( payload)
228
+ . context ( "invalid IFLA_IPTUN_FLAGS for IP6" ) ?,
229
+ ) ,
230
+ _ => {
231
+ return Err ( DecodeError :: from ( format ! (
232
+ "unsupported InfoKind for IFLA_IPTUN_FLAGS: {kind:?}"
233
+ ) ) ) ;
234
+ }
235
+ } ,
208
236
IFLA_IPTUN_PROTO => Protocol ( IpProtocol :: from (
209
- parse_u8 ( payload) . context ( "invalid IFLA_IPTUN_PROTO value" ) ?
210
- as i32 ,
237
+ parse_u8 ( payload) . context ( "invalid IFLA_IPTUN_PROTO value" ) ?,
211
238
) ) ,
212
239
IFLA_IPTUN_PMTUDISC => PMtuDisc (
213
240
parse_u8 ( payload)
0 commit comments