| /*! \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> |
| |
| extern const struct value_string gsm0480_comp_type_names[]; |
| static inline const char *gsm0480_comp_type_name(uint8_t comp_type) { |
| return get_value_string(gsm0480_comp_type_names, comp_type); |
| } |
| |
| extern const struct value_string gsm0480_op_code_names[]; |
| static inline const char *gsm0480_op_code_name(uint8_t op_code) { |
| return get_value_string(gsm0480_op_code_names, op_code); |
| } |
| |
| /** |
| * 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_extract_ie_by_tag(const struct gsm48_hdr *hdr, uint16_t msg_len, |
| uint8_t **ie, uint16_t *ie_len, uint8_t ie_tag); |
| int gsm0480_parse_facility_ie(const uint8_t *facility_ie, uint16_t length, |
| struct ss_request *req); |
| int gsm0480_decode_ss_request(const struct gsm48_hdr *hdr, uint16_t len, |
| struct ss_request *request); |
| |
| struct msgb *gsm0480_msgb_alloc_name(const char *name); |
| struct msgb *gsm0480_gen_ussd_resp_7bit(uint8_t invoke_id, const char *text); |
| struct msgb *gsm0480_gen_return_error(uint8_t invoke_id, uint8_t error_code); |
| struct msgb *gsm0480_gen_reject(int invoke_id, uint8_t problem_tag, uint8_t problem_code); |
| |
| 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) |
| OSMO_DEPRECATED("Use gsm0480_create_release_complete() instead."); |
| struct msgb *gsm0480_create_release_complete(uint8_t trans_id); |
| |
| int gsm0480_wrap_invoke(struct msgb *msg, int op, int link_id); |
| int gsm0480_wrap_facility(struct msgb *msg); |