diff options
-rw-r--r-- | include/Makefile.am | 1 | ||||
-rw-r--r-- | include/osmocom/gsm/gsm0480.h | 16 | ||||
-rw-r--r-- | include/osmocom/gsm/protocol/gsm_09_02.h | 137 | ||||
-rw-r--r-- | src/gsm/gsm0480.c | 126 | ||||
-rw-r--r-- | src/gsm/libosmogsm.map | 1 | ||||
-rw-r--r-- | tests/ussd/ussd_test.c | 14 |
6 files changed, 262 insertions, 33 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index 9aba3777..347f641a 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -77,6 +77,7 @@ nobase_include_HEADERS = \ osmocom/gsm/protocol/gsm_04_80.h \ osmocom/gsm/protocol/gsm_08_08.h \ osmocom/gsm/protocol/gsm_08_58.h \ + osmocom/gsm/protocol/gsm_09_02.h \ osmocom/gsm/protocol/gsm_12_21.h \ osmocom/gsm/protocol/gsm_44_318.h \ osmocom/gsm/protocol/ipaccess.h \ diff --git a/include/osmocom/gsm/gsm0480.h b/include/osmocom/gsm/gsm0480.h index b1281629..deac3225 100644 --- a/include/osmocom/gsm/gsm0480.h +++ b/include/osmocom/gsm/gsm0480.h @@ -1,19 +1,33 @@ #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> #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); + struct ussd_request *request) OSMO_DEPRECATED("Use gsm0480_decode_ss_request() instead"); + +struct ss_request { + uint8_t opcode; + uint8_t ss_code; + uint8_t ussd_text[MAX_LEN_USSD_STRING + 1]; + uint8_t transaction_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); diff --git a/include/osmocom/gsm/protocol/gsm_09_02.h b/include/osmocom/gsm/protocol/gsm_09_02.h new file mode 100644 index 00000000..3f68b457 --- /dev/null +++ b/include/osmocom/gsm/protocol/gsm_09_02.h @@ -0,0 +1,137 @@ +#ifndef PROTO_GSM_09_02_H +#define PROTO_GSM_09_02_H + +/* GSM TS 09.02 definitions (MAP) */ + +/* Section 17.7.4 */ +/* SS-Status */ +#define GSM0902_SS_STATUS_Q_BIT 0x08 +#define GSM0902_SS_STATUS_P_BIT 0x04 +#define GSM0902_SS_STATUS_R_BIT 0x02 +#define GSM0902_SS_STATUS_A_BIT 0x01 + +/* SS-Data */ +#define GSM0902_SS_DATA_SS_STATUS_TAG 0x84 +#define GSM0902_SS_DATA_NBR_USER 0x85 + +/* SS-Info */ +#define GSM0902_SS_INFO_FORW_INFO_TAG 0xA0 +#define GSM0902_SS_INFO_CALL_BARR_INFO_TAG 0xA1 +#define GSM0902_SS_INFO_SS_DATA_TAG 0xA3 + +/* InterrogateSS-Res */ +#define GSM0902_SS_INTERR_SS_RES_SS_STATUS_TAG 0x80 +#define GSM0902_SS_INTERR_SS_RES_BSG_LIST_TAG 0x81 +#define GSM0902_SS_INTERR_SS_RES_FORW_FEAT_LIST_TAG 0x82 +#define GSM0902_SS_INTERR_SS_RES_GEN_SERV_INFO_TAG 0x83 + +/* Section 17.7.5 */ +/* Supplementary service codes */ +#define GSM0902_SS_CODE_ALL_SS 0x00 +#define GSM0902_SS_CODE_ALL_LINE_IDENTIFICATION_SS 0x10 +#define GSM0902_SS_CODE_CLIP 0x11 +#define GSM0902_SS_CODE_CLIR 0x12 +#define GSM0902_SS_CODE_COLP 0x13 +#define GSM0902_SS_CODE_COLR 0x14 +#define GSM0902_SS_CODE_MCI 0x15 +#define GSM0902_SS_CODE_ALL_NAME_IDENTIFICATION_SS 0x18 +#define GSM0902_SS_CODE_CNAP 0x19 +#define GSM0902_SS_CODE_ALL_FORWARDING_SS 0x20 +#define GSM0902_SS_CODE_CFU 0x21 +#define GSM0902_SS_CODE_ALL_COND_FORWARDING_SS 0x28 +#define GSM0902_SS_CODE_CFB 0x29 +#define GSM0902_SS_CODE_CFNRY 0x2A +#define GSM0902_SS_CODE_CFNRC 0x2B +#define GSM0902_SS_CODE_CD 0x24 +#define GSM0902_SS_CODE_ALL_CALL_OFFERING_SS 0x30 +#define GSM0902_SS_CODE_ECT 0x31 +#define GSM0902_SS_CODE_MAH 0x32 +#define GSM0902_SS_CODE_ALL_CALL_COMPLETION_SS 0x40 +#define GSM0902_SS_CODE_CW 0x41 +#define GSM0902_SS_CODE_HOLD 0x42 +#define GSM0902_SS_CODE_CCBS_A 0x43 +#define GSM0902_SS_CODE_CCBS_B 0x44 +#define GSM0902_SS_CODE_MC 0x45 +#define GSM0902_SS_CODE_ALL_MULTI_PARTY_SS 0x50 +#define GSM0902_SS_CODE_MULTI_PTY 0x51 +#define GSM0902_SS_CODE_ALL_COMMUNITY_OF_INTEREST_SS 0x60 +#define GSM0902_SS_CODE_CUG 0x61 +#define GSM0902_SS_CODE_ALL_CHARGING_SS 0x70 +#define GSM0902_SS_CODE_AOCI 0x71 +#define GSM0902_SS_CODE_AOCC 0x72 +#define GSM0902_SS_CODE_ALL_ADDITIONAL_INFO_TRANSFER_SS 0x80 +#define GSM0902_SS_CODE_UUS1 0x81 +#define GSM0902_SS_CODE_UUS2 0x82 +#define GSM0902_SS_CODE_UUS3 0x83 +#define GSM0902_SS_CODE_ALL_BARRING_SS 0x90 +#define GSM0902_SS_CODE_BARRING_OF_OUTGOING_CALLS 0x91 +#define GSM0902_SS_CODE_BAOC 0x92 +#define GSM0902_SS_CODE_BOIC 0x93 +#define GSM0902_SS_CODE_BOIC_EX_HC 0x94 +#define GSM0902_SS_CODE_BARRING_OF_INCOMING_CALLS 0x99 +#define GSM0902_SS_CODE_BAIC 0x9A +#define GSM0902_SS_CODE_BIC_ROAM 0x9B +#define GSM0902_SS_CODE_ALL_PLMN_SPECIFIC_SS 0xF0 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_1 0xF1 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_2 0xF2 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_3 0xF3 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_4 0xF4 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_5 0xF5 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_6 0xF6 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_7 0xF7 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_8 0xF8 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_9 0xF9 +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_A 0xFA +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_B 0xFB +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_C 0xFC +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_D 0xFD +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_E 0xFE +#define GSM0902_SS_CODE_PLMN_SPECIFIC_SS_F 0xFF +#define GSM0902_SS_CODE_ALL_CALL_PRIORITY_SS 0xA0 +#define GSM0902_SS_CODE_EMLPP 0xA1 +#define GSM0902_SS_CODE_ALL_LCSPRIVACY_EXCEPTION 0xB0 +#define GSM0902_SS_CODE_UNIVERSAL 0xB1 +#define GSM0902_SS_CODE_CALL_SESSION_RELATED 0xB2 +#define GSM0902_SS_CODE_CALL_SESSION_UNRELATED 0xB3 +#define GSM0902_SS_CODE_PLMNOPERATOR 0xB4 +#define GSM0902_SS_CODE_SERVICE_TYPE 0xB5 +#define GSM0902_SS_CODE_ALL_MOLR_SS 0xC0 +#define GSM0902_SS_CODE_BASIC_SELF_LOCATION 0xC1 +#define GSM0902_SS_CODE_AUTONOMOUS_SELF_LOCATION 0xC2 +#define GSM0902_SS_CODE_TRANSFER_TO_THIRD_PARTY 0xC3 + +/* Section 17.7.9 */ +/* Teleservice codes */ +#define GSM0902_TS_CODE_ALL_TELESERVICES 0x00 +#define GSM0902_TS_CODE_ALL_SPEECH_TRANSMISSION_SERVICES 0x10 +#define GSM0902_TS_CODE_TELEPHONY 0x11 +#define GSM0902_TS_CODE_EMERGENCY_CALLS 0x12 +#define GSM0902_TS_CODE_ALL_SHORT_MESSAGE_SERVICES 0x20 +#define GSM0902_TS_CODE_SHORT_MESSAGE_MT_PP 0x21 +#define GSM0902_TS_CODE_SHORT_MESSAGE_MO_PP 0x22 +#define GSM0902_TS_CODE_ALL_FACSIMILE_TRANSMISSION_SERVICES 0x60 +#define GSM0902_TS_CODE_FACSIMILE_GROUP3AND_ALTER_SPEECH 0x61 +#define GSM0902_TS_CODE_AUTOMATIC_FACSIMILE_GROUP3 0x62 +#define GSM0902_TS_CODE_FACSIMILE_GROUP4 0x63 +#define GSM0902_TS_CODE_ALL_DATA_TELESERVICES 0x70 +#define GSM0902_TS_CODE_ALL_TELESERVICES_EXEPT_SMS 0x80 +#define GSM0902_TS_CODE_ALL_VOICE_GROUP_CALL_SERVICES 0x90 +#define GSM0902_TS_CODE_VOICE_GROUP_CALL 0x91 +#define GSM0902_TS_CODE_VOICE_BROADCAST_CALL 0x92 +#define GSM0902_TS_CODE_ALL_PLMN_SPECIFIC_TS 0xD0 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_1 0xD1 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_2 0xD2 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_3 0xD3 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_4 0xD4 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_5 0xD5 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_6 0xD6 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_7 0xD7 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_8 0xD8 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_9 0xD9 +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_A 0xDA +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_B 0xDB +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_C 0xDC +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_D 0xDD +#define GSM0902_TS_CODE_PLMN_SPECIFIC_TS_E 0xDE + +#endif /* PROTO_GSM_09_02_H */ diff --git a/src/gsm/gsm0480.c b/src/gsm/gsm0480.c index dbacefc4..952604b9 100644 --- a/src/gsm/gsm0480.c +++ b/src/gsm/gsm0480.c @@ -192,23 +192,29 @@ struct msgb *gsm0480_create_notifySS(const char *text) } /* Forward declarations */ -static int parse_ussd(const struct gsm48_hdr *hdr, - uint16_t len, struct ussd_request *req); -static int parse_ussd_info_elements(const uint8_t *ussd_ie, uint16_t len, - struct ussd_request *req); +static int parse_ss(const struct gsm48_hdr *hdr, + uint16_t len, struct ss_request *req); +static int parse_ss_info_elements(const uint8_t *ussd_ie, uint16_t len, + struct ss_request *req); static int parse_facility_ie(const uint8_t *facility_ie, uint16_t length, - struct ussd_request *req); + struct ss_request *req); static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length, - struct ussd_request *req); + struct ss_request *req); static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, - struct ussd_request *req); + struct ss_request *req); +static int parse_ss_for_bs_req(const uint8_t *ss_req_data, + uint16_t length, + struct ss_request *req); /* Decode a mobile-originated USSD-request message */ int gsm0480_decode_ussd_request(const struct gsm48_hdr *hdr, uint16_t len, struct ussd_request *req) { + struct ss_request ss; int rc = 0; + memset(&ss, 0, sizeof(ss)); + if (len < sizeof(*hdr) + 2) { LOGP(0, LOGL_DEBUG, "USSD Request is too short.\n"); return 0; @@ -216,7 +222,19 @@ int gsm0480_decode_ussd_request(const struct gsm48_hdr *hdr, uint16_t len, if ((hdr->proto_discr & 0x0f) == GSM48_PDISC_NC_SS) { req->transaction_id = hdr->proto_discr & 0x70; - rc = parse_ussd(hdr, len, req); + + ss.transaction_id = req->transaction_id; + rc = parse_ss(hdr, len, &ss); + + /* convert from ss_request to legacy ussd_request */ + req->transaction_id = ss.transaction_id; + req->invoke_id = ss.invoke_id; + if (ss.ussd_text[0] == 0xFF) + req->text[0] = '\0'; + else { + memcpy(req->text, ss.ussd_text, sizeof(req->text)); + req->text[sizeof(req->text)-1] = '\0'; + } } if (!rc) @@ -225,20 +243,42 @@ int gsm0480_decode_ussd_request(const struct gsm48_hdr *hdr, uint16_t len, return rc; } -static int parse_ussd(const struct gsm48_hdr *hdr, uint16_t len, struct ussd_request *req) +/* Decode a mobile-originated SS request message */ +int gsm0480_decode_ss_request(const struct gsm48_hdr *hdr, uint16_t len, + struct ss_request *req) +{ + int rc = 0; + + if (len < sizeof(*hdr) + 2) { + LOGP(0, LOGL_DEBUG, "SS Request is too short.\n"); + return 0; + } + + if ((hdr->proto_discr & 0x0f) == GSM48_PDISC_NC_SS) { + req->transaction_id = hdr->proto_discr & 0x70; + rc = parse_ss(hdr, len, req); + } + + if (!rc) + LOGP(0, LOGL_DEBUG, "Error occurred while parsing received SS!\n"); + + return rc; +} + +static int parse_ss(const struct gsm48_hdr *hdr, uint16_t len, struct ss_request *req) { int rc = 1; uint8_t msg_type = hdr->msg_type & 0xBF; /* message-type - section 3.4 */ switch (msg_type) { case GSM0480_MTYPE_RELEASE_COMPLETE: - LOGP(0, LOGL_DEBUG, "USS Release Complete\n"); + LOGP(0, LOGL_DEBUG, "SS Release Complete\n"); /* could also parse out the optional Cause/Facility data */ - req->text[0] = '\0'; + req->ussd_text[0] = 0xFF; break; case GSM0480_MTYPE_REGISTER: case GSM0480_MTYPE_FACILITY: - rc &= parse_ussd_info_elements(&hdr->data[0], len - sizeof(*hdr), req); + rc &= parse_ss_info_elements(&hdr->data[0], len - sizeof(*hdr), req); break; default: LOGP(0, LOGL_DEBUG, "Unknown GSM 04.80 message-type field 0x%02x\n", @@ -250,16 +290,16 @@ static int parse_ussd(const struct gsm48_hdr *hdr, uint16_t len, struct ussd_req return rc; } -static int parse_ussd_info_elements(const uint8_t *ussd_ie, uint16_t len, - struct ussd_request *req) +static int parse_ss_info_elements(const uint8_t *ss_ie, uint16_t len, + struct ss_request *req) { int rc = -1; /* Information Element Identifier - table 3.2 & GSM 04.08 section 10.5 */ uint8_t iei; uint8_t iei_length; - iei = ussd_ie[0]; - iei_length = ussd_ie[1]; + iei = ss_ie[0]; + iei_length = ss_ie[1]; /* If the data does not fit, report an error */ if (len - 2 < iei_length) @@ -269,7 +309,7 @@ static int parse_ussd_info_elements(const uint8_t *ussd_ie, uint16_t len, case GSM48_IE_CAUSE: break; case GSM0480_IE_FACILITY: - rc = parse_facility_ie(ussd_ie+2, iei_length, req); + rc = parse_facility_ie(ss_ie + 2, iei_length, req); break; case GSM0480_IE_SS_VERSION: break; @@ -284,7 +324,7 @@ static int parse_ussd_info_elements(const uint8_t *ussd_ie, uint16_t len, } static int parse_facility_ie(const uint8_t *facility_ie, uint16_t length, - struct ussd_request *req) + struct ss_request *req) { int rc = 1; uint8_t offset = 0; @@ -303,8 +343,8 @@ static int parse_facility_ie(const uint8_t *facility_ie, uint16_t length, switch (component_type) { case GSM0480_CTYPE_INVOKE: rc &= parse_ss_invoke(facility_ie+2, - component_length, - req); + component_length, + req); break; case GSM0480_CTYPE_RETURN_RESULT: break; @@ -326,7 +366,7 @@ static int parse_facility_ie(const uint8_t *facility_ie, uint16_t length, /* Parse an Invoke component - see table 3.3 */ static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length, - struct ussd_request *req) + struct ss_request *req) { int rc = 1; uint8_t offset; @@ -337,7 +377,7 @@ static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length, /* mandatory part */ if (invoke_data[0] != GSM0480_COMPIDTAG_INVOKE_ID) { LOGP(0, LOGL_DEBUG, "Unexpected GSM 04.80 Component-ID tag " - "0x%02x (expecting Invoke ID tag)\n", invoke_data[0]); + "0x%02x (expecting Invoke ID tag)\n", invoke_data[0]); } offset = invoke_data[1] + 2; @@ -356,12 +396,20 @@ static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length, if (offset + 2 > length) return 0; uint8_t operation_code = invoke_data[offset+2]; + req->opcode = operation_code; switch (operation_code) { case GSM0480_OP_CODE_PROCESS_USS_REQ: rc = parse_process_uss_req(invoke_data + offset + 3, length - offset - 3, req); break; + case GSM0480_OP_CODE_ACTIVATE_SS: + case GSM0480_OP_CODE_DEACTIVATE_SS: + case GSM0480_OP_CODE_INTERROGATE_SS: + rc = parse_ss_for_bs_req(invoke_data + offset + 3, + length - offset - 3, + req); + break; default: LOGP(0, LOGL_DEBUG, "GSM 04.80 operation code 0x%02x " "is not yet handled\n", operation_code); @@ -380,7 +428,7 @@ static int parse_ss_invoke(const uint8_t *invoke_data, uint16_t length, /* Parse the parameters of a Process UnstructuredSS Request */ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, - struct ussd_request *req) + struct ss_request *req) { int rc = 0; int num_chars; @@ -398,8 +446,12 @@ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, if ((dcs == 0x0F) && (uss_req_data[5] == ASN1_OCTET_STRING_TAG)) { num_chars = (uss_req_data[6] * 8) / 7; - gsm_7bit_decode_n_ussd(req->text, sizeof(req->text), - &(uss_req_data[7]), num_chars); + /* Prevent a mobile-originated buffer-overrun! */ + if (num_chars > MAX_LEN_USSD_STRING) + num_chars = MAX_LEN_USSD_STRING; + gsm_7bit_decode_n_ussd((char *)req->ussd_text, + sizeof(req->ussd_text), + &(uss_req_data[7]), num_chars); rc = 1; } } @@ -407,6 +459,30 @@ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, return rc; } +/* Parse the parameters of a Interrogate/Activate/DeactivateSS Request */ +static int parse_ss_for_bs_req(const uint8_t *ss_req_data, + uint16_t length, + struct ss_request *req) +{ + int rc = 0; + + + /* we need at least that much */ + if (length < 5) + return 0; + + + if (ss_req_data[0] == GSM_0480_SEQUENCE_TAG) { + if ((ss_req_data[2] == ASN1_OCTET_STRING_TAG) && + ss_req_data[3] == 1) { + req->ss_code = ss_req_data[4]; + + rc = 1; + } + } + return rc; +} + struct msgb *gsm0480_create_ussd_resp(uint8_t invoke_id, uint8_t trans_id, const char *text) { struct msgb *msg; diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index 02c88840..b7c5158b 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -44,6 +44,7 @@ gsm0480_create_notifySS; gsm0480_create_unstructuredSS_Notify; gsm0480_create_ussd_resp; gsm0480_decode_ussd_request; +gsm0480_decode_ss_request; gsm0480_wrap_facility; gsm0480_wrap_invoke; diff --git a/tests/ussd/ussd_test.c b/tests/ussd/ussd_test.c index b04f8e8a..f798e37c 100644 --- a/tests/ussd/ussd_test.c +++ b/tests/ussd/ussd_test.c @@ -38,13 +38,13 @@ static int parse_ussd(const uint8_t *_data, int len) { uint8_t *data; int rc; - struct ussd_request req; + struct ss_request req; struct gsm48_hdr *hdr; data = malloc(len); memcpy(data, _data, len); hdr = (struct gsm48_hdr *) &data[0]; - rc = gsm0480_decode_ussd_request(hdr, len, &req); + rc = gsm0480_decode_ss_request(hdr, len, &req); free(data); return rc; @@ -54,14 +54,14 @@ static int parse_mangle_ussd(const uint8_t *_data, int len) { uint8_t *data; int rc; - struct ussd_request req; + struct ss_request req; struct gsm48_hdr *hdr; data = malloc(len); memcpy(data, _data, len); hdr = (struct gsm48_hdr *) &data[0]; hdr->data[1] = len - sizeof(*hdr) - 2; - rc = gsm0480_decode_ussd_request(hdr, len, &req); + rc = gsm0480_decode_ss_request(hdr, len, &req); free(data); return rc; @@ -113,15 +113,15 @@ static void test_7bit_ussd(const char *text, const char *encoded_hex, const char int main(int argc, char **argv) { - struct ussd_request req; + struct ss_request req; const int size = sizeof(ussd_request); int i; struct msgb *msg; osmo_init_logging(&info); - gsm0480_decode_ussd_request((struct gsm48_hdr *) ussd_request, size, &req); - printf("Tested if it still works. Text was: %s\n", req.text); + gsm0480_decode_ss_request((struct gsm48_hdr *) ussd_request, size, &req); + printf("Tested if it still works. Text was: %s\n", req.ussd_text); printf("Testing parsing a USSD request and truncated versions\n"); |