diff --git a/const.py b/const.py index 164992d..6c26561 100755 --- a/const.py +++ b/const.py @@ -69,6 +69,8 @@ RPTA = b'RPTA' RPTO = b'RPTO' DMRA = b'DMRA' +#Bridge Control commands +BCKA = b'BCKA' # Higheset peer ID permitted by HBP PEER_MAX = 4294967295 diff --git a/hblink.py b/hblink.py index cb30232..a8c0faa 100755 --- a/hblink.py +++ b/hblink.py @@ -124,9 +124,15 @@ class OPENBRIDGE(DatagramProtocol): _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest())]) self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) # KEEP THE FOLLOWING COMMENTED OUT UNLESS YOU'RE DEBUGGING DEEPLY!!!! - #logger.debug('(%s) TX Packet to OpenBridge %s:%s -- %s', self._system, self._config['TARGET_IP'], self._config['TARGET_PORT'], ahex(_packet)) + #logger.debug('(%s) TX Packet to OpenBridge %s:%s -- %s', self._system, self._config['TARGET_IP'], self._config['TARGET_PORT'], ahex(_packet)) else: logger.error('(%s) OpenBridge system was asked to send non DMRD packet: %s', self._system, _packet) + + def send_bcka(self): + _packet= b'KA' + _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest())]) + self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) + logger.debug('(%s) Sent Bridge Control Keep Alive',self._system) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): pass @@ -194,7 +200,21 @@ class OPENBRIDGE(DatagramProtocol): else: h,p = _sockaddr logger.info('(%s) OpenBridge 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[:53]), len(_packet[53:]), repr(_packet[53:]),h,p) - + + if _packet[:2] == BC: # Bridge Control packet (Extended OBP) + if _packet[:4] == BCKA: + _data = _packet[:53] + _hash = _packet[53:] + _ckhs = hmac_new(self._config['PASSPHRASE'],_data,sha1).digest() + if compare_digest(_hash, _ckhs): + logger.debug('(%s) Bridge Control Keep Alive received') + self._config['_bc']['_ka'] = time() + + else: + h,p = _sockaddr + logger.info('(%s) OpenBridge BCKA invalid KeepAlive, packet discarded - OPCODE: %s DATA: %s HMAC LENGTH: %s HMAC: %s SRC IP: %s SRC PORT: %s', self._system, _packet[:4], repr(_packet[:53]), len(_packet[53:]), repr(_packet[53:]),h,p) + + #************************************************ # HB MASTER CLASS #************************************************ @@ -441,7 +461,7 @@ class HBSYSTEM(DatagramProtocol): 'SOFTWARE_ID': '', 'PACKAGE_ID': '', }}) - logger.info('(%s) Repeater Logging in with Radio ID: %s, %s:%s', self._system, int_id(_peer_id), _sockaddr[0], _sockaddr[1]) + logger.info('(%s) Repeater Logging in with Radio ID: %s, %s:%s, Package ID: %s', self._system, int_id(_peer_id), _sockaddr[0], _sockaddr[1],self._peers[_peer_id]['PACKAGE_ID']) _salt_str = bytes_4(self._peers[_peer_id]['SALT']) self.send_peer(_peer_id, b''.join([RPTACK, _salt_str])) self._peers[_peer_id]['CONNECTION'] = 'CHALLENGE_SENT'