blob: 0dfd868f29d5ac301dc4ddf1dd0fc82c41bcc4e5 [file] [log] [blame]
Neels Hofmeyr17518fe2017-06-20 04:35:06 +02001/*! \file gsm0480.h */
2
Sylvain Munaut12ba7782014-06-16 10:13:40 +02003#pragma once
Holger Hans Peter Freyther55aea502010-09-30 18:30:41 +08004
Tobias Engel419684e2012-03-08 13:31:52 +01005#include <osmocom/core/defs.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +01006#include <osmocom/core/msgb.h>
7#include <osmocom/gsm/protocol/gsm_04_08.h>
8#include <osmocom/gsm/protocol/gsm_04_80.h>
Holger Hans Peter Freyther55aea502010-09-30 18:30:41 +08009
Vadim Yanitskiyfa6c2b92017-08-09 17:38:39 +060010/**
11 * According to the GSM 04.80 (version 5.0.0) specification Annex A
12 * "Expanded ASN.1 Module "SS-Protocol", the maximum size of a USSD
13 * OCTET STRING field is 160 bytes.
14 */
15#define GSM0480_USSD_OCTET_STRING_LEN 160
16
17/**
18 * Thus according to ETSI TS 123 038 (version 10.0.0) specification
19 * 6.1.2.3 "USSD packing of 7 bit characters", in 160 octets, it's
20 * possible to pack (160 * 8) / 7 = 182.8, that is 182 characters.
21 * The remaining 6 bits are set to zero.
22 */
23#define GSM0480_USSD_7BIT_STRING_LEN 182
24
25/**
26 * DEPRECATED: this definition doesn't follow any specification,
27 * so we only keep it for compatibility reasons. It's strongly
28 * recommended to use correct definitions above.
29 */
30#define MAX_LEN_USSD_STRING 31
Holger Hans Peter Freyther00cb5702010-10-09 01:47:15 +080031
Tobias Engel419684e2012-03-08 13:31:52 +010032/* deprecated */
Holger Hans Peter Freyther00cb5702010-10-09 01:47:15 +080033struct ussd_request {
Harald Welte1f87d752012-09-07 12:07:10 +020034 char text[MAX_LEN_USSD_STRING + 1];
Holger Hans Peter Freyther00cb5702010-10-09 01:47:15 +080035 uint8_t transaction_id;
36 uint8_t invoke_id;
37};
38
Tobias Engel419684e2012-03-08 13:31:52 +010039/* deprecated */
Holger Hans Peter Freytherdaa653f2010-10-11 07:56:06 +020040int gsm0480_decode_ussd_request(const struct gsm48_hdr *hdr, uint16_t len,
Tobias Engel419684e2012-03-08 13:31:52 +010041 struct ussd_request *request) OSMO_DEPRECATED("Use gsm0480_decode_ss_request() instead");
42
43struct ss_request {
44 uint8_t opcode;
45 uint8_t ss_code;
Vadim Yanitskiyfa6c2b92017-08-09 17:38:39 +060046 uint8_t ussd_text[GSM0480_USSD_OCTET_STRING_LEN];
Tobias Engel419684e2012-03-08 13:31:52 +010047 uint8_t transaction_id;
48 uint8_t invoke_id;
49};
50
51int gsm0480_decode_ss_request(const struct gsm48_hdr *hdr, uint16_t len,
52 struct ss_request *request);
Holger Hans Peter Freyther00cb5702010-10-09 01:47:15 +080053
Holger Hans Peter Freytherc64970e2010-10-18 16:56:43 +020054struct msgb *gsm0480_create_ussd_resp(uint8_t invoke_id, uint8_t trans_id, const char *text);
Holger Hans Peter Freyther55aea502010-09-30 18:30:41 +080055struct msgb *gsm0480_create_unstructuredSS_Notify(int alertPattern, const char *text);
56struct msgb *gsm0480_create_notifySS(const char *text);
Neels Hofmeyrbc1d7582016-11-26 15:21:15 +010057struct msgb *gsm0480_create_ussd_notify(int level, const char *text);
58struct msgb *gsm0480_create_ussd_release_complete(void);
Holger Hans Peter Freyther55aea502010-09-30 18:30:41 +080059
60int gsm0480_wrap_invoke(struct msgb *msg, int op, int link_id);
61int gsm0480_wrap_facility(struct msgb *msg);
Neels Hofmeyr25774b92016-11-26 15:21:05 +010062
63struct gsm48_hdr *gsm0480_l3hdr_push(struct msgb *msg, uint8_t proto_discr,
64 uint8_t msg_type);