dect
/
libdect
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
libdect/include/dect/ie.h

768 lines
17 KiB
C

/*
* DECT S-Format Information Elements
*
* Copyright (c) 2009 Patrick McHardy <kaber@trash.net>
*/
#ifndef _LIBDECT_DECT_IE_H
#define _LIBDECT_DECT_IE_H
#include <string.h>
#include <dect/utils.h>
#include <list.h>
/**
* struct dect_ie_common - common representation of a DECT IE
*
* @list: repeat indicator list node
* @refcnt: reference count
*/
struct dect_ie_common {
struct list_head list;
unsigned int refcnt;
};
#define dect_ie_container(res, ie) container_of(ie, typeof(*res), common)
static inline struct dect_ie_common *__dect_ie_init(struct dect_ie_common *ie)
{
ie->refcnt = 1;
return ie;
}
#define dect_ie_init(ie) dect_ie_container(ie, __dect_ie_init(&(ie)->common))
static inline struct dect_ie_common *__dect_ie_hold(struct dect_ie_common *ie)
{
if (ie != NULL)
ie->refcnt++;
return ie;
}
#define dect_ie_hold(ie) dect_ie_container(ie, __dect_ie_hold(&(ie)->common))
/* Repeat indicator */
/**
* enum dect_ie_list_types - Repeat indicator list types
*
* @DECT_SFMT_IE_LIST_NORMAL: Non priorized list
* @DECT_SFMT_IE_PRIORITIZED: Priorized list
*/
enum dect_ie_list_types {
DECT_SFMT_IE_LIST_NORMAL = 0x1,
DECT_SFMT_IE_LIST_PRIORITIZED = 0x2,
};
struct dect_ie_repeat_indicator {
struct dect_ie_common common;
enum dect_ie_list_types type;
struct list_head list;
};
static inline void dect_repeat_indicator_init(struct dect_ie_repeat_indicator *ie)
{
dect_ie_init(ie);
init_list_head(&ie->list);
}
#define dect_foreach_ie(ptr, repeat) \
list_for_each_entry(ptr, &(repeat).list, common.list)
static inline void dect_ie_list_move(struct dect_ie_repeat_indicator *to,
struct dect_ie_repeat_indicator *from)
{
list_splice_init(&from->list, &to->list);
}
/* Sending complete */
struct dect_ie_sending_complete {
struct dect_ie_common common;
};
/* Delimiter request */
struct dect_ie_delimiter_request {
struct dect_ie_common common;
};
/* Use TPUI */
struct dect_ie_use_tpui {
struct dect_ie_common common;
};
/* Basic service */
#define DECT_BASIC_SERVICE_CALL_CLASS_MASK 0xf0
#define DECT_BASIC_SERVICE_CALL_CLASS_SHIFT 4
enum dect_call_classes {
DECT_CALL_CLASS_MESSAGE = 0x4,
DECT_CALL_CLASS_DECT_ISDN = 0x7,
DECT_CALL_CLASS_NORMAL = 0x8,
DECT_CALL_CLASS_INTERNAL = 0x9,
DECT_CALL_CLASS_EMERGENCY = 0xa,
DECT_CALL_CLASS_SERVICE = 0xb,
DECT_CALL_CLASS_EXTERNAL_HO = 0xc,
DECT_CALL_CLASS_SUPPLEMENTARY_SERVICE = 0xd,
DECT_CALL_CLASS_QA_M = 0xe,
};
#define DECT_CALL_CLASS_MAX 0xf
#define DECT_BASIC_SERVICE_SERVICE_MASK 0x0f
enum dect_basic_service {
DECT_SERVICE_BASIC_SPEECH_DEFAULT = 0x0,
DECT_SERVICE_DECT_GSM_IWP = 0x4,
DECT_SERVICE_UMTS_IWP = 0x6,
DECT_SERVICE_LRMS = 0x5,
DECT_SERVICE_GSM_IWP_SMS = 0x6,
DECT_SERVICE_WIDEBAND_SPEECH = 0x8,
DECT_SERVICE_OTHER = 0xf,
};
#define DECT_SERVICE_MAX 0xf
struct dect_ie_basic_service {
struct dect_ie_common common;
enum dect_call_classes class;
enum dect_basic_service service;
};
/* Release reason */
enum dect_release_reasons {
/* general values */
DECT_RELEASE_NORMAL = 0x0,
DECT_RELEASE_UNEXPECTED_MESSAGE = 0x1,
DECT_RELEASE_UNKNOWN_TRANSACTION_IDENTIFIER = 0x2,
DECT_RELEASE_MANDATORY_IE_MISSING = 0x3,
DECT_RELEASE_INVALID_IE_CONTENTS = 0x4,
DECT_RELEASE_INCOMPATIBLE_SERVICE = 0x5,
DECT_RELEASE_SERVICE_NOT_IMPLEMENTED = 0x6,
DECT_RELEASE_NEGOTIATION_NOT_SUPPORTED = 0x7,
DECT_RELEASE_INVALID_IDENTITY = 0x8,
DECT_RELEASE_AUTHENTICATION_FAILED = 0x9,
DECT_RELEASE_UNKNOWN_IDENTITY = 0xa,
DECT_RELEASE_NEGOTIATION_FAILED = 0xb,
DECT_RELEASE_TIMER_EXPIRY = 0xd,
DECT_RELEASE_PARTIAL_RELEASE = 0xe,
DECT_RELEASE_UNKNOWN = 0xf,
/* user values */
DECT_RELEASE_USER_DETACHED = 0x10,
DECT_RELEASE_USER_NOT_IN_RANGE = 0x11,
DECT_RELEASE_USER_UNKNOWN = 0x12,
DECT_RELEASE_USER_ALREADY_ACTIVE = 0x13,
DECT_RELEASE_USER_BUSY = 0x14,
DECT_RELEASE_USER_REJECTION = 0x15,
DECT_RELEASE_USER_CALL_MODIFY = 0x16,
/* external handover values */
DECT_RELEASE_EXTERNAL_HANDOVER_NOT_SUPPORTED = 0x21,
DECT_RELEASE_NETWORK_PARAMETERS_MISSING = 0x22,
DECT_RELEASE_EXTERNAL_HANDOVER_RELEASE = 0x23,
/* temporary overload values */
DECT_RELEASE_OVERLOAD = 0x31,
DECT_RELEASE_INSUFFICIENT_RESOURCES = 0x32,
DECT_RELEASE_INSUFFICIENT_BEARERS_AVAILABLE = 0x33,
DECT_RELEASE_IWU_CONGESTION = 0x34,
};
struct dect_ie_release_reason {
struct dect_ie_common common;
enum dect_release_reasons reason;
};
/* Display IE (used for both Single Display and Multi Display) */
struct dect_ie_display {
struct dect_ie_common common;
uint8_t len;
uint8_t info[256];
};
static inline void dect_display_init(struct dect_ie_display *display)
{
dect_ie_init(display);
display->len = 0;
}
static inline void
dect_display_append_char(struct dect_ie_display *display, char c)
{
display->info[display->len] = c;
display->len++;
}
static inline void dect_display_append(struct dect_ie_display *display,
const char *str, size_t len)
{
memcpy(display->info + display->len, str, len);
display->len += len;
}
/* Keypad IE (used for both Single Keypad and Multi Keypad) */
struct dect_ie_keypad {
struct dect_ie_common common;
uint16_t len;
uint8_t info[256];
};
/* Signal IE */
// FIXME: rename to alerting
enum dect_ring_patterns {
DECT_RING_PATTERN_0 = 0x0,
DECT_RING_PATTERN_1 = 0x1,
DECT_RING_PATTERN_2 = 0x2,
DECT_RING_PATTERN_3 = 0x3,
DECT_RING_PATTERN_4 = 0x4,
DECT_RING_PATTERN_5 = 0x5,
DECT_RING_PATTERN_6 = 0x6,
DECT_RING_PATTERN_7 = 0x7,
DECT_RING_CONTINUOUS = 0x8,
DECT_RING_INCOMING_CALL_RELEASED = 0xa,
DECT_RING_INCOMING_CALL_ANSWERED = 0xb,
DECT_RING_OFF = 0xf,
__DECT_RING_MAX
};
#define DECT_RING_MAX (__DECT_RING_MAX - 1)
enum dect_signal_codes {
DECT_SIGNAL_DIAL_TONE_ON = 0x0,
DECT_SIGNAL_RING_BACK_TONE_ON = 0x1,
DECT_SIGNAL_INTERCEPT_TONE_ON = 0x2,
DECT_SIGNAL_NETWORK_CONGESTION_TONE_ON = 0x3,
DECT_SIGNAL_BUSY_TONE_ON = 0x4,
DECT_SIGNAL_CONFIRM_TONE_ON = 0x5,
DECT_SIGNAL_ANSWER_TONE_ON = 0x6,
DECT_SIGNAL_CALL_WAITING_TONE_ON = 0x7,
DECT_SIGNAL_OFF_HOOK_WARNING_TONE_ON = 0x8,
DECT_SIGNAL_NEGATIVE_ACKNOWLEDGEMENT_TONE = 0x9,
DECT_SIGNAL_TONES_OFF = 0xf,
DECT_SIGNAL_ALERTING_BASE = 0x40,
};
struct dect_ie_signal {
struct dect_ie_common common;
enum dect_signal_codes code;
};
static inline struct dect_ie_signal *
dect_signal_init(struct dect_ie_signal *signal, enum dect_signal_codes code)
{
dect_ie_init(signal);
signal->code = code;
return signal;
}
/* Timer restart IE */
enum dect_timer_restart_codes {
DECT_TIMER_RESTART = 0x0,
DECT_TIMER_STOP = 0x1,
};
struct dect_ie_timer_restart {
struct dect_ie_common common;
enum dect_timer_restart_codes code;
};
/* Test hook control */
enum dect_test_hook_ctrls {
DECT_TEST_HOOK_ON_HOOK = 0x0,
DECT_TEST_HOOK_OFF_HOOK = 0x1,
};
struct dect_ie_test_hook_control {
struct dect_ie_common common;
enum dect_test_hook_ctrls hook;
};
/* Allocation type IE */
struct dect_ie_allocation_type {
struct dect_ie_common common;
};
/* Alphanumeric IE */
struct dect_ie_alphanumeric {
struct dect_ie_common common;
};
/* Auth type IE */
enum dect_ie_auth_type_identifiers {
AUTH_DSAA = 0x1,
AUTH_GSM = 0x40,
AUTH_UMTS = 0x20,
AUTH_PROPRIETARY = 0x7f,
};
enum dect_ie_auth_key_types {
KEY_USER_AUTHENTICATION_KEY = 0x1,
KEY_USER_PERSONAL_IDENTITY = 0x3,
KEY_AUTHENTICATION_CODE = 0x4,
};
struct dect_ie_auth_type {
struct dect_ie_common common;
uint8_t auth_id;
uint8_t proprietary_auth_id;
uint8_t auth_key_type;
uint8_t auth_key_num;
uint8_t flags;
uint8_t cipher_key_num;
};
/* Call attributes IE */
struct dect_ie_call_attributes {
struct dect_ie_common common;
};
/* Call identity IE */
struct dect_ie_call_identity {
struct dect_ie_common common;
};
/* Called party number IE */
enum number_type {
NUMBER_TYPE_UNKNOWN = 0x0,
NUMBER_TYPE_INTERNATIONAL = 0x1,
NUMBER_TYPE_NATIONAL = 0x2,
NUMBER_TYPE_NETWORK_SPECIFIC = 0x3,
NUMBER_TYPE_SUBSCRIBER = 0x4,
NUMBER_TYPE_ABBREVIATED = 0x6,
NUMBER_TYPE_RESERVED = 0x7,
};
enum numbering_plan_identification {
NPI_UNKNOWN = 0x0,
NPI_ISDN_E164 = 0x1,
NPI_DATA_PLAN_X121 = 0x3,
NPI_TCP_IP = 0x7,
NPI_NATIONAL_STANDARD = 0x8,
NPI_PRIVATE = 0x9,
NPI_SIP = 0xa,
NPI_INTERNET_CHARACTER_FORMAT = 0xb,
NPI_LAN_MAC_ADDRESS = 0xc,
NPI_X400 = 0xd,
NPI_PROFILE_SPECIFIC = 0xe,
NPI_RESERVED = 0xf,
};
struct dect_ie_called_party_number {
struct dect_ie_common common;
};
/* Called party subaddress IE */
struct dect_ie_called_party_subaddress {
struct dect_ie_common common;
};
/* Calling party number IE */
struct dect_ie_calling_party_number {
struct dect_ie_common common;
};
/* Cipher info IE */
struct dect_ie_cipher_info {
struct dect_ie_common common;
};
/* Connection attributes IE */
struct dect_ie_connection_attributes {
struct dect_ie_common common;
};
/* Connection identity IE */
struct dect_ie_connection_identity {
struct dect_ie_common common;
};
/* Duration IE */
struct dect_ie_duration {
struct dect_ie_common common;
};
/* End-to-end compatibility IE */
struct dect_ie_end_to_end_compatibility {
struct dect_ie_common common;
};
/* Facility IE */
struct dect_ie_facility {
struct dect_ie_common common;
};
/* Feature activate IE */
struct dect_ie_feature_activate {
struct dect_ie_common common;
};
/* Feature indicate IE */
struct dect_ie_feature_indicate {
struct dect_ie_common common;
};
/* Fixed identity IE */
/**
* @ID_TYPE_ARI: Access rights identity
* @ID_TYPE_ARI_RPN: Access rights identity plus radio fixed part number
* @ID_TYPE_ARI_WRS: Access rights identity plus radio fixed part number for WRS
* @ID_TYPE_PARK: Portable access rights key
*/
enum fixed_identity_types {
ID_TYPE_ARI = 0x00,
ID_TYPE_ARI_RPN = 0x01,
ID_TYPE_ARI_WRS = 0x02,
ID_TYPE_PARK = 0x20,
};
#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
struct dect_ie_fixed_identity {
struct dect_ie_common common;
enum fixed_identity_types type;
struct dect_ari ari;
uint8_t rpn;
};
/* Identity type IE */
struct dect_ie_identity_type {
struct dect_ie_common common;
};
/* Info type IE */
struct dect_ie_info_type {
struct dect_ie_common common;
};
/* InterWorking Unit (IWU) attributes IE */
struct dect_ie_iwu_attributes {
struct dect_ie_common common;
};
/* IWU packet IE */
struct dect_ie_iwu_packet {
struct dect_ie_common common;
};
/* IWU to IWU IE */
struct dect_ie_iwu_to_iwu {
struct dect_ie_common common;
};
/* Key IE */
struct dect_ie_key {
struct dect_ie_common common;
};
/* Location area IE */
struct dect_ie_location_area {
struct dect_ie_common common;
};
/* NetWorK (NWK) assigned identity IE */
struct dect_ie_nwk_assigned_identity {
struct dect_ie_common common;
};
/* Network parameter IE */
struct dect_ie_network_parameter {
struct dect_ie_common common;
};
/* Portable identity IE */
/**
* @ID_TYPE_IPUI: International Portable User Identity (IPUI)
* @ID_TYPE_IPEI: International Portable Equipment Identity (IPEI)
* @ID_TYPE_TPUI: Temporary Portable User Identity (TPUI)
*/
enum portable_identity_types {
ID_TYPE_IPUI = 0x0,
ID_TYPE_IPEI = 0x10,
ID_TYPE_TPUI = 0x20,
};
struct dect_ie_portable_identity {
struct dect_ie_common common;
enum portable_identity_types type;
union {
struct dect_ipui ipui;
};
};
/* Progress indicator IE */
enum dect_location {
DECT_LOCATION_USER = 0x0,
DECT_LOCATION_PRIVATE_NETWORK_SERVING_LOCAL_USER = 0x1,
DECT_LOCATION_PUBLIC_NETWORK_SERVING_LOCAL_USER = 0x2,
DECT_LOCATION_PRIVATE_NETWORK_SERVING_REMOTE_USER = 0x4,
DECT_LOCATION_PUBLIC_NETWORK_SERVING_REMOTE_USER = 0x5,
DECT_LOCATION_INTERNATIONAL_NETWORK = 0x7,
DECT_LOCATION_NETWORK_BEYONG_INTERWORKING_POINT = 0xa,
DECT_LOCATION_NOT_APPLICABLE = 0xf,
};
enum dect_progress_description {
DECT_PROGRESS_NOT_END_TO_END_ISDN = 0x0,
DECT_PROGRESS_DESTINATION_ADDRESS_NON_ISDN = 0x2,
DECT_PROGRESS_ORIGINATION_ADDRESS_NON_ISDN = 0x3,
DECT_PROGRESS_CALL_RETURNED_TO_ISDN = 0x4,
DECT_PROGRESS_SERVICE_CHANGE = 0x5,
DECT_PROGRESS_INBAND_INFORMATION_NOW_AVAILABLE = 0x8,
DECT_PROGRESS_INBAND_INFORMATION_NOT_AVAILABLE = 0x9,
DECT_PROGRESS_END_TO_END_ISDN = 0x40,
};
struct dect_ie_progress_indicator {
struct dect_ie_common common;
enum dect_location location;
enum dect_progress_description progress;
};
/* RAND IE */
struct dect_ie_rand {
struct dect_ie_common common;
};
/* Rate parameters IE */
struct dect_ie_rate_parameters {
struct dect_ie_common common;
};
/* Reject reason IE */
enum dect_reject_reasons {
DECT_REJECT_TPUI_UNKNOWN = 0x1,
DECT_REJECT_IPUI_UNKNOWN = 0x2,
DECT_REJECT_NETWORK_ASSIGNED_IDENTITY_UNKNOWN = 0x3,
DECT_REJECT_IPEI_NOT_ACCEPTED = 0x5,
DECT_REJECT_IPUI_NOT_ACCEPTED = 0x6,
DECT_REJECT_AUTHENTICATION_FAILED = 0x10,
DECT_REJECT_NO_AUTHENTICATION_ALGORITHM = 0x11,
DECT_REJECT_AUTHENTICATION_ALGORITHM_NOT_SUPPORTED = 0x12,
DECT_REJECT_AUTHENTICATION_KEY_NOT_SUPPORTED = 0x13,
DECT_REJECT_UPI_NOT_ENTERED = 0x14,
DECT_REJECT_NO_CIPHER_ALGORITHM = 0x17,
DECT_REJECT_CIPHER_ALGORITHM_NOT_SUPPORTED = 0x18,
DECT_REJECT_CIPHER_KEY_NOT_SUPPORTED = 0x19,
DECT_REJECT_INCOMPATIBLE_SERVICE = 0x20,
DECT_REJECT_FALSE_LCE_REPLY = 0x21,
DECT_REJECT_LATE_LCE_REPLY = 0x22,
DECT_REJECT_INVALID_TPUI = 0x23,
DECT_REJECT_TPUI_ASSIGNMENT_LIMITS_UNACCEPTABLE = 0x24,
DECT_REJECT_INSUFFICIENT_MEMORY = 0x2f,
DECT_REJECT_OVERLOAD = 0x30,
DECT_REJECT_TEST_CALL_BACK_NORMAL_EN_BLOC = 0x40,
DECT_REJECT_TEST_CALL_BACK_NORMAL_PIECEWISE = 0x41,
DECT_REJECT_TEST_CALL_BACK_EMERGENCY_EN_BLOC = 0x42,
DECT_REJECT_TEST_CALL_BACK_EMERGENCY_PIECEWISE = 0x43,
DECT_REJECT_INVALID_MESSAGE = 0x5f,
DECT_REJECT_INFORMATION_ELEMENT_ERROR = 0x60,
DECT_REJECT_INVALID_INFORMATION_ELEMENT_CONTENTS = 0x64,
DECT_REJECT_TIMER_EXPIRY = 0x70,
DECT_REJECT_PLMN_NOT_ALLOWED = 0x76,
DECT_REJECT_LOCATION_AREA_NOT_ALLOWED = 0x80,
DECT_REJECT_LOCATION_NATIONAL_ROAMING_NOT_ALLOWED = 0x81,
};
struct dect_ie_reject_reason {
struct dect_ie_common common;
enum dect_reject_reasons reason;
};
/* RES IE */
struct dect_ie_res {
struct dect_ie_common common;
};
/* RS IE */
struct dect_ie_rs {
struct dect_ie_common common;
};
/* Segmented info IE */
struct dect_ie_segmented_info {
struct dect_ie_common common;
};
/* Service change info IE */
struct dect_ie_service_change_info {
struct dect_ie_common common;
};
/* Service class IE */
struct dect_ie_service_class {
struct dect_ie_common common;
};
/* Setup capability IE */
struct dect_ie_setup_capability {
struct dect_ie_common common;
};
/* Terminal capability IE */
struct dect_ie_terminal_capability {
struct dect_ie_common common;
};
/* Transit delay IE */
struct dect_ie_transit_delay {
struct dect_ie_common common;
};
/* Window size IE */
struct dect_ie_window_size {
struct dect_ie_common common;
};
/* ZAP field IE */
struct dect_ie_zap_field {
struct dect_ie_common common;
};
/* Escape to proprietary IE */
struct dect_ie_escape_to_proprietary {
struct dect_ie_common common;
uint16_t emc;
uint8_t content[];
};
/* Model identifier IE */
struct dect_ie_model_identifier {
struct dect_ie_common common;
};
/* MMS Generic Header IE */
struct dect_ie_mms_generic_header {
struct dect_ie_common common;
};
/* MMS Object Header IE */
struct dect_ie_mms_object_header {
struct dect_ie_common common;
};
/* MMS Extended Header IE */
struct dect_ie_mms_extended_header {
struct dect_ie_common common;
};
/* Time-Date IE */
struct dect_ie_time_date {
struct dect_ie_common common;
};
/* Ext h/o indicator IE */
struct dect_ie_ext_ho_indicator {
struct dect_ie_common common;
};
/* Authentication Reject Parameter IE */
struct dect_ie_auth_reject_parameter {
struct dect_ie_common common;
};
/* Calling party Name IE */
struct dect_ie_calling_party_name {
struct dect_ie_common common;
};
/* Codec List IE */
struct dect_ie_codec_list {
struct dect_ie_common common;
};
/* Events notification IE */
enum dect_event_types {
DECT_EVENT_MESSAGE_WAITING = 0x0,
DECT_EVENT_MISSED_CALL = 0x1,
DECT_EVENT_WEB_CONTENT = 0x2,
DECT_EVENT_LIST_CHANGE_INDICATION = 0x3,
};
enum dect_event_message_waiting_subtypes {
DECT_EVENT_MESSAGE_WAITING_UNKNOWN = 0x0,
DECT_EVENT_MESSAGE_WAITING_VOICE = 0x1,
DECT_EVENT_MESSAGE_WAITING_SMS = 0x2,
DECT_EVENT_MESSAGE_WAITING_EMAIL = 0x3,
};
enum dect_event_missed_call_subtypes {
DECT_EVENT_MISSED_CALL_UNKNOWN = 0x0,
DECT_EVENT_MISSED_CALL_VOICE = 0x1,
};
enum dect_event_web_content_subtypes {
DECT_EVENT_WEB_CONTENT_UNKNOWN = 0x0,
DECT_EVENT_WEB_CONTENT_RSS = 0x1,
};
struct dect_ie_events_notification {
struct dect_ie_common common;
};
/* Call information IE */
struct dect_ie_call_information {
struct dect_ie_common common;
};
#endif /* _LIBDECT_DECT_IE_H */