fix ability to set MFID via REST before issuing P25 commands; implement MBT for GRP_AFF_Q_RSP;

pull/55/head
Bryan Biedenkapp 2 years ago
parent 01b92641fd
commit 0251944438

@ -102,12 +102,12 @@ bool AMBT::decode(const data::DataHeader& dataHeader, const data::DataBlock* blo
assert(pduUserData != nullptr);
if (dataHeader.getFormat() != PDU_FMT_AMBT) {
LogError(LOG_P25, "TSBK::decodeMBT(), PDU is not a AMBT PDU");
LogError(LOG_P25, "AMBT::decode(), PDU is not a AMBT PDU");
return false;
}
if (dataHeader.getBlocksToFollow() == 0U) {
LogError(LOG_P25, "TSBK::decodeMBT(), PDU contains no data blocks");
LogError(LOG_P25, "AMBT::decode(), PDU contains no data blocks");
return false;
}
@ -116,7 +116,7 @@ bool AMBT::decode(const data::DataHeader& dataHeader, const data::DataBlock* blo
m_mfId = dataHeader.getMFId(); // Mfg Id.
if (dataHeader.getOutbound()) {
LogWarning(LOG_P25, "TSBK::decodeMBT(), MBT is an outbound MBT?, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
LogWarning(LOG_P25, "AMBT::decode(), MBT is an outbound MBT?, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
}
// get PDU block data
@ -126,13 +126,18 @@ bool AMBT::decode(const data::DataHeader& dataHeader, const data::DataBlock* blo
for (uint8_t i = 0; i < dataHeader.getBlocksToFollow(); i++) {
uint32_t len = blocks[i].getData(pduUserData + dataOffset);
if (len != P25_PDU_UNCONFIRMED_LENGTH_BYTES) {
LogError(LOG_P25, "TSBK::decodeMBT(), failed to read PDU data block");
LogError(LOG_P25, "AMBT::decode(), failed to read PDU data block");
return false;
}
dataOffset += P25_PDU_UNCONFIRMED_LENGTH_BYTES;
}
if (m_verbose) {
LogDebug(LOG_P25, "AMBT::decode(), mfId = $%02X, lco = $%02X, ambt8 = $%02X, ambt9 = $%02X", m_mfId, m_lco, dataHeader.getAMBTField8(), dataHeader.getAMBTField9());
Utils::dump(2U, "AMBT::decode(), pduUserData", pduUserData, P25_PDU_UNCONFIRMED_LENGTH_BYTES * dataHeader.getBlocksToFollow());
}
return true;
}

@ -269,7 +269,6 @@ std::unique_ptr<AMBT> TSBKFactory::createAMBT(const data::DataHeader& dataHeader
case TSBK_IOSP_GRP_AFF:
case TSBK_IOSP_U_REG:
case TSBK_ISP_CAN_SRV_REQ:
case TSBK_ISP_GRP_AFF_Q_RSP:
case TSBK_OSP_DENY_RSP:
case TSBK_OSP_QUE_RSP:
case TSBK_ISP_U_DEREG_REQ:
@ -277,6 +276,8 @@ std::unique_ptr<AMBT> TSBKFactory::createAMBT(const data::DataHeader& dataHeader
case TSBK_ISP_LOC_REG_REQ:
mfId = P25_MFG_STANDARD;
break;
case TSBK_ISP_GRP_AFF_Q_RSP:
return decode(new MBT_ISP_GRP_AFF_Q_RSP(), dataHeader, blocks);
default:
LogError(LOG_P25, "TSBKFactory::createAMBT(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco);
break;

@ -78,6 +78,7 @@
#include "common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.h"
#include "common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.h"
#include "common/p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.h"
#include "common/p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.h"
#include "common/p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.h"
#include "common/p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.h"
#include "common/p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.h"

@ -0,0 +1,83 @@
// SPDX-License-Identifier: GPL-2.0-only
/**
* Digital Voice Modem - Common Library
* GPLv2 Open Source. Use is subject to license terms.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* @package DVM / Common Library
* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0)
*
* Copyright (C) 2024 Bryan Biedenkapp, N2PLL
*
*/
#include "Defines.h"
#include "p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.h"
using namespace p25::lc::tsbk;
using namespace p25::lc;
using namespace p25;
#include <cassert>
// ---------------------------------------------------------------------------
// Public Class Members
// ---------------------------------------------------------------------------
/// <summary>
/// Initializes a new instance of the MBT_ISP_GRP_AFF_Q_RSP class.
/// </summary>
MBT_ISP_GRP_AFF_Q_RSP::MBT_ISP_GRP_AFF_Q_RSP() : AMBT()
{
m_lco = TSBK_ISP_GRP_AFF_Q_RSP;
}
/// <summary>
/// Decode a alternate trunking signalling block.
/// </summary>
/// <param name="dataHeader"></param>
/// <param name="blocks"></param>
/// <returns>True, if TSBK was decoded, otherwise false.</returns>
bool MBT_ISP_GRP_AFF_Q_RSP::decodeMBT(const data::DataHeader& dataHeader, const data::DataBlock* blocks)
{
assert(blocks != nullptr);
uint8_t pduUserData[P25_PDU_UNCONFIRMED_LENGTH_BYTES * dataHeader.getBlocksToFollow()];
::memset(pduUserData, 0x00U, P25_PDU_UNCONFIRMED_LENGTH_BYTES * dataHeader.getBlocksToFollow());
bool ret = AMBT::decode(dataHeader, blocks, pduUserData);
if (!ret)
return false;
ulong64_t tsbkValue = AMBT::toValue(dataHeader, pduUserData);
m_netId = (uint32_t)((tsbkValue >> 44) & 0xFFFFFU); // Network ID
m_sysId = (uint32_t)((tsbkValue >> 32) & 0xFFFU); // System ID
m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFU); // Talkgroup Address
m_srcId = dataHeader.getLLId(); // Source Radio Address
return true;
}
/// <summary>
/// Encode a alternate trunking signalling block.
/// </summary>
/// <param name="dataHeader"></param>
/// <param name="pduUserData"></param>
void MBT_ISP_GRP_AFF_Q_RSP::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUserData)
{
assert(pduUserData != nullptr);
/* stub */
return;
}
/// <summary>
/// Returns a string that represents the current TSBK.
/// </summary>
/// <param name="isp"></param>
/// <returns></returns>
std::string MBT_ISP_GRP_AFF_Q_RSP::toString(bool isp)
{
return std::string("TSBK_ISP_GRP_AFF_Q_RSP (Group Affiliation Query Response)");
}

@ -0,0 +1,47 @@
// SPDX-License-Identifier: GPL-2.0-only
/**
* Digital Voice Modem - Common Library
* GPLv2 Open Source. Use is subject to license terms.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* @package DVM / Common Library
* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0)
*
* Copyright (C) 2024 Bryan Biedenkapp, N2PLL
*
*/
#if !defined(__P25_LC_TSBK__MBT_ISP_GRP_AFF_Q_RSP_H__)
#define __P25_LC_TSBK__MBT_ISP_GRP_AFF_Q_RSP_H__
#include "common/Defines.h"
#include "common/p25/lc/AMBT.h"
namespace p25
{
namespace lc
{
namespace tsbk
{
// ---------------------------------------------------------------------------
// Class Declaration
// Implements GRP AFF Q RSP - Group Affiliation Query Response
// ---------------------------------------------------------------------------
class HOST_SW_API MBT_ISP_GRP_AFF_Q_RSP : public AMBT {
public:
/// <summary>Initializes a new instance of the MBT_ISP_GRP_AFF_Q_RSP class.</summary>
MBT_ISP_GRP_AFF_Q_RSP();
/// <summary>Decode a alternate trunking signalling block.</summary>
bool decodeMBT(const data::DataHeader& dataHeader, const data::DataBlock* blocks) override;
/// <summary>Encode a alternate trunking signalling block.</summary>
void encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUserData) override;
/// <summary>Returns a string that represents the current TSBK.</summary>
std::string toString(bool isp = true) override;
};
} // namespace tsbk
} // namespace lc
} // namespace p25
#endif // __P25_LC_TSBK__MBT_ISP_GRP_AFF_Q_RSP_H__

@ -514,6 +514,10 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr<lc::
// make sure control data is supported
IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_ISP_GRP_AFF_Q_RSP, srcId);
if (m_p25->m_ackTSBKRequests) {
writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_GRP_AFF_Q_RSP, true, true);
}
ISP_GRP_AFF_Q_RSP* isp = static_cast<ISP_GRP_AFF_Q_RSP*>(tsbk.get());
if (m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", %s, srcId = %u, dstId = %u, anncId = %u",
@ -1006,6 +1010,11 @@ void ControlSignaling::writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId)
iosp->setSrcId(srcId);
iosp->setDstId(dstId);
if (m_lastMFID != P25_MFG_STANDARD) {
iosp->setMFId(m_lastMFID);
m_lastMFID = P25_MFG_STANDARD;
}
VERBOSE_LOG_TSBK(iosp->toString(), srcId, dstId);
::ActivityLog("P25", true, "call alert request from %u to %u", srcId, dstId);
@ -1047,6 +1056,11 @@ void ControlSignaling::writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32
iosp->setSrcId(arg);
iosp->setDstId(dstId);
if (m_lastMFID != P25_MFG_STANDARD) {
iosp->setMFId(m_lastMFID);
m_lastMFID = P25_MFG_STANDARD;
}
if (m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", %s, op = $%02X, arg = %u, tgt = %u",
iosp->toString().c_str(), iosp->getExtendedFunction(), iosp->getSrcId(), iosp->getDstId());
@ -1076,6 +1090,11 @@ void ControlSignaling::writeRF_TSDU_Grp_Aff_Q(uint32_t dstId)
osp->setSrcId(P25_WUID_FNE);
osp->setDstId(dstId);
if (m_lastMFID != P25_MFG_STANDARD) {
osp->setMFId(m_lastMFID);
m_lastMFID = P25_MFG_STANDARD;
}
VERBOSE_LOG_TSBK_DST(osp->toString(), dstId);
::ActivityLog("P25", true, "group affiliation query command from %u to %u", P25_WUID_FNE, dstId);
@ -1092,6 +1111,11 @@ void ControlSignaling::writeRF_TSDU_U_Reg_Cmd(uint32_t dstId)
osp->setSrcId(P25_WUID_FNE);
osp->setDstId(dstId);
if (m_lastMFID != P25_MFG_STANDARD) {
osp->setMFId(m_lastMFID);
m_lastMFID = P25_MFG_STANDARD;
}
VERBOSE_LOG_TSBK_DST(osp->toString(), dstId);
::ActivityLog("P25", true, "unit registration command from %u to %u", P25_WUID_FNE, dstId);

Loading…
Cancel
Save

Powered by TurnKey Linux.