1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/*! \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_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);
|