From 090500d32709b20dddb087e6f660e7d104aca29a Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Apr 2021 20:48:14 +0100 Subject: [PATCH] Duplicate detection for HBP --- bridge_master.py | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 71b35c5..d76a1f7 100755 --- a/bridge_master.py +++ b/bridge_master.py @@ -1403,7 +1403,9 @@ class routerHBP(HBSYSTEM): 2: b'\x00', 3: b'\x00', 4: b'\x00', - } + }, + 'lastSeq': False, + 'lastData': False }, 2: { 'RX_START': time(), @@ -1429,7 +1431,9 @@ class routerHBP(HBSYSTEM): 2: b'\x00', 3: b'\x00', 4: b'\x00', - } + }, + 'lastSeq': False, + 'lastData': False } } @@ -1765,7 +1769,28 @@ class routerHBP(HBSYSTEM): if int_id(_dst_id) >= 5 and int_id(_dst_id) != 9 and (str(int_id(_dst_id)) not in BRIDGES): logger.info('(%s) Bridge for TG %s does not exist. Creating as User Activated. Timeout %s',self._system, int_id(_dst_id),CONFIG['SYSTEMS'][self._system]['DEFAULT_UA_TIMER']) make_single_bridge(_dst_id,self._system,_slot,CONFIG['SYSTEMS'][self._system]['DEFAULT_UA_TIMER']) - + + #Duplicate handling# + #Duplicate complete packet + if self.STATUS[_slot]['lastData'] and self.STATUS[_slot]['lastData'] == _data and _seq > 1: + logger.warning("(%s) *DupControl* last packet is a complete duplicate of the previous one, disgarding. Stream ID:, %s TGID: %s",self._system,int_id(_stream_id),int_id(_dst_id)) + return + #Handle inbound duplicates + if _seq and _seq == self.STATUS[_slot]['lastSeq']: + logger.warning("(%s) *DupControl* Duplicate sequence number %s, disgarding. Stream ID:, %s TGID: %s",self._system,_seq,int_id(_stream_id),int_id(_dst_id)) + return + #Inbound out-of-order packets + if _seq and self.STATUS[_slot]['lastSeq'] and (_seq != 1) and (_seq < self.STATUS[_slot]['lastSeq']): + logger.warning("%s) *DupControl* Out of order packet - last sequence number %s, this sequence number %s, disgarding. Stream ID:, %s TGID: %s ",self._system,self.STATUS[_slot]['lastSeq'],_seq,int_id(_stream_id),int_id(_dst_id)) + return + #Inbound missed packets + if _seq and self.STATUS[_slot]['lastSeq'] and _seq > (self.STATUS[_slot]['lastSeq']+1): + logger.warning("(%s) *DupControl* Missed packet - last sequence number %s, this sequence number %s. Stream ID:, %s TGID: %s ",self._system,self.STATUS[_slot]['lastSeq'],_seq,int_id(_stream_id),int_id(_dst_id)) + + #Save this sequence number + self.STATUS[_slot]['lastSeq'] = _seq + #Save this packet + self.STATUS[_slot]['lastData'] = _data _sysIgnore = [] for _bridge in BRIDGES: @@ -1790,6 +1815,10 @@ class routerHBP(HBSYSTEM): self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration) if CONFIG['REPORTS']['REPORT']: self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration).encode(encoding='utf-8', errors='ignore')) + + #Reset back to False + self.STATUS[_slot]['lastSeq'] = False + self.STATUS[_slot]['lastData'] = False # # Begin in-band signalling for call end. This has nothign to do with routing traffic directly. @@ -2087,7 +2116,7 @@ if __name__ == '__main__': for system in CONFIG['SYSTEMS']: if CONFIG['SYSTEMS'][system]['ENABLED']: if CONFIG['SYSTEMS'][system]['MODE'] == 'XLXPEER': - logger.warning('(GLOBAL) system %s not started - XLXPEER and PEER connections currently unsupported ', system) + logger.warning('(GLOBAL) system %s not started - XLXPEER connections currently unsupported ', system) continue if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE': systems[system] = routerOBP(system, CONFIG, report_server)