MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/s6a/fd_init.c b/src/s6a/fd_init.c
new file mode 100644
index 0000000..b93623f
--- /dev/null
+++ b/src/s6a/fd_init.c
@@ -0,0 +1,656 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "s6a.h"
+#include "s6a_fd.h"
+
+/**Globals and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+extern bool g_nolog;
+extern enum log_levels g_log_level;
+/**Globals and externs**/
+
+/**
+ * @brief Add element to freediameter message
+ * ready
+ * @param[in] val - AVP value to be added
+ * @param[in] obj - Disctionary object
+ * @param[in/out] msg_bufi
+ * @return int Sucess or failure code
+ */
+int
+add_fd_msg(union avp_value *val, struct dict_object * obj,
+ struct msg **msg_buf)
+{
+ struct avp *avp_val = NULL;
+
+ CHECK_FCT_DO(fd_msg_avp_new(obj, 0, &avp_val), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_msg_avp_setvalue(avp_val, val), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_msg_avp_add(*msg_buf, MSG_BRW_LAST_CHILD, avp_val),
+ return S6A_FD_ERROR);
+
+ return SUCCESS;
+}
+
+/**
+ * @brief Dumo freediameter message buffer
+ * ready
+ * @param[in] Freediameter message to print
+ * @return void
+ */
+void
+dump_fd_msg(struct msg *msg)
+{
+ //char *buf = NULL;
+ //int len = 0;
+
+ g_nolog = true;
+
+ if (g_nolog) return;
+
+ //TODO: correct - fprintf(stderr, "%s\n", fd_msg_dump_treeview(&buf, &len, NULL, msg,
+ // fd_g_config->cnf_dict, 0, 1));
+ //free(buf);
+}
+
+/**
+ * @brief Extract last integeger representing ue index from session ID
+ * @param[in] sid - session id
+ * @param[in] sidlen - session id len
+ * @return int - eror code
+ */
+int
+get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen)
+{
+ int index = -1;
+ char *tmp = strrchr((char *)sid, ';');
+
+ index = strtol(++tmp, NULL, 10);
+ log_msg(LOG_INFO, "Received resp for index %d\n", index);
+ return index;
+}
+
+/**
+ * @brief Initialize free diameter vendor info
+ * @param None
+ * @return int - eror code
+ */
+int
+s6a_fd_init()
+{
+ //TODO: check vendor id
+ vendor_id_t vendor_id = 10415;
+
+ FD_DICT_SEARCH(DICT_VENDOR, VENDOR_BY_ID, &vendor_id, g_fd_dict_objs.vendor_id);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.vendor_id, &g_fd_dict_data.vendor_data),
+ return S6A_FD_ERROR);
+
+ return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter dictionary objects
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_objs_init()
+{
+ //TODO: Check app id
+ application_id_t app_s6a = 16777251;
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Result-Code",
+ g_fd_dict_objs.res_code);
+
+ FD_DICT_SEARCH(DICT_APPLICATION, APPLICATION_BY_ID, &app_s6a,
+ g_fd_dict_objs.s6a_app);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Experimental-Result",
+ g_fd_dict_objs.exp_res);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Application-Id",
+ g_fd_dict_objs.auth_app_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Session-Id",
+ g_fd_dict_objs.sess_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Session-State",
+ g_fd_dict_objs.auth_sess_state);
+
+ //NI Detach
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Host",
+ g_fd_dict_objs.org_host);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Realm",
+ g_fd_dict_objs.org_realm);
+ //NI Detach
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Host",
+ g_fd_dict_objs.dest_host);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Realm",
+ g_fd_dict_objs.dest_realm);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "User-Name",
+ g_fd_dict_objs.user_name);
+
+ /*search and map avp names to elements*/
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+ "Authentication-Information-Request",
+ g_fd_dict_objs.AIR);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+ "Authentication-Information-Answer",
+ g_fd_dict_objs.AIA);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Request",
+ g_fd_dict_objs.ULR);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer",
+ g_fd_dict_objs.ULA);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request",
+ g_fd_dict_objs.PUR);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer",
+ g_fd_dict_objs.PUA);
+
+ //NI Detach
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Request",
+ g_fd_dict_objs.CLR);
+
+ FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Answer",
+ g_fd_dict_objs.CLA);
+ //NI Detach
+
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id",
+ g_fd_dict_objs.visited_PLMN_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Requested-EUTRAN-Authentication-Info",
+ g_fd_dict_objs.req_EUTRAN_auth_info);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Number-Of-Requested-Vectors",
+ g_fd_dict_objs.no_of_req_vectors);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Immediate-Response-Preferred",
+ g_fd_dict_objs.immediate_resp_pref);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info",
+ g_fd_dict_objs.auth_info);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector",
+ g_fd_dict_objs.E_UTRAN_vector);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAND",
+ g_fd_dict_objs.RAND);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "XRES",
+ g_fd_dict_objs.XRES);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AUTN",
+ g_fd_dict_objs.AUTN);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "KASME",
+ g_fd_dict_objs.KASME);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type",
+ g_fd_dict_objs.RAT_type);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULR-Flags",
+ g_fd_dict_objs.ULR_flags);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULA-Flags",
+ g_fd_dict_objs.ULA_flags);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data",
+ g_fd_dict_objs.subscription_data);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status",
+ g_fd_dict_objs.subscriber_status);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN",
+ g_fd_dict_objs.MSISDN);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Network-Access-Mode",
+ g_fd_dict_objs.net_access_mode);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Access-Restriction-Data",
+ g_fd_dict_objs.access_restriction_data);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR",
+ g_fd_dict_objs.AMBR);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Max-Requested-Bandwidth-UL",
+ g_fd_dict_objs.max_req_bandwidth_UL);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Max-Requested-Bandwidth-DL",
+ g_fd_dict_objs.max_req_bandwidth_DL);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "APN-Configuration-Profile",
+ g_fd_dict_objs.APN_config_profile);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Context-Identifier",
+ g_fd_dict_objs.ctx_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Additional-Context-Identifier",
+ g_fd_dict_objs.additional_ctx_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "All-APN-Configurations-Included-Indicator",
+ g_fd_dict_objs.all_APN_configs_included_ind);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration",
+ g_fd_dict_objs.APN_config);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDN-Type",
+ g_fd_dict_objs.PDN_type);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "PDN-GW-Allocation-Type",
+ g_fd_dict_objs.PDN_GW_alloc_type);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info",
+ g_fd_dict_objs.specific_APN_info);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Non-IP-PDN-Type-Indicator",
+ g_fd_dict_objs.non_IP_PDN_type_ind);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Non-IP-Data-Delivery-Mechanism",
+ g_fd_dict_objs.non_IP_data_delivery_mech);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SCEF-ID",
+ g_fd_dict_objs.SCEF_ID);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level",
+ g_fd_dict_objs.priority_Level);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Location-Area-Identity",
+ g_fd_dict_objs.location_area_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Tracking-Area-Identity",
+ g_fd_dict_objs.tracking_area_id);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Subscribed-Periodic-RAU-TAU-Timer",
+ g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PUR-Flags",
+ g_fd_dict_objs.PUR_flags);
+
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Regional-Subscription-Zone-Code",
+ g_fd_dict_objs.reg_subs_zone_code);
+ //NI Detach
+ FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+ "Cancellation-Type",
+ g_fd_dict_objs.cancellation_type);
+ return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter data objects for the dictionary object
+ * initialized
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_data_init()
+{
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.s6a_app,
+ &g_fd_dict_data.app_s6a_data), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.res_code,
+ &g_fd_dict_data.res_code), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.exp_res,
+ &g_fd_dict_data.exp_res), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_app_id,
+ &g_fd_dict_data.auth_app_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.sess_id,
+ &g_fd_dict_data.sess_id), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_sess_state,
+ &g_fd_dict_data.auth_sess_state),
+ return S6A_FD_ERROR);
+ //NI Detach
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_host,
+ &g_fd_dict_data.org_host), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_realm,
+ &g_fd_dict_data.org_realm), return S6A_FD_ERROR);
+ //NI Detach
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_host,
+ &g_fd_dict_data.dest_host), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_realm,
+ &g_fd_dict_data.dest_realm), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.user_name,
+ &g_fd_dict_data.user_name), return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.visited_PLMN_id,
+ &g_fd_dict_data.visited_PLMN_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.req_EUTRAN_auth_info,
+ &g_fd_dict_data.req_EUTRAN_auth_info),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.no_of_req_vectors,
+ &g_fd_dict_data.no_of_req_vectors),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.immediate_resp_pref,
+ &g_fd_dict_data.immediate_resp_pref),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_info,
+ &g_fd_dict_data.auth_info),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.E_UTRAN_vector,
+ &g_fd_dict_data.E_UTRAN_vector),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAND,
+ &g_fd_dict_data.RAND),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.XRES,
+ &g_fd_dict_data.XRES),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AUTN,
+ &g_fd_dict_data.AUTN),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.KASME,
+ &g_fd_dict_data.KASME),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAT_type,
+ &g_fd_dict_data.RAT_type),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULR_flags,
+ &g_fd_dict_data.ULR_flags),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULA_flags,
+ &g_fd_dict_data.ULA_flags),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscription_data,
+ &g_fd_dict_data.subscription_data),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscriber_status,
+ &g_fd_dict_data.subscriber_status),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.MSISDN,
+ &g_fd_dict_data.MSISDN),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.net_access_mode,
+ &g_fd_dict_data.net_access_mode),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.access_restriction_data,
+ &g_fd_dict_data.access_restriction_data),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AMBR,
+ &g_fd_dict_data.AMBR),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_UL,
+ &g_fd_dict_data.max_req_bandwidth_UL),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_DL,
+ &g_fd_dict_data.max_req_bandwidth_DL),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config_profile,
+ &g_fd_dict_data.APN_config_profile),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ctx_id,
+ &g_fd_dict_data.ctx_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.additional_ctx_id,
+ &g_fd_dict_data.additional_ctx_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.all_APN_configs_included_ind,
+ &g_fd_dict_data.all_APN_configs_included_ind),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config,
+ &g_fd_dict_data.APN_config),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_type,
+ &g_fd_dict_data.PDN_type),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_GW_alloc_type,
+ &g_fd_dict_data.PDN_GW_alloc_type),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.specific_APN_info,
+ &g_fd_dict_data.specific_APN_info),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_PDN_type_ind,
+ &g_fd_dict_data.non_IP_PDN_type_ind),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_data_delivery_mech,
+ &g_fd_dict_data.non_IP_data_delivery_mech),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.SCEF_ID,
+ &g_fd_dict_data.SCEF_ID),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.priority_Level,
+ &g_fd_dict_data.priority_Level),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.location_area_id,
+ &g_fd_dict_data.location_area_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.tracking_area_id,
+ &g_fd_dict_data.tracking_area_id),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr,
+ &g_fd_dict_data.subsc_periodic_RAU_TAU_tmr),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PUR_flags,
+ &g_fd_dict_data.PUR_flags),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.reg_subs_zone_code,
+ &g_fd_dict_data.reg_subs_zone_code),
+ return S6A_FD_ERROR);
+
+ CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.cancellation_type,
+ &g_fd_dict_data.cancellation_type),
+ return S6A_FD_ERROR);
+ return SUCCESS;
+}
+
+int
+s6a_fd_cb_reg(void)
+{
+ log_msg(LOG_INFO, "ANJANA s6a_fd_cb_reg.\n");
+
+ struct disp_when data;
+
+ memset(&data, 0, sizeof(data));
+ data.app = g_fd_dict_objs.s6a_app;
+
+ /* Register resp callbacks */
+ data.command = g_fd_dict_objs.AIA;
+ CHECK_FCT_DO(fd_disp_register(aia_resp_callback, DISP_HOW_CC, &data,
+ NULL, NULL),
+ return S6A_FD_ERROR);
+
+ data.command = g_fd_dict_objs.ULA;
+ CHECK_FCT_DO(fd_disp_register(ula_resp_callback, DISP_HOW_CC, &data,
+ NULL, NULL),
+ return S6A_FD_ERROR);
+
+#if 0
+ data.command = g_fd_dict_objs.PUA;
+ CHECK_FCT_DO(fd_disp_register(purge_resp_callback, DISP_HOW_CC, &data,
+ NULL, NULL),
+ return S6A_FD_ERROR);
+#endif
+ //NI Detach
+ data.command = g_fd_dict_objs.CLR;
+ CHECK_FCT_DO(fd_disp_register(clr_resp_callback, DISP_HOW_CC, &data,
+ NULL, NULL),
+ return S6A_FD_ERROR);
+
+ //NI Detach
+
+ CHECK_FCT_DO(fd_disp_app_support(g_fd_dict_objs.s6a_app,
+ g_fd_dict_objs.vendor_id, 1, 0),
+ return S6A_FD_ERROR);
+
+ return SUCCESS;
+}
+
+/**
+ * @brief Create session ID for every HSS request. Append UE ID to session ID
+ * initialized
+ * @param [out] session ID created
+ * @param [in] UE index to append to session ID
+ * @return int - error code
+ */
+short
+create_fd_sess_id(struct s6a_sess_info *s6a_sess,
+ int ue_idx)
+{
+ struct session *sess = NULL;
+ unsigned char *sess_id;
+ size_t sess_id_len;
+ char idx[10] = {0};
+
+ /* clear the session id if exists */
+ if (s6a_sess->sess_id_len > 0) {
+ int exist = false;
+ CHECK_FCT_DO(fd_sess_fromsid((unsigned char*)s6a_sess->sess_id,
+ s6a_sess->sess_id_len, &sess, &exist),
+ return S6A_FD_ERROR);
+
+ if (exist == 0) {
+ CHECK_FCT_DO(fd_sess_destroy(&sess), return S6A_FD_ERROR);
+ sess = NULL;
+ }
+ }
+
+ sprintf(idx, "%d", ue_idx);
+ if (sess == NULL) {
+ CHECK_FCT_DO(fd_sess_new(&sess, fd_g_config->cnf_diamid,
+ fd_g_config->cnf_diamid_len, (unsigned char*)idx, strlen(idx)),
+ return S6A_FD_ERROR);
+ }
+ CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, &sess_id_len),
+ return S6A_FD_ERROR);
+
+ s6a_sess->sess_id_len = (unsigned char)sess_id_len;
+ memcpy(s6a_sess->sess_id, sess_id, s6a_sess->sess_id_len);
+ s6a_sess->sess_id[s6a_sess->sess_id_len] = '\0';
+
+ return SUCCESS;
+}
+
+/**
+ * @brief Parse AVP received in freediameter response
+ * initialized
+ * @param [in]avp - AVP value receivned
+ * @param [out] result value parserd out of avp
+ * @return int - error code
+ */
+short
+parse_fd_result(struct avp *avp, struct fd_result *res)
+{
+ struct avp_hdr *hdr;
+ struct avp *child_avp = NULL;
+
+ CHECK_FCT_DO(fd_msg_avp_hdr(avp, &hdr), return S6A_FD_ERROR);
+ if (hdr->avp_code != g_fd_dict_data.exp_res.avp_code)
+ return S6A_FD_ERROR;
+
+ CHECK_FCT_DO(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL),
+ return S6A_FD_ERROR);
+
+ while (child_avp) {
+ fd_msg_avp_hdr (child_avp, &hdr);
+
+ if (hdr->avp_code ==
+ g_fd_dict_data.exp_res_code.avp_code) {
+ res->result_code = hdr->avp_value->u32;
+ res->present = true;
+ } else if (hdr->avp_code == g_fd_dict_data.vendor_id.avp_code) {
+ res->vendor_id = hdr->avp_value->u32;
+ }
+
+ CHECK_FCT_DO(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp,
+ NULL),
+ return S6A_FD_ERROR);
+ }
+
+ return SUCCESS;
+}
+
+
+
+