|
|
|
|
@ -2794,16 +2794,52 @@ DEFAULT_DIAL_TS2: 92
|
|
|
|
|
self.assertIn("PACKET RATE 0.50/s", "\n".join(logs.output))
|
|
|
|
|
self.assertNotIn("PACKET RATE 2.00/s", "\n".join(logs.output))
|
|
|
|
|
|
|
|
|
|
def test_obp_group_rate_drop_uses_elapsed_duration(self):
|
|
|
|
|
def test_obp_group_rate_drop_ignores_short_burst(self):
|
|
|
|
|
config = minimal_config(("MASTER-A",))
|
|
|
|
|
add_openbridge_system(config, "OBP-1", network_id=3001)
|
|
|
|
|
|
|
|
|
|
with DeterministicScenario(config=config) as scenario:
|
|
|
|
|
rate_drops = []
|
|
|
|
|
scenario.systems["OBP-1"].proxy_BadPeer = lambda: rate_drops.append(True)
|
|
|
|
|
stream_id = 0x01020304
|
|
|
|
|
first_packet = PacketSpec(
|
|
|
|
|
dst_id=123,
|
|
|
|
|
slot=1,
|
|
|
|
|
stream_id=stream_id,
|
|
|
|
|
seq=0,
|
|
|
|
|
call_type="group",
|
|
|
|
|
frame_type=HBPF_VOICE,
|
|
|
|
|
dtype_vseq=0,
|
|
|
|
|
payload=bytes([0]) * 33,
|
|
|
|
|
)
|
|
|
|
|
scenario.inject_obp("OBP-1", first_packet)
|
|
|
|
|
scenario.clock.advance(0.1)
|
|
|
|
|
|
|
|
|
|
with self.assertNoLogs(scenario.bm.logger, level="WARNING"):
|
|
|
|
|
for seq in range(1, 61):
|
|
|
|
|
packet = PacketSpec(
|
|
|
|
|
dst_id=123,
|
|
|
|
|
slot=1,
|
|
|
|
|
stream_id=stream_id,
|
|
|
|
|
seq=seq,
|
|
|
|
|
call_type="group",
|
|
|
|
|
frame_type=HBPF_VOICE,
|
|
|
|
|
dtype_vseq=0,
|
|
|
|
|
payload=bytes([seq]) * 33,
|
|
|
|
|
)
|
|
|
|
|
scenario.inject_obp("OBP-1", packet)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
scenario.systems["OBP-1"].STATUS[bytes_4(stream_id)]["packets"],
|
|
|
|
|
60,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_obp_group_rate_drop_uses_lenient_sustained_fbp_threshold(self):
|
|
|
|
|
config = minimal_config(("MASTER-A",))
|
|
|
|
|
add_openbridge_system(config, "OBP-1", network_id=3001)
|
|
|
|
|
|
|
|
|
|
with DeterministicScenario(config=config) as scenario:
|
|
|
|
|
stream_id = 0x01020304
|
|
|
|
|
first_packet = PacketSpec(
|
|
|
|
|
peer_id=3001,
|
|
|
|
|
dst_id=123,
|
|
|
|
|
slot=1,
|
|
|
|
|
stream_id=stream_id,
|
|
|
|
|
@ -2814,11 +2850,12 @@ DEFAULT_DIAL_TS2: 92
|
|
|
|
|
payload=bytes([0]) * 33,
|
|
|
|
|
)
|
|
|
|
|
scenario.inject_obp("OBP-1", first_packet)
|
|
|
|
|
scenario.clock.advance(0.5)
|
|
|
|
|
scenario.clock.advance(2.0)
|
|
|
|
|
|
|
|
|
|
with self.assertLogs(scenario.bm.logger, level="WARNING") as logs:
|
|
|
|
|
for seq in range(1, 20):
|
|
|
|
|
for seq in range(1, 102):
|
|
|
|
|
packet = PacketSpec(
|
|
|
|
|
peer_id=3001,
|
|
|
|
|
dst_id=123,
|
|
|
|
|
slot=1,
|
|
|
|
|
stream_id=stream_id,
|
|
|
|
|
@ -2830,8 +2867,11 @@ DEFAULT_DIAL_TS2: 92
|
|
|
|
|
)
|
|
|
|
|
scenario.inject_obp("OBP-1", packet)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rate_drops, [True])
|
|
|
|
|
self.assertIn("*PacketControl* RATE DROP!", "\n".join(logs.output))
|
|
|
|
|
log_output = "\n".join(logs.output)
|
|
|
|
|
self.assertIn("*PacketControl* RATE DROP!", log_output)
|
|
|
|
|
self.assertIn("PEER: 3001", log_output)
|
|
|
|
|
self.assertIn("SRC: 9990", log_output)
|
|
|
|
|
self.assertIn("DURATION: 2.00", log_output)
|
|
|
|
|
|
|
|
|
|
def test_obp_voice_terminator_marks_stream_finished_when_reports_disabled(self):
|
|
|
|
|
config = minimal_config(("MASTER-B",))
|
|
|
|
|
|