Skip to content

Instantly share code, notes, and snippets.

@cyanide-burnout
Created June 6, 2018 15:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cyanide-burnout/ec2d6ea75c913e9a77879e375e1c77d8 to your computer and use it in GitHub Desktop.
Save cyanide-burnout/ec2d6ea75c913e9a77879e375e1c77d8 to your computer and use it in GitHub Desktop.
Suggestion for Simple Terminal Client protocol
#ifndef REWIND_H
#define REWIND_H
#include <stdint.h>
#include <netinet/in.h>
#ifdef __cplusplus
extern "C"
{
#endif
#pragma pack(push, 1)
#define REWIND_KEEP_ALIVE_INTERVAL 5
#define REWIND_SIGN_LENGTH 8
#define REWIND_PROTOCOL_SIGN "REWIND01"
#define REWIND_CLASS_REWIND_CONTROL 0x0000
#define REWIND_CLASS_SYSTEM_CONSOLE 0x0100
#define REWIND_CLASS_SERVER_NOTICE 0x0200
#define REWIND_CLASS_DEVICE_DATA 0x0800
#define REWIND_CLASS_APPLICATION 0x0900
#define REWIND_CLASS_TERMINAL 0x0a00
#define REWIND_CLASS_KAIROS_DATA (REWIND_CLASS_DEVICE_DATA + 0x00)
#define REWIND_CLASS_HYTERA_DATA (REWIND_CLASS_DEVICE_DATA + 0x10)
#define REWIND_TYPE_KEEP_ALIVE (REWIND_CLASS_REWIND_CONTROL + 0)
#define REWIND_TYPE_CLOSE (REWIND_CLASS_REWIND_CONTROL + 1)
#define REWIND_TYPE_CHALLENGE (REWIND_CLASS_REWIND_CONTROL + 2)
#define REWIND_TYPE_AUTHENTICATION (REWIND_CLASS_REWIND_CONTROL + 3)
#define REWIND_TYPE_REDIRECTION (REWIND_CLASS_REWIND_CONTROL + 8)
#define REWIND_TYPE_REPORT (REWIND_CLASS_SYSTEM_CONSOLE + 0)
#define REWIND_TYPE_BUSY_NOTICE (REWIND_CLASS_SERVER_NOTICE + 0)
#define REWIND_TYPE_ADDRESS_NOTICE (REWIND_CLASS_SERVER_NOTICE + 1)
#define REWIND_TYPE_BINDING_NOTICE (REWIND_CLASS_SERVER_NOTICE + 2)
#define REWIND_TYPE_EXTERNAL_SERVER (REWIND_CLASS_KAIROS_DATA + 0)
#define REWIND_TYPE_REMOTE_CONTROL (REWIND_CLASS_KAIROS_DATA + 1)
#define REWIND_TYPE_SNMP_TRAP (REWIND_CLASS_KAIROS_DATA + 2)
#define REWIND_TYPE_PEER_DATA (REWIND_CLASS_HYTERA_DATA + 0)
#define REWIND_TYPE_RDAC_DATA (REWIND_CLASS_HYTERA_DATA + 1)
#define REWIND_TYPE_MEDIA_DATA (REWIND_CLASS_HYTERA_DATA + 2)
#define REWIND_TYPE_CONFIGURATION (REWIND_CLASS_APPLICATION + 0x00)
#define REWIND_TYPE_SUBSCRIPTION (REWIND_CLASS_APPLICATION + 0x01)
#define REWIND_TYPE_CANCELLING (REWIND_CLASS_APPLICATION + 0x02)
#define REWIND_TYPE_SESSION_POLL (REWIND_CLASS_APPLICATION + 0x03)
#define REWIND_TYPE_DMR_DATA_BASE (REWIND_CLASS_APPLICATION + 0x10)
#define REWIND_TYPE_DMR_AUDIO_FRAME (REWIND_CLASS_APPLICATION + 0x20)
#define REWIND_TYPE_DMR_EMBEDDED_DATA (REWIND_CLASS_APPLICATION + 0x27)
#define REWIND_TYPE_SUPER_HEADER (REWIND_CLASS_APPLICATION + 0x28)
#define REWIND_TYPE_FAILURE_CODE (REWIND_CLASS_APPLICATION + 0x29)
#define REWIND_TYPE_TERMINAL_IDLE (REWIND_CLASS_TERMINAL + 0x00)
#define REWIND_TYPE_TERMINAL_WAKE (REWIND_CLASS_TERMINAL + 0x01)
#define REWIND_TYPE_MESSAGE_TEXT (REWIND_CLASS_TERMINAL + 0x10)
#define REWIND_TYPE_MESSAGE_STATUS (REWIND_CLASS_TERMINAL + 0x11)
#define REWIND_TYPE_LOCATION_REPORT (REWIND_CLASS_TERMINAL + 0x20)
#define REWIND_FLAG_NONE 0
#define REWIND_FLAG_REAL_TIME_1 (1 << 0)
#define REWIND_FLAG_REAL_TIME_2 (1 << 1)
#define REWIND_FLAG_BUFFERING (1 << 2)
#define REWIND_FLAG_DEFAULT_SET REWIND_FLAG_NONE
#define REWIND_ROLE_REPEATER_AGENT 0x10
#define REWIND_ROLE_APPLICATION 0x20
#define REWIND_SERVICE_CRONOS_AGENT (REWIND_ROLE_REPEATER_AGENT + 0)
#define REWIND_SERVICE_TELLUS_AGENT (REWIND_ROLE_REPEATER_AGENT + 1)
#define REWIND_SERVICE_SIMPLE_APPLICATION (REWIND_ROLE_APPLICATION + 0)
#define REWIND_SERVICE_SIMPLE_TERMINAL (REWIND_ROLE_APPLICATION + 1)
#define REWIND_OPTION_SUPER_HEADER (1 << 0)
#define REWIND_OPTION_LINEAR_FRAME (1 << 1)
#define REWIND_CALL_LENGTH 10
// Keep-Alive
struct RewindVersionData
{
uint32_t number; // Remote ID
uint8_t service; // REWIND_SERVICE_*
char description[0]; // Software name and version
};
// Redirection
union RewindAddress
{
struct in_addr v4;
struct in6_addr v6;
};
struct RewindRedirectionData
{
uint16_t family; // Address family: AF_INET, AF_INET6 or AF_UNSPEC
uint16_t port; // UDP port
union RewindAddress address; //
};
// Generic Data Structures
struct RewindAddressData
{
struct in_addr address;
uint16_t port;
};
struct RewindBindingData
{
uint16_t ports[0];
};
// Simple Application Protocol
struct RewindConfigurationData
{
uint32_t options; // REWIND_OPTION_*
};
struct RewindSubscriptionData
{
uint32_t type; // SESSION_TYPE_*
uint32_t number; // Destination ID
};
struct RewindSessionPollData
{
uint32_t type; // TREE_SESSION_*
uint32_t flag; // SESSION_FLAG_*
uint32_t number; // ID
uint32_t state; //
};
struct RewindSuperHeader
{
uint32_t type; // SESSION_TYPE_*
uint32_t sourceID; // Source ID or 0
uint32_t destinationID; // Destination ID or 0
char sourceCall[REWIND_CALL_LENGTH]; // Source Call or zeros
char destinationCall[REWIND_CALL_LENGTH]; // Destination Call or zeros
};
// Simple Terminal Client
struct RewindTextMessageData
{
uint32_t reserved; // Reserved for future use, should be 0
uint32_t sourceID; // Source ID
uint32_t destinationID; // Destination ID
uint16_t length; // Length of message in bytes
uint16_t data[0]; // Message text, UTF-16LE
};
struct RewindTextMessageStatus
{
uint32_t reserved; // Reserved for future use, should be 0
uint32_t sourceID; // Source ID
uint32_t destinationID; // Destination ID
uint8_t status; // STATUS_TYPE_*, corresponds to status field of DMR response header of data call
};
// Rewind Transport Layer
struct RewindData
{
char sign[REWIND_SIGN_LENGTH];
uint16_t type; // REWIND_TYPE_*
uint16_t flags; // REWIND_FLAG_*
uint32_t number; // Packet sequence number
uint16_t length; // Length of following data
uint8_t data[0]; //
};
#pragma pack(pop)
#ifdef __cplusplus
}
#endif
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment