diff --git a/bridge.py b/bridge.py index 51ca499..68e95d8 100755 --- a/bridge.py +++ b/bridge.py @@ -42,7 +42,7 @@ __author__ = 'Cortney T. Buffington, N0MJS' __copyright__ = 'Copyright (c) 2013-2015 Cortney T. Buffington, N0MJS and the K0USY Group' __credits__ = 'Adam Fast, KC0YLK, Dave K, and he who wishes not to be named' __license__ = 'Creative Commons Attribution-ShareAlike 3.0 Unported' -__version__ = '0.28b' +__version__ = '0.29b' __maintainer__ = 'Cort Buffington, N0MJS' __email__ = 'n0mjs@me.com' __status__ = 'beta' @@ -166,26 +166,26 @@ class bridgeIPSC(IPSC): #if rule['SRC_GROUP'] == _dst_group and rule['SRC_TS'] == _ts: #if BRIDGES: if (rule['SRC_GROUP'] == _dst_group and rule['SRC_TS'] == _ts) and (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 RULES[_network]['TRUNK'] == False: + 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 ((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]['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 + 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 @@ -228,91 +228,7 @@ class bridgeIPSC(IPSC): # 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 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 - ''' + 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))