From 91e234a64de359f66a598fdb5e8b69bcb28a12c6 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 13 Feb 2022 19:35:57 +0000 Subject: [PATCH] protocol 4 communication working (low level) --- doc/FreeDMR FBP Proto v4.ods | Bin 13983 -> 15070 bytes hblink.py | 110 ++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/doc/FreeDMR FBP Proto v4.ods b/doc/FreeDMR FBP Proto v4.ods index cc0e88afe7131d0903f4aa5744f41a5bcf58f524..8fc2803f2a7de478752d669ee49fb54fac8dbd1a 100644 GIT binary patch delta 13056 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 delta 11953 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 diff --git a/hblink.py b/hblink.py index 7bd740e..a642692 100755 --- a/hblink.py +++ b/hblink.py @@ -159,7 +159,7 @@ class OPENBRIDGE(DatagramProtocol): if 'VER' in self._config and self._config['VER'] > 3: _ver = VER.to_bytes(1,'big') - _packet = b''.join([DMRE,_ver,_packet[4:11], self._CONFIG['GLOBAL']['SERVER_ID'],_packet[15:],time_ns().to_bytes(8,'big'), _source_server, _hops]) + _packet = b''.join([DMRE,_packet[4:11], self._CONFIG['GLOBAL']['SERVER_ID'],_packet[15:],_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() @@ -339,6 +339,114 @@ class OPENBRIDGE(DatagramProtocol): elif _packet[:4] == EOBP: logger.warning('(%s) *ProtoControl* KF7EEL EOBP protocol not supported',self._system) return + + 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] + #_ckhs = hmac_new(self._config['PASSPHRASE'],_data,sha1).digest() + _h = blake2b(key=self._config['PASSPHRASE'], digest_size=16) + _h.update(_packet[:67]) + + _ckhs = _h.digest() + + if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): + _peer_id = _data[11:15] + if self._config['NETWORK_ID'] != _peer_id: + logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + return + _seq = _data[4] + _rf_src = _data[5:8] + _dst_id = _data[8:11] + _int_dst_id = int_id(_dst_id) + _bits = _data[15] + _slot = 2 if (_bits & 0x80) else 1 + #_call_type = 'unit' if (_bits & 0x40) else 'group' + if _bits & 0x40: + _call_type = 'unit' + elif (_bits & 0x23) == 0x23: + _call_type = 'vcsbk' + else: + _call_type = 'group' + _frame_type = (_bits & 0x30) >> 4 + _dtype_vseq = (_bits & 0xF) # data, 1=voice header, 2=voice terminator; voice, 0=burst A ... 5=burst F + _stream_id = _data[16:20] + #logger.debug('(%s) DMRD - Seqence: %s, RF Source: %s, Destination ID: %s', self._system, int_id(_seq), int_id(_rf_src), int_id(_dst_id)) + + #Don't do anything if we are STUNned + if 'STUN' in self._CONFIG: + if _stream_id not in self._laststrid: + logger.warning('(%s) Bridge STUNned, discarding', self._system) + self._laststrid.append(_stream_id) + return + + #Increment max hops + _inthops = _hops +1 + + if _inthops > 10: + logger.warning('(%s) MAX HOPS exceed, dropping. Hops: %s, DST: %s', self._system, _inthops, _int_dst_id) + self.send_bcsq(_dst_id,_stream_id) + return + + + #Low-level TG filtering + if _call_type != 'unit': + _int_dst_id = int_id(_dst_id) + if _int_dst_id <= 79 or (_int_dst_id >= 9990 and _int_dst_id <= 9999) or _int_dst_id == 900999: + if _stream_id not in self._laststrid: + logger.info('(%s) CALL DROPPED WITH STREAM ID %s FROM SUBSCRIBER %s BY GLOBAL TG FILTER', self._system, int_id(_stream_id), _int_dst_id) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return + + # ACL Processing + if self._CONFIG['GLOBAL']['USE_ACL']: + if not acl_check(_rf_src, self._CONFIG['GLOBAL']['SUB_ACL']): + if _stream_id not in self._laststrid: + logger.info('(%s) CALL DROPPED WITH STREAM ID %s ON TGID %s BY GLOBAL TS1 ACL', self._system, int_id(_stream_id), int_id(_rf_src)) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return + if _slot == 1 and not acl_check(_dst_id, self._CONFIG['GLOBAL']['TG1_ACL']): + if _stream_id not in self._laststrid: + logger.info('(%s) CALL DROPPED WITH STREAM ID %s ON TGID %s BY GLOBAL TS1 ACL', self._system, int_id(_stream_id), int_id(_dst_id)) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return + if self._config['USE_ACL']: + if not acl_check(_rf_src, self._config['SUB_ACL']): + if _stream_id not in self._laststrid: + logger.info('(%s) CALL DROPPED WITH STREAM ID %s FROM SUBSCRIBER %s BY SYSTEM ACL', self._system, int_id(_stream_id), int_id(_rf_src)) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return + if not acl_check(_dst_id, self._config['TG1_ACL']): + if _stream_id not in self._laststrid: + logger.info('(%s) CALL DROPPED WITH STREAM ID %s ON TGID %s BY SYSTEM ACL', self._system, int_id(_stream_id), int_id(_dst_id)) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return + + + + #Remove timestamp from data. For now dmrd_received does not expect it + #Leaving it in screws up the AMBE data + #_data = b''.join([_data[:5],_data[12:]]) + _data = b''.join([DMRD,_data[4:]]) + + _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) + #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) + elif _packet[:4] == DMRF: _data = _packet[:53]