Neels Hofmeyr | 17518fe | 2017-06-20 04:35:06 +0200 | [diff] [blame] | 1 | /*! \file gsm_04_08_gprs.h */ |
| 2 | |
Vadim Yanitskiy | 395db20 | 2022-09-28 23:51:42 +0700 | [diff] [blame] | 3 | #pragma once |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 4 | |
| 5 | #include <stdint.h> |
Max | a337b9c | 2016-06-27 15:51:34 +0200 | [diff] [blame] | 6 | #include <stdbool.h> |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 7 | #include <osmocom/gsm/protocol/gsm_04_08.h> |
Max | a337b9c | 2016-06-27 15:51:34 +0200 | [diff] [blame] | 8 | #include <osmocom/crypt/gprs_cipher.h> |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 9 | #include <osmocom/core/endian.h> |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 10 | |
| 11 | /* Table 10.4 / 10.4a, GPRS Mobility Management (GMM) */ |
| 12 | #define GSM48_MT_GMM_ATTACH_REQ 0x01 |
| 13 | #define GSM48_MT_GMM_ATTACH_ACK 0x02 |
| 14 | #define GSM48_MT_GMM_ATTACH_COMPL 0x03 |
| 15 | #define GSM48_MT_GMM_ATTACH_REJ 0x04 |
| 16 | #define GSM48_MT_GMM_DETACH_REQ 0x05 |
| 17 | #define GSM48_MT_GMM_DETACH_ACK 0x06 |
| 18 | |
| 19 | #define GSM48_MT_GMM_RA_UPD_REQ 0x08 |
| 20 | #define GSM48_MT_GMM_RA_UPD_ACK 0x09 |
| 21 | #define GSM48_MT_GMM_RA_UPD_COMPL 0x0a |
| 22 | #define GSM48_MT_GMM_RA_UPD_REJ 0x0b |
| 23 | |
| 24 | #define GSM48_MT_GMM_PTMSI_REALL_CMD 0x10 |
| 25 | #define GSM48_MT_GMM_PTMSI_REALL_COMPL 0x11 |
| 26 | #define GSM48_MT_GMM_AUTH_CIPH_REQ 0x12 |
| 27 | #define GSM48_MT_GMM_AUTH_CIPH_RESP 0x13 |
| 28 | #define GSM48_MT_GMM_AUTH_CIPH_REJ 0x14 |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 29 | #define GSM48_MT_GMM_AUTH_CIPH_FAIL 0x1C |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 30 | #define GSM48_MT_GMM_ID_REQ 0x15 |
| 31 | #define GSM48_MT_GMM_ID_RESP 0x16 |
| 32 | #define GSM48_MT_GMM_STATUS 0x20 |
| 33 | #define GSM48_MT_GMM_INFO 0x21 |
| 34 | |
| 35 | /* Table 10.4a, GPRS Session Management (GSM) */ |
| 36 | #define GSM48_MT_GSM_ACT_PDP_REQ 0x41 |
| 37 | #define GSM48_MT_GSM_ACT_PDP_ACK 0x42 |
| 38 | #define GSM48_MT_GSM_ACT_PDP_REJ 0x43 |
| 39 | #define GSM48_MT_GSM_REQ_PDP_ACT 0x44 |
| 40 | #define GSM48_MT_GSM_REQ_PDP_ACT_REJ 0x45 |
| 41 | #define GSM48_MT_GSM_DEACT_PDP_REQ 0x46 |
| 42 | #define GSM48_MT_GSM_DEACT_PDP_ACK 0x47 |
| 43 | #define GSM48_MT_GSM_ACT_AA_PDP_REQ 0x50 |
| 44 | #define GSM48_MT_GSM_ACT_AA_PDP_ACK 0x51 |
| 45 | #define GSM48_MT_GSM_ACT_AA_PDP_REJ 0x52 |
| 46 | #define GSM48_MT_GSM_DEACT_AA_PDP_REQ 0x53 |
| 47 | #define GSM48_MT_GSM_DEACT_AA_PDP_ACK 0x54 |
| 48 | #define GSM48_MT_GSM_STATUS 0x55 |
| 49 | |
| 50 | /* Chapter 10.5.5.2 / Table 10.5.135 */ |
| 51 | #define GPRS_ATT_T_ATTACH 1 |
| 52 | #define GPRS_ATT_T_ATT_WHILE_IMSI 2 |
| 53 | #define GPRS_ATT_T_COMBINED 3 |
| 54 | |
| 55 | extern const struct value_string *gprs_att_t_strs; |
Max | f5f773f | 2016-07-05 19:17:19 +0200 | [diff] [blame] | 56 | extern const struct value_string gprs_msgt_gmm_names[]; |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 57 | |
| 58 | /* Chapter 10.5.5.5 / Table 10.5.138 */ |
| 59 | #define GPRS_DET_T_MO_GPRS 1 |
| 60 | #define GPRS_DET_T_MO_IMSI 2 |
| 61 | #define GPRS_DET_T_MO_COMBINED 3 |
| 62 | /* Network to MS direction */ |
| 63 | #define GPRS_DET_T_MT_REATT_REQ 1 |
| 64 | #define GPRS_DET_T_MT_REATT_NOTREQ 2 |
| 65 | #define GPRS_DET_T_MT_IMSI 3 |
| 66 | |
| 67 | extern const struct value_string *gprs_det_t_mo_strs; |
| 68 | extern const struct value_string *gprs_det_t_mt_strs; |
| 69 | |
| 70 | /* Chapter 10.5.5.18 / Table 105.150 */ |
| 71 | #define GPRS_UPD_T_RA 0 |
| 72 | #define GPRS_UPD_T_RA_LA 1 |
| 73 | #define GPRS_UPD_T_RA_LA_IMSI_ATT 2 |
| 74 | #define GPRS_UPD_T_PERIODIC 3 |
| 75 | |
| 76 | extern const struct value_string *gprs_upd_t_strs; |
| 77 | |
Neels Hofmeyr | 0318f6b | 2016-08-29 13:18:56 +0200 | [diff] [blame] | 78 | /* Table 10.4 in 3GPP TS 24.008 (successor to 04.08) */ |
| 79 | #define GSM48_MT_GMM_SERVICE_REQ 0x0c |
| 80 | #define GSM48_MT_GMM_SERVICE_ACK 0x0d |
| 81 | #define GSM48_MT_GMM_SERVICE_REJ 0x0e |
| 82 | |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 83 | enum gsm48_gprs_ie_mm { |
| 84 | GSM48_IE_GMM_CIPH_CKSN = 0x08, /* 10.5.1.2 */ |
Pau Espin Pedrol | 550fdf8 | 2023-04-25 18:37:36 +0200 | [diff] [blame] | 85 | GSM48_IE_GMM_PTMSI_TYPE = 0x0e, /* 10.5.5.29 */ |
Neels Hofmeyr | a9c29b4 | 2023-05-12 00:02:21 +0200 | [diff] [blame] | 86 | GSM48_IE_GMM_TMSI_BASED_NRI_C = 0x10, /* 10.5.5.31 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 87 | GSM48_IE_GMM_TIMER_READY = 0x17, /* 10.5.7.3 */ |
| 88 | GSM48_IE_GMM_ALLOC_PTMSI = 0x18, /* 10.5.1.4 */ |
| 89 | GSM48_IE_GMM_PTMSI_SIG = 0x19, /* 10.5.5.8 */ |
| 90 | GSM48_IE_GMM_AUTH_RAND = 0x21, /* 10.5.3.1 */ |
| 91 | GSM48_IE_GMM_AUTH_SRES = 0x22, /* 10.5.3.2 */ |
| 92 | GSM48_IE_GMM_IMEISV = 0x23, /* 10.5.1.4 */ |
| 93 | GSM48_IE_GMM_CAUSE = 0x25, /* 10.5.5.14 */ |
| 94 | GSM48_IE_GMM_DRX_PARAM = 0x27, /* 10.5.5.6 */ |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 95 | GSM48_IE_GMM_AUTN = 0x28, /* 10.5.3.1.1 */ |
| 96 | GSM48_IE_GMM_AUTH_RES_EXT = 0x29, /* 10.5.3.2.1 */ |
Pau Espin Pedrol | 5e79a30 | 2023-04-13 13:46:25 +0200 | [diff] [blame] | 97 | GSM48_IE_GMM_TIMER_T3302 = 0x2A, /* 10.5.7.4 */ |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 98 | GSM48_IE_GMM_AUTH_FAIL_PAR = 0x30, /* 10.5.3.2.2 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 99 | GSM48_IE_GMM_MS_NET_CAPA = 0x31, /* 10.5.5.12 */ |
| 100 | GSM48_IE_GMM_PDP_CTX_STATUS = 0x32, /* 10.5.7.1 */ |
| 101 | GSM48_IE_GMM_PS_LCS_CAPA = 0x33, /* 10.5.5.22 */ |
| 102 | GSM48_IE_GMM_GMM_MBMS_CTX_ST = 0x35, /* 10.5.7.6 */ |
Pau Espin Pedrol | 5e79a30 | 2023-04-13 13:46:25 +0200 | [diff] [blame] | 103 | GSM48_IE_GMM_TIMER_T3346 = 0x3A, /* 10.5.7.4 */ |
Pau Espin Pedrol | bfcce40 | 2020-11-26 19:28:55 +0100 | [diff] [blame] | 104 | GSM48_IE_GMM_NET_FEAT_SUPPORT = 0xB0, /* 10.5.5.23 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 105 | }; |
| 106 | |
| 107 | enum gsm48_gprs_ie_sm { |
Pau Espin Pedrol | ec7d502 | 2023-03-28 18:16:12 +0200 | [diff] [blame] | 108 | GSM48_IE_GSM_RADIO_PRIO = 0x08, /* 10.5.7.2 */ |
| 109 | GSM48_IE_GSM_DEV_PROP = 0x0C, /* 10.5.7.8 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 110 | GSM48_IE_GSM_APN = 0x28, /* 10.5.6.1 */ |
| 111 | GSM48_IE_GSM_PROTO_CONF_OPT = 0x27, /* 10.5.6.3 */ |
| 112 | GSM48_IE_GSM_PDP_ADDR = 0x2b, /* 10.5.6.4 */ |
| 113 | GSM48_IE_GSM_AA_TMR = 0x29, /* 10.5.7.3 */ |
Pau Espin Pedrol | ec7d502 | 2023-03-28 18:16:12 +0200 | [diff] [blame] | 114 | GSM48_IE_GSM_QOS = 0x30, /* 10.5.6.5 */ |
| 115 | GSM48_IE_GSM_TFT = 0x31, /* 10.5.6.12 */ |
| 116 | GSM48_IE_GSM_LLC_SAPI = 0x32, /* 10.5.6.9 */ |
| 117 | GSM48_IE_GSM_MBIFOM_CONT = 0x33, /* 10.5.6.21 */ |
| 118 | GSM48_IE_GSM_PFI = 0x34, /* 10.5.6.11 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 119 | GSM48_IE_GSM_NAME_FULL = 0x43, /* 10.5.3.5a */ |
| 120 | GSM48_IE_GSM_NAME_SHORT = 0x45, /* 10.5.3.5a */ |
| 121 | GSM48_IE_GSM_TIMEZONE = 0x46, /* 10.5.3.8 */ |
| 122 | GSM48_IE_GSM_UTC_AND_TZ = 0x47, /* 10.5.3.9 */ |
| 123 | GSM48_IE_GSM_LSA_ID = 0x48, /* 10.5.3.11 */ |
Pau Espin Pedrol | ec7d502 | 2023-03-28 18:16:12 +0200 | [diff] [blame] | 124 | GSM48_IE_GSM_EXT_QOS = 0x5C, /* 10.5.6.5B */ |
| 125 | GSM48_IE_GSM_EXT_PROTO_CONF_OPT = 0x7B, /* 10.5.6.3a */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 126 | |
| 127 | /* Fake IEs that are not present on the Layer3 air interface, |
| 128 | * but which we use to simplify internal APIs */ |
Holger Hans Peter Freyther | 5a54dcb | 2017-07-09 12:46:08 +0200 | [diff] [blame] | 129 | OSMO_IE_GSM_CHARG_CHAR = 0xfc, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 130 | OSMO_IE_GSM_REQ_QOS = 0xfd, |
| 131 | OSMO_IE_GSM_REQ_PDP_ADDR = 0xfe, |
| 132 | OSMO_IE_GSM_SUB_QOS = 0xff, |
| 133 | }; |
| 134 | |
| 135 | /* Chapter 9.4.15 / Table 9.4.15 */ |
| 136 | struct gsm48_ra_upd_ack { |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 137 | #if OSMO_IS_LITTLE_ENDIAN |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 138 | uint8_t force_stby:4, /* 10.5.5.7 */ |
| 139 | upd_result:4; /* 10.5.5.17 */ |
| 140 | uint8_t ra_upd_timer; /* 10.5.7.3 */ |
| 141 | struct gsm48_ra_id ra_id; /* 10.5.5.15 */ |
| 142 | uint8_t data[0]; |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 143 | #elif OSMO_IS_BIG_ENDIAN |
Oliver Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 144 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 145 | uint8_t upd_result:4, force_stby:4; |
| 146 | uint8_t ra_upd_timer; |
| 147 | struct gsm48_ra_id ra_id; |
| 148 | uint8_t data[0]; |
| 149 | #endif |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 150 | } __attribute__((packed)); |
| 151 | |
| 152 | /* Chapter 10.5.7.3 */ |
| 153 | enum gsm48_gprs_tmr_unit { |
| 154 | GPRS_TMR_2SECONDS = 0 << 5, |
| 155 | GPRS_TMR_MINUTE = 1 << 5, |
| 156 | GPRS_TMR_6MINUTE = 2 << 5, |
| 157 | GPRS_TMR_DEACTIVATED = 7 << 5, |
| 158 | }; |
| 159 | |
| 160 | #define GPRS_TMR_UNIT_MASK (7 << 5) |
| 161 | #define GPRS_TMR_FACT_MASK ((1 << 5)-1) |
| 162 | |
| 163 | /* Chapter 9.4.2 / Table 9.4.2 */ |
| 164 | struct gsm48_attach_ack { |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 165 | #if OSMO_IS_LITTLE_ENDIAN |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 166 | uint8_t att_result:4, /* 10.5.5.7 */ |
| 167 | force_stby:4; /* 10.5.5.1 */ |
| 168 | uint8_t ra_upd_timer; /* 10.5.7.3 */ |
| 169 | uint8_t radio_prio; /* 10.5.7.2 */ |
| 170 | struct gsm48_ra_id ra_id; /* 10.5.5.15 */ |
| 171 | uint8_t data[0]; |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 172 | #elif OSMO_IS_BIG_ENDIAN |
Oliver Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 173 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 174 | uint8_t force_stby:4, att_result:4; |
| 175 | uint8_t ra_upd_timer; |
| 176 | uint8_t radio_prio; |
| 177 | struct gsm48_ra_id ra_id; |
| 178 | uint8_t data[0]; |
| 179 | #endif |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 180 | } __attribute__((packed)); |
| 181 | |
| 182 | /* Chapter 9.4.9 / Table 9.4.9 */ |
| 183 | struct gsm48_auth_ciph_req { |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 184 | #if OSMO_IS_LITTLE_ENDIAN |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 185 | uint8_t ciph_alg:4, /* 10.5.5.3 */ |
| 186 | imeisv_req:4; /* 10.5.5.10 */ |
| 187 | uint8_t force_stby:4, /* 10.5.5.7 */ |
| 188 | ac_ref_nr:4; /* 10.5.5.19 */ |
| 189 | uint8_t data[0]; |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 190 | #elif OSMO_IS_BIG_ENDIAN |
Oliver Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 191 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 192 | uint8_t imeisv_req:4, ciph_alg:4; |
| 193 | uint8_t ac_ref_nr:4, force_stby:4; |
| 194 | uint8_t data[0]; |
| 195 | #endif |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 196 | } __attribute__((packed)); |
| 197 | /* optional: TV RAND, TV CKSN */ |
| 198 | |
| 199 | struct gsm48_auth_ciph_resp { |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 200 | #if OSMO_IS_LITTLE_ENDIAN |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 201 | uint8_t ac_ref_nr:4, |
| 202 | spare:4; |
| 203 | uint8_t data[0]; |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 204 | #elif OSMO_IS_BIG_ENDIAN |
Oliver Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 205 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Neels Hofmeyr | b260039 | 2018-11-16 00:20:39 +0100 | [diff] [blame] | 206 | uint8_t spare:4, ac_ref_nr:4; |
| 207 | uint8_t data[0]; |
| 208 | #endif |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 209 | } __attribute__((packed)); |
| 210 | |
| 211 | /* Chapter 9.5.1 / Table 9.5.1 */ |
| 212 | struct gsm48_act_pdp_ctx_req { |
| 213 | uint8_t req_nsapi; |
| 214 | uint8_t req_llc_sapi; |
| 215 | uint8_t data[0]; |
| 216 | } __attribute__((packed)); |
| 217 | |
| 218 | /* Chapter 10.5.5.14 / Table 10.5.147 */ |
| 219 | enum gsm48_gmm_cause { |
| 220 | GMM_CAUSE_IMSI_UNKNOWN = 0x02, |
| 221 | GMM_CAUSE_ILLEGAL_MS = 0x03, |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 222 | GMM_CAUSE_IMEI_NOT_ACCEPTED = 0x05, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 223 | GMM_CAUSE_ILLEGAL_ME = 0x06, |
| 224 | GMM_CAUSE_GPRS_NOTALLOWED = 0x07, |
| 225 | GMM_CAUSE_GPRS_OTHER_NOTALLOWED = 0x08, |
| 226 | GMM_CAUSE_MS_ID_NOT_DERIVED = 0x09, |
| 227 | GMM_CAUSE_IMPL_DETACHED = 0x0a, |
| 228 | GMM_CAUSE_PLMN_NOTALLOWED = 0x0b, |
| 229 | GMM_CAUSE_LA_NOTALLOWED = 0x0c, |
| 230 | GMM_CAUSE_ROAMING_NOTALLOWED = 0x0d, |
| 231 | GMM_CAUSE_NO_GPRS_PLMN = 0x0e, |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 232 | GMM_CAUSE_NO_SUIT_CELL_IN_LA = 0x0f, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 233 | GMM_CAUSE_MSC_TEMP_NOTREACH = 0x10, |
| 234 | GMM_CAUSE_NET_FAIL = 0x11, |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 235 | GMM_CAUSE_MAC_FAIL = 0x14, |
| 236 | GMM_CAUSE_SYNC_FAIL = 0x15, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 237 | GMM_CAUSE_CONGESTION = 0x16, |
Harald Welte | 82f94ef | 2016-05-05 23:33:27 +0200 | [diff] [blame] | 238 | GMM_CAUSE_GSM_AUTH_UNACCEPT = 0x17, |
| 239 | GMM_CAUSE_NOT_AUTH_FOR_CSG = 0x19, |
| 240 | GMM_CAUSE_SMS_VIA_GPRS_IN_RA = 0x1c, |
| 241 | GMM_CAUSE_NO_PDP_ACTIVATED = 0x28, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 242 | GMM_CAUSE_SEM_INCORR_MSG = 0x5f, |
| 243 | GMM_CAUSE_INV_MAND_INFO = 0x60, |
| 244 | GMM_CAUSE_MSGT_NOTEXIST_NOTIMPL = 0x61, |
| 245 | GMM_CAUSE_MSGT_INCOMP_P_STATE = 0x62, |
| 246 | GMM_CAUSE_IE_NOTEXIST_NOTIMPL = 0x63, |
| 247 | GMM_CAUSE_COND_IE_ERR = 0x64, |
| 248 | GMM_CAUSE_MSG_INCOMP_P_STATE = 0x65, |
| 249 | GMM_CAUSE_PROTO_ERR_UNSPEC = 0x6f, |
| 250 | }; |
| 251 | |
| 252 | extern const struct value_string *gsm48_gmm_cause_names; |
| 253 | |
Neels Hofmeyr | 6ad50aa | 2019-01-14 20:28:56 +0100 | [diff] [blame] | 254 | /* 3GPP TS 24.008 10.5.6.6 / Table 10.5.157 */ |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 255 | enum gsm48_gsm_cause { |
Daniel Willmann | 6959e3c | 2017-05-12 11:20:53 +0200 | [diff] [blame] | 256 | GSM_CAUSE_OPER_DET_BARR = 0x08, |
| 257 | GSM_CAUSE_MBMS_CAP_INSUF = 0x18, |
| 258 | GSM_CAUSE_LLC_SNDCP_FAIL = 0x19, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 259 | GSM_CAUSE_INSUFF_RSRC = 0x1a, |
| 260 | GSM_CAUSE_MISSING_APN = 0x1b, |
| 261 | GSM_CAUSE_UNKNOWN_PDP = 0x1c, |
| 262 | GSM_CAUSE_AUTH_FAILED = 0x1d, |
| 263 | GSM_CAUSE_ACT_REJ_GGSN = 0x1e, |
| 264 | GSM_CAUSE_ACT_REJ_UNSPEC = 0x1f, |
| 265 | GSM_CAUSE_SERV_OPT_NOTSUPP = 0x20, |
| 266 | GSM_CAUSE_REQ_SERV_OPT_NOTSUB = 0x21, |
| 267 | GSM_CAUSE_SERV_OPT_TEMP_OOO = 0x22, |
| 268 | GSM_CAUSE_NSAPI_IN_USE = 0x23, |
| 269 | GSM_CAUSE_DEACT_REGULAR = 0x24, |
| 270 | GSM_CAUSE_QOS_NOT_ACCEPTED = 0x25, |
| 271 | GSM_CAUSE_NET_FAIL = 0x26, |
| 272 | GSM_CAUSE_REACT_RQD = 0x27, |
| 273 | GSM_CAUSE_FEATURE_NOTSUPP = 0x28, |
| 274 | GSM_CAUSE_INVALID_TRANS_ID = 0x51, |
| 275 | GSM_CAUSE_SEM_INCORR_MSG = 0x5f, |
| 276 | GSM_CAUSE_INV_MAND_INFO = 0x60, |
| 277 | GSM_CAUSE_MSGT_NOTEXIST_NOTIMPL = 0x61, |
| 278 | GSM_CAUSE_MSGT_INCOMP_P_STATE = 0x62, |
| 279 | GSM_CAUSE_IE_NOTEXIST_NOTIMPL = 0x63, |
| 280 | GSM_CAUSE_COND_IE_ERR = 0x64, |
| 281 | GSM_CAUSE_MSG_INCOMP_P_STATE = 0x65, |
| 282 | GSM_CAUSE_PROTO_ERR_UNSPEC = 0x6f, |
| 283 | }; |
| 284 | |
| 285 | extern const struct value_string *gsm48_gsm_cause_names; |
| 286 | |
| 287 | /* Section 6.1.2.2: Session management states on the network side */ |
| 288 | enum gsm48_pdp_state { |
| 289 | PDP_S_INACTIVE, |
| 290 | PDP_S_ACTIVE_PENDING, |
| 291 | PDP_S_ACTIVE, |
| 292 | PDP_S_INACTIVE_PENDING, |
| 293 | PDP_S_MODIFY_PENDING, |
| 294 | }; |
| 295 | |
| 296 | /* Table 10.5.155/3GPP TS 24.008 */ |
| 297 | enum gsm48_pdp_type_org { |
| 298 | PDP_TYPE_ORG_ETSI = 0x00, |
| 299 | PDP_TYPE_ORG_IETF = 0x01, |
| 300 | }; |
| 301 | enum gsm48_pdp_type_nr { |
| 302 | PDP_TYPE_N_ETSI_RESERVED = 0x00, |
| 303 | PDP_TYPE_N_ETSI_PPP = 0x01, |
| 304 | PDP_TYPE_N_IETF_IPv4 = 0x21, |
| 305 | PDP_TYPE_N_IETF_IPv6 = 0x57, |
Keith | 3f43134 | 2021-09-29 21:04:37 +0200 | [diff] [blame] | 306 | PDP_TYPE_N_IETF_IPv4v6 = 0x8D, |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 307 | }; |
| 308 | |
| 309 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 310 | enum gsm48_qos_reliab_class { |
| 311 | GSM48_QOS_RC_LLC_ACK_RLC_ACK_DATA_PROT = 2, |
| 312 | GSM48_QOS_RC_LLC_UN_RLC_ACK_DATA_PROT = 3, |
| 313 | GSM48_QOS_RC_LLC_UN_RLC_UN_PROT_DATA = 4, |
| 314 | GSM48_QOS_RC_LLC_UN_RLC_UN_DATA_UN = 5, |
| 315 | }; |
| 316 | |
| 317 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 318 | enum gsm48_qos_preced_class { |
| 319 | GSM48_QOS_PC_HIGH = 1, |
| 320 | GSM48_QOS_PC_NORMAL = 2, |
| 321 | GSM48_QOS_PC_LOW = 3, |
| 322 | }; |
| 323 | |
| 324 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 325 | enum gsm48_qos_peak_tput { |
| 326 | GSM48_QOS_PEAK_TPUT_1000bps = 1, |
| 327 | GSM48_QOS_PEAK_TPUT_2000bps = 2, |
| 328 | GSM48_QOS_PEAK_TPUT_4000bps = 3, |
| 329 | GSM48_QOS_PEAK_TPUT_8000bps = 4, |
| 330 | GSM48_QOS_PEAK_TPUT_16000bps = 5, |
| 331 | GSM48_QOS_PEAK_TPUT_32000bps = 6, |
| 332 | GSM48_QOS_PEAK_TPUT_64000bps = 7, |
| 333 | GSM48_QOS_PEAK_TPUT_128000bps = 8, |
| 334 | GSM48_QOS_PEAK_TPUT_256000bps = 9, |
| 335 | }; |
| 336 | |
| 337 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 338 | enum gsm48_qos_mean_tput { |
| 339 | GSM48_QOS_MEAN_TPUT_100bph = 1, |
| 340 | GSM48_QOS_MEAN_TPUT_200bph = 2, |
| 341 | GSM48_QOS_MEAN_TPUT_500bph = 3, |
| 342 | GSM48_QOS_MEAN_TPUT_1000bph = 4, |
| 343 | GSM48_QOS_MEAN_TPUT_2000bph = 5, |
| 344 | GSM48_QOS_MEAN_TPUT_5000bph = 6, |
| 345 | GSM48_QOS_MEAN_TPUT_10000bph = 7, |
| 346 | GSM48_QOS_MEAN_TPUT_20000bph = 8, |
| 347 | GSM48_QOS_MEAN_TPUT_50000bph = 9, |
| 348 | GSM48_QOS_MEAN_TPUT_100kbph = 10, |
| 349 | GSM48_QOS_MEAN_TPUT_200kbph = 11, |
| 350 | GSM48_QOS_MEAN_TPUT_500kbph = 0xc, |
| 351 | GSM48_QOS_MEAN_TPUT_1Mbph = 0xd, |
| 352 | GSM48_QOS_MEAN_TPUT_2Mbph = 0xe, |
| 353 | GSM48_QOS_MEAN_TPUT_5Mbph = 0xf, |
| 354 | GSM48_QOS_MEAN_TPUT_10Mbph = 0x10, |
| 355 | GSM48_QOS_MEAN_TPUT_20Mbph = 0x11, |
| 356 | GSM48_QOS_MEAN_TPUT_50Mbph = 0x12, |
| 357 | GSM48_QOS_MEAN_TPUT_BEST_EFFORT = 0x1f, |
| 358 | }; |
| 359 | |
| 360 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 361 | enum gsm48_qos_err_sdu { |
| 362 | GSM48_QOS_ERRSDU_NODETECT = 1, |
| 363 | GSM48_QOS_ERRSDU_YES = 2, |
| 364 | GSM48_QOS_ERRSDU_NO = 3, |
| 365 | }; |
| 366 | |
| 367 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 368 | enum gsm48_qos_deliv_order { |
| 369 | GSM48_QOS_DO_ORDERED = 1, |
| 370 | GSM48_QOS_DO_UNORDERED = 2, |
| 371 | }; |
| 372 | |
| 373 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 374 | enum gsm48_qos_traf_class { |
| 375 | GSM48_QOS_TC_CONVERSATIONAL = 1, |
| 376 | GSM48_QOS_TC_STREAMING = 2, |
| 377 | GSM48_QOS_TC_INTERACTIVE = 3, |
| 378 | GSM48_QOS_TC_BACKGROUND = 4, |
| 379 | }; |
| 380 | |
| 381 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 382 | enum gsm48_qos_max_sdu_size { |
| 383 | /* values below in 10 octet granularity */ |
| 384 | GSM48_QOS_MAXSDU_1502 = 0x97, |
| 385 | GSM48_QOS_MAXSDU_1510 = 0x98, |
| 386 | GSM48_QOS_MAXSDU_1520 = 0x99, |
| 387 | }; |
| 388 | |
| 389 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 390 | enum gsm48_qos_max_bitrate { |
| 391 | GSM48_QOS_MBRATE_1k = 0x01, |
| 392 | GSM48_QOS_MBRATE_63k = 0x3f, |
| 393 | GSM48_QOS_MBRATE_64k = 0x40, |
| 394 | GSM48_QOS_MBRATE_568k = 0x7f, |
| 395 | GSM48_QOS_MBRATE_576k = 0x80, |
| 396 | GSM48_QOS_MBRATE_8640k = 0xfe, |
| 397 | GSM48_QOS_MBRATE_0k = 0xff, |
| 398 | }; |
| 399 | |
| 400 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 401 | enum gsm48_qos_resid_ber { |
| 402 | GSM48_QOS_RBER_5e_2 = 0x01, |
| 403 | GSM48_QOS_RBER_1e_2 = 0x02, |
| 404 | GSM48_QOS_RBER_5e_3 = 0x03, |
| 405 | GSM48_QOS_RBER_4e_3 = 0x04, |
| 406 | GSM48_QOS_RBER_1e_3 = 0x05, |
| 407 | GSM48_QOS_RBER_1e_4 = 0x06, |
| 408 | GSM48_QOS_RBER_1e_5 = 0x07, |
| 409 | GSM48_QOS_RBER_1e_6 = 0x08, |
| 410 | GSM48_QOS_RBER_6e_8 = 0x09, |
| 411 | }; |
| 412 | |
| 413 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 414 | enum gsm48_qos_sdu_err { |
| 415 | GSM48_QOS_SERR_1e_2 = 0x01, |
| 416 | GSM48_QOS_SERR_7e_2 = 0x02, |
| 417 | GSM48_QOS_SERR_1e_3 = 0x03, |
| 418 | GSM48_QOS_SERR_1e_4 = 0x04, |
| 419 | GSM48_QOS_SERR_1e_5 = 0x05, |
| 420 | GSM48_QOS_SERR_1e_6 = 0x06, |
| 421 | GSM48_QOS_SERR_1e_1 = 0x07, |
| 422 | }; |
| 423 | |
Neels Hofmeyr | 0318f6b | 2016-08-29 13:18:56 +0200 | [diff] [blame] | 424 | /* 3GPP 24.008 / Chapter 10.5.5.20 / Table 10.5.153a */ |
| 425 | enum gsm48_gmm_service_type { |
| 426 | GPRS_SERVICE_T_SIGNALLING = 0x00, |
| 427 | GPRS_SERVICE_T_DATA = 0x01, |
| 428 | GPRS_SERVICE_T_PAGING_RESP = 0x02, |
| 429 | GPRS_SERVICE_T_MBMS_MC_SERV = 0x03, |
| 430 | GPRS_SERVICE_T_MBMS_BC_SERV = 0x04, |
| 431 | }; |
| 432 | |
| 433 | extern const struct value_string *gprs_service_t_strs; |
| 434 | |
Max | a337b9c | 2016-06-27 15:51:34 +0200 | [diff] [blame] | 435 | bool gprs_ms_net_cap_gea_supported(const uint8_t *ms_net_cap, uint8_t cap_len, |
| 436 | enum gprs_ciph_algo gea); |
| 437 | |
Harald Welte | 64f38c0 | 2016-04-20 17:12:24 +0200 | [diff] [blame] | 438 | /* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */ |
| 439 | struct gsm48_qos { |
| 440 | /* octet 3 */ |
| 441 | uint8_t reliab_class:3; |
| 442 | uint8_t delay_class:3; |
| 443 | uint8_t spare:2; |
| 444 | /* octet 4 */ |
| 445 | uint8_t preced_class:3; |
| 446 | uint8_t spare2:1; |
| 447 | uint8_t peak_tput:4; |
| 448 | /* octet 5 */ |
| 449 | uint8_t mean_tput:5; |
| 450 | uint8_t spare3:3; |
| 451 | /* octet 6 */ |
| 452 | uint8_t deliv_err_sdu:3; |
| 453 | uint8_t deliv_order:2; |
| 454 | uint8_t traf_class:3; |
| 455 | /* octet 7 */ |
| 456 | uint8_t max_sdu_size; |
| 457 | /* octet 8 */ |
| 458 | uint8_t max_bitrate_up; |
| 459 | /* octet 9 */ |
| 460 | uint8_t max_bitrate_down; |
| 461 | /* octet 10 */ |
| 462 | uint8_t sdu_err_ratio:4; |
| 463 | uint8_t resid_ber:4; |
| 464 | /* octet 11 */ |
| 465 | uint8_t handling_prio:2; |
| 466 | uint8_t xfer_delay:6; |
| 467 | /* octet 12 */ |
| 468 | uint8_t guar_bitrate_up; |
| 469 | /* octet 13 */ |
| 470 | uint8_t guar_bitrate_down; |
| 471 | /* octet 14 */ |
| 472 | uint8_t src_stats_desc:4; |
| 473 | uint8_t sig_ind:1; |
| 474 | uint8_t spare5:3; |
| 475 | /* octet 15 */ |
| 476 | uint8_t max_bitrate_down_ext; |
| 477 | /* octet 16 */ |
| 478 | uint8_t guar_bitrate_down_ext; |
| 479 | }; |