diff --git a/p25/P25Defines.h b/p25/P25Defines.h
index 33342809..c0930e01 100644
--- a/p25/P25Defines.h
+++ b/p25/P25Defines.h
@@ -117,6 +117,10 @@ namespace p25
const uint8_t P25_MOT_CALLSIGN_LENGTH_BYTES = 8U;
+ const uint8_t P25_AUTH_RES_LENGTH_BYTES = 4U;
+ const uint8_t P25_AUTH_RS_LENGTH_BYTES = 10U;
+ const uint8_t P25_AUTH_RAND_LENGTH_BYTES = 5U;
+
const uint8_t P25_ALGO_UNENCRYPT = 0x80U;
const uint8_t P25_IDEN_UP_VU_BW_625K = 0x04U;
diff --git a/p25/lc/TSBK.cpp b/p25/lc/TSBK.cpp
index 1d998c57..a5d84491 100644
--- a/p25/lc/TSBK.cpp
+++ b/p25/lc/TSBK.cpp
@@ -116,6 +116,21 @@ TSBK::TSBK(LC* lc) : TSBK(lc->siteData())
///
TSBK::~TSBK()
{
+ if (m_authRes != NULL) {
+ delete[] m_authRes;
+ m_authRes = NULL;
+ }
+
+ if (m_authRS != NULL) {
+ delete[] m_authRS;
+ m_authRS = NULL;
+ }
+
+ if (m_authRand != NULL) {
+ delete[] m_authRand;
+ m_authRand = NULL;
+ }
+
delete[] m_siteCallsign;
}
@@ -137,10 +152,22 @@ TSBK& TSBK::operator=(const TSBK& data)
/// Decode a alternate trunking signalling block.
///
///
-///
+///
/// True, if TSBK was decoded, otherwise false.
-bool TSBK::decodeMBT(const data::DataHeader dataHeader, const uint8_t* block)
+bool TSBK::decodeMBT(const data::DataHeader dataHeader, const data::DataBlock* blocks)
{
+ assert(blocks != NULL);
+
+ if (dataHeader.getFormat() != PDU_FMT_AMBT) {
+ LogError(LOG_P25, "TSBK::decodeMBT(), PDU is not a AMBT PDU");
+ return false;
+ }
+
+ if (dataHeader.getBlocksToFollow() == 0U) {
+ LogError(LOG_P25, "TSBK::decodeMBT(), PDU contains no data blocks");
+ return false;
+ }
+
m_lco = dataHeader.getAMBTOpcode(); // LCO
m_lastBlock = true;
m_mfId = dataHeader.getMFId(); // Mfg Id.
@@ -149,30 +176,36 @@ bool TSBK::decodeMBT(const data::DataHeader dataHeader, const uint8_t* block)
LogWarning(LOG_P25, "TSBK::decodeMBT(), MBT is an outbound MBT?, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
}
- ulong64_t tsbkValue = 0U;
+ // get the first data block
+ uint8_t block1[P25_PDU_UNCONFIRMED_LENGTH_BYTES];
+ uint32_t len = blocks[0U].getData(block1);
+ if (len != P25_PDU_UNCONFIRMED_LENGTH_BYTES) {
+ LogError(LOG_P25, "TSBK::decodeMBT(), failed to read PDU data block");
+ return false;
+ }
- if (dataHeader.getFormat() == PDU_FMT_AMBT) {
- // combine bytes into rs value
- tsbkValue = dataHeader.getAMBTField8();
- tsbkValue = (tsbkValue << 8) + dataHeader.getAMBTField9();
- tsbkValue = (tsbkValue << 8) + block[0U];
- tsbkValue = (tsbkValue << 8) + block[1U];
- tsbkValue = (tsbkValue << 8) + block[2U];
- tsbkValue = (tsbkValue << 8) + block[3U];
- tsbkValue = (tsbkValue << 8) + block[4U];
- tsbkValue = (tsbkValue << 8) + block[5U];
- } else {
- // combine bytes into rs value
- tsbkValue = block[0U];
- tsbkValue = (tsbkValue << 8) + block[1U];
- tsbkValue = (tsbkValue << 8) + block[2U];
- tsbkValue = (tsbkValue << 8) + block[3U];
- tsbkValue = (tsbkValue << 8) + block[4U];
- tsbkValue = (tsbkValue << 8) + block[5U];
- tsbkValue = (tsbkValue << 8) + block[6U];
- tsbkValue = (tsbkValue << 8) + block[7U];
+ // get the second data block
+ uint8_t block2[P25_PDU_UNCONFIRMED_LENGTH_BYTES];
+ if (dataHeader.getBlocksToFollow() == 2U) {
+ uint32_t len = blocks[1U].getData(block2);
+ if (len != P25_PDU_UNCONFIRMED_LENGTH_BYTES) {
+ LogError(LOG_P25, "TSBK::decodeMBT(), failed to read PDU data block");
+ return false;
+ }
}
+ ulong64_t tsbkValue = 0U;
+
+ // combine bytes into rs value
+ tsbkValue = dataHeader.getAMBTField8();
+ tsbkValue = (tsbkValue << 8) + dataHeader.getAMBTField9();
+ tsbkValue = (tsbkValue << 8) + block1[0U];
+ tsbkValue = (tsbkValue << 8) + block1[1U];
+ tsbkValue = (tsbkValue << 8) + block1[2U];
+ tsbkValue = (tsbkValue << 8) + block1[3U];
+ tsbkValue = (tsbkValue << 8) + block1[4U];
+ tsbkValue = (tsbkValue << 8) + block1[5U];
+
// Motorola P25 vendor opcodes
if (m_mfId == P25_MFG_MOT) {
switch (m_lco) {
@@ -215,14 +248,14 @@ bool TSBK::decodeMBT(const data::DataHeader dataHeader, const uint8_t* block)
m_statusValue = (uint8_t)((tsbkValue >> 48) & 0xFFFFU); // Message Value
m_netId = (uint32_t)((tsbkValue >> 28) & 0xFFFFFU); // Network ID
m_sysId = (uint32_t)((tsbkValue >> 16) & 0xFFFU); // System ID
- m_dstId = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block[6U]; // Target Radio Address
+ m_dstId = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block1[6U]; // Target Radio Address
m_srcId = dataHeader.getLLId(); // Source Radio Address
break;
case TSBK_IOSP_MSG_UPDT:
m_messageValue = (uint32_t)((tsbkValue >> 48) & 0xFFFFU); // Message Value
m_netId = (uint32_t)((tsbkValue >> 28) & 0xFFFFFU); // Network ID
m_sysId = (uint32_t)((tsbkValue >> 16) & 0xFFFU); // System ID
- m_dstId = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block[6U]; // Target Radio Address
+ m_dstId = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block1[6U]; // Target Radio Address
m_srcId = dataHeader.getLLId(); // Source Radio Address
break;
case TSBK_IOSP_CALL_ALRT:
@@ -252,13 +285,40 @@ bool TSBK::decodeMBT(const data::DataHeader dataHeader, const uint8_t* block)
m_netId = (uint32_t)((tsbkValue >> 20) & 0xFFFFFU); // Network ID
m_sysId = (uint32_t)((tsbkValue >> 8) & 0xFFFU); // System ID
m_dstId = (uint32_t)((((tsbkValue) & 0xFFU) << 16) + // Target Radio Address
- (block[6U] << 8) + (block[7U]));
+ (block1[6U] << 8) + (block1[7U]));
m_srcId = dataHeader.getLLId(); // Source Radio Address
break;
case TSBK_IOSP_EXT_FNCT:
m_netId = (uint32_t)((tsbkValue >> 44) & 0xFFFFFU); // Network ID
m_sysId = (uint32_t)((tsbkValue >> 32) & 0xFFFU); // System ID
- m_extendedFunction = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block[6U]; // Extended Function
+ m_extendedFunction = (uint32_t)(((tsbkValue) & 0xFFFFU) << 8) + block1[6U]; // Extended Function
+ m_srcId = dataHeader.getLLId(); // Source Radio Address
+ break;
+ case TSBK_ISP_AUTH_RESP_M:
+ {
+ if (dataHeader.getBlocksToFollow() != 2) {
+ LogError(LOG_P25, "TSBK::decodeMBT(), PDU does not contain the appropriate amount of data blocks");
+ return false;
+ }
+
+ m_netId = (uint32_t)((tsbkValue >> 44) & 0xFFFFFU); // Network ID
+ m_sysId = (uint32_t)((tsbkValue >> 32) & 0xFFFU); // System ID
+ m_authStandalone = ((block2[2U] & 0xFFU) & 0x01U) == 0x01U; // Authentication Standalone Flag
+ m_authRand[4U] = (uint8_t)block1[5U] & 0xFFU; // Random Salt b0
+ m_authRand[3U] = (uint8_t)block1[6U] & 0xFFU; // Random Salt b0
+ m_authRand[2U] = (uint8_t)block1[7U] & 0xFFU; // Random Salt b0
+ m_authRand[1U] = (uint8_t)block1[8U] & 0xFFU; // Random Salt b0
+ m_authRand[0U] = (uint8_t)block1[9U] & 0xFFU; // Random Salt b0
+ m_authRes[3U] = (uint8_t)block1[10U] & 0xFFU; // Result b3
+ m_authRes[2U] = (uint8_t)block1[11U] & 0xFFU; // Result b2
+ m_authRes[1U] = (uint8_t)block2[0U] & 0xFFU; // Result b1
+ m_authRes[0U] = (uint8_t)block2[1U] & 0xFFU; // Result b0
+ m_srcId = dataHeader.getLLId(); // Source Radio Address
+ }
+ break;
+ case TSBK_ISP_AUTH_SU_DMD:
+ m_netId = (uint32_t)((tsbkValue >> 44) & 0xFFFFFU); // Network ID
+ m_sysId = (uint32_t)((tsbkValue >> 32) & 0xFFFU); // System ID
m_srcId = dataHeader.getLLId(); // Source Radio Address
break;
default:
@@ -456,6 +516,11 @@ bool TSBK::decode(const uint8_t* data, bool rawTSBK)
m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
break;
+ case TSBK_ISP_RAD_MON_REQ:
+ m_txMult = (uint8_t)((tsbkValue >> 48) & 0x3U); // TX Multiplier
+ m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
+ m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
+ break;
case TSBK_IOSP_CALL_ALRT:
m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
@@ -528,6 +593,22 @@ bool TSBK::decode(const uint8_t* data, bool rawTSBK)
m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFU); // Talkgroup Address
m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
break;
+ case TSBK_ISP_AUTH_RESP:
+ m_authStandalone = (((tsbkValue >> 56) & 0xFFU) & 0x01U) == 0x01U; // Authentication Standalone Flag
+ m_authRes[3U] = (uint8_t)((tsbkValue >> 48) & 0xFFU); // Result b3
+ m_authRes[2U] = (uint8_t)((tsbkValue >> 40) & 0xFFU); // Result b2
+ m_authRes[1U] = (uint8_t)((tsbkValue >> 32) & 0xFFU); // Result b1
+ m_authRes[0U] = (uint8_t)((tsbkValue >> 24) & 0xFFU); // Result b0
+ m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
+ break;
+ case TSBK_ISP_AUTH_FNE_RST:
+ m_authSuccess = (((tsbkValue >> 56) & 0xFFU) & 0x80U) == 0x80U; // Authentication Success Flag
+ m_authStandalone = (((tsbkValue >> 56) & 0xFFU) & 0x01U) == 0x01U; // Authentication Standalone Flag
+ m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
+ break;
+ case TSBK_ISP_AUTH_SU_DMD:
+ m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
+ break;
case TSBK_OSP_ADJ_STS_BCAST:
m_adjSysId = (uint32_t)((tsbkValue >> 40) & 0xFFFU); // Site System ID
m_adjRfssId = (uint8_t)((tsbkValue >> 32) & 0xFFU); // Site RFSS ID
@@ -536,11 +617,6 @@ bool TSBK::decode(const uint8_t* data, bool rawTSBK)
m_adjChannelNo = (uint32_t)((tsbkValue >> 8) & 0xFFFU); // Site Channel Number
m_adjServiceClass = (uint8_t)(tsbkValue & 0xFFU); // Site Service Class
break;
- case TSBK_ISP_RAD_MON_REQ:
- m_txMult = (uint8_t)((tsbkValue >> 48) & 0x3U); // TX Multiplier
- m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
- m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
- break;
default:
LogError(LOG_P25, "TSBK::decode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break;
@@ -622,6 +698,30 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address
}
break;
+ case TSBK_OSP_SNDCP_CH_ANN:
+ {
+ uint32_t calcSpace = (uint32_t)(m_siteIdenEntry.chSpaceKhz() / 0.125);
+ float calcTxOffset = m_siteIdenEntry.txOffsetMhz() * 1000000;
+
+ uint32_t txFrequency = (uint32_t)((m_siteIdenEntry.baseFrequency() + ((calcSpace * 125) * m_siteData.channelNo())));
+ uint32_t rxFrequency = (uint32_t)(txFrequency + calcTxOffset);
+
+ uint32_t rootFreq = rxFrequency - m_siteIdenEntry.baseFrequency();
+ uint32_t rxChNo = rootFreq / (m_siteIdenEntry.chSpaceKhz() * 1000);
+
+ tsbkValue = 0U; //
+ tsbkValue = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag
+ (m_encrypted ? 0x40U : 0x00U); // Encrypted Flag
+ tsbkValue = (tsbkValue << 8) +
+ (m_sndcpAutoAccess ? 0x80U : 0x00U) + // Autonomous Access
+ (m_sndcpAutoAccess ? 0x40U : 0x00U); // Requested Access
+ tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (T) ID
+ tsbkValue = (tsbkValue << 12) + m_siteData.channelNo(); // Channel (T) Number
+ tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (R) ID
+ tsbkValue = (tsbkValue << 12) + (rxChNo & 0xFFFU); // Channel (R) Number
+ tsbkValue = (tsbkValue << 16) + m_sndcpDAC; // Data Access Control
+ }
+ break;
case TSBK_IOSP_STS_UPDT:
tsbkValue = 0U;
tsbkValue = (tsbkValue << 16) + m_statusValue; // Status Value
@@ -634,6 +734,11 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
break;
+ case TSBK_OSP_RAD_MON_CMD:
+ tsbkValue = (tsbkValue << 48) + (m_txMult & 0x3U); // TX Multiplier
+ tsbkValue = (tsbkValue << 24) + (m_srcId & 0xFFFFFFU); // Source Radio Address
+ tsbkValue = tsbkValue + (m_dstId & 0xFFFFFFU); // Target Radio Address
+ break;
case TSBK_IOSP_CALL_ALRT:
tsbkValue = 0U;
tsbkValue = (tsbkValue << 40) + m_dstId; // Target Radio Address
@@ -665,30 +770,6 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
tsbkValue = (tsbkValue << 16) + (m_dstId & 0xFFFFU); // Talkgroup Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
break;
- case TSBK_OSP_SNDCP_CH_ANN:
- {
- uint32_t calcSpace = (uint32_t)(m_siteIdenEntry.chSpaceKhz() / 0.125);
- float calcTxOffset = m_siteIdenEntry.txOffsetMhz() * 1000000;
-
- uint32_t txFrequency = (uint32_t)((m_siteIdenEntry.baseFrequency() + ((calcSpace * 125) * m_siteData.channelNo())));
- uint32_t rxFrequency = (uint32_t)(txFrequency + calcTxOffset);
-
- uint32_t rootFreq = rxFrequency - m_siteIdenEntry.baseFrequency();
- uint32_t rxChNo = rootFreq / (m_siteIdenEntry.chSpaceKhz() * 1000);
-
- tsbkValue = 0U; //
- tsbkValue = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag
- (m_encrypted ? 0x40U : 0x00U); // Encrypted Flag
- tsbkValue = (tsbkValue << 8) +
- (m_sndcpAutoAccess ? 0x80U : 0x00U) + // Autonomous Access
- (m_sndcpAutoAccess ? 0x40U : 0x00U); // Requested Access
- tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (T) ID
- tsbkValue = (tsbkValue << 12) + m_siteData.channelNo(); // Channel (T) Number
- tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (R) ID
- tsbkValue = (tsbkValue << 12) + (rxChNo & 0xFFFU); // Channel (R) Number
- tsbkValue = (tsbkValue << 16) + m_sndcpDAC; // Data Access Control
- }
- break;
case TSBK_IOSP_U_REG:
tsbkValue = 0U;
tsbkValue = (tsbkValue << 2) + (m_response & 0x3U); // Unit Registration Response
@@ -821,6 +902,14 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
tsbkValue = (tsbkValue << 13) + (m_microslotCount & 0x1FFFU); // Microslot Count
}
break;
+ case TSBK_OSP_AUTH_FNE_RESP:
+ tsbkValue = 0U;
+ tsbkValue = (tsbkValue << 8) + m_authRes[3U]; // Result b3
+ tsbkValue = (tsbkValue << 8) + m_authRes[2U]; // Result b2
+ tsbkValue = (tsbkValue << 8) + m_authRes[1U]; // Result b1
+ tsbkValue = (tsbkValue << 8) + m_authRes[0U]; // Result b0
+ tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
+ break;
case TSBK_OSP_IDEN_UP_VU:
{
if ((m_siteIdenEntry.chBandwidthKhz() != 0.0F) && (m_siteIdenEntry.chSpaceKhz() != 0.0F) &&
@@ -948,13 +1037,6 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
}
}
break;
- case TSBK_OSP_RAD_MON_CMD:
- {
- tsbkValue = (tsbkValue << 48) + (m_txMult & 0x3U); // TX Multiplier
- tsbkValue = (tsbkValue << 24) + (m_srcId & 0xFFFFFFU); // Source Radio Address
- tsbkValue = tsbkValue + (m_dstId & 0xFFFFFFU); // Target Radio Address
- }
- break;
default:
if (m_mfId == P25_MFG_STANDARD) {
LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
@@ -1227,6 +1309,9 @@ TSBK::TSBK(SiteData siteData) :
m_encrypted(false),
m_priority(4U),
m_group(true),
+ m_txMult(0U),
+ m_authSuccess(false),
+ m_authStandalone(false),
m_siteData(siteData),
m_siteIdenEntry(),
m_rs(),
@@ -1235,11 +1320,21 @@ TSBK::TSBK(SiteData siteData) :
m_sndcpAutoAccess(true),
m_sndcpReqAccess(false),
m_sndcpDAC(1U),
+ m_authRes(NULL),
+ m_authRS(NULL),
+ m_authRand(NULL),
m_siteCallsign(NULL)
{
m_siteCallsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES];
::memset(m_siteCallsign, 0x00U, P25_MOT_CALLSIGN_LENGTH_BYTES);
setCallsign(siteData.callsign());
+
+ m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES];
+ ::memset(m_siteCallsign, 0x00U, P25_AUTH_RES_LENGTH_BYTES);
+ m_authRS = new uint8_t[P25_AUTH_RS_LENGTH_BYTES];
+ ::memset(m_siteCallsign, 0x00U, P25_AUTH_RS_LENGTH_BYTES);
+ m_authRand = new uint8_t[P25_AUTH_RAND_LENGTH_BYTES];
+ ::memset(m_siteCallsign, 0x00U, P25_AUTH_RAND_LENGTH_BYTES);
}
///
@@ -1302,9 +1397,35 @@ void TSBK::copy(const TSBK& data)
m_group = data.m_group;
+ m_txMult = data.m_txMult;
+
+ m_authSuccess = data.m_authSuccess;
+ m_authStandalone = data.m_authStandalone;
+
m_siteData = data.m_siteData;
m_siteIdenEntry = data.m_siteIdenEntry;
+ if (m_authRes != NULL) {
+ delete[] m_authRes;
+ }
+
+ m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES];
+ ::memcpy(m_authRes, data.m_authRes, P25_AUTH_RES_LENGTH_BYTES);
+
+ if (m_authRS != NULL) {
+ delete[] m_authRes;
+ }
+
+ m_authRS = new uint8_t[P25_AUTH_RS_LENGTH_BYTES];
+ ::memcpy(m_authRS, data.m_authRS, P25_AUTH_RS_LENGTH_BYTES);
+
+ if (m_authRand != NULL) {
+ delete[] m_authRand;
+ }
+
+ m_authRand = new uint8_t[P25_AUTH_RAND_LENGTH_BYTES];
+ ::memcpy(m_authRand, data.m_authRand, P25_AUTH_RAND_LENGTH_BYTES);
+
delete[] m_siteCallsign;
uint8_t* callsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES];
diff --git a/p25/lc/TSBK.h b/p25/lc/TSBK.h
index ed824e90..02d42142 100644
--- a/p25/lc/TSBK.h
+++ b/p25/lc/TSBK.h
@@ -82,7 +82,7 @@ namespace p25
TSBK& operator=(const TSBK& data);
/// Decode a alternate trunking signalling block.
- bool decodeMBT(const data::DataHeader dataHeader, const uint8_t* block);
+ bool decodeMBT(const data::DataHeader dataHeader, const data::DataBlock* blocks);
/// Decode a trunking signalling block.
bool decode(const uint8_t* data, bool rawTSBK = false);
@@ -204,16 +204,22 @@ namespace p25
/// Flag indicating a group/talkgroup operation.
__PROPERTY(bool, group, Group);
+ /** Radio Unit Monitor */
+ /// Radio Unit Monitor.
+ __PROPERTY(uint8_t, txMult, TxMult);
+
+ /** Authentication Handshake */
+ /// Flag indicating authentication was successful.
+ __PROPERTY(bool, authSuccess, AuthSuccess);
+ /// Flag indicating authentication is standalone.
+ __PROPERTY(bool, authStandalone, AuthStandalone);
+
/** Local Site data */
/// Local Site Data.
__PROPERTY_PLAIN(SiteData, siteData, siteData);
/// Local Site Identity Entry.
__PROPERTY_PLAIN(::lookups::IdenTable, siteIdenEntry, siteIdenEntry);
- /** Radio Unit Monitor */
- /// Radio Unit Monitor.
- __PROPERTY(uint8_t, txMult, TxMult);
-
private:
/// Initializes a new instance of the TSBK class.
TSBK();
@@ -231,6 +237,11 @@ namespace p25
bool m_sndcpReqAccess;
uint16_t m_sndcpDAC;
+ /** Authentication data */
+ uint8_t* m_authRes;
+ uint8_t* m_authRS;
+ uint8_t* m_authRand;
+
/** Local Site data */
uint8_t* m_siteCallsign;
diff --git a/p25/packet/Data.cpp b/p25/packet/Data.cpp
index c0e95efa..666007ca 100644
--- a/p25/packet/Data.cpp
+++ b/p25/packet/Data.cpp
@@ -335,9 +335,7 @@ bool Data::process(uint8_t* data, uint32_t len)
m_rfDataHeader.getAMBTOpcode(), m_rfDataHeader.getBlocksToFollow());
}
- for (uint32_t i = 0; i < blocksToFollow; i++) {
- m_p25->m_trunk->processMBT(m_rfDataHeader, m_rfData);
- }
+ m_p25->m_trunk->processMBT(m_rfDataHeader, m_rfData);
}
break;
default:
diff --git a/p25/packet/Trunk.cpp b/p25/packet/Trunk.cpp
index 2f2deb70..82a94f6d 100644
--- a/p25/packet/Trunk.cpp
+++ b/p25/packet/Trunk.cpp
@@ -838,29 +838,12 @@ bool Trunk::processMBT(DataHeader dataHeader, DataBlock* blocks)
uint8_t data[1U];
::memset(data, 0x00U, 1U);
- bool ret = true;
- for (uint32_t i = 0; i < dataHeader.getBlocksToFollow(); i++) {
- bool blockRead = true;
-
- // get the raw block data
- uint8_t raw[P25_PDU_UNCONFIRMED_LENGTH_BYTES];
- uint32_t len = blocks[i].getData(raw);
- if (len != P25_PDU_UNCONFIRMED_LENGTH_BYTES) {
- LogError(LOG_P25, "Trunk::processMBT(), failed to read PDU data block");
- blockRead = false;
- }
-
- if (blockRead) {
- bool mbtDecode = m_rfTSBK.decodeMBT(dataHeader, raw);
- if (mbtDecode) {
- process(data, 1U, true);
- } else {
- ret = false;
- }
- }
+ bool mbtDecode = m_rfTSBK.decodeMBT(dataHeader, blocks);
+ if (mbtDecode) {
+ return process(data, 1U, true);
+ } else {
+ return false;
}
-
- return ret;
}
///