anjana_sreekumar@infosys.com | 991c206 | 2020-01-08 11:42:57 +0530 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd. |
| 3 | * Copyright (c) 2017 Intel Corporation |
| 4 | * |
| 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at |
| 8 | * |
| 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | * |
| 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
| 16 | */ |
| 17 | |
| 18 | #ifndef __S6A_FD_H__ |
| 19 | #define __S6A_FD_H__ |
| 20 | |
| 21 | #include <stdlib.h> |
| 22 | #include <string.h> |
| 23 | #include <ctype.h> |
| 24 | #include <stdio.h> |
| 25 | #include <stdbool.h> |
| 26 | #include <ctype.h> |
| 27 | #include <freeDiameter/freeDiameter-host.h> |
| 28 | #include <freeDiameter/libfdproto.h> |
| 29 | #include <freeDiameter/libfdcore.h> |
| 30 | |
| 31 | #include "err_codes.h" |
| 32 | #include "s6a.h" |
| 33 | |
| 34 | /*Update location request(ULR) flag bitfields*/ |
| 35 | /* Single-Registration-Indication -------1*/ |
| 36 | #define ULR_FLAG_SINGLE_REG_IND (1) |
| 37 | /*S6a/S6d-Indicator: ------1-*/ |
| 38 | #define ULR_FLAG_S6AS6D_IND (1<<1) |
| 39 | /*Skip-Subscriber-Data: -----1--*/ |
| 40 | #define ULR_FLAGS_SKIP_SUB_DATA (1<<2) |
| 41 | /*GPRS-Subscription-Data-Indicator:----1---*/ |
| 42 | #define ULR_FLAGS_GPRS_SUBS_DATA_IBND (1<<3) |
| 43 | /*Node-Type-Indicator: ---1----*/ |
| 44 | #define ULR_FLAGS_NODE_TYPE_IIND (1<<4) |
| 45 | /*Initial-Attach-Indicator: --1-----*/ |
| 46 | #define ULR_FLAG_INIT_ATCH_IND (1<<5) |
| 47 | /*PS-LCS-Not-Supported-By-UE: -1------*/ |
| 48 | #define ULR_FLAG_PS_LCS_NOT_SUPPORTED_BY_UE (1<<6) |
| 49 | /*SMS-Only-Indication: 1-------*/ |
| 50 | #define ULR_FLAG_SMS_ONLY_IND (1<<7) |
| 51 | |
| 52 | #define S6A_RAT_EUTRAN 1004 |
| 53 | |
| 54 | #define FD_DICT_SEARCH(dict, cond, id, obj) \ |
| 55 | CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, dict, cond,\ |
| 56 | (void*)id, &obj, ENOENT),\ |
| 57 | return S6A_FD_DICTSRCH_FAILED) |
| 58 | |
| 59 | /** |
| 60 | * @brief Freediameter result |
| 61 | */ |
| 62 | struct fd_result { |
| 63 | bool present; |
| 64 | unsigned int vendor_id; |
| 65 | unsigned int result_code; |
| 66 | }; |
| 67 | |
| 68 | /** |
| 69 | * @brief Freediameter disctionary objects user in s6a transactions |
| 70 | */ |
| 71 | struct fd_dict_objects { |
| 72 | /*s6a and app id*/ |
| 73 | struct dict_object *vendor_id; |
| 74 | struct dict_object *s6a_app; |
| 75 | |
| 76 | /*Message types*/ |
| 77 | struct dict_object *AIR; /*Authentication-Information-Request*/ |
| 78 | struct dict_object *AIA; /*Authentication-information-Answer*/ |
| 79 | struct dict_object *ULR; /*Update-Location-Request*/ |
| 80 | struct dict_object *ULA; /*Update-Location-Answer*/ |
| 81 | struct dict_object *PUR; /*Purge-Request*/ |
| 82 | struct dict_object *PUA; /*Purge-Answer*/ |
| 83 | //NI Detach |
| 84 | struct dict_object *CLR; /*Cancel-Location-Request*/ |
| 85 | struct dict_object *CLA; /*Cancel-Location-Answer*/ |
| 86 | //NI Detach |
| 87 | |
| 88 | /*common s6a requst header*/ |
| 89 | struct dict_object *auth_app_id; |
| 90 | struct dict_object *sess_id; |
| 91 | struct dict_object *org_host; //NI Detach |
| 92 | struct dict_object *org_realm; //NI Detach |
| 93 | struct dict_object *dest_host; |
| 94 | struct dict_object *dest_realm; |
| 95 | struct dict_object *auth_sess_state; |
| 96 | struct dict_object *res_code; |
| 97 | struct dict_object *exp_res; |
| 98 | struct dict_object *user_name; |
| 99 | |
| 100 | /*AIR elements*/ |
| 101 | struct dict_object *visited_PLMN_id; |
| 102 | struct dict_object *req_EUTRAN_auth_info; |
| 103 | struct dict_object *no_of_req_vectors; |
| 104 | struct dict_object *immediate_resp_pref; |
| 105 | |
| 106 | /*AIA elements*/ |
| 107 | struct dict_object *auth_info; |
| 108 | struct dict_object *E_UTRAN_vector; |
| 109 | struct dict_object *RAND; |
| 110 | struct dict_object *XRES; |
| 111 | struct dict_object *AUTN; |
| 112 | struct dict_object *KASME; |
| 113 | |
| 114 | /*ULR elements*/ |
| 115 | struct dict_object *RAT_type; |
| 116 | struct dict_object *ULR_flags; |
| 117 | |
| 118 | /*ULA elements*/ |
| 119 | struct dict_object *ULA_flags; |
| 120 | struct dict_object *subscription_data; |
| 121 | struct dict_object *subscriber_status; |
| 122 | struct dict_object *MSISDN; |
| 123 | struct dict_object *net_access_mode; |
| 124 | struct dict_object *access_restriction_data; |
| 125 | struct dict_object *AMBR; |
| 126 | struct dict_object *max_req_bandwidth_UL; |
| 127 | struct dict_object *max_req_bandwidth_DL; |
| 128 | struct dict_object *APN_config_profile; |
| 129 | struct dict_object *ctx_id; |
| 130 | struct dict_object *additional_ctx_id; |
| 131 | struct dict_object *all_APN_configs_included_ind; |
| 132 | struct dict_object *APN_config; |
| 133 | struct dict_object *PDN_type; |
| 134 | struct dict_object *PDN_GW_alloc_type; |
| 135 | struct dict_object *specific_APN_info; |
| 136 | struct dict_object *non_IP_PDN_type_ind; |
| 137 | struct dict_object *non_IP_data_delivery_mech; |
| 138 | struct dict_object *SCEF_ID; |
| 139 | struct dict_object *priority_Level; |
| 140 | struct dict_object *location_area_id; |
| 141 | struct dict_object *tracking_area_id; |
| 142 | struct dict_object *subsc_periodic_RAU_TAU_tmr; |
| 143 | |
| 144 | /*PUR elements*/ |
| 145 | struct dict_object *PUR_flags; |
| 146 | struct dict_object *reg_subs_zone_code; |
| 147 | |
| 148 | //NI Detach |
| 149 | /*CLR elements*/ |
| 150 | struct dict_object *cancellation_type; |
| 151 | }; |
| 152 | |
| 153 | /** |
| 154 | * @brief Freediameter dictionary data storage |
| 155 | */ |
| 156 | struct fd_dict_data { |
| 157 | /* S6A AVP data */ |
| 158 | struct dict_application_data app_s6a_data; |
| 159 | struct dict_vendor_data vendor_data; |
| 160 | |
| 161 | /*Common s6a elements*/ |
| 162 | struct dict_avp_data res_code; |
| 163 | struct dict_avp_data exp_res; |
| 164 | struct dict_avp_data exp_res_code; |
| 165 | struct dict_avp_data vendor_specific_app_id; |
| 166 | struct dict_avp_data auth_app_id; |
| 167 | struct dict_avp_data acct_app_id; |
| 168 | struct dict_avp_data vendor_id; |
| 169 | struct dict_avp_data sess_id; |
| 170 | struct dict_avp_data auth_sess_state; |
| 171 | struct dict_avp_data org_host; |
| 172 | struct dict_avp_data org_realm; |
| 173 | struct dict_avp_data dest_host; |
| 174 | struct dict_avp_data dest_realm; |
| 175 | struct dict_avp_data user_name; |
| 176 | struct dict_avp_data visited_PLMN_id; |
| 177 | struct dict_avp_data req_EUTRAN_auth_info; |
| 178 | struct dict_avp_data no_of_req_vectors; |
| 179 | struct dict_avp_data immediate_resp_pref; |
| 180 | |
| 181 | /*AIA data*/ |
| 182 | struct dict_avp_data auth_info; |
| 183 | struct dict_avp_data E_UTRAN_vector; |
| 184 | struct dict_avp_data RAND; |
| 185 | struct dict_avp_data XRES; |
| 186 | struct dict_avp_data AUTN; |
| 187 | struct dict_avp_data KASME; |
| 188 | |
| 189 | /*ULR data*/ |
| 190 | struct dict_avp_data RAT_type; |
| 191 | struct dict_avp_data ULR_flags; |
| 192 | |
| 193 | /*ULA data*/ |
| 194 | struct dict_avp_data ULA_flags; |
| 195 | struct dict_avp_data subscription_data; |
| 196 | struct dict_avp_data subscriber_status; |
| 197 | struct dict_avp_data MSISDN; |
| 198 | struct dict_avp_data net_access_mode; |
| 199 | struct dict_avp_data access_restriction_data; |
| 200 | struct dict_avp_data AMBR; |
| 201 | struct dict_avp_data max_req_bandwidth_UL; |
| 202 | struct dict_avp_data max_req_bandwidth_DL; |
| 203 | struct dict_avp_data APN_config_profile; |
| 204 | struct dict_avp_data ctx_id; |
| 205 | struct dict_avp_data additional_ctx_id; |
| 206 | struct dict_avp_data all_APN_configs_included_ind; |
| 207 | struct dict_avp_data APN_config; |
| 208 | struct dict_avp_data PDN_type; |
| 209 | struct dict_avp_data PDN_GW_alloc_type; |
| 210 | struct dict_avp_data specific_APN_info; |
| 211 | struct dict_avp_data non_IP_PDN_type_ind; |
| 212 | struct dict_avp_data non_IP_data_delivery_mech; |
| 213 | struct dict_avp_data SCEF_ID; |
| 214 | struct dict_avp_data priority_Level; |
| 215 | struct dict_avp_data location_area_id; |
| 216 | struct dict_avp_data tracking_area_id; |
| 217 | struct dict_avp_data subsc_periodic_RAU_TAU_tmr; |
| 218 | |
| 219 | /*PUR flags*/ |
| 220 | struct dict_avp_data PUR_flags; |
| 221 | struct dict_avp_data reg_subs_zone_code; |
| 222 | |
| 223 | //NI Detach |
| 224 | /*CLR Data*/ |
| 225 | struct dict_avp_data cancellation_type; |
| 226 | }; |
| 227 | |
| 228 | /** |
| 229 | * @brief Initialize freediameter parser, callbacks, dictionary etc. |
| 230 | * @params none |
| 231 | * @return int as success/fail |
| 232 | */ |
| 233 | int |
| 234 | s6a_fd_init(); |
| 235 | |
| 236 | /** |
| 237 | * @brief Initialize freediameter dictionary |
| 238 | * @param none |
| 239 | * @return int as success/fail |
| 240 | */ |
| 241 | int |
| 242 | s6a_fd_objs_init(); |
| 243 | |
| 244 | /** |
| 245 | * @brief Initialize freediameter dictionary data objects |
| 246 | * @param none |
| 247 | * @return int as success/fail |
| 248 | */ |
| 249 | int |
| 250 | s6a_fd_data_init(); |
| 251 | |
| 252 | /** |
| 253 | * @brief Initialize freediameter API callbacks for response handling |
| 254 | * @param none |
| 255 | * @return int as success/fail |
| 256 | */ |
| 257 | int |
| 258 | s6a_fd_cb_reg(); |
| 259 | |
| 260 | /** |
| 261 | * @brief extract ue index from session id of freediameter |
| 262 | * @param[in] sid - session id |
| 263 | * @param[in] sidlen - Session Id length |
| 264 | * @return UE index extracted out of session id |
| 265 | */ |
| 266 | int |
| 267 | get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen); |
| 268 | |
| 269 | /** |
| 270 | * @brief Cression session id, append ue index to session id |
| 271 | * @param[in, out] s6a_sess - session information |
| 272 | * @param[in] ue_idx to append to session id |
| 273 | * @return int as success/fail |
| 274 | */ |
| 275 | short |
| 276 | create_fd_sess_id(struct s6a_sess_info *s6a_sess, int ue_idx); |
| 277 | |
| 278 | int |
| 279 | aia_resp_callback(struct msg **msg, struct avp *avp, struct session *sess, |
| 280 | void *data, enum disp_action *act); |
| 281 | |
| 282 | int |
| 283 | ula_resp_callback(struct msg **msg, struct avp *avp, struct session *sess, |
| 284 | void *data, enum disp_action *act); |
| 285 | |
| 286 | //NI Detach |
| 287 | int |
| 288 | clr_resp_callback(struct msg **msg, struct avp *avp, struct session *sess, |
| 289 | void *data, enum disp_action *act); |
| 290 | |
| 291 | |
| 292 | #if 0 |
| 293 | int |
| 294 | purge_resp_callback(struct msg **msg, struct avp *avp, struct session *sess, |
| 295 | void *data, enum disp_action *act); |
| 296 | #endif |
| 297 | |
| 298 | /** |
| 299 | * @brief Dumo freediameter message on console |
| 300 | * @param msg - Freediameter message structure |
| 301 | * @return void |
| 302 | */ |
| 303 | void |
| 304 | dump_fd_msg(struct msg *msg); |
| 305 | |
| 306 | /** |
| 307 | * brief add AVl object to freediameter message |
| 308 | * @param[in] avp value to add |
| 309 | * @param[in] ditionary object for reference |
| 310 | * @param[out] frediameter message where avp is added |
| 311 | * @return int as success/fail |
| 312 | */ |
| 313 | int |
| 314 | add_fd_msg(union avp_value *val, struct dict_object * obj, |
| 315 | struct msg **msg_buf); |
| 316 | |
| 317 | void |
| 318 | handle_perf_hss_aia(int ue_idx, struct hss_aia_msg *aia); |
| 319 | |
| 320 | void |
| 321 | handle_perf_hss_ula(int ue_idx, struct hss_ula_msg *ula); |
| 322 | |
| 323 | void |
| 324 | handle_perf_hss_purge_resp(int ue_idx); |
| 325 | |
| 326 | //NI Detach |
| 327 | void |
| 328 | handle_perf_hss_clr(int ue_idx, struct hss_clr_msg *clr); |
| 329 | |
| 330 | short |
| 331 | parse_fd_result(struct avp *avp, struct fd_result *res); |
| 332 | |
| 333 | #endif /* __S6A_FD_H__ */ |