Example #1
0
bool CDMRControl::processWakeup(const unsigned char* data)
{
	assert(data != NULL);

	// Wakeups always come in on slot 1
	if (data[0U] != TAG_DATA || data[1U] != (DMR_IDLE_RX | DMR_SYNC_DATA | DT_CSBK))
		return false;

	CDMRCSBK csbk;
	bool valid = csbk.put(data + 2U);
	if (!valid)
		return false;

	CSBKO csbko = csbk.getCSBKO();
	if (csbko != CSBKO_BSDWNACT)
		return false;

	unsigned int srcId = csbk.getSrcId();
	std::string src = m_lookup->find(srcId);

	bool ret = CDMRAccessControl::validateSrcId(srcId);
	if (!ret) {
		LogMessage("Invalid Downlink Activate received from %s", src.c_str());
		return false;
	}

	LogMessage("Downlink Activate received from %s", src.c_str());

	return true;
}
Example #2
0
bool CDMRControl::processWakeup(const unsigned char* data)
{
	assert(data != NULL);

	// Wakeups always come in on slot 1
	if (data[0U] != TAG_DATA || data[1U] != (DMR_IDLE_RX | DMR_SYNC_DATA | DT_CSBK))
		return false;

	CDMRCSBK csbk;
	bool valid = csbk.put(data + 2U);
	if (!valid)
		return false;

	CSBKO csbko = csbk.getCSBKO();
	if (csbko != CSBKO_BSDWNACT)
		return false;

	unsigned int srcId = csbk.getSrcId();
	unsigned int bsId  = csbk.getBSId();

	std::string src = m_lookup->find(srcId);

	if (m_selfOnly) {
		if (srcId != m_id) {
			LogMessage("Invalid CSBK BS_Dwn_Act received from %s", src.c_str());
			return false;
		}
	} else {
		if (std::find(m_blackList.begin(), m_blackList.end(), srcId) != m_blackList.end()) {
			LogMessage("Invalid CSBK BS_Dwn_Act received from %s", src.c_str());
			return false;
		}

		unsigned int prefix = srcId / 10000U;
		if (prefix == 0U || prefix > 999U) {
			LogMessage("Invalid CSBK BS_Dwn_Act received from %s", src.c_str());
			return false;
		}

		if (m_prefixes.size() > 0U) {
			if (std::find(m_prefixes.begin(), m_prefixes.end(), prefix) == m_prefixes.end()) {
				LogMessage("Invalid CSBK BS_Dwn_Act received from %s", src.c_str());
				return false;
			}
		}
	}

	if (bsId == 0xFFFFFFU) {
		LogMessage("CSBK BS_Dwn_Act for ANY received from %s", src.c_str());
		return true;
	} else if (bsId == m_id) {
		LogMessage("CSBK BS_Dwn_Act for %u received from %s", bsId, src.c_str());
		return true;
	}

	return false;
}
Example #3
0
void CDMRRX::processDataSync(const unsigned char* buffer)
{
	CDMRSlotType slotType;
	slotType.putData(buffer);

	unsigned char type = slotType.getDataType();
	unsigned char cc   = slotType.getColorCode();

	if (type == DT_IDLE) {
		unsigned int ber = idleBER(m_buffer);
		LogMessage("%u [Data Sync] [IDLE] CC=%u BER=%.1f%%", m_slotNo, cc, float(ber) / 1.96F);
		m_idleBits += 196U;
		m_idleErrs += ber;
	} else if (type == DT_VOICE_LC_HEADER) {
		CDMRFullLC fullLC;
		CDMRLC* lc = fullLC.decode(buffer, type);
		if (lc != NULL) {
			LogMessage("%u [Data Sync] [VOICE_LC_HEADER] CC=%u src=%u dest=%s%u", m_slotNo, cc, lc->getSrcId(), lc->getFLCO() == FLCO_GROUP ? "TG" : "", lc->getDstId());
			delete lc;
		} else {
			LogMessage("%u [Data Sync] [VOICE_LC_HEADER] CC=%u <Invalid LC>", m_slotNo, cc);
		}
	} else if (type == DT_TERMINATOR_WITH_LC) {
		CDMRFullLC fullLC;
		CDMRLC* lc = fullLC.decode(buffer, type);
		if (lc != NULL) {
			LogMessage("%u [Data Sync] [DT_TERMINATOR_WITH_LC] CC=%u src=%u dest=%s%u", m_slotNo, cc, lc->getSrcId(), lc->getFLCO() == FLCO_GROUP ? "TG" : "", lc->getDstId());
			delete lc;
		} else {
			LogMessage("%u [Data Sync] [DT_TERMINATOR_WITH_LC] CC=%u <Invalid LC>", m_slotNo, cc);
		}
	} else if (type == DT_VOICE_PI_HEADER) {
		LogMessage("%u [Data Sync] [VOICE_PI_HEADER] CC=%u", m_slotNo, cc);
	} else if (type == DT_DATA_HEADER) {
		CDMRDataHeader header;
		bool valid = header.put(buffer);
		if (valid)
			LogMessage("%u [Data Sync] [DATA_HEADER] CC=%u src=%u dest=%s%u", m_slotNo, cc, header.getSrcId(), header.getGI() ? "TG" : "", header.getDstId());
		else
			LogMessage("%u [Data Sync] [DATA_HEADER] CC=%u invalid", m_slotNo, cc);
	} else if (type == DT_RATE_12_DATA) {
		LogMessage("%u [Data Sync] [RATE_1/2_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_RATE_34_DATA) {
		LogMessage("%u [Data Sync] [RATE_3/4_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_RATE_1_DATA) {
		LogMessage("%u [Data Sync] [RATE_1_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_CSBK) {
		CDMRCSBK csbk;
		bool valid = csbk.put(buffer);
		if (valid)
			LogMessage("%u [Data Sync] [CSBK] CC=%u src=%u dest=%s%u", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId());
		else
			LogMessage("%u [Data Sync] [CSBK] CC=%u invalid", m_slotNo, cc);
	} else {
		LogMessage("%u [Data Sync] [UNKNOWN] CC=%u type=%u", m_slotNo, cc, type);
	}
}