378 lines
8.8 KiB
C
378 lines
8.8 KiB
C
#ifndef _DECT_S_FMT_H
|
|
#define _DECT_S_FMT_H
|
|
|
|
#include <assert.h>
|
|
#include <identities.h>
|
|
|
|
/*
|
|
* S-Format message header
|
|
*/
|
|
|
|
#define DECT_S_HDR_SIZE 2
|
|
|
|
/* Transaction Identifier (TI) element */
|
|
#define DECT_S_TI_F_FLAG 0x80
|
|
|
|
#define DECT_S_TI_TV_MASK 0x70
|
|
#define DECT_S_TI_TV_SHIFT 4
|
|
|
|
#define DECT_S_TI_TV_EXT_FLAG 0x08
|
|
|
|
/* Protocol Descriminator (PD) element */
|
|
#define DECT_S_PD_MASK 0x0f
|
|
|
|
/**
|
|
* @DECT_S_PD_LCE: Link Control Entity (LCE) messages
|
|
* @DECT_S_PD_CC: Call Control (CC) messages
|
|
* @DECT_S_PD_CISS: Call Independant Supplementary Services (CISS) messages
|
|
* @DECT_S_PD_MM: Mobility Management (MM) messages
|
|
* @DECT_S_PD_CLMS: ConnectionLess Message Service (CLMS) messages
|
|
* @DECT_S_PD_COMS: Connection Orentied Message Service (COMS) messages
|
|
* @DECT_S_PD_UNKNOWN: Unknown protocol entity (bit 8)
|
|
*/
|
|
enum dect_s_pd_values {
|
|
DECT_S_PD_LCE = 0x0,
|
|
DECT_S_PD_CC = 0x3,
|
|
DECT_S_PD_CISS = 0x4,
|
|
DECT_S_PD_MM = 0x5,
|
|
DECT_S_PD_CLMS = 0x6,
|
|
DECT_S_PD_COMS = 0x7,
|
|
DECT_S_PD_UNKNOWN = 0x8,
|
|
__DECT_S_PD_MAX
|
|
};
|
|
#define DECT_S_PD_MAX (__DECT_S_PD_MAX - 1)
|
|
|
|
/* Message type element */
|
|
#define DECT_S_PD_MSG_TYPE_MASK 0x7f
|
|
|
|
/* CLMS message types */
|
|
enum dect_clms_msg_types {
|
|
DECT_CLMS_VARIABLE = 0x1,
|
|
};
|
|
|
|
/*
|
|
* Information elements
|
|
*/
|
|
|
|
#define DECT_SFMT_IE_FIXED_LEN 0x80
|
|
#define DECT_SFMT_IE_FIXED_ID_MASK 0x70
|
|
#define DECT_SFMT_IE_FIXED_ID_SHIFT 4
|
|
#define DECT_SFMT_IE_FIXED_VAL_MASK 0x0f
|
|
|
|
enum dect_sfmt_single_octet_ies {
|
|
S_SO_IE_RESERVED = (0x00 << DECT_SFMT_IE_FIXED_ID_SHIFT) | DECT_SFMT_IE_FIXED_LEN,
|
|
S_SO_IE_SHIFT = (0x01 << DECT_SFMT_IE_FIXED_ID_SHIFT) | DECT_SFMT_IE_FIXED_LEN,
|
|
S_SO_IE_EXT_PREFIX = (0x02 << DECT_SFMT_IE_FIXED_ID_SHIFT) | DECT_SFMT_IE_FIXED_LEN,
|
|
S_SO_IE_REPEAT_INDICATOR = (0x05 << DECT_SFMT_IE_FIXED_ID_SHIFT) | DECT_SFMT_IE_FIXED_LEN,
|
|
S_SO_IE_DOUBLE_OCTET_ELEMENT = (0x06 << DECT_SFMT_IE_FIXED_ID_SHIFT) | DECT_SFMT_IE_FIXED_LEN,
|
|
};
|
|
|
|
enum dect_sfmt_single_octet_ext_ies {
|
|
S_SE_IE_SENDING_COMPLETE = 0x1 | S_SO_IE_EXT_PREFIX,
|
|
S_SE_IE_DELIMITER_REQUEST = 0x2 | S_SO_IE_EXT_PREFIX,
|
|
S_SE_IE_USE_TPUI = 0x3 | S_SO_IE_EXT_PREFIX,
|
|
};
|
|
|
|
enum dect_sfmt_double_octet_ies {
|
|
S_DO_IE_BASIC_SERVICE = 0x0 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_RELEASE_REASON = 0x2 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_SIGNAL = 0x4 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_TIMER_RESTART = 0x5 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_TEST_HOOK_CONTROL = 0x6 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_SINGLE_DISPLAY = 0x8 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_SINGLE_KEYPAD = 0x9 | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
S_DO_IE_RESERVED = 0xf | S_SO_IE_DOUBLE_OCTET_ELEMENT,
|
|
};
|
|
|
|
enum dect_sfmt_variable_length_ies {
|
|
S_VL_IE_INFO_TYPE = 0x01,
|
|
S_VL_IE_IDENTITY_TYPE = 0x02,
|
|
S_VL_IE_PORTABLE_IDENTITY = 0x05,
|
|
S_VL_IE_FIXED_IDENTITY = 0x06,
|
|
S_VL_IE_LOCATION_AREA = 0x07,
|
|
S_VL_IE_NWK_ASSIGNED_IDENTITY = 0x09,
|
|
S_VL_IE_AUTH_TYPE = 0x0a,
|
|
S_VL_IE_ALLOCATION_TYPE = 0x0b,
|
|
S_VL_IE_RAND = 0x0c,
|
|
S_VL_IE_RES = 0x0d,
|
|
S_VL_IE_RS = 0x0e,
|
|
S_VL_IE_IWU_ATTRIBUTES = 0x12,
|
|
S_VL_IE_CALL_ATTRIBUTES = 0x13,
|
|
S_VL_IE_SERVICE_CHANGE_INFO = 0x16,
|
|
S_VL_IE_CONNECTION_ATTRIBUTES = 0x17,
|
|
S_VL_IE_CIPHER_INFO = 0x19,
|
|
S_VL_IE_CALL_IDENTITY = 0x1a,
|
|
S_VL_IE_CONNECTION_IDENTITY = 0x1b,
|
|
S_VL_IE_FACILITY = 0x1c,
|
|
S_VL_IE_PROGRESS_INDICATOR = 0x1e,
|
|
S_VL_IE_MMS_GENERIC_HEADER = 0x20,
|
|
S_VL_IE_MMS_OBJECT_HEADER = 0x21,
|
|
S_VL_IE_MMS_EXTENDED_HEADER = 0x22,
|
|
S_VL_IE_TIME_DATE = 0x23,
|
|
S_VL_IE_MULTI_DISPLAY = 0x28,
|
|
S_VL_IE_MULTI_KEYPAD = 0x2c,
|
|
S_VL_IE_FEATURE_ACTIVATE = 0x38,
|
|
S_VL_IE_FEATURE_INDICATE = 0x39,
|
|
S_VL_IE_NETWORK_PARAMETER = 0x41,
|
|
S_VL_IE_EXT_HO_INDICATOR = 0x42,
|
|
S_VL_IE_ZAP_FIELD = 0x52,
|
|
S_VL_IE_SERVICE_CLASS = 0x54,
|
|
S_VL_IE_KEY = 0x56,
|
|
S_VL_IE_REJECT_REASON = 0x60,
|
|
S_VL_IE_SETUP_CAPABILITY = 0x62,
|
|
S_VL_IE_TERMINAL_CAPABILITY = 0x63,
|
|
S_VL_IE_END_TO_END_COMPATIBILITY = 0x64,
|
|
S_VL_IE_RATE_PARAMETERS = 0x65,
|
|
S_VL_IE_TRANSIT_DELAY = 0x66,
|
|
S_VL_IE_WINDOW_SIZE = 0x67,
|
|
S_VL_IE_CALLING_PARTY_NUMBER = 0x6c,
|
|
S_VL_IE_CALLING_PARTY_NAME = 0x6d,
|
|
S_VL_IE_CALLED_PARTY_NUMBER = 0x70,
|
|
S_VL_IE_CALLED_PARTY_SUBADDR = 0x71,
|
|
S_VL_IE_DURATION = 0x72,
|
|
S_VL_IE_SEGMENTED_INFO = 0x75,
|
|
S_VL_IE_ALPHANUMERIC = 0x76,
|
|
S_VL_IE_IWU_TO_IWU = 0x77,
|
|
S_VL_IE_MODEL_IDENTIFIER = 0x78,
|
|
S_VL_IE_IWU_PACKET = 0x7a,
|
|
S_VL_IE_ESCAPE_TO_PROPRIETARY = 0x7b,
|
|
S_VL_IE_CODEC_LIST = 0x7c,
|
|
S_VL_IE_EVENTS_NOTIFICATION = 0x7d,
|
|
S_VL_IE_CALL_INFORMATION = 0x7e,
|
|
S_VL_IE_ESCAPE_FOR_EXTENSION = 0x7f,
|
|
__S_VL_IE_MAX
|
|
};
|
|
|
|
/* Repeat indicator */
|
|
|
|
/* Basic service */
|
|
|
|
#define DECT_BASIC_SERVICE_CALL_CLASS_MASK 0xf0
|
|
#define DECT_BASIC_SERVICE_CALL_CLASS_SHIFT 4
|
|
|
|
#define DECT_BASIC_SERVICE_SERVICE_MASK 0x0f
|
|
|
|
/* Single display IE */
|
|
|
|
/* Single keypad IE */
|
|
|
|
/* Release reason */
|
|
|
|
/* Allocation type IE */
|
|
|
|
/* Alphanumeric IE */
|
|
|
|
/* Auth type IE */
|
|
|
|
/* Call attributes IE */
|
|
|
|
/* Call identity IE */
|
|
|
|
/* Called party number IE */
|
|
|
|
/* Called party subaddress IE */
|
|
|
|
/* Calling party number IE */
|
|
|
|
/* Cipher info IE */
|
|
|
|
/* Connection attributes IE */
|
|
|
|
/* Connection identity IE */
|
|
|
|
/* Duration IE */
|
|
|
|
/* End-to-end compatibility IE */
|
|
|
|
/* Facility IE */
|
|
|
|
/* Feature activate IE */
|
|
|
|
/* Feature indicate IE */
|
|
|
|
/* Fixed identity IE */
|
|
|
|
#define S_VL_IE_FIXED_IDENTITY_MIN_SIZE 2
|
|
|
|
#define S_VL_IE_FIXED_IDENTITY_TYPE_MASK 0x7f
|
|
#define S_VL_IE_FIXED_IDENTITY_LENGTH_MASK 0x7f
|
|
|
|
/* Identity type IE */
|
|
|
|
/* Info type IE */
|
|
|
|
/* InterWorking Unit (IWU) attributes IE */
|
|
|
|
/* IWU packet IE */
|
|
|
|
/* IWU to IWU IE */
|
|
|
|
/* Key IE */
|
|
|
|
/* Location area IE */
|
|
|
|
/* Multi-display IE */
|
|
|
|
/* Multi-keypad IE */
|
|
|
|
/* NetWorK (NWK) assigned identity IE */
|
|
|
|
/* Network parameter IE */
|
|
|
|
/* Portable identity IE */
|
|
|
|
#define S_VL_IE_PORTABLE_IDENTITY_MIN_SIZE 2
|
|
|
|
#define S_VL_IE_PORTABLE_IDENTITY_TYPE_MASK 0x7f
|
|
#define S_VL_IE_PORTABLE_IDENTITY_LENGTH_MASK 0x7f
|
|
|
|
/* IPUI */
|
|
|
|
#define IPUI_BITS_PER_DIGIT 4
|
|
#define IPUI_PUT_PSTN_ISDN_NUMBER_MAX_DIGITS 60
|
|
|
|
#define IPUI_PUT_PRIVATE_NUMBER_MAX_LEN 60
|
|
|
|
/* Progress indicator IE */
|
|
|
|
#define DECT_SFMT_IE_PROGRESS_INDICATOR_LOCATION_MASK 0x0f
|
|
|
|
/* RAND IE */
|
|
|
|
/* Rate parameters IE */
|
|
|
|
/* Reject reason IE */
|
|
|
|
/* RES IE */
|
|
|
|
/* RS IE */
|
|
|
|
/* Segmented info IE */
|
|
|
|
/* Service change info IE */
|
|
|
|
/* Service class IE */
|
|
|
|
/* Setup capability IE */
|
|
|
|
/* Terminal capability IE */
|
|
|
|
/* Transit delay IE */
|
|
|
|
/* Window size IE */
|
|
|
|
/* ZAP field IE */
|
|
|
|
/* Escape to proprietary IE */
|
|
|
|
#define DECT_ESC_TO_PROPRIETARY_IE_DESC_TYPE_MASK 0x7f
|
|
#define DECT_ESC_TO_PROPRIETARY_IE_DESC_EMC 1
|
|
|
|
/* Model identifier IE */
|
|
|
|
/* MMS Generic Header IE */
|
|
|
|
/* MMS Object Header IE */
|
|
|
|
/* MMS Extended Header IE */
|
|
|
|
/* Time-Data IE */
|
|
|
|
/* Ext h/o indicator IE */
|
|
|
|
/* Authentication Reject Parameter IE */
|
|
|
|
/* Calling party Name IE */
|
|
|
|
/* Codec List IE */
|
|
|
|
/* Events notification IE */
|
|
|
|
/* Call information IE */
|
|
|
|
enum dect_sfmt_ie_status {
|
|
DECT_SFMT_IE_NONE,
|
|
DECT_SFMT_IE_OPTIONAL,
|
|
DECT_SFMT_IE_MANDATORY
|
|
};
|
|
|
|
enum dect_sfmt_ie_flags {
|
|
DECT_SFMT_IE_REPEAT = 0x1,
|
|
DECT_SFMT_IE_EITHER = 0x2,
|
|
DECT_SFMT_IE_END = 0x4,
|
|
};
|
|
|
|
/**
|
|
* struct dect_sfmt_ie_desc - S-Format IE description
|
|
*
|
|
* @offset: offset of corresponding S-Format IE storage
|
|
* @type: IE type
|
|
* @f_p: Status in direction FP->PP
|
|
* @p_f: Status in direction PP->FP
|
|
* @flags: Global flags
|
|
*/
|
|
struct dect_sfmt_ie_desc {
|
|
uint16_t type;
|
|
enum dect_sfmt_ie_status f_p:8;
|
|
enum dect_sfmt_ie_status p_f:8;
|
|
uint8_t flags;
|
|
};
|
|
|
|
#define DECT_SFMT_IE(_type, _f_p, _p_f, _flags) { \
|
|
.type = (_type), \
|
|
.f_p = DECT_SFMT_ ## _f_p, \
|
|
.p_f = DECT_SFMT_ ## _p_f, \
|
|
.flags = (_flags), \
|
|
}
|
|
|
|
#define DECT_SFMT_IE_END_MSG { \
|
|
.flags = DECT_SFMT_IE_END, \
|
|
}
|
|
|
|
|
|
struct dect_sfmt_ie {
|
|
uint8_t *data;
|
|
uint16_t id;
|
|
uint8_t len;
|
|
};
|
|
|
|
/**
|
|
* enum dect_sfmt_error - S-Format message parsing/construction state
|
|
*
|
|
* @DECT_SFMT_OK: No error
|
|
* @DECT_SFMT_MANDATORY_IE_MISSING: A mandatory IE was missing
|
|
* @DECT_SFMT_MANDATORY_IE_ERROR: A mandatory IE had an internal structural error
|
|
* @DECT_SFMT_INVALID_IE: An invalid IE was passed to message construction
|
|
*/
|
|
enum dect_sfmt_error {
|
|
DECT_SFMT_OK = 0,
|
|
DECT_SFMT_MANDATORY_IE_MISSING = -1,
|
|
DECT_SFMT_MANDATORY_IE_ERROR = -2,
|
|
DECT_SFMT_INVALID_IE = -3,
|
|
};
|
|
|
|
/**
|
|
* struct dect_msg_common - Common dummy msg structure to avoid casts
|
|
*
|
|
* @ie: First IE
|
|
*/
|
|
struct dect_msg_common {
|
|
struct dect_ie_common *ie[0];
|
|
};
|
|
|
|
struct dect_msg_buf;
|
|
extern enum dect_sfmt_error dect_parse_sfmt_msg(const struct dect_handle *dh,
|
|
const struct dect_sfmt_ie_desc *desc,
|
|
struct dect_msg_common *dst,
|
|
struct dect_msg_buf *mb);
|
|
extern enum dect_sfmt_error dect_build_sfmt_msg(const struct dect_handle *dh,
|
|
const struct dect_sfmt_ie_desc *desc,
|
|
const struct dect_msg_common *src,
|
|
struct dect_msg_buf *mb);
|
|
|
|
extern void dect_msg_free(const struct dect_handle *dh,
|
|
const struct dect_sfmt_ie_desc *desc,
|
|
struct dect_msg_common *msg);
|
|
|
|
#endif /* _DECT_S_FMT_H */
|