@@ -149,6 +149,8 @@ pub enum EthType {
149
149
Arp = 0x0806 ,
150
150
Vlan = 0x8100 ,
151
151
Qinq = 0x88A8 ,
152
+ MplsUnicast = 0x8847 ,
153
+ MplsMulticast = 0x8848 ,
152
154
Other ( u16 ) ,
153
155
}
154
156
@@ -160,6 +162,8 @@ impl EthType {
160
162
EthType :: Arp => 0x0806 ,
161
163
EthType :: Vlan => 0x8100 ,
162
164
EthType :: Qinq => 0x88A8 ,
165
+ EthType :: MplsUnicast => 0x8847 ,
166
+ EthType :: MplsMulticast => 0x8848 ,
163
167
EthType :: Other ( val) => * val,
164
168
}
165
169
}
@@ -175,6 +179,8 @@ impl From<u16> for EthType {
175
179
0x0800 => Self :: IPv4 ,
176
180
0x86DD => Self :: IPv6 ,
177
181
0x0806 => Self :: Arp ,
182
+ 0x8847 => Self :: MplsUnicast ,
183
+ 0x8848 => Self :: MplsMulticast ,
178
184
_ => Self :: Other ( val) ,
179
185
}
180
186
}
@@ -188,6 +194,8 @@ impl From<EthType> for u16 {
188
194
EthType :: Arp => 0x0806 ,
189
195
EthType :: Vlan => 0x8100 ,
190
196
EthType :: Qinq => 0x88A8 ,
197
+ EthType :: MplsUnicast => 0x8847 ,
198
+ EthType :: MplsMulticast => 0x8848 ,
191
199
EthType :: Other ( val) => val,
192
200
}
193
201
}
@@ -196,6 +204,10 @@ impl From<EthType> for u16 {
196
204
pub type TcpPort = u16 ;
197
205
pub type UdpPort = u16 ;
198
206
pub type SctpPort = u16 ;
207
+ pub type MplsTtl = u8 ;
208
+ pub type MplsBos = u8 ;
209
+ pub type MplsTc = u8 ;
210
+ pub type MplsLabel = u32 ;
199
211
200
212
// Lists sourced from https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml
201
213
pub mod icmpv4 {
@@ -1333,6 +1345,10 @@ pub enum TcFilterFlowerOption {
1333
1345
KeyArpShaMask ( arp:: ShaMask ) ,
1334
1346
KeyArpTha ( arp:: Tha ) ,
1335
1347
KeyArpThaMask ( arp:: ThaMask ) ,
1348
+ KeyMplsTtl ( MplsTtl ) ,
1349
+ KeyMplsBos ( MplsBos ) ,
1350
+ KeyMplsTc ( MplsTc ) ,
1351
+ KeyMplsLabel ( MplsLabel ) ,
1336
1352
}
1337
1353
1338
1354
impl Nla for TcFilterFlowerOption {
@@ -1402,6 +1418,10 @@ impl Nla for TcFilterFlowerOption {
1402
1418
Self :: KeyArpShaMask ( _) => 6 ,
1403
1419
Self :: KeyArpTha ( _) => 6 ,
1404
1420
Self :: KeyArpThaMask ( _) => 6 ,
1421
+ Self :: KeyMplsTtl ( _) => 1 ,
1422
+ Self :: KeyMplsBos ( _) => 1 ,
1423
+ Self :: KeyMplsTc ( _) => 1 ,
1424
+ Self :: KeyMplsLabel ( _) => 4 ,
1405
1425
Self :: Other ( attr) => attr. value_len ( ) ,
1406
1426
}
1407
1427
}
@@ -1476,6 +1496,10 @@ impl Nla for TcFilterFlowerOption {
1476
1496
Self :: KeyArpShaMask ( _) => TCA_FLOWER_KEY_ARP_SHA_MASK ,
1477
1497
Self :: KeyArpTha ( _) => TCA_FLOWER_KEY_ARP_THA ,
1478
1498
Self :: KeyArpThaMask ( _) => TCA_FLOWER_KEY_ARP_THA_MASK ,
1499
+ Self :: KeyMplsTtl ( _) => TCA_FLOWER_KEY_MPLS_TTL ,
1500
+ Self :: KeyMplsBos ( _) => TCA_FLOWER_KEY_MPLS_BOS ,
1501
+ Self :: KeyMplsTc ( _) => TCA_FLOWER_KEY_MPLS_TC ,
1502
+ Self :: KeyMplsLabel ( _) => TCA_FLOWER_KEY_MPLS_LABEL ,
1479
1503
Self :: Other ( attr) => attr. kind ( ) ,
1480
1504
}
1481
1505
}
@@ -1607,6 +1631,20 @@ impl Nla for TcFilterFlowerOption {
1607
1631
Self :: KeyArpShaMask ( k) => buffer. copy_from_slice ( k. as_slice ( ) ) ,
1608
1632
Self :: KeyArpTha ( k) => buffer. copy_from_slice ( k. as_slice ( ) ) ,
1609
1633
Self :: KeyArpThaMask ( k) => buffer. copy_from_slice ( k. as_slice ( ) ) ,
1634
+ Self :: KeyMplsTtl ( ttl) => {
1635
+ buffer. copy_from_slice ( ttl. to_be_bytes ( ) . as_slice ( ) )
1636
+ }
1637
+ Self :: KeyMplsBos ( bos) => {
1638
+ buffer. copy_from_slice ( bos. to_be_bytes ( ) . as_slice ( ) )
1639
+ }
1640
+ Self :: KeyMplsTc ( tc) => {
1641
+ buffer. copy_from_slice ( tc. to_be_bytes ( ) . as_slice ( ) )
1642
+ }
1643
+ Self :: KeyMplsLabel ( label) => {
1644
+ // TODO: I don't know why the yaml says this should be big endian
1645
+ // but nothing works unless it's native endian. Bug report?
1646
+ buffer. copy_from_slice ( label. to_ne_bytes ( ) . as_slice ( ) )
1647
+ }
1610
1648
Self :: Other ( attr) => attr. emit_value ( buffer) ,
1611
1649
}
1612
1650
}
@@ -2167,6 +2205,31 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
2167
2205
Err ( e) => return Err ( e) ,
2168
2206
}
2169
2207
}
2208
+ TCA_FLOWER_KEY_MPLS_TTL => {
2209
+ if payload. len ( ) != 1 {
2210
+ return Err ( DecodeError :: from ( "invalid mpls ttl length" ) ) ;
2211
+ }
2212
+ Self :: KeyMplsTtl ( payload[ 0 ] )
2213
+ }
2214
+ TCA_FLOWER_KEY_MPLS_BOS => {
2215
+ if payload. len ( ) != 1 {
2216
+ return Err ( DecodeError :: from ( "invalid mpls bos length" ) ) ;
2217
+ }
2218
+ Self :: KeyMplsBos ( payload[ 0 ] )
2219
+ }
2220
+ TCA_FLOWER_KEY_MPLS_TC => {
2221
+ if payload. len ( ) != 1 {
2222
+ return Err ( DecodeError :: from ( "invalid mpls tc length" ) ) ;
2223
+ }
2224
+ Self :: KeyMplsTc ( payload[ 0 ] )
2225
+ }
2226
+ TCA_FLOWER_KEY_MPLS_LABEL => {
2227
+ if payload. len ( ) != 4 {
2228
+ return Err ( DecodeError :: from ( "invalid mpls label length" ) ) ;
2229
+ }
2230
+ let label = BigEndian :: read_u32 ( payload) ;
2231
+ Self :: KeyMplsLabel ( label)
2232
+ }
2170
2233
_ => Self :: Other (
2171
2234
DefaultNla :: parse ( buf) . context ( "failed to parse flower nla" ) ?,
2172
2235
) ,
0 commit comments