Files
svc.ems/plat/isdn/src/isdn_uif.c
2024-09-27 15:39:34 +08:00

429 lines
16 KiB
C

/***********************************************************
Copyright (C), LGC Wireless.
File Name: isdn_uif.c
Description: ISDN USER INTERFACE
Version: v9.0.0
Author: Gengxin Chen
Create Date: 2008-2-19
History:
<author> <date> <version> <desc>
************************************************************/
#include "./include/isdn_const.h"
#include "./include/isdn_rm.h"
#include "./include/isdn_debug.h"
#include "./include/isdn_ext.h"
#include "./include/isdn_inc.h"
extern void isdn_cpc_proc(u32 pid);
extern void isdn_restart_ctrl(u32 pid);
extern void service_bc_proc(u32 pid);
/*************************************************************
Function: isdn_setup_req
Description: msc invokes the function to request setup
Output: pst:post structure pointer, ptr:isdn setup structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_setup_req(Pst *pst, IsdnSetup *ptr)
{
const pal_circuit_struct *circuit_ptr = NULL;
circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic);
if(circuit_ptr == NULL)
{
isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__);
return ISDN_CM_FAILED;
}
pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_ptr->id);
isdn_rs.port_pond[pst->sp_proc_id].su_proc_id = pst->su_proc_id;
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_SETUP_REQ;
isdn_rs.port_pond[pst->sp_proc_id].trace_flag = pst->trace_flag;
isdn_rs.port_pond[pst->sp_proc_id].enable = 1;
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state != IDLE_FLAG)
{
isdn_log_err(pst->sp_proc_id, "call state is not idle, but is %d\n", isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state);
return ISDN_CM_FAILED;
}
memcpy(&(isdn_sd_msg.msg_list.setup), ptr, sizeof(IsdnSetup));
if(circuit_ptr->attrib.user_network_if)
isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state = CALLOUT_FLAG;
else
isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state = CALLIN_FLAG;
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_m_info_req
Description: msc invokes the function to request more information
Output: pst:post structure pointer, ptr:isdn setup ack structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_m_info_req(Pst *pst, IsdnSetupAck *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_MORE_INFO_REQ;
memcpy(&(isdn_sd_msg.msg_list.setupAck), ptr, sizeof(IsdnSetupAck));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_call_proc_req
Description: msc invokes the function to request call proceeding
Output: pst:post structure pointer, ptr:isdn call proceeding structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_call_proc_req(Pst *pst, IsdnCallProc *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_PROC_REQ;
memcpy(&(isdn_sd_msg.msg_list.callProc), ptr, sizeof(IsdnCallProc));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_alert_req
Description: msc invokes the function to request alerting
Output: pst:post structure pointer, ptr:isdn alerting structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_alert_req(Pst *pst, IsdnAlert *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_ALERT_REQ;
memcpy(&(isdn_sd_msg.msg_list.alert), ptr, sizeof(IsdnAlert));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_setup_resp
Description: msc invokes the function to request setup response
Output: pst:post structure pointer, ptr:isdn connect structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_setup_resp(Pst *pst, IsdnConn *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_SETUP_RSP;
memcpy(&(isdn_sd_msg.msg_list.conn), ptr, sizeof(IsdnConn));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_disc_req
Description: msc invokes the function to request disconnect
Output: pst:post structure pointer, ptr:isdn disconnect structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_disc_req(Pst *pst, IsdnDisc *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_DISCONNECT_REQ;
memcpy(&(isdn_sd_msg.msg_list.disc), ptr, sizeof(IsdnDisc));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_rel_req
Description: msc invokes the function to request release
Output: pst:post structure pointer, ptr:isdn release structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_rel_req(Pst *pst, IsdnRel *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_RELEASE_REQ;
memcpy(&(isdn_sd_msg.msg_list.rel), ptr, sizeof(IsdnRel));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
int isdn_rej_req(Pst *pst, IsdnRelComp *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_REJECT_REQ;
memcpy(&(isdn_sd_msg.msg_list.relComp), ptr, sizeof(IsdnRelComp));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_info_req
Description: msc invokes the function to request information
Output: pst:post structure pointer, ptr:isdn information structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_info_req(Pst *pst, IsdnInfo *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_INFO_REQ;
memcpy(&(isdn_sd_msg.msg_list.info), ptr, sizeof(IsdnInfo));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_prog_req
Description: msc invokes the function to request progress
Output: pst:post structure pointer, ptr:isdn progress structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_prog_req(Pst *pst, IsdnProg *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_PROG_REQ;
memcpy(&(isdn_sd_msg.msg_list.prog), ptr, sizeof(IsdnProg));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_noti_req
Description: msc invokes the function to request notify
Output: pst:post structure pointer, ptr:isdn notify structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_noti_req(Pst * pst, IsdnNoti * ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_NOTI_REQ;
memcpy(&(isdn_sd_msg.msg_list.noti), ptr, sizeof(IsdnNoti));
isdn_cpc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd);
isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0;
}
return ISDN_CM_OK;
}
/*************************************************************
Function: isdn_m_restart_req
Description: msc invokes the function to request management restart
Output: pst:post structure pointer, ptr:isdn restart structure pointer
Return: ISDN_CM_OK:success
ISDN_CM_FAILED:failed
*************************************************************/
int isdn_m_restart_req(Pst *pst, IsdnRestart *ptr) //restart indicated channel
{
u32 pid, link_id;
int circuit_id;
const pal_cg_struct *cg_ptr = NULL;
const pal_circuit_struct *circuit_ptr = NULL;
isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__);
cg_ptr = pal_cg_ptr(pst->cg_id);
if(cg_ptr == NULL)
return ISDN_CM_FAILED;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
return ISDN_CM_FAILED;
circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic);
if(circuit_ptr == NULL)
{
isdn_log_err(0, "isdn_m_restart_req err!circuit_ptr cann't be found by vcg_id=%d,cic=%ld \r\n", pst->cg_id, pst->cic);
return ISDN_CM_FAILED;
}
circuit_id = circuit_ptr->id;
pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_id);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
memcpy(&(isdn_sd_msg.msg_list.restart), ptr, sizeof(IsdnRestart));
pid = (circuit_id) * ISDN_CIRCUIT_CIC;
link_id = circuit_ptr->attrib.link_id;
if(ptr->restart_ind.clas == 0)
isdn_rs.port_pond[pid].cic_val = pst->cic;
else
isdn_rs.port_pond[pid].cic_val = 0;
isdn_rs.link_pond[link_id].restart_clas = ptr->restart_ind.clas;
isdn_rs.port_pond[pid].g_pri_cmd = ISDN_M_RESTART_REQ;
isdn_restart_ctrl(pid);
if(isdn_rs.port_pond[pid].g_pri_cmd != 0)
{
isdn_trace_func(pid, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd);
isdn_rs.port_pond[pid].g_pri_cmd = 0;
}
return ISDN_CM_OK;
}
//ansi
int isdn_service_bc_req(Pst *pst, IsdnService *ptr)
{
const pal_circuit_struct *circuit_ptr = NULL;
circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic);
if(circuit_ptr == NULL)
{
isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__);
return ISDN_CM_FAILED;
}
pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_ptr->id);
isdn_rs.port_pond[pst->sp_proc_id].su_proc_id = pst->su_proc_id;
isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = ISDN_SERVICE_REQ;
isdn_rs.port_pond[pst->sp_proc_id].trace_flag = pst->trace_flag;
// isdn_rs.port_pond[pst->sp_proc_id].enable = 1;
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
memcpy(&(isdn_sd_msg.msg_list.service), ptr, sizeof(IsdnService));
service_bc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd);
isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = 0;
}
return ISDN_CM_OK;
}
int isdn_service_bc_rsp(Pst *pst, IsdnServAck *ptr)
{
isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__);
if(pst->sp_proc_id >= ISDN_MAX_PORT)
{
isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id);
return ISDN_CM_FAILED;
}
isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = ISDN_SERVICE_RSP;
memcpy(&(isdn_sd_msg.msg_list.servAck), ptr, sizeof(IsdnServAck));
service_bc_proc(pst->sp_proc_id);
if(isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd != 0)
{
isdn_trace_func(pst->sp_proc_id, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd);
isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = 0;
}
return ISDN_CM_OK;
}