mirror of https://gerrit.osmocom.org/libosmocore
108 lines
3.3 KiB
C
108 lines
3.3 KiB
C
/*! \file gsm0480.h */
|
|
|
|
#pragma once
|
|
|
|
#include <osmocom/core/defs.h>
|
|
#include <osmocom/core/msgb.h>
|
|
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
|
#include <osmocom/gsm/protocol/gsm_04_80.h>
|
|
|
|
/**
|
|
* According to the GSM 04.80 (version 5.0.0) specification Annex A
|
|
* "Expanded ASN.1 Module "SS-Protocol", the maximum size of a USSD
|
|
* OCTET STRING field is 160 bytes.
|
|
*/
|
|
#define GSM0480_USSD_OCTET_STRING_LEN 160
|
|
|
|
/**
|
|
* Thus according to ETSI TS 123 038 (version 10.0.0) specification
|
|
* 6.1.2.3 "USSD packing of 7 bit characters", in 160 octets, it's
|
|
* possible to pack (160 * 8) / 7 = 182.8, that is 182 characters.
|
|
* The remaining 6 bits are set to zero.
|
|
*/
|
|
#define GSM0480_USSD_7BIT_STRING_LEN 182
|
|
|
|
/**
|
|
* DEPRECATED: this definition doesn't follow any specification,
|
|
* so we only keep it for compatibility reasons. It's strongly
|
|
* recommended to use correct definitions above.
|
|
*/
|
|
#define MAX_LEN_USSD_STRING 31
|
|
|
|
/* deprecated */
|
|
struct ussd_request {
|
|
char text[MAX_LEN_USSD_STRING + 1];
|
|
uint8_t transaction_id;
|
|
uint8_t invoke_id;
|
|
};
|
|
|
|
/* deprecated */
|
|
int gsm0480_decode_ussd_request(const struct gsm48_hdr *hdr, uint16_t len,
|
|
struct ussd_request *request) OSMO_DEPRECATED("Use gsm0480_decode_ss_request() instead");
|
|
|
|
/**
|
|
* This structure represents some meaningful parts of
|
|
* a decoded and/or to be encoded GSM 04.80 message.
|
|
*/
|
|
struct ss_request {
|
|
/**
|
|
* GSM TS 04.80, section 3.6.4 "Operation code"
|
|
* See GSM0480_OP_CODE_* for possible values.
|
|
*/
|
|
uint8_t opcode;
|
|
/**
|
|
* GSM TS 04.80, section 4.4.3.9 "ss-Code"
|
|
* The ss-Code identifier refers to the code which identify
|
|
* a supplementary service or a group of supplementary services.
|
|
*/
|
|
uint8_t ss_code;
|
|
|
|
/**
|
|
* A rudiment of deprecated 'ussd_request' structure.
|
|
* Represents the data of either an INVOKE, either
|
|
* a RETURN_RESULT component, encoded as ASCII in
|
|
* case if DCS is 0x0f (i.e. decoded by the code
|
|
* itself), otherwise raw bytes 'as is'.
|
|
*/
|
|
uint8_t ussd_text[GSM0480_USSD_OCTET_STRING_LEN];
|
|
|
|
/**
|
|
* Represents the data of either an INVOKE, either
|
|
* a RETURN_RESULT component 'as is'. Useful when
|
|
* decoding is not supported or not desired.
|
|
*
|
|
* Shall be always followed by its length (in bytes)
|
|
* and DCS (Data Coding Scheme).
|
|
*/
|
|
uint8_t ussd_data[GSM0480_USSD_OCTET_STRING_LEN];
|
|
uint8_t ussd_data_len; /* Length in bytes */
|
|
uint8_t ussd_data_dcs; /* Data Coding Scheme */
|
|
|
|
/**
|
|
* GSM TS 04.80, section 3.3 "Transaction identifier"
|
|
* See GSM TS 04.07, section 11.2.3 for details.
|
|
*/
|
|
uint8_t transaction_id;
|
|
/**
|
|
* GSM TS 04.80, section 3.6.3 "Component ID tag"
|
|
* The term Component ID refers to the Invoke ID or
|
|
* the Linked ID.
|
|
*/
|
|
uint8_t invoke_id;
|
|
};
|
|
|
|
int gsm0480_decode_ss_request(const struct gsm48_hdr *hdr, uint16_t len,
|
|
struct ss_request *request);
|
|
|
|
struct msgb *gsm0480_create_ussd_resp(uint8_t invoke_id, uint8_t trans_id, const char *text);
|
|
struct msgb *gsm0480_create_unstructuredSS_Notify(int alertPattern, const char *text);
|
|
struct msgb *gsm0480_create_notifySS(const char *text);
|
|
struct msgb *gsm0480_create_ussd_notify(int level, const char *text);
|
|
struct msgb *gsm0480_create_ussd_release_complete(void);
|
|
|
|
int gsm0480_wrap_invoke(struct msgb *msg, int op, int link_id);
|
|
int gsm0480_wrap_facility(struct msgb *msg);
|
|
|
|
struct gsm48_hdr *gsm0480_l3hdr_push(struct msgb *msg, uint8_t proto_discr,
|
|
uint8_t msg_type);
|