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; }
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; }
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); } }