/*
 * 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;
}




