Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 1 | % This Source Code Form is subject to the terms of the Mozilla Public |
| 2 | % License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 | % file, You can obtain one at https://mozilla.org/MPL/2.0/. |
| 4 | % (C) 2019 Andrey Velikiy <agreat22@gmail.com> |
| 5 | % (C) 2019 Fairwaves (edited) |
Harald Welte | b470dfa | 2019-12-01 16:28:48 +0100 | [diff] [blame] | 6 | % (C) 2019 Harald Welte <laforge@gnumonks.org> |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 7 | |
| 8 | -ifndef(GSUP_PROTOCOL). |
| 9 | -define(GSUP_PROTOCOL, true). |
| 10 | |
| 11 | -type 'GSUPMessageType'() :: location_upd_req |
| 12 | | location_upd_err |
| 13 | | location_upd_res |
| 14 | | send_auth_info_req |
| 15 | | send_auth_info_err |
| 16 | | send_auth_info_res |
| 17 | | auth_failure_report |
| 18 | | purge_ms_req |
| 19 | | purge_ms_err |
| 20 | | purge_ms_res |
| 21 | | insert_sub_data_req |
| 22 | | insert_sub_data_err |
| 23 | | insert_sub_data_res |
| 24 | | delete_sub_data_req |
| 25 | | delete_sub_data_err |
| 26 | | delete_sub_data_res |
| 27 | | location_cancellation_req |
| 28 | | location_cancellation_err |
| 29 | | location_cancellation_res |
| 30 | | ss_req |
| 31 | | ss_err |
| 32 | | ss_res |
Andrey Velikiy | fde0fd9 | 2019-08-02 09:42:22 +0300 | [diff] [blame] | 33 | | mo_forward_sm_req |
| 34 | | mo_forward_sm_err |
| 35 | | mo_forward_sm_res |
| 36 | | mt_forward_sm_req |
| 37 | | mt_forward_sm_err |
| 38 | | mt_forward_sm_res |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 39 | | ready_for_sm_req |
| 40 | | ready_for_sm_err |
| 41 | | ready_for_sm_res |
| 42 | | check_imei_req |
| 43 | | check_imei_err |
Andrey Velikiy | bb29966 | 2019-06-19 14:19:10 +0300 | [diff] [blame] | 44 | | check_imei_res |
| 45 | | e_prepare_handover_req |
| 46 | | e_prepare_handover_err |
| 47 | | e_prepare_handover_res |
| 48 | | e_prepare_subseq_handover_req |
| 49 | | e_prepare_subseq_handover_err |
| 50 | | e_prepare_subseq_handover_res |
| 51 | | e_send_end_signal_req |
| 52 | | e_send_end_signal_err |
| 53 | | e_send_end_signal_res |
| 54 | | e_process_access_signalling_req |
| 55 | | e_forward_access_signalling_req |
| 56 | | e_close |
| 57 | | e_abort |
| 58 | | e_routing_err. |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 59 | |
Harald Welte | b76c7fa | 2019-08-22 13:48:00 +0200 | [diff] [blame] | 60 | -type 'GSUPRatType'() :: rat_unknown | rat_geran_a | rat_utran_iu | rat_eutran_sgs. |
| 61 | |
Harald Welte | 0ba5533 | 2019-08-12 18:53:08 +0200 | [diff] [blame] | 62 | -type 'GSUPAuthTuple'() :: #{ |
| 63 | rand := binary(), |
| 64 | sres := binary(), |
| 65 | kc := binary(), |
| 66 | ik => binary(), |
| 67 | ck => binary(), |
| 68 | autn => binary(), |
| 69 | res => binary() |
| 70 | }. |
| 71 | |
Harald Welte | c92ebfa | 2019-08-13 07:37:20 +0200 | [diff] [blame] | 72 | -type 'GSUPPdpInfo'() :: #{ |
| 73 | pdp_context_id => integer(), |
| 74 | pdp_type => integer(), |
| 75 | access_point_name => binary(), |
| 76 | quality_of_service => binary(), |
| 77 | pdp_charging => integer() |
| 78 | }. |
| 79 | |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 80 | -type 'GSUPMessage'() :: #{ |
| 81 | message_type := 'GSUPMessageType'(), |
| 82 | imsi := binary(), |
| 83 | cause => integer(), |
Harald Welte | 0ba5533 | 2019-08-12 18:53:08 +0200 | [diff] [blame] | 84 | auth_tuples => ['GSUPAuthTuple'()], |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 85 | pdp_info_complete => true, |
Harald Welte | c92ebfa | 2019-08-13 07:37:20 +0200 | [diff] [blame] | 86 | pdp_info_list => ['GSUPPdpInfo'()], |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 87 | cancellation_type => integer(), |
| 88 | freeze_p_tmsi => true, |
| 89 | msisdn => binary(), |
| 90 | hlr_number => binary(), |
| 91 | pdp_context_id => [integer()], |
| 92 | pdp_charging => integer(), |
| 93 | rand => binary(), |
| 94 | auts => binary(), |
| 95 | cn_domain => integer(), |
Harald Welte | bb32d46 | 2019-12-01 16:20:50 +0100 | [diff] [blame] | 96 | supported_rat_types => ['GSUPRatType'()], |
Harald Welte | b470dfa | 2019-12-01 16:28:48 +0100 | [diff] [blame] | 97 | current_rat_type => 'GSUPRatType'(), |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 98 | session_id => integer(), |
| 99 | session_state => integer(), |
| 100 | ss_info => binary(), |
| 101 | sm_rp_mr => integer(), |
| 102 | sm_rp_da => binary(), |
| 103 | sm_rp_oa => binary(), |
| 104 | sm_rp_ui => binary(), |
| 105 | sm_rp_cause => integer(), |
| 106 | sm_rp_mms => integer(), |
| 107 | sm_alert_reason => integer(), |
| 108 | imei => binary(), |
Andrey Velikiy | c66c8d0 | 2019-06-19 14:16:52 +0300 | [diff] [blame] | 109 | imei_check_result => integer(), |
Alexander Couzens | b656fc1 | 2019-12-27 05:04:40 +0100 | [diff] [blame] | 110 | num_vectors_req => integer(), |
Andrey Velikiy | bb29966 | 2019-06-19 14:19:10 +0300 | [diff] [blame] | 111 | message_class => integer(), |
| 112 | source_name => binary(), |
| 113 | destination_name => binary(), |
| 114 | an_apdu => binary(), |
| 115 | rr_cause => integer(), |
| 116 | session_management_cause => integer(), |
| 117 | bssap_cause => integer() |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 118 | }. |
| 119 | |
| 120 | -define(SESSION_STATE_BEGIN, 1). |
| 121 | -define(SESSION_STATE_CONTINUE, 2). |
| 122 | -define(SESSION_STATE_END, 3). |
| 123 | |
| 124 | -define(IMSI, 16#01). |
| 125 | -define(CAUSE, 16#02). |
| 126 | -define(AUTH_TUPLE, 16#03). |
| 127 | -define(PDP_INFO_COMPLETE, 16#04). |
| 128 | -define(PDP_INFO, 16#05). |
| 129 | -define(CANCELLATION_TYPE, 16#06). |
| 130 | -define(FREEZE_P_TMSI, 16#07). |
| 131 | -define(MSISDN, 16#08). |
| 132 | -define(HLR_NUMBER, 16#09). |
Andrey Velikiy | c66c8d0 | 2019-06-19 14:16:52 +0300 | [diff] [blame] | 133 | -define(MESSAGE_CLASS, 16#0a). |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 134 | -define(PDP_CONTEXT_ID, 16#10). |
| 135 | -define(PDP_TYPE, 16#11). |
| 136 | -define(ACCESS_POINT_NAME, 16#12). |
| 137 | -define(QUALITY_OF_SERVICE, 16#13). |
| 138 | -define(PDP_CHARGING, 16#14). |
| 139 | -define(RAND, 16#20). |
| 140 | -define(SRES, 16#21). |
| 141 | -define(KC, 16#22). |
| 142 | -define(IK, 16#23). |
| 143 | -define(CK, 16#24). |
| 144 | -define(AUTN, 16#25). |
| 145 | -define(AUTS, 16#26). |
| 146 | -define(RES, 16#27). |
| 147 | -define(CN_DOMAIN, 16#28). |
Harald Welte | bb32d46 | 2019-12-01 16:20:50 +0100 | [diff] [blame] | 148 | -define(SUPPORTED_RAT_TYPES, 16#29). |
Harald Welte | b470dfa | 2019-12-01 16:28:48 +0100 | [diff] [blame] | 149 | -define(CURRENT_RAT_TYPE, 16#2a). |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 150 | -define(SESSION_ID, 16#30). |
| 151 | -define(SESSION_STATE, 16#31). |
| 152 | -define(SS_INFO, 16#35). |
| 153 | -define(SM_RP_MR, 16#40). |
| 154 | -define(SM_RP_DA, 16#41). |
| 155 | -define(SM_RP_OA, 16#42). |
| 156 | -define(SM_RP_UI, 16#43). |
| 157 | -define(SM_RP_CAUSE, 16#44). |
| 158 | -define(SM_RP_MMS, 16#45). |
| 159 | -define(SM_ALERT_REASON, 16#46). |
| 160 | -define(IMEI, 16#50). |
| 161 | -define(IMEI_CHECK_RESULT, 16#51). |
Alexander Couzens | b656fc1 | 2019-12-27 05:04:40 +0100 | [diff] [blame] | 162 | -define(NUM_VECTORS_REQ, 16#52). |
Andrey Velikiy | bb29966 | 2019-06-19 14:19:10 +0300 | [diff] [blame] | 163 | -define(SOURCE_NAME, 16#60). |
| 164 | -define(DESTINATION_NAME, 16#61). |
| 165 | -define(AN_APDU, 16#62). |
| 166 | -define(RR_CAUSE, 16#63). |
| 167 | -define(BSSAP_CAUSE, 16#64). |
| 168 | -define(SESSION_MANAGEMENT_CAUSE, 16#65). |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 169 | |
| 170 | -define(MANDATORY_DEFAULT, [imsi, message_type]). |
| 171 | |
Vadim Yanitskiy | e708e54 | 2019-12-26 13:14:35 +0100 | [diff] [blame] | 172 | -define(OPTIONAL_DEFAULT, [message_class, source_name, destination_name]). |
Andrey Velikiy | c66c8d0 | 2019-06-19 14:16:52 +0300 | [diff] [blame] | 173 | |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 174 | -define (GSUP_MESSAGES(), #{ |
| 175 | 16#04 => #{message_type => location_upd_req, mandatory => [], optional => [cn_domain]}, |
| 176 | 16#05 => #{message_type => location_upd_err, mandatory => [cause]}, |
Andrey Velikiy | 1e80178 | 2019-06-24 14:09:57 +0300 | [diff] [blame] | 177 | 16#06 => #{message_type => location_upd_res, mandatory => [], optional => [msisdn, hlr_number, pdp_info_complete, pdp_info_list, pdp_charging]}, |
Alexander Couzens | b656fc1 | 2019-12-27 05:04:40 +0100 | [diff] [blame] | 178 | 16#08 => #{message_type => send_auth_info_req, mandatory => [], optional => [cn_domain, auts, rand, supported_rat_types, current_rat_type, num_vectors_req]}, |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 179 | 16#09 => #{message_type => send_auth_info_err, mandatory => [cause]}, |
Andrey Velikiy | 1e80178 | 2019-06-24 14:09:57 +0300 | [diff] [blame] | 180 | 16#0a => #{message_type => send_auth_info_res, mandatory => [], optional => [auth_tuples, auts, rand]}, |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 181 | 16#0b => #{message_type => auth_failure_report, mandatory => [], optional => [cn_domain]}, |
Andrey Velikiy | 1e80178 | 2019-06-24 14:09:57 +0300 | [diff] [blame] | 182 | 16#0c => #{message_type => purge_ms_req, mandatory => [], optional => [cn_domain, hlr_number]}, |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 183 | 16#0d => #{message_type => purge_ms_err, mandatory => [cause]}, |
| 184 | 16#0e => #{message_type => purge_ms_res, mandatory => [freeze_p_tmsi]}, |
Alexander Couzens | 8c72402 | 2019-12-27 18:34:54 +0100 | [diff] [blame^] | 185 | 16#10 => #{message_type => insert_sub_data_req, mandatory => [], optional => [cn_domain, msisdn, hlr_number, pdp_info_complete, pdp_info_list, pdp_charging]}, |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 186 | 16#11 => #{message_type => insert_sub_data_err, mandatory => [cause]}, |
| 187 | 16#12 => #{message_type => insert_sub_data_res, mandatory => []}, |
| 188 | 16#14 => #{message_type => delete_sub_data_req, mandatory => [], optional => [cn_domain, pdp_context_id]}, |
| 189 | 16#15 => #{message_type => delete_sub_data_err, mandatory => [cause]}, |
| 190 | 16#16 => #{message_type => delete_sub_data_res, mandatory => []}, |
| 191 | 16#1c => #{message_type => location_cancellation_req, mandatory => [], optional => [cn_domain, cancellation_type]}, |
| 192 | 16#1d => #{message_type => location_cancellation_err, mandatory => [cause]}, |
| 193 | 16#1e => #{message_type => location_cancellation_res, mandatory => [], optional => [cn_domain]}, |
| 194 | 16#20 => #{message_type => ss_req, mandatory => [session_id, session_state], optional => [ss_info]}, |
| 195 | 16#21 => #{message_type => ss_err, mandatory => [session_id, session_state, cause]}, |
| 196 | 16#22 => #{message_type => ss_res, mandatory => [session_id, session_state], optional => [ss_info]}, |
Andrey Velikiy | fde0fd9 | 2019-08-02 09:42:22 +0300 | [diff] [blame] | 197 | 16#24 => #{message_type => mo_forward_sm_req, mandatory => [sm_rp_mr, sm_rp_da, sm_rp_oa, sm_rp_ui]}, |
| 198 | 16#25 => #{message_type => mo_forward_sm_err, mandatory => [sm_rp_mr, sm_rp_cause], optional => [sm_rp_ui]}, |
| 199 | 16#26 => #{message_type => mo_forward_sm_res, mandatory => [sm_rp_mr], optional => [sm_rp_ui]}, |
| 200 | 16#28 => #{message_type => mt_forward_sm_req, mandatory => [sm_rp_mr, sm_rp_da, sm_rp_oa, sm_rp_ui], optional => [sm_rp_mms]}, |
| 201 | 16#29 => #{message_type => mt_forward_sm_err, mandatory => [sm_rp_mr, sm_rp_cause], optional => [sm_rp_ui]}, |
| 202 | 16#2a => #{message_type => mt_forward_sm_res, mandatory => [sm_rp_mr], optional => [sm_rp_ui]}, |
Vadim Yanitskiy | 657fee9 | 2019-12-26 13:18:02 +0100 | [diff] [blame] | 203 | 16#2c => #{message_type => ready_for_sm_req, mandatory => [sm_rp_mr, sm_alert_reason]}, |
| 204 | 16#2d => #{message_type => ready_for_sm_err, mandatory => [sm_rp_mr, sm_rp_cause], optional => [sm_rp_ui]}, |
| 205 | 16#2e => #{message_type => ready_for_sm_res, mandatory => [sm_rp_mr]}, |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 206 | 16#30 => #{message_type => check_imei_req, mandatory => [imei]}, |
| 207 | 16#31 => #{message_type => check_imei_err, mandatory => [cause]}, |
Andrey Velikiy | bb29966 | 2019-06-19 14:19:10 +0300 | [diff] [blame] | 208 | 16#32 => #{message_type => check_imei_res, mandatory => [imei_check_result]}, |
| 209 | 16#34 => #{message_type => e_prepare_handover_req, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 210 | 16#35 => #{message_type => e_prepare_handover_err, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state, bssap_cause]}, |
| 211 | 16#36 => #{message_type => e_prepare_handover_res, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 212 | 16#38 => #{message_type => e_prepare_subseq_handover_req, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 213 | 16#39 => #{message_type => e_prepare_subseq_handover_err, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state, bssap_cause]}, |
| 214 | 16#3a => #{message_type => e_prepare_subseq_handover_res, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 215 | 16#3c => #{message_type => e_send_end_signal_req, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 216 | 16#3d => #{message_type => e_send_end_signal_err, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state, bssap_cause]}, |
| 217 | 16#3e => #{message_type => e_send_end_signal_res, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 218 | 16#40 => #{message_type => e_process_access_signalling_req, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 219 | 16#44 => #{message_type => e_forward_access_signalling_req, mandatory => [message_class, source_name, destination_name, an_apdu, session_id, session_state]}, |
| 220 | 16#47 => #{message_type => e_close, mandatory => [message_class, source_name, destination_name, session_id, session_state]}, |
| 221 | 16#4b => #{message_type => e_abort, mandatory => [message_class, session_id, session_state, bssap_cause]}, |
| 222 | 16#4e => #{message_type => e_routing_err, mandatory => [message_class, source_name, destination_name, session_id, session_state]} |
Andrey Velikiy | b39df23 | 2019-06-14 21:08:00 +0300 | [diff] [blame] | 223 | }). |
| 224 | |
| 225 | -define(AUTH_TUPLE_MANDATORY, [rand, sres, kc]). |
| 226 | -define(AUTH_TUPLE_OPTIONAL, [ik, ck, autn, res]). |
| 227 | -define(PDP_INFO_MANDATORY, []). |
| 228 | -define(PDP_INFO_OPTIONAL, [pdp_context_id, pdp_type, access_point_name, quality_of_service, pdp_charging]). |
| 229 | |
| 230 | -endif. |