1
1
use super :: * ;
2
2
3
+ const VM_REPORT_BLOCK_LENGTH : u16 = 4 + 4 + 2 * 4 + 10 + 2 * 3 ;
4
+
3
5
/// VoIPMetricsReportBlock encodes a VoIP Metrics Report Block as described
4
6
/// in RFC 3611, section 4.7.
5
7
///
@@ -26,7 +28,6 @@ use super::*;
26
28
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27
29
#[ derive( Debug , Default , PartialEq , Clone ) ]
28
30
pub struct VoIPMetricsReportBlock {
29
- pub xr_header : XRHeader ,
30
31
pub ssrc : u32 ,
31
32
pub loss_rate : u8 ,
32
33
pub discard_rate : u8 ,
@@ -42,13 +43,13 @@ pub struct VoIPMetricsReportBlock {
42
43
pub gmin : u8 ,
43
44
pub rfactor : u8 ,
44
45
pub ext_rfactor : u8 ,
45
- pub moslq : u8 ,
46
- pub moscq : u8 ,
47
- pub rxconfig : u8 ,
46
+ pub mos_lq : u8 ,
47
+ pub mos_cq : u8 ,
48
+ pub rx_config : u8 ,
48
49
pub reserved : u8 ,
49
- pub jbnominal : u16 ,
50
- pub jbmaximum : u16 ,
51
- pub jbabs_max : u16 ,
50
+ pub jb_nominal : u16 ,
51
+ pub jb_maximum : u16 ,
52
+ pub jb_abs_max : u16 ,
52
53
}
53
54
54
55
impl fmt:: Display for VoIPMetricsReportBlock {
@@ -57,34 +58,153 @@ impl fmt::Display for VoIPMetricsReportBlock {
57
58
}
58
59
}
59
60
60
- impl ReportBlock for VoIPMetricsReportBlock {
61
- /// destination_ssrc returns an array of ssrc values that this report block refers to.
62
- fn destination_ssrc ( & self ) -> Vec < u32 > {
63
- vec ! [ self . ssrc]
61
+ impl VoIPMetricsReportBlock {
62
+ pub fn xr_header ( & self ) -> XRHeader {
63
+ XRHeader {
64
+ block_type : BlockType :: VoIPMetrics ,
65
+ type_specific : 0 ,
66
+ block_length : ( self . raw_size ( ) / 4 - 1 ) as u16 ,
67
+ }
64
68
}
69
+ }
65
70
66
- fn setup_block_header ( & mut self ) {
67
- self . xr_header . block_type = ReportBlockType :: VoIPMetrics ;
68
- self . xr_header . type_specific = 0 ;
69
- self . xr_header . block_length = ( self . raw_size ( ) / 4 - 1 ) as u16 ;
71
+ impl Packet for VoIPMetricsReportBlock {
72
+ fn header ( & self ) -> Header {
73
+ Header :: default ( )
70
74
}
71
75
72
- fn unpack_block_header ( & mut self ) { }
76
+ /// destination_ssrc returns an array of ssrc values that this report block refers to.
77
+ fn destination_ssrc ( & self ) -> Vec < u32 > {
78
+ vec ! [ self . ssrc]
79
+ }
73
80
74
81
fn raw_size ( & self ) -> usize {
75
- 4 + 4 + 4 + 2 * 4 + 10 + 2 * 3
82
+ XR_HEADER_LENGTH + VM_REPORT_BLOCK_LENGTH as usize
76
83
}
77
84
78
85
fn as_any ( & self ) -> & ( dyn Any + Send + Sync ) {
79
86
self
80
87
}
81
- fn equal ( & self , other : & ( dyn ReportBlock + Send + Sync ) ) -> bool {
88
+ fn equal ( & self , other : & ( dyn Packet + Send + Sync ) ) -> bool {
82
89
other
83
90
. as_any ( )
84
91
. downcast_ref :: < VoIPMetricsReportBlock > ( )
85
92
. map_or ( false , |a| self == a)
86
93
}
87
- fn cloned ( & self ) -> Box < dyn ReportBlock + Send + Sync > {
94
+ fn cloned ( & self ) -> Box < dyn Packet + Send + Sync > {
88
95
Box :: new ( self . clone ( ) )
89
96
}
90
97
}
98
+
99
+ impl MarshalSize for VoIPMetricsReportBlock {
100
+ fn marshal_size ( & self ) -> usize {
101
+ self . raw_size ( )
102
+ }
103
+ }
104
+
105
+ impl Marshal for VoIPMetricsReportBlock {
106
+ /// marshal_to encodes the VoIPMetricsReportBlock in binary
107
+ fn marshal_to ( & self , mut buf : & mut [ u8 ] ) -> Result < usize > {
108
+ if buf. remaining_mut ( ) < self . marshal_size ( ) {
109
+ return Err ( error:: Error :: BufferTooShort . into ( ) ) ;
110
+ }
111
+
112
+ let h = self . xr_header ( ) ;
113
+ let n = h. marshal_to ( buf) ?;
114
+ buf = & mut buf[ n..] ;
115
+
116
+ buf. put_u32 ( self . ssrc ) ;
117
+ buf. put_u8 ( self . loss_rate ) ;
118
+ buf. put_u8 ( self . discard_rate ) ;
119
+ buf. put_u8 ( self . burst_density ) ;
120
+ buf. put_u8 ( self . gap_density ) ;
121
+ buf. put_u16 ( self . burst_duration ) ;
122
+ buf. put_u16 ( self . gap_duration ) ;
123
+ buf. put_u16 ( self . round_trip_delay ) ;
124
+ buf. put_u16 ( self . end_system_delay ) ;
125
+ buf. put_u8 ( self . signal_level ) ;
126
+ buf. put_u8 ( self . noise_level ) ;
127
+ buf. put_u8 ( self . rerl ) ;
128
+ buf. put_u8 ( self . gmin ) ;
129
+ buf. put_u8 ( self . rfactor ) ;
130
+ buf. put_u8 ( self . ext_rfactor ) ;
131
+ buf. put_u8 ( self . mos_lq ) ;
132
+ buf. put_u8 ( self . mos_cq ) ;
133
+ buf. put_u8 ( self . rx_config ) ;
134
+ buf. put_u8 ( self . reserved ) ;
135
+ buf. put_u16 ( self . jb_nominal ) ;
136
+ buf. put_u16 ( self . jb_maximum ) ;
137
+ buf. put_u16 ( self . jb_abs_max ) ;
138
+
139
+ Ok ( self . marshal_size ( ) )
140
+ }
141
+ }
142
+
143
+ impl Unmarshal for VoIPMetricsReportBlock {
144
+ /// Unmarshal decodes the VoIPMetricsReportBlock from binary
145
+ fn unmarshal < B > ( raw_packet : & mut B ) -> Result < Self >
146
+ where
147
+ Self : Sized ,
148
+ B : Buf ,
149
+ {
150
+ if raw_packet. remaining ( ) < XR_HEADER_LENGTH {
151
+ return Err ( error:: Error :: PacketTooShort . into ( ) ) ;
152
+ }
153
+
154
+ let xr_header = XRHeader :: unmarshal ( raw_packet) ?;
155
+
156
+ if xr_header. block_length != VM_REPORT_BLOCK_LENGTH
157
+ || raw_packet. remaining ( ) < xr_header. block_length as usize
158
+ {
159
+ return Err ( error:: Error :: PacketTooShort . into ( ) ) ;
160
+ }
161
+
162
+ let ssrc = raw_packet. get_u32 ( ) ;
163
+ let loss_rate = raw_packet. get_u8 ( ) ;
164
+ let discard_rate = raw_packet. get_u8 ( ) ;
165
+ let burst_density = raw_packet. get_u8 ( ) ;
166
+ let gap_density = raw_packet. get_u8 ( ) ;
167
+ let burst_duration = raw_packet. get_u16 ( ) ;
168
+ let gap_duration = raw_packet. get_u16 ( ) ;
169
+ let round_trip_delay = raw_packet. get_u16 ( ) ;
170
+ let end_system_delay = raw_packet. get_u16 ( ) ;
171
+ let signal_level = raw_packet. get_u8 ( ) ;
172
+ let noise_level = raw_packet. get_u8 ( ) ;
173
+ let rerl = raw_packet. get_u8 ( ) ;
174
+ let gmin = raw_packet. get_u8 ( ) ;
175
+ let rfactor = raw_packet. get_u8 ( ) ;
176
+ let ext_rfactor = raw_packet. get_u8 ( ) ;
177
+ let mos_lq = raw_packet. get_u8 ( ) ;
178
+ let mos_cq = raw_packet. get_u8 ( ) ;
179
+ let rx_config = raw_packet. get_u8 ( ) ;
180
+ let reserved = raw_packet. get_u8 ( ) ;
181
+ let jb_nominal = raw_packet. get_u16 ( ) ;
182
+ let jb_maximum = raw_packet. get_u16 ( ) ;
183
+ let jb_abs_max = raw_packet. get_u16 ( ) ;
184
+
185
+ Ok ( VoIPMetricsReportBlock {
186
+ ssrc,
187
+ loss_rate,
188
+ discard_rate,
189
+ burst_density,
190
+ gap_density,
191
+ burst_duration,
192
+ gap_duration,
193
+ round_trip_delay,
194
+ end_system_delay,
195
+ signal_level,
196
+ noise_level,
197
+ rerl,
198
+ gmin,
199
+ rfactor,
200
+ ext_rfactor,
201
+ mos_lq,
202
+ mos_cq,
203
+ rx_config,
204
+ reserved,
205
+ jb_nominal,
206
+ jb_maximum,
207
+ jb_abs_max,
208
+ } )
209
+ }
210
+ }
0 commit comments