@@ -14,6 +14,7 @@ use crate::{
1414 prefix:: { PrefixMessage , PrefixMessageBuffer } ,
1515 route:: { RouteHeader , RouteMessage , RouteMessageBuffer } ,
1616 rule:: { RuleMessage , RuleMessageBuffer } ,
17+ stats:: { StatsMessage , StatsMessageBuffer } ,
1718 tc:: { TcActionMessage , TcActionMessageBuffer , TcMessage , TcMessageBuffer } ,
1819} ;
1920
@@ -66,8 +67,8 @@ const RTM_SETNEIGHTBL: u16 = 67;
6667const RTM_NEWNSID : u16 = 88 ;
6768const RTM_DELNSID : u16 = 89 ;
6869const RTM_GETNSID : u16 = 90 ;
69- // const RTM_NEWSTATS: u16 = 92;
70- // const RTM_GETSTATS: u16 = 94;
70+ const RTM_NEWSTATS : u16 = 92 ;
71+ const RTM_GETSTATS : u16 = 94 ;
7172// const RTM_NEWCACHEREPORT: u16 = 96;
7273const RTM_NEWCHAIN : u16 = 100 ;
7374const RTM_DELCHAIN : u16 = 101 ;
@@ -302,6 +303,21 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
302303 }
303304 }
304305
306+ // Stats messages
307+ RTM_NEWSTATS | RTM_GETSTATS => {
308+ let err = "invalid stats message" ;
309+ let msg = StatsMessage :: parse (
310+ & StatsMessageBuffer :: new_checked ( & buf. inner ( ) )
311+ . context ( err) ?,
312+ )
313+ . context ( err) ?;
314+ match message_type {
315+ RTM_NEWSTATS => RouteNetlinkMessage :: NewStats ( msg) ,
316+ RTM_GETSTATS => RouteNetlinkMessage :: GetStats ( msg) ,
317+ _ => unreachable ! ( ) ,
318+ }
319+ }
320+
305321 // ND ID Messages
306322 RTM_NEWNSID | RTM_GETNSID | RTM_DELNSID => {
307323 let err = "invalid nsid message" ;
@@ -365,6 +381,8 @@ pub enum RouteNetlinkMessage {
365381 NewTrafficChain ( TcMessage ) ,
366382 DelTrafficChain ( TcMessage ) ,
367383 GetTrafficChain ( TcMessage ) ,
384+ NewStats ( StatsMessage ) ,
385+ GetStats ( StatsMessage ) ,
368386 NewNsId ( NsidMessage ) ,
369387 DelNsId ( NsidMessage ) ,
370388 GetNsId ( NsidMessage ) ,
@@ -522,6 +540,14 @@ impl RouteNetlinkMessage {
522540 matches ! ( self , RouteNetlinkMessage :: DelRule ( _) )
523541 }
524542
543+ pub fn is_new_stats ( & self ) -> bool {
544+ matches ! ( self , RouteNetlinkMessage :: NewStats ( _) )
545+ }
546+
547+ pub fn is_get_stats ( & self ) -> bool {
548+ matches ! ( self , RouteNetlinkMessage :: GetStats ( _) )
549+ }
550+
525551 pub fn message_type ( & self ) -> u16 {
526552 match self {
527553 Self :: NewLink ( _) => RTM_NEWLINK ,
@@ -561,6 +587,8 @@ impl RouteNetlinkMessage {
561587 Self :: GetNsId ( _) => RTM_GETNSID ,
562588 Self :: NewNsId ( _) => RTM_NEWNSID ,
563589 Self :: DelNsId ( _) => RTM_DELNSID ,
590+ Self :: NewStats ( _) => RTM_NEWSTATS ,
591+ Self :: GetStats ( _) => RTM_GETSTATS ,
564592 Self :: GetRule ( _) => RTM_GETRULE ,
565593 Self :: NewRule ( _) => RTM_NEWRULE ,
566594 Self :: DelRule ( _) => RTM_DELRULE ,
@@ -613,6 +641,10 @@ impl Emitable for RouteNetlinkMessage {
613641 | Self :: DelNsId ( ref msg)
614642 | Self :: GetNsId ( ref msg) => msg. buffer_len ( ) ,
615643
644+ Self :: NewStats ( ref msg) | Self :: GetStats ( ref msg) => {
645+ msg. buffer_len ( )
646+ }
647+
616648 Self :: NewRule ( ref msg)
617649 | Self :: DelRule ( ref msg)
618650 | Self :: GetRule ( ref msg) => msg. buffer_len ( ) ,
@@ -667,6 +699,10 @@ impl Emitable for RouteNetlinkMessage {
667699 | Self :: DelNsId ( ref msg)
668700 | Self :: GetNsId ( ref msg) => msg. emit ( buffer) ,
669701
702+ Self :: NewStats ( ref msg) | Self :: GetStats ( ref msg) => {
703+ msg. emit ( buffer)
704+ }
705+
670706 Self :: NewRule ( ref msg)
671707 | Self :: DelRule ( ref msg)
672708 | Self :: GetRule ( ref msg) => msg. emit ( buffer) ,
0 commit comments