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;
+}
+
+
+
+