|
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