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