11// SPDX-License-Identifier: MIT
22
33use netlink_packet_core:: {
4- DecodeError , DefaultNla , Emitable , ErrorContext , Nla , NlaBuffer ,
5- NlasIterator , Parseable ,
4+ emit_u32_be , parse_u32_be , DecodeError , DefaultNla , Emitable , ErrorContext ,
5+ Nla , NlaBuffer , NlasIterator , Parseable ,
66} ;
77
8- use crate :: conntrack:: attributes:: { protoinfo:: ProtoInfo , tuple:: Tuple } ;
8+ use crate :: conntrack:: attributes:: {
9+ protoinfo:: ProtoInfo , status:: Status , tuple:: Tuple ,
10+ } ;
911
1012const CTA_TUPLE_ORIG : u16 = 1 ;
13+ const CTA_TUPLE_REPLY : u16 = 2 ;
1114const CTA_PROTOINFO : u16 = 4 ;
15+ const CTA_STATUS : u16 = 3 ;
16+ const CTA_TIMEOUT : u16 = 7 ;
17+ const CTA_MARK : u16 = 8 ;
1218
1319#[ derive( Clone , Debug , PartialEq , Eq ) ]
1420#[ non_exhaustive]
1521pub enum ConntrackNla {
1622 CtaTupleOrig ( Vec < Tuple > ) ,
23+ CtaTupleReply ( Vec < Tuple > ) ,
1724 CtaProtoInfo ( Vec < ProtoInfo > ) ,
25+ CtaStatus ( Status ) ,
26+ CtaTimeout ( u32 ) ,
27+ CtaMark ( u32 ) ,
1828 Other ( DefaultNla ) ,
1929}
2030
@@ -24,17 +34,27 @@ impl Nla for ConntrackNla {
2434 ConntrackNla :: CtaTupleOrig ( attr) => {
2535 attr. iter ( ) . map ( |op| op. buffer_len ( ) ) . sum ( )
2636 }
37+ ConntrackNla :: CtaTupleReply ( attr) => {
38+ attr. iter ( ) . map ( |op| op. buffer_len ( ) ) . sum ( )
39+ }
2740 ConntrackNla :: CtaProtoInfo ( attr) => {
2841 attr. iter ( ) . map ( |op| op. buffer_len ( ) ) . sum ( )
2942 }
43+ ConntrackNla :: CtaStatus ( _) => size_of :: < u32 > ( ) ,
44+ ConntrackNla :: CtaTimeout ( attr) => size_of_val ( attr) ,
45+ ConntrackNla :: CtaMark ( attr) => size_of_val ( attr) ,
3046 ConntrackNla :: Other ( attr) => attr. value_len ( ) ,
3147 }
3248 }
3349
3450 fn kind ( & self ) -> u16 {
3551 match self {
3652 ConntrackNla :: CtaTupleOrig ( _) => CTA_TUPLE_ORIG ,
53+ ConntrackNla :: CtaTupleReply ( _) => CTA_TUPLE_REPLY ,
3754 ConntrackNla :: CtaProtoInfo ( _) => CTA_PROTOINFO ,
55+ ConntrackNla :: CtaStatus ( _) => CTA_STATUS ,
56+ ConntrackNla :: CtaTimeout ( _) => CTA_TIMEOUT ,
57+ ConntrackNla :: CtaMark ( _) => CTA_MARK ,
3858 ConntrackNla :: Other ( attr) => attr. kind ( ) ,
3959 }
4060 }
@@ -48,20 +68,36 @@ impl Nla for ConntrackNla {
4868 len += op. buffer_len ( ) ;
4969 }
5070 }
71+ ConntrackNla :: CtaTupleReply ( attr) => {
72+ let mut len = 0 ;
73+ for op in attr {
74+ op. emit ( & mut buffer[ len..] ) ;
75+ len += op. buffer_len ( ) ;
76+ }
77+ }
5178 ConntrackNla :: CtaProtoInfo ( attr) => {
5279 let mut len = 0 ;
5380 for op in attr {
5481 op. emit ( & mut buffer[ len..] ) ;
5582 len += op. buffer_len ( ) ;
5683 }
5784 }
85+ ConntrackNla :: CtaStatus ( attr) => {
86+ emit_u32_be ( buffer, ( * attr) . bits ( ) ) . unwrap ( )
87+ }
88+ ConntrackNla :: CtaTimeout ( attr) => {
89+ emit_u32_be ( buffer, * attr) . unwrap ( )
90+ }
91+ ConntrackNla :: CtaMark ( attr) => emit_u32_be ( buffer, * attr) . unwrap ( ) ,
5892 ConntrackNla :: Other ( attr) => attr. emit_value ( buffer) ,
5993 }
6094 }
6195 fn is_nested ( & self ) -> bool {
6296 matches ! (
6397 self ,
64- ConntrackNla :: CtaTupleOrig ( _) | ConntrackNla :: CtaProtoInfo ( _)
98+ ConntrackNla :: CtaTupleOrig ( _)
99+ | ConntrackNla :: CtaTupleReply ( _)
100+ | ConntrackNla :: CtaProtoInfo ( _)
65101 )
66102 }
67103}
@@ -81,6 +117,16 @@ impl<'buffer, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'buffer T>>
81117 }
82118 ConntrackNla :: CtaTupleOrig ( tuples)
83119 }
120+ CTA_TUPLE_REPLY => {
121+ let mut tuples = Vec :: new ( ) ;
122+ for nlas in NlasIterator :: new ( payload) {
123+ let nlas =
124+ & nlas. context ( "invalid CTA_TUPLE_REPLY value" ) ?;
125+
126+ tuples. push ( Tuple :: parse ( nlas) ?) ;
127+ }
128+ ConntrackNla :: CtaTupleReply ( tuples)
129+ }
84130 CTA_PROTOINFO => {
85131 let mut proto_infos = Vec :: new ( ) ;
86132 for nlas in NlasIterator :: new ( payload) {
@@ -89,6 +135,15 @@ impl<'buffer, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'buffer T>>
89135 }
90136 ConntrackNla :: CtaProtoInfo ( proto_infos)
91137 }
138+ CTA_STATUS => ConntrackNla :: CtaStatus ( Status :: from_bits_retain (
139+ parse_u32_be ( payload) . context ( "invalid CTA_STATUS value" ) ?,
140+ ) ) ,
141+ CTA_TIMEOUT => ConntrackNla :: CtaTimeout (
142+ parse_u32_be ( payload) . context ( "invalid CTA_TIMEOUT value" ) ?,
143+ ) ,
144+ CTA_MARK => ConntrackNla :: CtaMark (
145+ parse_u32_be ( payload) . context ( "invalid CTA_MARK value" ) ?,
146+ ) ,
92147 _ => ConntrackNla :: Other ( DefaultNla :: parse ( buf) ?) ,
93148 } ;
94149 Ok ( nla)
0 commit comments