Files
ocs/plat/iptrans/src/readmsg.c
2025-03-03 11:01:26 +08:00

191 lines
5.4 KiB
C

/*
** PACS-WLL 2000 project, Prepaid System.
**
** The module Copyright (C) 2000-2001 interWAVE Inc.
** Written completely by Zhang Shuzhong at iCRD January, 2001
**
** file name: iptrans.c
** CVS: $Id: iptrans.c,v 1.9 2001/02/09 08:53:43 zhangsz Exp $
**
** Description: IP transceiver common module of PACS-WLL Project.
**
*/
#include "./include/iptrans.h"
#define PROG_NAME "iptrans"
extern int debug; /* defined in errorlog.c */
extern int under_develop; /* defined in errorlog.c */
static int iptrans_shm_id;
static int iptrans_sem_id;
static struct termio prev_termio;
static iptrans_shm *iptrans_shm_ptr;
int GetMessage(message_list *msgGet,int port);
void PutMessage(message_list msgPut);
/*@ignore@*/
/* Set debug flag to control debug message print or not */
void SetDebugFlag(void)
{
debug = DEBUG; /* DEBUG defined in debug.h */
under_develop = UNDER_DEVELOP; /* UNDER_DEVELOP defined in debug.h */
}
/*
** Handler of terminatation,
** process while received a signal from user.
*/
static void Terminate(int sig)
{
int retval;
usleep(100000);
retval = (int) shmdt(0);
if (retval == -1) log_ret("%s: %s: shmdt", PROG_NAME, FUNCTION_MACRO);
retval = shmctl(iptrans_shm_id, IPC_RMID, NULL);
if (retval == -1) log_ret("%s: %s: shmctl", PROG_NAME, FUNCTION_MACRO);
retval = semctl(iptrans_sem_id, PORT_NUM, IPC_RMID, NULL);
if (retval == -1) log_ret("%s: %s: semctl", PROG_NAME, FUNCTION_MACRO);
exit(sig);
}
int GetMessage(struct message_list *msgGet,int port)
{
message_list msgSend;
if(iptrans_shm_ptr->msgPortIn[port].msgReadSub != iptrans_shm_ptr->msgPortIn[port].msgWriteSub)
{
memcpy(msgGet,
&iptrans_shm_ptr->msgPortIn[port].msgList[iptrans_shm_ptr->msgPortIn[port].msgReadSub],
sizeof(struct message_list));
memcpy(&msgSend,msgGet,sizeof(struct message_list));
PutMessage(msgSend);
fprintf(stderr,"Recv msg %d.\n",port+4951);
iptrans_shm_ptr->msgPortIn[port].msgReadSub ++;
if(iptrans_shm_ptr->msgPortIn[port].msgReadSub==IN_LIST_NUM)
iptrans_shm_ptr->msgPortIn[port].msgReadSub =0;
/*
fprintf(stderr,"iptrans state:\n port=%d\n packet in=%ld out=%ld errors=%ld %ld\n",
port,
iptrans_shm_ptr->msgPortStat[port].inPackets,
iptrans_shm_ptr->msgPortStat[port].outPackets,
iptrans_shm_ptr->msgPortStat[port].errorInPackets,
iptrans_shm_ptr->msgPortStat[port].errorOutPackets);
*/
return 1;
}
else
{
return 0;
}
}
void PutMessage(struct message_list msgPut)
{
memcpy(&iptrans_shm_ptr->msgPortOut.msgList[iptrans_shm_ptr->msgPortOut.msgWriteSub],
&msgPut,sizeof(struct message_list));
iptrans_shm_ptr->msgPortOut.msgWriteSub ++;
if(iptrans_shm_ptr->msgPortOut.msgWriteSub==OUT_LIST_NUM)
iptrans_shm_ptr->msgPortOut.msgWriteSub=0;
}
void timer_IRQ()
{
int i;
struct message_list msgList;
for(i=0;i<13;i++)
{
GetMessage(&msgList,i);
// PutMessage(msgList);
}
}
void init_timer_interrupt(void)
{
struct sigaction newact;
newact.sa_handler =timer_IRQ;
newact.sa_flags =0;
sigemptyset(&newact.sa_mask);
sigaction(SIGALRM,&newact,NULL);
}
void setup_interval_timer(void)
{
struct itimerval value;
value.it_interval.tv_sec =0;
value.it_interval.tv_usec =5*1000;
value.it_value =value.it_interval;
setitimer(ITIMER_REAL,&value,NULL);
}
void init_timer()
{
init_timer_interrupt();
setup_interval_timer();
}
extern void DaemonInit(const char *pname, int facility);
extern void *ShmInit(int shm_id, char *prog_name, key_t key, int size, int shmflg);
extern void SetTermSignal(struct termio *ptermio, void (*handler)(int));
int main(int argc, char *argv[])
{
int err_flag = FALSE;
int test_mode = FALSE;
int ret;
SetDebugFlag();
/*
** Get option from command line.
** option 'd' is enable to run program with daemon mode.
*/
while ((ret = getopt(argc, argv, "dt")) != -1)
switch (ret)
{
case 'd':
/* Set daemon mode and open a syslog */
DaemonInit(PROG_NAME, LOG_USER);
break;
case 't':
test_mode = TRUE; /* test mode: bind port 4950 to recvfrom */
break;
case '?':
err_flag = TRUE;
}
if (err_flag) {
log_msg("Usage: %s -d -t \n", argv[0]);
log_msg(" -d with daemon mode");
log_msg(" -t with test mode");
exit(1);
}
/*
** Get shared memory block,
** IPTRANS_SHM_KEY to be defined in iptrans.h.
*/
iptrans_shm_ptr = (iptrans_shm *) ShmInit(iptrans_shm_id, PROG_NAME,
IPTRANS_SHM_KEY, sizeof(iptrans_shm), IPTRANS_SHM_PERM|IPC_CREAT);
memset(iptrans_shm_ptr, 0, sizeof(iptrans_shm));
/*
** Get semaphores ID used by shared memory block,
** IPTRANS_SEM_KEY to be defined in iptrans.h.
*/
SetTermSignal(&prev_termio, Terminate);
/*
** Open socket handler for IP transceiver.
** maxinum number is PORT_NUM.
*/
init_timer();
while(1){
usleep(1);
}
exit(0);
}
/*@end@*/