blob: 8161a010002749f56f4c73aca6046f11b53c678c [file] [log] [blame]
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*******************************************************************************
* Filename:
* ---------
* dispatcher_control.c
*
* Project:
* --------
* VMOLY
*
* Description:
* ------------
* Dispatcher control information managment.
*
* Author:
* -------
* -------
*
*******************************************************************************/
#include "dispatcher_struct.h"
#include "dispatcher_msgid.h"
#include "md_sap.h"
#include "dispatcher_debug.h"
#include "dispatcher_data_path_trace_utmd.h"
/**
* dispatcher global conrol context having bearer & context information
*/
static dispatcher_control_cntx g_dispatcher_cntx[MAX_SIM_NUM];
/**
* dispatcher current protoidx for recvd ilm
*/
kal_uint8 g_dispatcher_curr_protoidx;
void dispatcher_ctrl_set_current_protoidx(kal_uint8 protoidx)
{
g_dispatcher_curr_protoidx = protoidx;
}
void dispatcher_init_control_cntx(void)
{
kal_mem_set(g_dispatcher_cntx, 0, sizeof(g_dispatcher_cntx));
}
#ifdef ATEST_SYS_DISPATCHER
extern kal_bool dispatcher_ut_assert_flag;
#ifdef ASSERT
#undef ASSERT
#endif
//#define ASSERT(x) do{ if (x) ut_assert_flag = KAL_TRUE; }while(0)
void ASSERT(int x) {
if (!x) {
dispatcher_ut_assert_flag = KAL_TRUE;
}
}
#endif
/******************************************************************
****************Control path functions****************************
*****************************************************************/
void
n3epc_dispatcher_bearer_act_req(n3epc_dispatcher_bearer_act_req_struct *p_local)
{
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_bearer_info_struct *p_bearer_info;
dispatcher_cid_info_struct *p_cid_info;
kal_uint8 bearer_id, cid;
MD_TRC_DISPATCHER_TR_BEARER_ACT_REQ(p_local->bearer_id, p_local->linked_bearer_id,
p_local->context_id, proto_idx);
bearer_id = p_local->bearer_id;
/*as per WO bearer_id will range from 1~15*/
if (0 == bearer_id || bearer_id > 15) {
//BEARER_ID_INVALID_VALUE
ASSERT(0);
return;
}
cid = p_local->context_id;
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[cid];
/*if ebi context has already valid values it means bearer is already active*/
if (p_bearer_info->defult_bearer_id != 0) {
ASSERT(0);
return;
}
p_bearer_info->bearer_id = bearer_id;
p_bearer_info->defult_bearer_id = p_local->linked_bearer_id;
//for R14 this will be always true
if (p_bearer_info->bearer_id == p_local->linked_bearer_id)
{
// the bearer_id of the cid info not to be set at bearer act req
//bearer is already active for this cid
ASSERT(p_cid_info->bearer_id == 0);
p_bearer_info->context_id = cid;
// save ip_addr and dns for the ipcore bind process
p_cid_info->ip_addr = p_local->ip_addr;
p_cid_info->dns = p_local->dns;
MD_TRC_DISPATCHER_TR_BEARER_ACT_REQ_BIND_STATE(p_bearer_info->context_id, p_cid_info->bind_state);
if (DISPATCHER_PDN_ST_UNBIND == p_cid_info->bind_state)
{
//reset old bearer id here
p_cid_info->old_bearer_id = 0;
}
/* not accepatable state to handle bearer activation*/
if ((DISPATCHER_PDN_ST_BIND == p_cid_info->bind_state) ||
(DISPATCHER_PDN_ST_BINDING == p_cid_info->bind_state) ||
(DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND == p_cid_info->bind_state))
{
ASSERT(0);
return;
}
p_cid_info->bearer_id = p_bearer_info->defult_bearer_id;
}
/*currently bearer_id & linked bearer_id will be same*/
else
{
ASSERT(0);
return;
}
}
void
n3epc_dispatcher_bearer_deact_req(n3epc_dispatcher_bearer_deact_req_struct *p_local)
{
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_bearer_info_struct *p_bearer_info;
dispatcher_cid_info_struct *p_cid_info;
kal_uint8 bearer_id, cid;
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
bearer_id = p_local->bearer_id;
cid = p_local->context_id;
MD_TRC_DISPATCHER_TR_BEARER_DEACT_REQ(bearer_id, cid, proto_idx);
if (0 == bearer_id || bearer_id > 15) {
//BEARER_ID_INVALID_VALUE
ASSERT(0);
return;
}
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[cid];
if (p_bearer_info->defult_bearer_id == bearer_id)
{
/*check this bearer info have same cid*/
ASSERT(p_bearer_info->context_id == cid);
p_bearer_info->defult_bearer_id = 0;
p_cid_info->bearer_id = 0;
}
/*bearer can be deactivated before pdn unbind*/
/*to handle unbind we need bearer_id, to keep bearer_id in old_bearer_id in cid info*/
if ((DISPATCHER_PDN_ST_BIND == p_cid_info->bind_state) ||
(DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND == p_cid_info->bind_state) ||
(DISPATCHER_PDN_ST_BINDING == p_cid_info->bind_state))
{
p_cid_info->old_bearer_id = bearer_id;
}
}
void n3epc_dispatcher_pdn_bind_req(n3epc_dispatcher_pdn_bind_req_struct *p_local,
kal_uint32 src_mod_id)
{
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_bearer_info_struct *p_bearer_info;
dispatcher_cid_info_struct *p_cid_info;
kal_uint8 bearer_id;
dispatcher_bind_state_enum bind_state;
#ifndef ATEST_SYS_DISPATCHER
kal_uint8 pdn_id;
ipcore_dispatcher_pdn_bind_ind_struct *p_pdn_bind_ind;
#endif
ps_cause_enum error_result = HIF_IPC_OK;
MD_TRC_DISPATCHER_TR_PDN_BIND_REQ(p_local->context_id,
p_local->network_interface_id, proto_idx);
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[p_local->context_id];
bearer_id = p_cid_info->bearer_id;
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
/*check if bearer is already active or not before bind this is must condition*/
/*******handling added for assert removal*************/
if ((p_cid_info->bearer_id == 0) ||
(p_bearer_info->defult_bearer_id != bearer_id))
{
error_result = N3EPC_DISPATCHER_BIND_ERROR_AS_BEARER_NOT_ACTIVATED_BEFORE;
dispatcher_report_bind_unbind_error_cnf(KAL_TRUE, error_result, p_local->context_id, src_mod_id);
return;
}
bind_state = p_cid_info->bind_state;
/*bind req is valid for unbind state only*/
if (DISPATCHER_PDN_ST_UNBIND == bind_state)
{
/*update pdn bind state*/
p_cid_info->bind_state = DISPATCHER_PDN_ST_BINDING;
p_cid_info->apn_type_info = p_local->apn_type_info;
/* forward to IPCORE */
#ifndef ATEST_SYS_DISPATCHER
p_pdn_bind_ind = construct_local_para(sizeof(ipcore_dispatcher_pdn_bind_ind_struct), 0);
#if defined(__SENSITIVE_DATA_MOSAIC__) && defined(__MTK_TARGET__)
kal_set_sensitive_buff(p_pdn_bind_ind);
#endif
p_pdn_bind_ind->network_interface_id = p_local->network_interface_id;
DISPATCHER_CONVERT_BEARERID_TO_PDNID(bearer_id, pdn_id);
p_pdn_bind_ind->pdn_id = pdn_id;
p_pdn_bind_ind->apn_type_info = p_local->apn_type_info;
p_pdn_bind_ind->ip_addr = p_cid_info->ip_addr;
p_pdn_bind_ind->dns = p_cid_info->dns;
p_pdn_bind_ind->back_info.reply_dest_mod_id = src_mod_id;
p_pdn_bind_ind->back_info.context_id = p_local->context_id;
msg_send6(
MOD_DISPATCHER + proto_idx,
MOD_IPCORE,
#if defined(__SENSITIVE_DATA_MOSAIC__) && defined(__MTK_TARGET__)
DISPATCHER_USER_SENSITIVE_SAP,
#else
DISPATCHER_SAP,
#endif
MSG_ID_IPCORE_DISPATCHER_PDN_BIND_IND,
(local_para_struct*) p_pdn_bind_ind,
NULL);
#endif
} else if (DISPATCHER_PDN_ST_BIND == bind_state) {
error_result = N3EPC_DISPATCHER_BIND_ERROR_AS_PDN_ALREADY_BIND;
dispatcher_report_bind_unbind_error_cnf(KAL_TRUE, error_result, p_local->context_id, src_mod_id);
} else if (DISPATCHER_PDN_ST_BINDING == bind_state) {
error_result = N3EPC_DISPATCHER_BIND_ERROR_AS_PREV_BIND_IN_PROGRESS;
dispatcher_report_bind_unbind_error_cnf(KAL_TRUE, error_result, p_local->context_id, src_mod_id);
} else /*if (DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND == bind_state)*/ {
error_result = N3EPC_DISPATCHER_BINDING_GOING_TO_UNBIND_ERROR_AS_PREV_BIND_IN_PROGRESS;
dispatcher_report_bind_unbind_error_cnf(KAL_TRUE, error_result, p_local->context_id, src_mod_id);
}
MD_TRC_DISPATCHER_TR_PDN_BIND_REQ_BIND_STATE(p_local->context_id,
bind_state, p_cid_info->bind_state);
}
void n3epc_dispatcher_pdn_unbind_req(n3epc_dispatcher_pdn_unbind_req_struct *p_local,
kal_uint32 src_mod_id)
{
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_bearer_info_struct *p_bearer_info;
dispatcher_cid_info_struct *p_cid_info;
kal_uint8 bearer_id;
kal_uint8 cid = p_local->context_id;
dispatcher_bind_state_enum bind_state;
ps_cause_enum error_result = HIF_IPC_OK;
MD_TRC_DISPATCHER_TR_PDN_UNBIND_REQ(p_local->context_id, proto_idx);
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[cid];
bind_state = p_cid_info->bind_state;
bearer_id = p_cid_info->bearer_id;
/* unbind may be after bearer deact
* on bearer deact we will keep the bearer_id to old_bearer_id in cid
*/
if (!bearer_id) {
bearer_id = p_cid_info->old_bearer_id;
}
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
ASSERT(p_bearer_info->context_id == cid);
if (DISPATCHER_PDN_ST_BIND == bind_state) {
/* wo unbind cnf + ipc unbind ind!! */
dispatcher_unbind_cnf_optional_ipc_ind(p_bearer_info, KAL_TRUE, src_mod_id, proto_idx);
p_cid_info->bind_state = DISPATCHER_PDN_ST_UNBIND;
} else if (DISPATCHER_PDN_ST_BINDING == bind_state) {
// update bind_state
p_cid_info->bind_state = DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND;
} else {
// Not expected state
//ASSERT(0);
error_result = N3EPC_DISPATCHER_UNBIND_ERROR_AS_DUPLICATE_UNBIND_REQ;
dispatcher_report_bind_unbind_error_cnf(KAL_FALSE, error_result, p_local->context_id, src_mod_id);
}
MD_TRC_DISPATCHER_TR_PDN_UNBIND_REQ_BIND_STATE(cid, bind_state, p_cid_info->bind_state);
}
void
ipcore_dispatcher_pdn_bind_rsp(ipcore_dispatcher_pdn_bind_rsp_struct *p_local)
{
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
kal_uint8 bearer_id = 0;
kal_uint8 context_id = p_local->back_info.context_id;
n3epc_dispatcher_pdn_bind_cnf_struct *p_pdn_bind_cnf;
dispatcher_bind_state_enum bind_state;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_bearer_info_struct *p_bearer_info;
dispatcher_cid_info_struct *p_cid_info;
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
DISPATCHER_CONVERT_PDNID_TO_BEARERID(p_local->pdn_id, bearer_id);
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[context_id];
bind_state = p_cid_info->bind_state;
if (DISPATCHER_PDN_ST_BINDING == bind_state) {
/* state is binding(waiting for bind rsp) send cnf to wo!! */
if (HIF_IPC_OK == p_local->result) {
p_cid_info->bind_state = DISPATCHER_PDN_ST_BIND;
p_cid_info->network_interface_id = p_local->network_interface_id;
} else {
p_cid_info->bind_state = DISPATCHER_PDN_ST_UNBIND;
}
} else if (DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND == bind_state) {
/*send bind cnf to WO + unbind to ipc based upon bind result*/
if (HIF_IPC_OK == p_local->result) {
p_cid_info->pending_req = DISPATCHER_PENDING_REQ_UNBIND_IND_N_CNF ;
} else {
p_cid_info->pending_req = DISPATCHER_PENDING_REQ_UNBIND_CNF;
}
} else {
ASSERT(0);
}
MD_TRC_DISPATCHER_TR_PDN_IPC_BIND_RSP(p_local->result, context_id,
bind_state, p_cid_info->bind_state, proto_idx);
/*as this is the bind rsp so first send bind cnf to WO !! */
p_pdn_bind_cnf = construct_local_para(sizeof(n3epc_dispatcher_pdn_bind_cnf_struct), TD_RESET);
p_pdn_bind_cnf->context_id = p_local->back_info.context_id;
if (DISPATCHER_PDN_ST_BIND == p_cid_info->bind_state) {
p_pdn_bind_cnf->is_successful = p_local->result == HIF_IPC_OK ? KAL_TRUE : KAL_FALSE;
}
p_pdn_bind_cnf->error_result = p_local->result;
msg_send6(
#ifndef ATEST_SYS_DISPATCHER
MOD_DISPATCHER + proto_idx,
#else
MOD_NIL,
#endif
p_local->back_info.reply_dest_mod_id,
DISPATCHER_SAP,
MSG_ID_N3EPC_DISPATCHER_PDN_BIND_CNF,
(local_para_struct*) p_pdn_bind_cnf,
NULL);
/*only send unbind cnf to WO*/
if (DISPATCHER_PENDING_REQ_UNBIND_CNF == p_cid_info->pending_req) {
//KAL_FALSE : as bind rsp failed so no need to send unbind ind to ipcore
dispatcher_unbind_cnf_optional_ipc_ind(p_bearer_info, KAL_FALSE,
p_local->back_info.reply_dest_mod_id, proto_idx);
p_cid_info->bind_state = DISPATCHER_PDN_ST_UNBIND;
p_cid_info->pending_req = DISPATCHER_PENDING_REQ_NONE;
} else if (DISPATCHER_PENDING_REQ_UNBIND_IND_N_CNF == p_cid_info->pending_req) {
//KAL_TRUE: as bind rsp success, so send unbind ind to ipcore
dispatcher_unbind_cnf_optional_ipc_ind(p_bearer_info, KAL_TRUE,
p_local->back_info.reply_dest_mod_id, proto_idx);
p_cid_info->bind_state = DISPATCHER_PDN_ST_UNBIND;
p_cid_info->pending_req = DISPATCHER_PENDING_REQ_NONE;
}
}
/******************************************************************
*helper function to check binding state & bearer activation state*
*****************************************************************/
dispatcher_bind_state_enum
dispatcher_get_bind_state_by_bearerid(kal_uint8 bearer_id, kal_uint8 proto_idx)
{
dispatcher_cid_info_struct *p_cid_info;
dispatcher_bearer_info_struct *p_bearer_info;
kal_uint8 cid = 0;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
cid = p_bearer_info->context_id;
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[cid];
MD_TRC_DISPATCHER_DATA_TRACE_BINDING_INFO(bearer_id, cid, p_cid_info->bind_state, proto_idx);
return p_cid_info->bind_state;
}
dispatcher_bind_state_enum
dispatcher_get_bind_state_by_pdnid(kal_uint8 pdn_id, kal_uint8 proto_idx)
{
kal_uint8 bearer_id = 0;
DISPATCHER_CONVERT_PDNID_TO_BEARERID(pdn_id, bearer_id);
if (IS_VALID_BEARERID(bearer_id)) {
return dispatcher_get_bind_state_by_bearerid(bearer_id, proto_idx);
}
return 0;
}
kal_bool dispatcher_check_is_bearer_active_by_pdnid(kal_uint8 pdn_id,
kal_uint8 proto_idx)
{
kal_uint8 bearer_id = 0;
DISPATCHER_CONVERT_PDNID_TO_BEARERID(pdn_id, bearer_id);
if (IS_VALID_BEARERID(bearer_id)) {
return dispatcher_check_is_bearer_active_by_bearerid(bearer_id, proto_idx);
}
return KAL_FALSE;
}
kal_bool dispatcher_check_is_bearer_active_by_bearerid(kal_uint8 bearer_id,
kal_uint8 proto_idx)
{
dispatcher_control_cntx *p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[proto_idx];
dispatcher_bearer_info_struct *p_bearer_info = &p_dispatcher_ctrl_cntx->bearer_info[bearer_id];
kal_bool is_active = (0 != p_bearer_info->defult_bearer_id) ? KAL_TRUE : KAL_FALSE;
MD_TRC_DISPATCHER_DATA_TRACE_BEARER_INFO(bearer_id, is_active, proto_idx);
return is_active;
}
/**
* dispatcher_report_bind_unbind_error_cnf
* report bind unbind error to WO for pre check
*/
void dispatcher_report_bind_unbind_error_cnf(kal_bool is_bindreq,
ps_cause_enum error_code,
kal_uint8 cid,
kal_uint32 reply_mod_id)
{
kal_bool success = KAL_FALSE;
kal_uint8 proto_idx = g_dispatcher_curr_protoidx;
if (is_bindreq)
{
n3epc_dispatcher_pdn_bind_cnf_struct *p_pdn_bind_cnf;
p_pdn_bind_cnf = construct_local_para(sizeof(n3epc_dispatcher_pdn_bind_cnf_struct), TD_RESET);
p_pdn_bind_cnf->context_id = cid;
p_pdn_bind_cnf->is_successful = success;
p_pdn_bind_cnf->error_result = error_code;
msg_send6(
#ifndef ATEST_SYS_DISPATCHER
MOD_DISPATCHER + proto_idx,
#else
MOD_NIL,
#endif
reply_mod_id,
DISPATCHER_SAP,
MSG_ID_N3EPC_DISPATCHER_PDN_BIND_CNF,
(local_para_struct*) p_pdn_bind_cnf,
NULL);
}
else
{
n3epc_dispatcher_pdn_unbind_cnf_struct *p_pdn_unbind_cnf;
p_pdn_unbind_cnf = construct_local_para(sizeof(n3epc_dispatcher_pdn_unbind_cnf_struct), TD_RESET);
p_pdn_unbind_cnf->context_id = cid;
p_pdn_unbind_cnf->is_successful = success;
p_pdn_unbind_cnf->error_result = error_code;
msg_send6(
#ifndef ATEST_SYS_DISPATCHER
MOD_DISPATCHER + proto_idx,
#else
MOD_NIL,
#endif
reply_mod_id,
DISPATCHER_SAP,
MSG_ID_N3EPC_DISPATCHER_PDN_UNBIND_CNF,
(local_para_struct*) p_pdn_unbind_cnf,
NULL);
}
}
/**
* dispatcher_unbind_cnf_optional_ipc_ind
* unbind CNF to WO must + optional IPC unbind ind
*/
void dispatcher_unbind_cnf_optional_ipc_ind(
dispatcher_bearer_info_struct *p_bearer_info,
kal_bool ipc_unbind_required,
kal_uint32 dest_mod_id,
kal_uint8 proto_idx)
{
#ifndef ATEST_SYS_DISPATCHER
ipcore_dispatcher_pdn_unbind_ind_struct *p_pdn_unbind_ind;
#endif
n3epc_dispatcher_pdn_unbind_cnf_struct *p_pdn_unbind_cnf;
kal_uint8 bearer_id = p_bearer_info->bearer_id;
kal_uint8 cid = p_bearer_info->context_id;
MD_TRC_DISPATCHER_TR_PDN_UNBIND_CNF_N_IND_OPTIONAL(bearer_id,
p_bearer_info->context_id, ipc_unbind_required, proto_idx);
/* forward to IPCORE */
if (ipc_unbind_required) {
#ifndef ATEST_SYS_DISPATCHER
kal_uint8 pdn_id = 0;
p_pdn_unbind_ind = construct_local_para(sizeof(ipcore_dispatcher_pdn_unbind_ind_struct), TD_RESET);
DISPATCHER_CONVERT_BEARERID_TO_PDNID(bearer_id, pdn_id);
p_pdn_unbind_ind->pdn_id = pdn_id;
msg_send6(
MOD_DISPATCHER + proto_idx,
MOD_IPCORE,
DISPATCHER_SAP,
MSG_ID_IPCORE_DISPATCHER_PDN_UNBIND_IND,
(local_para_struct*) p_pdn_unbind_ind,
NULL);
#endif
}
/* CNF to WO */
p_pdn_unbind_cnf = construct_local_para(sizeof(n3epc_dispatcher_pdn_unbind_cnf_struct), TD_RESET);
p_pdn_unbind_cnf->context_id = cid;
p_pdn_unbind_cnf->is_successful = KAL_TRUE;
p_pdn_unbind_cnf->error_result = HIF_IPC_OK;
msg_send6(
#ifndef ATEST_SYS_DISPATCHER
MOD_DISPATCHER + proto_idx,
#else
MOD_NIL,
#endif
dest_mod_id,
DISPATCHER_SAP,
MSG_ID_N3EPC_DISPATCHER_PDN_UNBIND_CNF,
(local_para_struct*) p_pdn_unbind_cnf,
NULL);
}
#if defined(__SENSITIVE_DATA_MOSAIC__)
void dispatcher_clean_private_data(void)
{
//kal_mem_set(g_dispatcher_cntx, 0, sizeof(g_dispatcher_cntx));
//or just clean the ip_addr from global
kal_uint8 sim_id, cid;
dispatcher_control_cntx *p_dispatcher_ctrl_cntx;
dispatcher_cid_info_struct *p_cid_info;
for (sim_id = 0; sim_id < MAX_SIM_NUM; sim_id++) {
p_dispatcher_ctrl_cntx = &g_dispatcher_cntx[sim_id];
for (cid = 0; cid < 200; cid++) {
p_cid_info = &p_dispatcher_ctrl_cntx->cid_info[cid];
kal_mem_set(&p_cid_info->ip_addr,0, sizeof(ip_addr_struct));
kal_mem_set(&p_cid_info->dns, 0, sizeof(dns_struct));
}
}
}
#endif