From dbeb97e57820cb2cc4feabd393fe036296ffdb12 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 13 Feb 2022 23:00:30 +0000 Subject: [PATCH] handle source_server, ber, rssi - in code --- bridge_master.py | 37 +++++++++++++++++++++-------------- doc/FreeDMR FBP Proto v4.ods | Bin 15070 -> 15138 bytes hblink.py | 31 ++++++++++++++++------------- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 3a25516..74bf38d 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1236,7 +1236,7 @@ class routerOBP(OPENBRIDGE): OPENBRIDGE.__init__(self, _name, _config, _report) self.STATUS = {} - def to_target(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,_noOBP,sysIgnore, _hops = b''): + def to_target(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,_noOBP,sysIgnore, _hops = b'', _source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): _sysIgnore = sysIgnore for _target in BRIDGES[_bridge]: if (_target['SYSTEM'] != self._system) and (_target['ACTIVE']): @@ -1405,10 +1405,11 @@ class routerOBP(OPENBRIDGE): elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_target['TS']]['TX_EMB_LC'][_dtype_vseq] + dmrbits[148:264] dmrpkt = dmrbits.tobytes() - _tmp_data = b''.join([_tmp_data, dmrpkt, b'\x00\x00']) # Add two bytes of nothing since OBP doesn't include BER & RSSI bytes #_data[53:55] + #_tmp_data = b''.join([_tmp_data, dmrpkt, b'\x00\x00']) # Add two bytes of nothing since OBP doesn't include BER & RSSI bytes #_data[53:55] + _tmp_data = b''.join([_tmp_data, dmrpkt]) # Transmit the packet to the destination system - systems[_target['SYSTEM']].send_system(_tmp_data,_hops) + systems[_target['SYSTEM']].send_system(_tmp_data,_hops,_source_server, _ber, _rssi) #logger.debug('(%s) Packet routed by bridge: %s to system: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) #Ignore this system and TS pair if it's called again on this packet return(_sysIgnore) @@ -1423,7 +1424,7 @@ class routerOBP(OPENBRIDGE): if CONFIG['REPORTS']['REPORT']: systems[_d_system]._report.send_bridgeEvent('UNIT DATA,START,TX,{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) - def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b''): + def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): _int_dst_id = int_id(_dst_id) _target_status = systems[_target].STATUS @@ -1457,13 +1458,13 @@ class routerOBP(OPENBRIDGE): #Assemble transmit HBP packet header _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) _tmp_data = b''.join([_tmp_data, dmrpkt]) - systems[_target].send_system(_tmp_data,_hops) + systems[_target].send_system(_tmp_data,_hops, _source_server, _ber, _rssi) logger.info('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: systems[_target]._report.send_bridgeEvent('UNIT DATA,START,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) - def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash, _hops = b''): + def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash, _hops = b'', _source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): pkt_time = time() dmrpkt = _data[20:53] _bits = _data[15] @@ -1576,7 +1577,7 @@ class routerOBP(OPENBRIDGE): #We only want to send data calls to individual IDs via OpenBridge #Only send if proto ver for bridge is > 1 if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE' and CONFIG['SYSTEMS'][system]['VER'] > 1 and (_int_dst_id >= 1000000): - self.sendDataToOBP(system,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops) + self.sendDataToOBP(system,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops,_source_server,_ber,_rssi) #If destination ID is in the Subscriber Map if _dst_id in SUB_MAP: @@ -1655,8 +1656,8 @@ class routerOBP(OPENBRIDGE): _inthops = 0 if _hops: _inthops = int.from_bytes(_hops,'big') - logger.info('(%s) *CALL START* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, HOPS %s', \ - 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,_inthops) + logger.info('(%s) *CALL START* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, BER: %s, RSSI %s, HOPS %s', \ + 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,int_id(_source_server),_ber,_rssi,_inthops) if CONFIG['REPORTS']['REPORT']: self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) @@ -1775,7 +1776,7 @@ class routerOBP(OPENBRIDGE): for _system in BRIDGES[_bridge]: if _system['SYSTEM'] == self._system and _system['TGID'] == _dst_id and _system['TS'] == _slot and _system['ACTIVE'] == True: - _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore,_hops) + _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore,_hops, _source_server, _ber, _rssi) # Final actions - Is this a voice terminator? @@ -1862,7 +1863,7 @@ class routerHBP(HBSYSTEM): } } - def to_target(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,_noOBP,sysIgnore): + def to_target(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,_noOBP,sysIgnore,_source_server, _ber, _rssi): _sysIgnore = sysIgnore for _target in BRIDGES[_bridge]: #if _target['SYSTEM'] != self._system or (_target['SYSTEM'] == self._system and _target['TS'] != _slot): @@ -2029,7 +2030,7 @@ class routerHBP(HBSYSTEM): _tmp_data = b''.join([_tmp_data, dmrpkt, _data[53:55]]) # Transmit the packet to the destination system - systems[_target['SYSTEM']].send_system(_tmp_data,None) + systems[_target['SYSTEM']].send_system(_tmp_data,b'',_source_server,_ber,_rssi) return _sysIgnore @@ -2078,7 +2079,7 @@ class routerHBP(HBSYSTEM): #Assemble transmit HBP packet header _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) _tmp_data = b''.join([_tmp_data, dmrpkt]) - systems[_target].send_system(_tmp_data,None) + systems[_target].send_system(_tmp_data,b'',_source_server,_ber,_rssi) logger.info('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: systems[system]._report.send_bridgeEvent('UNIT DATA,START,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) @@ -2087,8 +2088,14 @@ class routerHBP(HBSYSTEM): def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): pkt_time = time() dmrpkt = _data[20:53] + + _ber = _data[53] + _rssi = _data[54] + _bits = _data[15] + _source_server = self._CONFIG['GLOBAL']['SERVER_ID'] + #_pkt_crc = Crc32.calc(_data[4:53]) #_pkt_crc = hash(_data).digest() @@ -2504,7 +2511,7 @@ class routerHBP(HBSYSTEM): if True: for _system in BRIDGES[_bridge]: if _system['SYSTEM'] == self._system and _system['TGID'] == _dst_id and _system['TS'] == _slot and _system['ACTIVE'] == True: - _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore) + _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore,_source_server,_ber,_rssi) #Send to reflector or TG too, if it exists if _bridge[0:1] == '#': @@ -2512,7 +2519,7 @@ class routerHBP(HBSYSTEM): else: _bridge = '#'+_bridge if _bridge in BRIDGES: - _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore) + _sysIgnore = self.to_target(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data, pkt_time, dmrpkt, _bits,_bridge,_system,False,_sysIgnore,_source_server,_ber,_rssi) # Final actions - Is this a voice terminator? if (_frame_type == HBPF_DATA_SYNC) and (_dtype_vseq == HBPF_SLT_VTERM) and (self.STATUS[_slot]['RX_TYPE'] != HBPF_SLT_VTERM): diff --git a/doc/FreeDMR FBP Proto v4.ods b/doc/FreeDMR FBP Proto v4.ods index 8fc2803f2a7de478752d669ee49fb54fac8dbd1a..334ee9d58a5d7f2bf7d1394f6e60c19bdc2d9b11 100644 GIT binary patch delta 4554 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 delta 4490 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 3: _ver = VER.to_bytes(1,'big') - _packet = b''.join([DMRE,_packet[4:11], self._CONFIG['GLOBAL']['SERVER_ID'],_packet[15:],_ver,time_ns().to_bytes(8,'big'), _source_server, _hops]) + _packet = b''.join([DMRE,_packet[4:11], self._CONFIG['GLOBAL']['SERVER_ID'],_packet[15:],_ber,_rssi,_ver,time_ns().to_bytes(8,'big'), _source_server, _hops]) _h = blake2b(key=self._config['PASSPHRASE'], digest_size=16) _h.update(_packet) _hash = _h.digest() @@ -233,7 +233,7 @@ class OPENBRIDGE(DatagramProtocol): - def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash,_hops = b''): + def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash,_hops = b'', _source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): pass #print(int_id(_peer_id), int_id(_rf_src), int_id(_dst_id), int_id(_seq), _slot, _call_type, _frame_type, repr(_dtype_vseq), int_id(_stream_id)) @@ -342,14 +342,16 @@ class OPENBRIDGE(DatagramProtocol): elif _packet[:4] == DMRE: _data = _packet[:53] - _embedded_version = _packet[53] - _timestamp = _packet[54:62] - _source_server = _packet[62:66] - _hops = _packet[66] - _hash = _packet[67:83] + _ber = _packet[53] + _rssi = _packet[54] + _embedded_version = _packet[55] + _timestamp = _packet[56:64] + _source_server = _packet[64:68] + _hops = _packet[68] + _hash = _packet[69:85] #_ckhs = hmac_new(self._config['PASSPHRASE'],_data,sha1).digest() _h = blake2b(key=self._config['PASSPHRASE'], digest_size=16) - _h.update(_packet[:67]) + _h.update(_packet[:69]) _ckhs = _h.digest() @@ -439,13 +441,13 @@ class OPENBRIDGE(DatagramProtocol): _hops = _inthops.to_bytes(1,'big') # Userland actions -- typically this is the function you subclass for an application - self.dmrd_received(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash,_hops) + self.dmrd_received(_peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash,_hops,_source_server,_ber,_rssi) #Silently treat a DMRD packet like a keepalive - this is because it's traffic and the #Other end may not have enabled ENAHNCED_OBP self._config['_bcka'] = time() else: h,p = _sockaddr - logger.warning('(%s) FreeBridge HMAC failed, packet discarded - OPCODE: %s DATA: %s HMAC LENGTH: %s HMAC: %s SRC IP: %s SRC PORT: %s', self._system, _packet[:4], repr(_packet[:67]), len(_packet[67:]), repr(_packet[61:]),h,p) + logger.warning('(%s) FreeBridge HMAC failed, packet discarded - OPCODE: %s DATA: %s HMAC LENGTH: %s HMAC: %s SRC IP: %s SRC PORT: %s', self._system, _packet[:4], repr(_packet[:69]), len(_packet[69:]), repr(_packet[61:]),h,p) elif _packet[:4] == DMRF: @@ -730,8 +732,9 @@ class HBSYSTEM(DatagramProtocol): def updateSockaddr_errback(self,failure): logger.info('(%s) hostname resolution error: %s',self._system,failure) - def send_peers(self, _packet, _hops = b''): + def send_peers(self, _packet, _hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): for _peer in self._peers: + _packet =b''.join([_packet,_ber,_rssi]) self.send_peer(_peer, _packet) #logger.debug('(%s) Packet sent to peer %s', self._system, self._peers[_peer]['RADIO_ID']) @@ -742,9 +745,9 @@ class HBSYSTEM(DatagramProtocol): # KEEP THE FOLLOWING COMMENTED OUT UNLESS YOU'RE DEBUGGING DEEPLY!!!! #logger.debug('(%s) TX Packet to %s on port %s: %s', self._peers[_peer]['RADIO_ID'], self._peers[_peer]['IP'], self._peers[_peer]['PORT'], ahex(_packet)) - def send_master(self, _packet, _hops = b''): + def send_master(self, _packet, _hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00'): if _packet[:4] == DMRD: - _packet = b''.join([_packet[:11], self._config['RADIO_ID'], _packet[15:]]) + _packet = b''.join([_packet[:11], self._config['RADIO_ID'], _packet[15:],_ber,_rssi]) self.transport.write(_packet, self._config['MASTER_SOCKADDR']) # KEEP THE FOLLOWING COMMENTED OUT UNLESS YOU'RE DEBUGGING DEEPLY!!!! #logger.debug('(%s) TX Packet to %s:%s -- %s', self._system, self._config['MASTER_IP'], self._config['MASTER_PORT'], ahex(_packet))