From bacb0631212b57f6aa55d4e91959866175cfe8f5 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Thu, 28 May 2015 09:42:14 -0500 Subject: [PATCH] Work on Data Packet Types --- bridge.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 107 insertions(+), 8 deletions(-) diff --git a/bridge.py b/bridge.py index fc4e577..c448947 100755 --- a/bridge.py +++ b/bridge.py @@ -230,24 +230,123 @@ class bridgeIPSC(IPSC): self.IPSC_STATUS[_TS]['RX_GROUP'] = _dst_group self.IPSC_STATUS[_TS]['RX_TIME'] = now + ''' + def private_voice(self, _network, _src_sub, _dst_sub, _ts, _end, _peerid, _data): + logger.debug('(%s) Private Voice Packet Received From: %s, IPSC Peer %s, Destination %s', _network, int_id(_src_sub), int_id(_peerid), int_id(_dst_group)) + _burst_data_type = _data[30] # Determine the type of voice packet this is (see top of file for possible types) + if _ts == 0: + _TS = 'TS1' + elif _ts == 1: + _TS = 'TS2' + + now = time() # Mark packet arrival time -- we'll need this for call contention handling + + for rule in RULES[_network]['PRIVATE_VOICE']: + _target = rule # Shorthand to reduce length and make it easier to read + _status = networks[_target].IPSC_STATUS # Shorthand to reduce length and make it easier to read + + # Matching for rules is against the Destination Group in the SOURCE packet (SRC_GROUP) + #if rule['SRC_GROUP'] == _dst_group and rule['SRC_TS'] == _ts: + #if BRIDGES: + if self.BRIDGE == True or networks[_target].BRIDGE == True: + + if ((rule['DST_GROUP'] != _status[_TS]['RX_GROUP']) and ((now - _status[_TS]['RX_TIME']) < RULES[_network]['GROUP_HANGTIME'])): + if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: + logger.info('(%s) Call not bridged, target active or in group hangtime: IPSC %s, %s, TGID%s', _network, _target, _TS, int_id(rule['DST_GROUP'])) + return + + if ((rule['DST_GROUP'] != _status[_TS]['TX_GROUP']) and ((now - _status[_TS]['TX_TIME']) < RULES[_network]['GROUP_HANGTIME'])): + if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: + logger.info('(%s) Call not bridged, target in group hangtime: IPSC %s, %s, TGID%s', _network, _target, _TS, int_id(rule['DST_GROUP'])) + return + + if (rule['DST_GROUP'] == _status[_TS]['TX_GROUP']) and (_src_sub != _status[_TS]['TX_SRC_SUB']) and ((now - _status[_TS]['TX_TIME']) < TS_CLEAR_TIME): + if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: + logger.info('(%s) Call not bridged, call bridge in progress from %s, target: IPSC %s, %s, TGID%s', _network, int_id(_src_sub), _target, _TS, int_id(rule['DST_GROUP'])) + return + + if (rule['DST_GROUP'] == _status[_TS]['RX_GROUP']) and ((now - _status[_TS]['RX_TIME']) < TS_CLEAR_TIME): + if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: + logger.info('(%s) Call not bridged, matching call already active on target: IPSC %s, %s, TGID%s', _network, _target, _TS, int_id(rule['DST_GROUP'])) + return + + _tmp_data = _data + # Re-Write the IPSC SRC to match the target network's ID + _tmp_data = _tmp_data.replace(_peerid, NETWORK[_target]['LOCAL']['RADIO_ID']) + # Re-Write the destination Group ID + _tmp_data = _tmp_data.replace(_dst_group, rule['DST_GROUP']) + + # Re-Write IPSC timeslot value + _call_info = int_id(_data[17:18]) + if rule['DST_TS'] == 0: + _call_info &= ~(1 << 5) + elif rule['DST_TS'] == 1: + _call_info |= 1 << 5 + _call_info = chr(_call_info) + _tmp_data = _tmp_data[:17] + _call_info + _tmp_data[18:] + + # Re-Write DMR timeslot value + # Determine if the slot is present, so we can translate if need be + if _burst_data_type == BURST_DATA_TYPE['SLOT1_VOICE'] or _burst_data_type == BURST_DATA_TYPE['SLOT2_VOICE']: + _slot_valid = True + else: + _slot_valid = False + # Re-Write timeslot if necessary... + if _slot_valid: + if rule['DST_TS'] == 0: + _burst_data_type = BURST_DATA_TYPE['SLOT1_VOICE'] + elif rule['DST_TS'] == 1: + _burst_data_type = BURST_DATA_TYPE['SLOT2_VOICE'] + _tmp_data = _tmp_data[:30] + _burst_data_type + _tmp_data[31:] + + # Calculate and append the authentication hash for the target network... if necessary + if NETWORK[_target]['LOCAL']['AUTH_ENABLED']: + _tmp_data = self.hashed_packet(NETWORK[_target]['LOCAL']['AUTH_KEY'], _tmp_data) + # Send the packet to all peers in the target IPSC + networks[_target].send_to_ipsc(_tmp_data) + + _status[_TS]['TX_GROUP'] = _dst_group + _status[_TS]['TX_TIME'] = now + _status[_TS]['TX_SRC_SUB'] = _src_sub + + # Mark the group and time that a packet was recieved + self.IPSC_STATUS[_TS]['RX_GROUP'] = _dst_group + self.IPSC_STATUS[_TS]['RX_TIME'] = now + ''' + def group_data(self, _network, _src_sub, _dst_sub, _ts, _end, _peerid, _data): logger.debug('(%s) Group Data Packet Received From: %s, IPSC Peer %s, Destination %s', _network, int_id(_src_sub), int_id(_peerid), int_id(_dst_sub)) + for rule in RULES[_network]['GROUP_DATA']: + _target = rule # Shorthand to reduce length and make it easier to read + + if self.BRIDGE == True or networks[_target].BRIDGE == True: + _tmp_data = _data + # Re-Write the IPSC SRC to match the target network's ID + _tmp_data = _tmp_data.replace(_peerid, NETWORK[_target]['LOCAL']['RADIO_ID']) + + # Calculate and append the authentication hash for the target network... if necessary + if NETWORK[_target]['LOCAL']['AUTH_ENABLED']: + _tmp_data = self.hashed_packet(NETWORK[_target]['LOCAL']['AUTH_KEY'], _tmp_data) + # Send the packet to all peers in the target IPSC + networks[_target].send_to_ipsc(_tmp_data) + def private_data(self, _network, _src_sub, _dst_sub, _ts, _end, _peerid, _data): logger.debug('(%s) Private Data Packet Received From: %s, IPSC Peer %s, Destination %s', _network, int_id(_src_sub), int_id(_peerid), int_id(_dst_sub)) for rule in RULES[_network]['PRIVATE_DATA']: _target = rule # Shorthand to reduce length and make it easier to read - _tmp_data = _data - # Re-Write the IPSC SRC to match the target network's ID - _tmp_data = _tmp_data.replace(_peerid, NETWORK[_target]['LOCAL']['RADIO_ID']) + if self.BRIDGE == True or networks[_target].BRIDGE == True: + _tmp_data = _data + # Re-Write the IPSC SRC to match the target network's ID + _tmp_data = _tmp_data.replace(_peerid, NETWORK[_target]['LOCAL']['RADIO_ID']) - # Calculate and append the authentication hash for the target network... if necessary - if NETWORK[_target]['LOCAL']['AUTH_ENABLED']: - _tmp_data = self.hashed_packet(NETWORK[_target]['LOCAL']['AUTH_KEY'], _tmp_data) - # Send the packet to all peers in the target IPSC - networks[_target].send_to_ipsc(_tmp_data) + # Calculate and append the authentication hash for the target network... if necessary + if NETWORK[_target]['LOCAL']['AUTH_ENABLED']: + _tmp_data = self.hashed_packet(NETWORK[_target]['LOCAL']['AUTH_KEY'], _tmp_data) + # Send the packet to all peers in the target IPSC + networks[_target].send_to_ipsc(_tmp_data) if __name__ == '__main__':