parent
d18b4c2b4e
commit
f23d3931f4
@ -0,0 +1,110 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPCtxActAccept.h"
|
||||
#include "Log.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPCtxActAccept class.
|
||||
/// </summary>
|
||||
SNDCPCtxActAccept::SNDCPCtxActAccept() : SNDCPPacket(),
|
||||
m_priority(4U),
|
||||
m_readyTimer(SNDCPReadyTimer::TEN_SECONDS),
|
||||
m_standbyTimer(SNDCPStandbyTimer::ONE_MINUTE),
|
||||
m_nat(SNDCPNAT::IPV4_STATIC_ADDR),
|
||||
m_ipAddress(0U),
|
||||
m_mtu(SNDCP_MTU_510)
|
||||
{
|
||||
m_pduType = SNDCP_PDUType::ACT_TDS_CTX;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decode a SNDCP context activation response.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True, if packet was decoded, otherwise false.</returns>
|
||||
bool SNDCPCtxActAccept::decode(const uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::decodeHeader(data, false);
|
||||
|
||||
m_priority = (uint8_t)((data[1U] >> 4) & 0x0FU); // Priority
|
||||
m_readyTimer = (uint8_t)(data[1U] & 0x0FU); // Ready Timer
|
||||
m_standbyTimer = (uint8_t)((data[2U] >> 4) & 0x0FU); // Standby Timer
|
||||
m_nat = (uint8_t)(data[2U] & 0x0FU); // NAT
|
||||
|
||||
m_ipAddress = 0U; // IP Address
|
||||
m_ipAddress = data[3U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[4U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[5U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[6U];
|
||||
|
||||
m_mtu = (uint8_t)((data[9U] >> 4) & 0x0FU); // MTU
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encode a SNDCP context activation response.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActAccept::encode(uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::encodeHeader(data, true);
|
||||
|
||||
data[1U] = ((m_priority << 4U) & 0xF0U) + // Priority
|
||||
(m_readyTimer & 0x0FU); // Ready Timer
|
||||
data[2U] = ((m_standbyTimer << 4U) & 0xF0U) + // Standby Timer
|
||||
(m_nat & 0x0FU); // NAT
|
||||
|
||||
data[3U] = (uint8_t)((m_ipAddress >> 24) & 0xFFU); // IP Address
|
||||
data[4U] = (uint8_t)((m_ipAddress >> 16) & 0xFFU);
|
||||
data[5U] = (uint8_t)((m_ipAddress >> 8) & 0xFFU);
|
||||
data[6U] = (uint8_t)((m_ipAddress >> 0) & 0xFFU);
|
||||
|
||||
data[9U] = ((m_mtu << 4U) & 0xF0U); // MTU
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Protected Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to copy the the class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActAccept::copy(const SNDCPCtxActAccept& data)
|
||||
{
|
||||
m_priority = data.m_priority;
|
||||
m_readyTimer = data.m_readyTimer;
|
||||
m_standbyTimer = data.m_standbyTimer;
|
||||
m_nat = data.m_nat;
|
||||
|
||||
m_ipAddress = data.m_ipAddress;
|
||||
|
||||
m_mtu = data.m_mtu;
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
// 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_SNDCP__SNDCPCTXACTACCEPT_H__)
|
||||
#define __P25_SNDCP__SNDCPCTXACTACCEPT_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
#include "common/p25/sndcp/SNDCPPacket.h"
|
||||
#include "common/Utils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Represents a SNDCP PDU context accept response.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPCtxActAccept : public SNDCPPacket {
|
||||
public:
|
||||
/// <summary>Initializes a new instance of the SNDCPCtxActAccept class.</summary>
|
||||
SNDCPCtxActAccept();
|
||||
|
||||
/// <summary>Decode a SNDCP context activation response.</summary>
|
||||
bool decode(const uint8_t* data);
|
||||
/// <summary>Encode a SNDCP context activation response.</summary>
|
||||
void encode(uint8_t* data);
|
||||
|
||||
public:
|
||||
/// <summary>Priority</summary>
|
||||
__PROPERTY(uint8_t, priority, Priority);
|
||||
/// <summary>Ready Timer</summary>
|
||||
__PROPERTY(uint8_t, readyTimer, ReadyTimer);
|
||||
/// <summary>Ready Timer</summary>
|
||||
__PROPERTY(uint8_t, standbyTimer, StandbyTimer);
|
||||
/// <summary>Network Address Type</summary>
|
||||
__PROPERTY(uint8_t, nat, NAT);
|
||||
|
||||
/// <summary>IP Address</summary>
|
||||
__PROPERTY(ulong64_t, ipAddress, IPAddress);
|
||||
|
||||
/// <summary>MTU</summary>
|
||||
__PROPERTY(uint8_t, mtu, MTU);
|
||||
|
||||
__COPY(SNDCPCtxActAccept);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCPCTXACTACCEPT_H__
|
||||
@ -0,0 +1,73 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPCtxActReject.h"
|
||||
#include "Log.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPCtxActReject class.
|
||||
/// </summary>
|
||||
SNDCPCtxActReject::SNDCPCtxActReject() : SNDCPPacket(),
|
||||
m_rejectCode(SNDCPRejectReason::ANY_REASON)
|
||||
{
|
||||
m_pduType = SNDCP_PDUType::ACT_TDS_CTX_REJECT;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decode a SNDCP context activation reject packet.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True, if packet was decoded, otherwise false.</returns>
|
||||
bool SNDCPCtxActReject::decode(const uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::decodeHeader(data, false);
|
||||
|
||||
m_rejectCode = data[1U]; // Reject Code
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encode a SNDCP context activation reject packet.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActReject::encode(uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::encodeHeader(data, true);
|
||||
|
||||
data[1U] = m_rejectCode; // Reject Code
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to copy the the class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActReject::copy(const SNDCPCtxActReject& data)
|
||||
{
|
||||
m_rejectCode = data.m_rejectCode;
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
// 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_SNDCP__SNDCPCTXACTREJECT_H__)
|
||||
#define __P25_SNDCP__SNDCPCTXACTREJECT_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
#include "common/p25/sndcp/SNDCPPacket.h"
|
||||
#include "common/Utils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Represents a SNDCP PDU context activation reject response.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPCtxActReject : public SNDCPPacket {
|
||||
public:
|
||||
/// <summary>Initializes a new instance of the SNDCPCtxActReject class.</summary>
|
||||
SNDCPCtxActReject();
|
||||
|
||||
/// <summary>Decode a SNDCP context activation reject packet.</summary>
|
||||
bool decode(const uint8_t* data);
|
||||
/// <summary>Encode a SNDCP context activation reject packet.</summary>
|
||||
void encode(uint8_t* data);
|
||||
|
||||
public:
|
||||
/// <summary>Reject Code</summary>
|
||||
__PROPERTY(uint8_t, rejectCode, RejectCode);
|
||||
|
||||
__COPY(SNDCPCtxActReject);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCPCTXACTREJECT_H__
|
||||
@ -0,0 +1,97 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPCtxActRequest.h"
|
||||
#include "Log.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPCtxActRequest class.
|
||||
/// </summary>
|
||||
SNDCPCtxActRequest::SNDCPCtxActRequest() : SNDCPPacket(),
|
||||
m_nat(SNDCPNAT::IPV4_NO_ADDRESS),
|
||||
m_ipAddress(0U),
|
||||
m_dsut(SNDCP_DSUT::ALT_T_AND_C_DATA_VOICE)
|
||||
{
|
||||
m_pduType = SNDCP_PDUType::ACT_TDS_CTX;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decode a SNDCP context activation request.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True, if packet was decoded, otherwise false.</returns>
|
||||
bool SNDCPCtxActRequest::decode(const uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::decodeHeader(data, false);
|
||||
|
||||
m_nsapi = (uint8_t)((data[1U] >> 4) & 0x0FU); // NSAPI
|
||||
m_nat = (uint8_t)((data[1U]) & 0x0FU); // NAT
|
||||
|
||||
m_ipAddress = 0U; // IP Address
|
||||
m_ipAddress = data[2U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[3U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[4U];
|
||||
m_ipAddress = (m_ipAddress << 8) + data[5U];
|
||||
|
||||
m_dsut = (uint8_t)((data[6U] >> 4) & 0x0FU); // Data Subscriber Unit Type
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encode a SNDCP context activation request.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActRequest::encode(uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::encodeHeader(data, true);
|
||||
|
||||
data[1U] = ((m_nsapi << 4U) & 0xF0U) + // NSAPI
|
||||
(m_nat & 0x0FU); // NAT
|
||||
|
||||
data[2U] = (uint8_t)((m_ipAddress >> 24) & 0xFFU); // IP Address
|
||||
data[3U] = (uint8_t)((m_ipAddress >> 16) & 0xFFU);
|
||||
data[4U] = (uint8_t)((m_ipAddress >> 8) & 0xFFU);
|
||||
data[5U] = (uint8_t)((m_ipAddress >> 0) & 0xFFU);
|
||||
|
||||
data[6U] = ((m_dsut << 4U) & 0xF0U); // Data Subscriber Unit Type
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to copy the the class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxActRequest::copy(const SNDCPCtxActRequest& data)
|
||||
{
|
||||
m_nsapi = data.m_nsapi;
|
||||
m_nat = data.m_nat;
|
||||
|
||||
m_ipAddress = data.m_ipAddress;
|
||||
|
||||
m_dsut = data.m_dsut;
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
// 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_SNDCP__SNDCPCTXACTREQUEST_H__)
|
||||
#define __P25_SNDCP__SNDCPCTXACTREQUEST_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
#include "common/p25/sndcp/SNDCPPacket.h"
|
||||
#include "common/Utils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Represents a SNDCP PDU context activation request.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPCtxActRequest : public SNDCPPacket {
|
||||
public:
|
||||
/// <summary>Initializes a new instance of the SNDCPCtxActRequest class.</summary>
|
||||
SNDCPCtxActRequest();
|
||||
|
||||
/// <summary>Decode a SNDCP context activation request.</summary>
|
||||
bool decode(const uint8_t* data);
|
||||
/// <summary>Encode a SNDCP context activation request.</summary>
|
||||
void encode(uint8_t* data);
|
||||
|
||||
public:
|
||||
/// <summary>Network Address Type</summary>
|
||||
__PROPERTY(uint8_t, nat, NAT);
|
||||
|
||||
/// <summary>IP Address</summary>
|
||||
__PROPERTY(ulong64_t, ipAddress, IPAddress);
|
||||
|
||||
/// <summary>Data Subscriber Unit Type</summary>
|
||||
__PROPERTY(uint8_t, dsut, DSUT);
|
||||
|
||||
__COPY(SNDCPCtxActRequest);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCPCTXACTREQUEST_H__
|
||||
@ -0,0 +1,73 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPCtxDeactivation.h"
|
||||
#include "Log.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPCtxDeactivation class.
|
||||
/// </summary>
|
||||
SNDCPCtxDeactivation::SNDCPCtxDeactivation() : SNDCPPacket(),
|
||||
m_deactType(SNDCPDeactivationType::DEACT_ALL)
|
||||
{
|
||||
m_pduType = SNDCP_PDUType::DEACT_TDS_CTX_REQ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decode a SNDCP context deactivation packet.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True, if packet was decoded, otherwise false.</returns>
|
||||
bool SNDCPCtxDeactivation::decode(const uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::decodeHeader(data, false);
|
||||
|
||||
m_deactType = data[1U]; // Deactivation Type
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encode a SNDCP context deactivation packet.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxDeactivation::encode(uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
SNDCPPacket::encodeHeader(data, true);
|
||||
|
||||
data[1U] = m_deactType; // Deactivation Type
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to copy the the class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPCtxDeactivation::copy(const SNDCPCtxDeactivation& data)
|
||||
{
|
||||
m_deactType = data.m_deactType;
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
// 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_SNDCP__SNDCPCTXDEACTIVATION_H__)
|
||||
#define __P25_SNDCP__SNDCPCTXDEACTIVATION_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
#include "common/p25/sndcp/SNDCPPacket.h"
|
||||
#include "common/Utils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Represents a SNDCP PDU context deactivation.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPCtxDeactivation : public SNDCPPacket {
|
||||
public:
|
||||
/// <summary>Initializes a new instance of the SNDCPCtxDeactivation class.</summary>
|
||||
SNDCPCtxDeactivation();
|
||||
|
||||
/// <summary>Decode a SNDCP context deactivation packet.</summary>
|
||||
bool decode(const uint8_t* data);
|
||||
/// <summary>Encode a SNDCP context deactivation packet.</summary>
|
||||
void encode(uint8_t* data);
|
||||
|
||||
public:
|
||||
/** Common Data */
|
||||
/// <summary>Deactivation Type</summary>
|
||||
__PROPERTY(uint8_t, deactType, DeactType);
|
||||
|
||||
__COPY(SNDCPCtxDeactivation);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCPCTXDEACTIVATION_H__
|
||||
@ -0,0 +1,90 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPFactory.h"
|
||||
#include "Log.h"
|
||||
#include "Utils.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPFactory class.
|
||||
/// </summary>
|
||||
SNDCPFactory::SNDCPFactory() = default;
|
||||
|
||||
/// <summary>
|
||||
/// Finalizes a instance of SNDCPFactory class.
|
||||
/// </summary>
|
||||
SNDCPFactory::~SNDCPFactory() = default;
|
||||
|
||||
/// <summary>
|
||||
/// Create an instance of a SNDCPPacket.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True, if packet was decoded, otherwise false.</returns>
|
||||
std::unique_ptr<SNDCPPacket> SNDCPFactory::create(const uint8_t* data)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
uint8_t pduType = (uint8_t)((data[0U] >> 4) & 0x0FU); // SNDCP PDU Message Type
|
||||
|
||||
switch (pduType) {
|
||||
case SNDCP_PDUType::ACT_TDS_CTX:
|
||||
return decode(new SNDCPCtxActRequest(), data);
|
||||
break;
|
||||
case SNDCP_PDUType::DEACT_TDS_CTX_REQ:
|
||||
return decode(new SNDCPCtxDeactivation(), data);
|
||||
break;
|
||||
case SNDCP_PDUType::RF_CONFIRMED:
|
||||
break;
|
||||
case SNDCP_PDUType::RF_UNCONFIRMED:
|
||||
break;
|
||||
default:
|
||||
LogError(LOG_P25, "SNDCPFactory::create(), unknown SNDCP PDU value, pduType = $%02X", pduType);
|
||||
break;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Private Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="tsbk"></param>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="rawTSBK"></param>
|
||||
/// <returns></returns>
|
||||
std::unique_ptr<SNDCPPacket> SNDCPFactory::decode(SNDCPPacket* packet, const uint8_t* data)
|
||||
{
|
||||
assert(packet != nullptr);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (!packet->decode(data)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return std::unique_ptr<SNDCPPacket>(packet);
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
// 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_SNDCP__SNDCP_FACTORY_H__)
|
||||
#define __P25_SNDCP__SNDCP_FACTORY_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
|
||||
#include "common/p25/sndcp/SNDCPPacket.h"
|
||||
#include "common/p25/sndcp/SNDCPCtxActAccept.h"
|
||||
#include "common/p25/sndcp/SNDCPCtxActReject.h"
|
||||
#include "common/p25/sndcp/SNDCPCtxActRequest.h"
|
||||
#include "common/p25/sndcp/SNDCPCtxDeactivation.h"
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Helper class to instantiate an instance of a SNDCP packet.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPFactory {
|
||||
public:
|
||||
/// <summary>Initializes a new instance of the SNDCPFactory class.</summary>
|
||||
SNDCPFactory();
|
||||
/// <summary>Finalizes a instance of the SNDCPFactory class.</summary>
|
||||
~SNDCPFactory();
|
||||
|
||||
/// <summary>Create an instance of a SNDCPPacket.</summary>
|
||||
static std::unique_ptr<SNDCPPacket> create(const uint8_t* data);
|
||||
|
||||
private:
|
||||
/// <summary></summary>
|
||||
static std::unique_ptr<SNDCPPacket> decode(SNDCPPacket* packet, const uint8_t* data);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCP_FACTORY_H__
|
||||
@ -0,0 +1,104 @@
|
||||
// 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/P25Defines.h"
|
||||
#include "p25/sndcp/SNDCPPacket.h"
|
||||
#include "Log.h"
|
||||
|
||||
using namespace p25;
|
||||
using namespace p25::defines;
|
||||
using namespace p25::sndcp;
|
||||
|
||||
#include <cassert>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a copy instance of the SNDCPPacket class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
SNDCPPacket::SNDCPPacket(const SNDCPPacket& data) : SNDCPPacket()
|
||||
{
|
||||
copy(data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SNDCPPacket class.
|
||||
/// </summary>
|
||||
SNDCPPacket::SNDCPPacket() :
|
||||
m_pduType(SNDCP_PDUType::ACT_TDS_CTX),
|
||||
m_sndcpVersion(SNDCP_VERSION_1),
|
||||
m_nsapi(0U)
|
||||
{
|
||||
/* stub */
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finalizes a instance of SNDCPPacket class.
|
||||
/// </summary>
|
||||
SNDCPPacket::~SNDCPPacket() = default;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Protected Class Members
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to decode a SNDCP header.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="outbound"></param>
|
||||
/// <returns>True, if header was decoded, otherwise false.</returns>
|
||||
bool SNDCPPacket::decodeHeader(const uint8_t* data, bool outbound)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
m_pduType = (uint8_t)((data[0U] >> 4) & 0x0FU); // SNDCP PDU Message Type
|
||||
|
||||
if (m_pduType == SNDCP_PDUType::ACT_TDS_CTX && !outbound) {
|
||||
m_sndcpVersion = (uint8_t)((data[0U]) & 0x0FU); // SNDCP Version
|
||||
} else {
|
||||
m_nsapi = (uint8_t)((data[0U]) & 0x0FU); // NSAPI
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to encode a SNDCP header.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="outbound"></param>
|
||||
void SNDCPPacket::encodeHeader(uint8_t* data, bool outbound)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
|
||||
data[0U] = ((m_pduType << 4U) & 0xF0U); // SNDCP PDU Message Type
|
||||
|
||||
if (m_pduType == SNDCP_PDUType::ACT_TDS_CTX && !outbound) {
|
||||
data[0U] += (m_sndcpVersion & 0x0FU); // SNDCP Version
|
||||
} else {
|
||||
data[0U] += (m_nsapi & 0x0FU); // NSAPI
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal helper to copy the the class.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
void SNDCPPacket::copy(const SNDCPPacket& data)
|
||||
{
|
||||
m_pduType = data.m_pduType;
|
||||
m_sndcpVersion = data.m_sndcpVersion;
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
// 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_SNDCP__SNDCPHEADER_H__)
|
||||
#define __P25_SNDCP__SNDCPHEADER_H__
|
||||
|
||||
#include "common/Defines.h"
|
||||
#include "common/Utils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace p25
|
||||
{
|
||||
namespace sndcp
|
||||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// Class Declaration
|
||||
// Represents a SNDCP PDU packet header.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class HOST_SW_API SNDCPPacket {
|
||||
public:
|
||||
/// <summary>Initializes a copy instance of the SNDCPPacket class.</summary>
|
||||
SNDCPPacket(const SNDCPPacket& data);
|
||||
/// <summary>Initializes a new instance of the SNDCPPacket class.</summary>
|
||||
SNDCPPacket();
|
||||
/// <summary>Finalizes a instance of the SNDCPPacket class.</summary>
|
||||
~SNDCPPacket();
|
||||
|
||||
/// <summary>Decode a SNDCP packet.</summary>
|
||||
virtual bool decode(const uint8_t* data) = 0;
|
||||
/// <summary>Encode a SNDCP packet.</summary>
|
||||
virtual void encode(uint8_t* data) = 0;
|
||||
|
||||
public:
|
||||
/** Common Data */
|
||||
/// <summary>SNDCP PDU Type.</summary>
|
||||
__PROTECTED_PROPERTY(uint8_t, pduType, PDUType);
|
||||
/// <summary>Link control opcode.</summary>
|
||||
__READONLY_PROPERTY(uint8_t, sndcpVersion, SNDCPVersion);
|
||||
/// <summary>Network Service Access Point Identifier</summary>
|
||||
__PROTECTED_PROPERTY(uint8_t, nsapi, NSAPI);
|
||||
|
||||
protected:
|
||||
/// <summary>Internal helper to decode a SNDCP header.</summary>
|
||||
bool decodeHeader(const uint8_t* data, bool outbound = false);
|
||||
/// <summary>Internal helper to encode a SNDCP header.</summary>
|
||||
void encodeHeader(uint8_t* data, bool outbound = false);
|
||||
|
||||
__PROTECTED_COPY(SNDCPPacket);
|
||||
};
|
||||
} // namespace sndcp
|
||||
} // namespace p25
|
||||
|
||||
#endif // __P25_SNDCP__SNDCPHEADER_H__
|
||||
Loading…
Reference in new issue