@@ -57,31 +57,20 @@ impl QueryRequest {
57
57
}
58
58
59
59
// ---------------------------------------------------------------------------------------------------------------------
60
- // PortStats
60
+ // QueryResponse
61
61
// ---------------------------------------------------------------------------------------------------------------------
62
62
63
- #[ derive( Debug ) ]
64
- pub struct PortStats {
65
- pub stats : Vec < PortStat > ,
66
- }
63
+ struct QueryResponse ;
67
64
68
- #[ derive( Debug ) ]
69
- pub struct PortStat {
70
- pub port_no : u8 ,
71
- pub recv_bytes : u64 ,
72
- pub send_bytes : u64 ,
73
- pub error_pkts : u64 ,
74
- }
75
-
76
- impl PortStats {
77
- fn decode ( dat : & [ u8 ] ) -> Result < Self , Error > {
65
+ impl QueryResponse {
66
+ fn decode ( dat : & [ u8 ] ) -> Result < Vec < Vec < u8 > > , Error > {
78
67
let ( _, rest) = bytes ( & [ 0x01 , 0x02 ] )
79
68
. and ( be_u16 ( ) )
80
69
. and ( be_u16 ( ) )
81
70
. and ( skip_count ( 26 , any ( ) ) )
82
71
. parse ( dat)
83
72
. map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
84
- let mut stats = Vec :: new ( ) ;
73
+ let mut ret = Vec :: new ( ) ;
85
74
let mut buf = rest;
86
75
while buf. len ( ) != 0 {
87
76
let ( ( cmd, len) , rest) = be_u16 ( )
@@ -99,9 +88,38 @@ impl PortStats {
99
88
. map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
100
89
buf = rest;
101
90
91
+ ret. push ( dat) ;
92
+ }
93
+
94
+ Ok ( ret)
95
+ }
96
+ }
97
+
98
+ // ---------------------------------------------------------------------------------------------------------------------
99
+ // PortStats
100
+ // ---------------------------------------------------------------------------------------------------------------------
101
+
102
+ #[ derive( Debug ) ]
103
+ pub struct PortStats {
104
+ pub stats : Vec < PortStat > ,
105
+ }
106
+
107
+ #[ derive( Debug ) ]
108
+ pub struct PortStat {
109
+ pub port_no : u8 ,
110
+ pub recv_bytes : u64 ,
111
+ pub send_bytes : u64 ,
112
+ pub error_pkts : u64 ,
113
+ }
114
+
115
+ impl PortStats {
116
+ fn decode ( dat : & [ u8 ] ) -> Result < Self , Error > {
117
+ let dat = QueryResponse :: decode ( dat) ?;
118
+ let mut stats = Vec :: new ( ) ;
119
+ for d in dat {
102
120
let ( ( port_no, metrics) , _rest) = any ( )
103
121
. and ( count :: < Vec < _ > , _ > ( 6 , be_u64 ( ) ) )
104
- . parse ( & dat as & [ u8 ] )
122
+ . parse ( & d as & [ u8 ] )
105
123
. map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
106
124
107
125
let stat = PortStat {
@@ -144,33 +162,12 @@ pub enum Link {
144
162
145
163
impl SpeedStats {
146
164
fn decode ( dat : & [ u8 ] ) -> Result < Self , Error > {
147
- let ( _, rest) = bytes ( & [ 0x01 , 0x02 ] )
148
- . and ( be_u16 ( ) )
149
- . and ( be_u16 ( ) )
150
- . and ( skip_count ( 26 , any ( ) ) )
151
- . parse ( dat)
152
- . map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
165
+ let dat = QueryResponse :: decode ( dat) ?;
153
166
let mut stats = Vec :: new ( ) ;
154
- let mut buf = rest;
155
- while buf. len ( ) != 0 {
156
- let ( ( cmd, len) , rest) = be_u16 ( )
157
- . and ( be_u16 ( ) )
158
- . parse ( buf)
159
- . map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
160
- buf = rest;
161
-
162
- if cmd == 0xffff {
163
- break ;
164
- }
165
-
166
- let ( dat, rest) = count :: < Vec < _ > , _ > ( len as usize , any ( ) )
167
- . parse ( buf)
168
- . map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
169
- buf = rest;
170
-
167
+ for d in dat {
171
168
let ( ( port_no, metrics) , _rest) = any ( )
172
169
. and ( count :: < Vec < _ > , _ > ( 2 , any ( ) ) )
173
- . parse ( & dat as & [ u8 ] )
170
+ . parse ( & d as & [ u8 ] )
174
171
. map_err ( |x| format_err ! ( "failed to parse: {:?}" , x) ) ?;
175
172
176
173
let link = match metrics[ 0 ] {
@@ -188,7 +185,6 @@ impl SpeedStats {
188
185
port_no : port_no,
189
186
link : link,
190
187
} ;
191
-
192
188
stats. push ( stat) ;
193
189
}
194
190
0 commit comments