Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit 8e60711

Browse files
author
Rain Liu
committed
add vm
1 parent 0b1d0ed commit 8e60711

File tree

2 files changed

+140
-20
lines changed

2 files changed

+140
-20
lines changed

src/extended_report/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ pub mod prt;
66
pub mod rle;
77
pub mod rrt;
88
pub mod ssr;
9-
//pub mod vm;
109
pub mod unknown;
10+
pub mod vm;
1111

1212
pub use unknown::UnknownReportBlock;
1313

src/extended_report/vm.rs

Lines changed: 139 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use super::*;
22

3+
const VM_REPORT_BLOCK_LENGTH: u16 = 4 + 4 + 2 * 4 + 10 + 2 * 3;
4+
35
/// VoIPMetricsReportBlock encodes a VoIP Metrics Report Block as described
46
/// in RFC 3611, section 4.7.
57
///
@@ -26,7 +28,6 @@ use super::*;
2628
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2729
#[derive(Debug, Default, PartialEq, Clone)]
2830
pub struct VoIPMetricsReportBlock {
29-
pub xr_header: XRHeader,
3031
pub ssrc: u32,
3132
pub loss_rate: u8,
3233
pub discard_rate: u8,
@@ -42,13 +43,13 @@ pub struct VoIPMetricsReportBlock {
4243
pub gmin: u8,
4344
pub rfactor: u8,
4445
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,
4849
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,
5253
}
5354

5455
impl fmt::Display for VoIPMetricsReportBlock {
@@ -57,34 +58,153 @@ impl fmt::Display for VoIPMetricsReportBlock {
5758
}
5859
}
5960

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+
}
6468
}
69+
}
6570

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()
7074
}
7175

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+
}
7380

7481
fn raw_size(&self) -> usize {
75-
4 + 4 + 4 + 2 * 4 + 10 + 2 * 3
82+
XR_HEADER_LENGTH + VM_REPORT_BLOCK_LENGTH as usize
7683
}
7784

7885
fn as_any(&self) -> &(dyn Any + Send + Sync) {
7986
self
8087
}
81-
fn equal(&self, other: &(dyn ReportBlock + Send + Sync)) -> bool {
88+
fn equal(&self, other: &(dyn Packet + Send + Sync)) -> bool {
8289
other
8390
.as_any()
8491
.downcast_ref::<VoIPMetricsReportBlock>()
8592
.map_or(false, |a| self == a)
8693
}
87-
fn cloned(&self) -> Box<dyn ReportBlock + Send + Sync> {
94+
fn cloned(&self) -> Box<dyn Packet + Send + Sync> {
8895
Box::new(self.clone())
8996
}
9097
}
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

Comments
 (0)