You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
9.7 KiB
232 lines
9.7 KiB
// 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.
|
|
*
|
|
* Copyright (C) 2023-2026 Bryan Biedenkapp, N2PLL
|
|
*
|
|
*/
|
|
/**
|
|
* @file RTPFNEHeader.h
|
|
* @ingroup network_core
|
|
* @file RTPFNEHeader.cpp
|
|
* @ingroup network_core
|
|
*/
|
|
#if !defined(__RTP_FNE_HEADER_H__)
|
|
#define __RTP_FNE_HEADER_H__
|
|
|
|
#include "common/Defines.h"
|
|
#include "common/network/RTPExtensionHeader.h"
|
|
|
|
#include <chrono>
|
|
#include <random>
|
|
#include <string>
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Constants
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#define RTP_FNE_HEADER_LENGTH_BYTES 16
|
|
#define RTP_FNE_HEADER_LENGTH_EXT_LEN 4
|
|
|
|
#define RTP_END_OF_CALL_SEQ 65535
|
|
|
|
namespace network
|
|
{
|
|
// ---------------------------------------------------------------------------
|
|
// Constants
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @brief Network Functions
|
|
* @ingroup network_core
|
|
*/
|
|
namespace NET_FUNC {
|
|
enum ENUM : uint8_t {
|
|
ILLEGAL = 0xFFU, //!< Illegal Function
|
|
|
|
PROTOCOL = 0x00U, //!< Digital Protocol Function
|
|
|
|
MASTER = 0x01U, //!< Network Master Function
|
|
|
|
RPTL = 0x60U, //!< Repeater Login
|
|
RPTK = 0x61U, //!< Repeater Authorisation
|
|
RPTC = 0x62U, //!< Repeater Configuration
|
|
|
|
RPT_DISC = 0x70U, //!< Repeater Disconnect
|
|
MST_DISC = 0x71U, //!< Master Disconnect
|
|
|
|
PING = 0x74U, //!< Ping
|
|
PONG = 0x75U, //!< Pong
|
|
|
|
GRANT_REQ = 0x7AU, //!< Grant Request
|
|
INCALL_CTRL = 0x7BU, //!< In-Call Control
|
|
KEY_REQ = 0x7CU, //!< Encryption Key TEK Request
|
|
KEY_RSP = 0x7DU, //!< Encryption Key TEK Response
|
|
|
|
ACK = 0x7EU, //!< Packet Acknowledge
|
|
NAK = 0x7FU, //!< Packet Negative Acknowledge
|
|
|
|
KEY_LLA_REQ = 0x80U, //!< Encryption Key LLA Request
|
|
KEY_LLA_RSP = 0x81U, //!< Encryption Key LLA Response
|
|
KEYS_INVENTORY = 0x8EU, //!< Encryption Key Container Inventory
|
|
KEYS_UPDATE = 0x8FU, //!< Encryption Key Container Update
|
|
|
|
TRANSFER = 0x90U, //!< Network Transfer Function
|
|
|
|
ANNOUNCE = 0x91U, //!< Network Announce Function
|
|
|
|
REPL = 0x92U, //!< FNE Replication Function
|
|
NET_TREE = 0x93U //!< FNE Network Tree Function
|
|
};
|
|
};
|
|
|
|
/**
|
|
* @brief Network Sub-Functions
|
|
* @ingroup network_core
|
|
*/
|
|
namespace NET_SUBFUNC {
|
|
enum ENUM : uint8_t {
|
|
NOP = 0xFFU, //!< No Operation Sub-Function
|
|
|
|
PROTOCOL_SUBFUNC_DMR = 0x00U, //!< DMR
|
|
PROTOCOL_SUBFUNC_P25 = 0x01U, //!< P25
|
|
PROTOCOL_SUBFUNC_NXDN = 0x02U, //!< NXDN
|
|
PROTOCOL_SUBFUNC_P25_P2 = 0x03U, //!< P25 Phase 2
|
|
PROTOCOL_SUBFUNC_ANALOG = 0x0FU, //!< Analog
|
|
|
|
MASTER_SUBFUNC_WL_RID = 0x00U, //!< Whitelist RIDs
|
|
MASTER_SUBFUNC_BL_RID = 0x01U, //!< Blacklist RIDs
|
|
MASTER_SUBFUNC_ACTIVE_TGS = 0x02U, //!< Active TGIDs
|
|
MASTER_SUBFUNC_DEACTIVE_TGS = 0x03U, //!< Deactive TGIDs
|
|
MASTER_HA_PARAMS = 0xA3U, //!< HA Parameters
|
|
|
|
TRANSFER_SUBFUNC_ACTIVITY = 0x01U, //!< Activity Log Transfer
|
|
TRANSFER_SUBFUNC_DIAG = 0x02U, //!< Diagnostic Log Transfer
|
|
TRANSFER_SUBFUNC_STATUS = 0x03U, //!< Status Transfer
|
|
|
|
ANNC_SUBFUNC_GRP_AFFIL = 0x00U, //!< Announce Group Affiliation
|
|
ANNC_SUBFUNC_UNIT_REG = 0x01U, //!< Announce Unit Registration
|
|
ANNC_SUBFUNC_UNIT_DEREG = 0x02U, //!< Announce Unit Deregistration
|
|
ANNC_SUBFUNC_GRP_UNAFFIL = 0x03U, //!< Announce Group Affiliation Removal
|
|
ANNC_SUBFUNC_AFFILS = 0x90U, //!< Update All Affiliations
|
|
ANNC_SUBFUNC_UNIT_REGS = 0x91U, //!< Update All Unit Registrations
|
|
ANNC_SUBFUNC_SITE_VC = 0x9AU, //!< Announce Site VCs
|
|
|
|
REPL_TALKGROUP_LIST = 0x00U, //!< FNE Replication Talkgroup Transfer
|
|
REPL_RID_LIST = 0x01U, //!< FNE Replication Radio ID Transfer
|
|
REPL_PEER_LIST = 0x02U, //!< FNE Replication Peer List Transfer
|
|
|
|
REPL_ACT_PEER_LIST = 0xA2U, //!< FNE Replication Active Peer List Transfer
|
|
REPL_HA_PARAMS = 0xA3U, //!< FNE Replication HA Parameters
|
|
|
|
NET_TREE_LIST = 0x00U, //!< FNE Network Tree List
|
|
NET_TREE_DISC = 0x01U //!< FNE Network Tree Disconnect
|
|
};
|
|
};
|
|
|
|
/**
|
|
* @brief Network In-Call Control
|
|
* @ingroup network_core
|
|
*/
|
|
namespace NET_ICC {
|
|
enum ENUM : uint8_t {
|
|
NOP = 0xFFU, //!< No Operation Sub-Function
|
|
|
|
BUSY_DENY = 0x00U, //!< Busy Deny
|
|
REJECT_TRAFFIC = 0x01U, //!< Reject Active Traffic
|
|
|
|
// DMR Reverse Channel Commands
|
|
DMR_RC_CEASE_TRANSMIT = 0xD2U, //!< DMR Reverse Channel: Cease Transmission
|
|
DMR_RC_REQUEST_CEASE_TRANSMIT = 0xD3U, //!< DMR Reverse Channel: Request Cease Transmission
|
|
DMR_RC_MAXIMUM_POWER = 0xD4U, //!< DMR Reverse Channel: Maximum Power
|
|
DMR_RC_MINIMUM_POWER = 0xD5U, //!< DMR Reverse Channel: Minimum Power
|
|
DMR_RC_POWER_INCREASE_ONE_STEP = 0xD6U, //!< DMR Reverse Channel: Increase Power One Step
|
|
DMR_RC_POWER_DECREASE_ONE_STEP = 0xD7U, //!< DMR Reverse Channel: Decrease Power One Step
|
|
};
|
|
};
|
|
|
|
namespace frame
|
|
{
|
|
// ---------------------------------------------------------------------------
|
|
// Constants
|
|
// ---------------------------------------------------------------------------
|
|
|
|
const uint8_t DVM_FRAME_START = 0xFEU;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Class Declaration
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @brief Represents the FNE RTP Extension header.
|
|
* \code{.unparsed}
|
|
* Byte 0 1 2 3
|
|
* Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Encoded RTP Extension Header |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Payload CRC-16 | Function | Sub-function |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Stream ID |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Peer ID |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Message Length |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* 20 bytes (16 bytes without RTP Extension Header)
|
|
* \endcode
|
|
*/
|
|
class HOST_SW_API RTPFNEHeader : public RTPExtensionHeader {
|
|
public:
|
|
/**
|
|
* @brief Initializes a new instance of the RTPFNEHeader class.
|
|
*/
|
|
RTPFNEHeader();
|
|
/**
|
|
* @brief Finalizes a instance of the RTPFNEHeader class.
|
|
*/
|
|
~RTPFNEHeader();
|
|
|
|
/**
|
|
* @brief Decode a RTP header.
|
|
* @param[in] data Buffer containing RTP FNE header to decode.
|
|
*/
|
|
bool decode(const uint8_t* data) override;
|
|
/**
|
|
* @brief Encode a RTP header.
|
|
* @param[out] data Buffer to encode an RTP FNE header.
|
|
*/
|
|
void encode(uint8_t* data) override;
|
|
|
|
public:
|
|
/**
|
|
* @brief Traffic payload packet CRC-16.
|
|
*/
|
|
DECLARE_PROPERTY(uint16_t, crc16, CRC);
|
|
/**
|
|
* @brief Function.
|
|
*/
|
|
DECLARE_PROPERTY(NET_FUNC::ENUM, func, Function);
|
|
/**
|
|
* @brief Sub-function.
|
|
*/
|
|
DECLARE_PROPERTY(NET_SUBFUNC::ENUM, subFunc, SubFunction);
|
|
/**
|
|
* @brief Traffic Stream ID.
|
|
*/
|
|
DECLARE_PROPERTY(uint32_t, streamId, StreamId);
|
|
/**
|
|
* @brief Traffic Peer ID.
|
|
*/
|
|
DECLARE_PROPERTY(uint32_t, peerId, PeerId);
|
|
/**
|
|
* @brief Traffic Message Length.
|
|
*/
|
|
DECLARE_PROPERTY(uint32_t, messageLength, MessageLength);
|
|
};
|
|
} // namespace frame
|
|
} // namespace network
|
|
|
|
#endif // __RTP_FNE_HEADER_H__
|