|
1 | 1 | // SPDX-License-Identifier: MIT |
2 | 2 |
|
3 | 3 | use anyhow::Context; |
4 | | -use netlink_packet_utils::{ |
5 | | - DecodeError, Emitable, Parseable, ParseableParametrized, |
6 | | -}; |
7 | | - |
8 | 4 | use netlink_packet_core::{ |
9 | 5 | NetlinkDeserializable, NetlinkHeader, NetlinkPayload, NetlinkSerializable, |
10 | 6 | }; |
| 7 | +use netlink_packet_utils::{ |
| 8 | + DecodeError, Emitable, Parseable, ParseableParametrized, |
| 9 | +}; |
11 | 10 |
|
| 11 | +use crate::tc::{TcActionMessage, TcActionMessageBuffer}; |
12 | 12 | use crate::{ |
13 | 13 | address::{AddressHeader, AddressMessage, AddressMessageBuffer}, |
14 | 14 | link::{LinkMessage, LinkMessageBuffer}, |
@@ -46,9 +46,9 @@ const RTM_GETTCLASS: u16 = 42; |
46 | 46 | const RTM_NEWTFILTER: u16 = 44; |
47 | 47 | const RTM_DELTFILTER: u16 = 45; |
48 | 48 | const RTM_GETTFILTER: u16 = 46; |
49 | | -// const RTM_NEWACTION: u16 = 48; |
50 | | -// const RTM_DELACTION: u16 = 49; |
51 | | -// const RTM_GETACTION: u16 = 50; |
| 49 | +const RTM_NEWACTION: u16 = 48; |
| 50 | +const RTM_DELACTION: u16 = 49; |
| 51 | +const RTM_GETACTION: u16 = 50; |
52 | 52 | const RTM_NEWPREFIX: u16 = 52; |
53 | 53 | // const RTM_GETMULTICAST: u16 = 58; |
54 | 54 | // const RTM_GETANYCAST: u16 = 62; |
@@ -291,6 +291,21 @@ impl<'a, T: AsRef<[u8]> + ?Sized> |
291 | 291 | } |
292 | 292 | } |
293 | 293 |
|
| 294 | + RTM_NEWACTION | RTM_DELACTION | RTM_GETACTION => { |
| 295 | + let err = "invalid tc action message"; |
| 296 | + let msg = TcActionMessage::parse( |
| 297 | + &TcActionMessageBuffer::new_checked(&buf.inner()) |
| 298 | + .context(err)?, |
| 299 | + ) |
| 300 | + .context(err)?; |
| 301 | + match message_type { |
| 302 | + RTM_NEWACTION => RouteNetlinkMessage::NewTrafficAction(msg), |
| 303 | + RTM_DELACTION => RouteNetlinkMessage::DelTrafficAction(msg), |
| 304 | + RTM_GETACTION => RouteNetlinkMessage::GetTrafficAction(msg), |
| 305 | + _ => unreachable!(), |
| 306 | + } |
| 307 | + } |
| 308 | + |
294 | 309 | // ND ID Messages |
295 | 310 | RTM_NEWNSID | RTM_GETNSID | RTM_DELNSID => { |
296 | 311 | let err = "invalid nsid message"; |
@@ -348,6 +363,9 @@ pub enum RouteNetlinkMessage { |
348 | 363 | NewTrafficFilter(TcMessage), |
349 | 364 | DelTrafficFilter(TcMessage), |
350 | 365 | GetTrafficFilter(TcMessage), |
| 366 | + NewTrafficAction(TcActionMessage), |
| 367 | + DelTrafficAction(TcActionMessage), |
| 368 | + GetTrafficAction(TcActionMessage), |
351 | 369 | NewTrafficChain(TcMessage), |
352 | 370 | DelTrafficChain(TcMessage), |
353 | 371 | GetTrafficChain(TcMessage), |
@@ -460,6 +478,18 @@ impl RouteNetlinkMessage { |
460 | 478 | matches!(self, RouteNetlinkMessage::GetTrafficFilter(_)) |
461 | 479 | } |
462 | 480 |
|
| 481 | + pub fn is_new_action(&self) -> bool { |
| 482 | + matches!(self, RouteNetlinkMessage::NewTrafficAction(_)) |
| 483 | + } |
| 484 | + |
| 485 | + pub fn is_del_action(&self) -> bool { |
| 486 | + matches!(self, RouteNetlinkMessage::DelTrafficAction(_)) |
| 487 | + } |
| 488 | + |
| 489 | + pub fn is_get_action(&self) -> bool { |
| 490 | + matches!(self, RouteNetlinkMessage::GetTrafficAction(_)) |
| 491 | + } |
| 492 | + |
463 | 493 | pub fn is_new_chain(&self) -> bool { |
464 | 494 | matches!(self, RouteNetlinkMessage::NewTrafficChain(_)) |
465 | 495 | } |
@@ -528,6 +558,9 @@ impl RouteNetlinkMessage { |
528 | 558 | NewTrafficFilter(_) => RTM_NEWTFILTER, |
529 | 559 | DelTrafficFilter(_) => RTM_DELTFILTER, |
530 | 560 | GetTrafficFilter(_) => RTM_GETTFILTER, |
| 561 | + NewTrafficAction(_) => RTM_NEWACTION, |
| 562 | + DelTrafficAction(_) => RTM_DELACTION, |
| 563 | + GetTrafficAction(_) => RTM_GETACTION, |
531 | 564 | NewTrafficChain(_) => RTM_NEWCHAIN, |
532 | 565 | DelTrafficChain(_) => RTM_DELCHAIN, |
533 | 566 | GetTrafficChain(_) => RTM_GETCHAIN, |
@@ -598,7 +631,12 @@ impl Emitable for RouteNetlinkMessage { |
598 | 631 | | NewRule(ref msg) |
599 | 632 | | DelRule(ref msg) |
600 | 633 | | GetRule(ref msg) |
601 | | - => msg.buffer_len() |
| 634 | + => msg.buffer_len(), |
| 635 | + |
| 636 | + | NewTrafficAction(ref msg) |
| 637 | + | DelTrafficAction(ref msg) |
| 638 | + | GetTrafficAction(ref msg) |
| 639 | + => msg.buffer_len(), |
602 | 640 | } |
603 | 641 | } |
604 | 642 |
|
@@ -658,7 +696,12 @@ impl Emitable for RouteNetlinkMessage { |
658 | 696 | | NewRule(ref msg) |
659 | 697 | | DelRule(ref msg) |
660 | 698 | | GetRule(ref msg) |
661 | | - => msg.emit(buffer) |
| 699 | + => msg.emit(buffer), |
| 700 | + |
| 701 | + | NewTrafficAction(ref msg) |
| 702 | + | DelTrafficAction(ref msg) |
| 703 | + | GetTrafficAction(ref msg) |
| 704 | + => msg.emit(buffer), |
662 | 705 | } |
663 | 706 | } |
664 | 707 | } |
|
0 commit comments