Files
svc.ems/plat/m2ua/src_old/m2ua.c
2024-09-27 15:39:34 +08:00

363 lines
7.4 KiB
C

/****************************************************************/
/* M2UA Implementation Program */
/* Version 10.0.3 */
/* Designed By Ying Min */
/* Last Update: 2006-2-14 */
/****************************************************************/
#include "./include/m2ua_pub.h"
#include "./include/m2ua.h"
#include "./include/m2ua_const.h"
#include "./include/m2ua_def.h"
#include "./include/m2ua_struct.h"
#include "./include/m2ua_msg.h"
#include "./include/m2ua_fsm.h"
#include "./include/m2ua_debug.h"
int m2ua_get_local_ip(void)
{
struct hostent *host;
if (gethostname(hostname, 50) == -1)
{
printf("M2UA gethostname fail!\n");
exit(3);
}
if ((host = gethostbyname(hostname)) == NULL)
{
printf("M2UA gethostbyname fail!\n");
exit(4);
}
else
{
sprintf(hostip, "%d.%d.%d.%d",
(BYTE)host->h_addr_list[0][0],
(BYTE)host->h_addr_list[0][1],
(BYTE)host->h_addr_list[0][2],
(BYTE)host->h_addr_list[0][3]);
host_ip = inet_addr(hostip); // Network byte order host_ip, like 0xE60012AC
printf("hostip: %s (0x%lX)\n", hostip, host_ip);
}
return 0;
}
/*
int m2ua_get_mtp3_para(void)
{
DWORD oid[20] = {1,3,6,1,4,1,1373,1,3,2,2,2,2,9,1}; // SG Attributes
BYTE msg[64], vartype;
int i;
printf("M2UA start to get MTP3 link_para!\n");
for (i = 0; i < M2UA_MAX_SG_NUM; i++)
{
oid[15] = i;
if (get_response(16, oid, msg, &vartype) < 0)
{
printf("M2UA get MTP3 sg_para failed, please set it from MTP3!\n");
return -1;
}
else
set_m2ua_sg(i, msg);
}
oid[14] = 5; // Link Attributes
for (i = 0; i < M2UA_MAX_LK_NUM; i++)
{
oid[15] = i;
if (get_response(16, oid, msg, &vartype) < 0)
{
printf("M2UA get MTP3 link_para failed, please set it from MTP3!\n");
return -1;
}
else
set_m2ua_link(i, msg);
}
return 0;
}
*/
void m2ua_init(BYTE system_id)
{
int id, fd;
//static DWORD init_times = 0;
printf("M2UA Init Start!\n");
plat_id = system_id%2;
m2ua_get_local_ip();
for (id = 0; id < M2UA_MAX_SG_FSM_NUM; id++)
{
m2ua_sg_init(id);
m2ua_sg_mon_fg[id] = 0;
}
m2ua_sg_mon_count = 0;
#ifndef _LKSCTP
if ((fd = m2ua_sctp_t_open(M2UA_LISTEN_SG_NUM_0)) <= 0)
{
printf("M2UA_LISTEN_SG_NUM_0 sctp_t open failure!\n");
exit(2);
}
#else
if ((fd = m2ua_sctp_open_lksctp(M2UA_LISTEN_SG_NUM_0)) <= 0)
{
printf("M2UA_LISTEN_SG_NUM_0 lksctp open failure!\n");
exit(2);
}
#endif
else
{
m2ua_sg_info[M2UA_LISTEN_SG_NUM_0].fd = fd;
m2ua_sg_info[M2UA_LISTEN_SG_NUM_0].enable = 1;
printf("M2UA_LISTEN_SG_NUM_0 listening fd open succeed!\n");
}
#ifndef _LKSCTP
if ((fd = m2ua_sctp_t_open(M2UA_LISTEN_SG_NUM_1)) <= 0)
{
printf("M2UA_LISTEN_SG_NUM_1 sctp_t open failure!\n");
exit(2);
}
#else
if ((fd = m2ua_sctp_open_lksctp(M2UA_LISTEN_SG_NUM_1)) <= 0)
{
printf("M2UA_LISTEN_SG_NUM_1 lksctp open failure!\n");
exit(2);
}
#endif
else
{
m2ua_sg_info[M2UA_LISTEN_SG_NUM_1].fd = fd;
m2ua_sg_info[M2UA_LISTEN_SG_NUM_1].enable = 1;
printf("M2UA_LISTEN_SG_NUM_1 listening fd open succeed!\n");
}
//add by yizane
#ifndef _LKSCTP
if ((fd = m2ua_sctp_t_open(IUA_LISTEN_SG_NUM_0)) <= 0)
{
printf("IUA_LISTEN_SG_NUM_0 sctp_t open failure!\n");
exit(2);
}
#else
if ((fd = m2ua_sctp_open_lksctp(IUA_LISTEN_SG_NUM_0)) <= 0)
{
printf("IUA_LISTEN_SG_NUM_0 lksctp open failure!\n");
exit(2);
}
#endif
else
{
m2ua_sg_info[IUA_LISTEN_SG_NUM_0].fd = fd;
m2ua_sg_info[IUA_LISTEN_SG_NUM_0].enable = 1;
printf("IUA_LISTEN_SG_NUM_0 listening fd open succeed!\n");
}
#ifndef _LKSCTP
if ((fd = m2ua_sctp_t_open(IUA_LISTEN_SG_NUM_1)) <= 0)
{
printf("IUA_LISTEN_SG_NUM_1 sctp_t open failure!\n");
exit(2);
}
#else
if ((fd = m2ua_sctp_open_lksctp(IUA_LISTEN_SG_NUM_1)) <= 0)
{
printf("IUA_LISTEN_SG_NUM_1 lksctp open failure!\n");
exit(2);
}
#endif
else
{
m2ua_sg_info[IUA_LISTEN_SG_NUM_1].fd = fd;
m2ua_sg_info[IUA_LISTEN_SG_NUM_1].enable = 1;
printf("IUA_LISTEN_SG_NUM_1 listening fd open succeed!\n");
}
//add by yizane
for (id = 0; id < M2UA_MAX_LK_NUM; id++)
{
m2ua_lk_init(id);
m2ua_lk_mon_fg[id] = 0;
}
m2ua_lk_mon_count = 0;
for (id = 0; id < M2UA_MAX_M3MSG_NUM; id++)
x256[id] = 256 * id;
bzero(&m2ua_csta, sizeof(m2ua_csta_t));
bzero(err, 256);
m2ua_mtp3_sd_h = 0;
m2ua_mtp3_sd_t = 0;
iua_q931_sd_h = 0;
iua_q931_sd_t = 0;
m2ua_sctp_cmd_len = 0;
m2ua_sctp_dat_len = 0;
m2ua_sctp_addr.port = htons(2904);
m2ua_sctp_server_addr.port = htons(2904);
inet_aton(hostip, &m2ua_sctp_addr.addr);
strcpy(m2ua_asciin_buf, "\0");
strcpy(m2ua_asciout_buf, "\0");
moniter_fg = MONITOR_NONE;
m2ua_debug_set();
init_flag = 0;
m2ua_command = M2UA_CMD_IDLE;
//if (init_times++);
//m2ua_get_mtp3_para();
printf("M2UA Init Complete!\n");
}
void m2ua_t10ms()
{
static int cnt_10ms = 0;
static int ls_hb_flag = 0;
static int ls_hb_lk = 0;
WORD nsg;
WORD i, fd;
if (ls_hb_flag)
{
if (ls_hb_lk < M2UA_MAX_LK_NUM)
{
if (m2ua_para.lk_para[ls_hb_lk].enable == 1)
{
nsg = m2ua_para.lk_para[ls_hb_lk].lk_sg;
if ((m2ua_para.sg_para[nsg].xUA_ack>>1) == M2UA_APP)
m2ua_sd_mtp3_primi(ls_hb_lk, m2ua_lk_info[ls_hb_lk].lk_st);
else if ((m2ua_para.sg_para[nsg].xUA_ack>>1) == IUA_APP)
iua_sd_q931_primi(ls_hb_lk, m2ua_lk_info[ls_hb_lk].lk_st);
}
ls_hb_lk++;
}
else
{
ls_hb_flag = 0;
ls_hb_lk = 0;
}
}
if (!(++cnt_10ms % 10))
{ // 100 ms
m2ua_mon();
if (!(cnt_10ms % 100))
{ // 1 seconds
if (m2ua_command != M2UA_CMD_IDLE)
{
sprintf(m2ua_ascitemp_buf, "M2UA Restart! m2ua_command=%d\n\r", m2ua_command);
m2ua_asciout_proc(m2ua_ascitemp_buf);
m2ua_asciout_proc("\n\r");
m2ua_command = M2UA_CMD_IDLE;
for (i = 0; i < M2UA_MAX_SG_FSM_NUM; i++)
{
if ((fd = m2ua_sg_info[i].fd) > 0)
{
if ((m2ua_sg_info[i].sctp_state > 2) ||
((m2ua_sg_info[i].sctp_state == 2) &&
(m2ua_sg_info[i].sctp_state_1 > 0)))
{
#ifndef _LKSCTP
if (i >= M2UA_MAX_SG_NUM)
m2ua_sctp_discon_req(fd, i, m2ua_sg_info[i].seq);
else
m2ua_sctp_discon_req(fd, i, 0);
#else
m2ua_sctp_discon_req_lksctp(fd, i, 0);
#endif
}
#ifndef _LKSCTP
m2ua_sctp_close(m2ua_sg_info[i].fd, i);
#endif
}
}
m2ua_init(plat_id);
}
else if (cnt_10ms >= 1500)
{ // 15 seconds
cnt_10ms = 0;
ls_hb_flag = 1;
}
}
}
}
// Called every 10 ms
void m2ua_timer(void)
{
WORD sg, sg_dual, i;
static BYTE sg_start = 0;
static BYTE lk_scan = 0;
for (sg = sg_start; sg < sg_start + 128; sg++)
{
sg_dual = sg;
if (m2ua_sg_info[sg_dual].m2ua_state == 3)
{
for (i = 0; i < 32; i++)
{
if (m2ua_sg_fsm(sg_dual) < 0)
break;
}
}
else
m2ua_sg_fsm(sg_dual);
sg_dual = sg + M2UA_MAX_SG_NUM/2;
if (m2ua_sg_info[sg_dual].m2ua_state == 3)
{
for (i = 0; i < 32; i++)
{
if (m2ua_sg_fsm(sg_dual) < 0)
break;
}
}
else
m2ua_sg_fsm(sg_dual);
}
sg_start += 128;
if (sg_start == 0)
{
m2ua_sg_fsm(M2UA_LISTEN_SG_NUM_0);
m2ua_sg_fsm(M2UA_LISTEN_SG_NUM_1);
m2ua_sg_fsm(IUA_LISTEN_SG_NUM_0);
m2ua_sg_fsm(IUA_LISTEN_SG_NUM_1);
}
if (m2ua_lk_info[lk_scan].lk_timer > 0)
m2ua_lk_info[lk_scan].lk_timer--;
lk_scan ++;
m2ua_t10ms();
}
int m2ua_restart()
{
if (m2ua_command != M2UA_CMD_IDLE)
return 0;
else if (init_flag == 2)
{
m2ua_command = M2UA_CMD_STATUS_INIT;
return 0;
}
return 1;
}