📄 icu.c
字号:
// gcc -g -O2 -D_REENTRANT -Wall -o icu icu.c ./libunp.a -lrt -lpthread
//
// TITLE:
//
// DESCRIPTION:
// main programme of icu, managing with network data
// current version based on mcu6 ver4.1
// REFER to "SiTracs system design.doc"
//
// FILENAME:
// icu.c
//
// AUTHOR(S):
// Andrew Dai(mailto:andrew.x.dai@gmail.com )
//
// CREATION DATE:
// date from: 2007-5-1
//
// MODIFICATION HISTORY:
//
//
//
/* toDo list
defination of 3 NICs, udp socket listen to a specific NIC
all parameters defined in a configuration file --> designing a management approach
implement of locking mechanism
*/
#include "icu.h"
#include "tc12mes.h"
#include "mcu6.h"
#include "trm.h"
#include "timer.h"
void
die(char *why, int n)
{
perror(why);
syslog(LOG_ERR|LOG_USER, why);
exit(n);
}
void
sys_log(const char *fmt, ... )
{
#if LEVEL(1)
va_list ap;
va_start(ap, fmt);
printf(fmt, ap);
printf("\n");
syslog(LOG_INFO|LOG_USER, fmt, ap);
va_end(ap);
#endif
return;
}
void
printHex(unsigned char p[], unsigned short len, char *str)
{
#if LEVEL(1)
int i;
printf("%s\t\"", str);
for (i=0; i<len; i++ )
{
printf("%02X ",p[i]);
}
printf("\"\n");
#endif
}
void *
myStrcpy(size_1 *d,size_1 *s, size_4 len)
{
size_4 j;
for (j=0; j<len;j++ )
{
d[j]=s[j];
}
return d;
}
size_1
myStrcmp(size_1 *d,size_1 *s, size_4 len)
{
size_4 j;
for (j=0; j<len;j++ )
{
if(d[j]!=s[j]) return FALSE;
}
return TRUE;
}
void
do_promisc(char *nif, int sock )
{
struct ifreq ifr;
strncpy(ifr.ifr_name, nif,strlen(nif)+1);
if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
{
die("ioctl", 2);
}
ifr.ifr_flags |= IFF_PROMISC;
if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )
{
die("ioctl", 3);
}
}
/* refer to: man 7 netdevice */
int
getEthernetAddr(const char *dev, unsigned char *addr) /* Get the ethernet address for the given device name */
{
struct ifreq ifr;
int ioctl_sockid;
bzero((char *)&ifr, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
if ((ioctl_sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return (-1);
if (ioctl(ioctl_sockid, SIOCGIFHWADDR, (char *)&ifr) < 0)
return(-1);
memcpy(addr, (unsigned char *) &ifr.ifr_hwaddr.sa_data, ETH_ALEN);
return(0);
}
int
main(int argc, char **argv)
{
sys_log("#PROGRAM_NAME started." );
/* create listening RAW PACKET socket */
if (getEthernetAddr(NIC_SCOOT, MyMac)) die("there is no nic for scoot", 1 );
if((packet_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) die("raw socket error", 1);
do_promisc(NIC_SCOOT, packet_fd);
/* create UDP for MCU6 socket */
/* i donot know why the below fd return 0
if((udp_mcu6_fd = socket(AF_INET, SOCK_DGRAM, 0)==-1)) die("UDP socket for MCU6 error",1);
*/
udp_mcu6_fd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));
udp_mcu6_serv_addr.sin_family = AF_INET;
udp_mcu6_serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
udp_mcu6_serv_addr.sin_port = htons(UDP_PORT_FOR_MCU6);
bind(udp_mcu6_fd, (SA *) &udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));
/* create UDP for TERMINAL socket */
// if((udp_terminal_fd = socket(AF_INET, SOCK_DGRAM, 0)==-1)) die("UDP socket for TERMINAL error",1);
udp_terminal_fd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));
udp_terminal_serv_addr.sin_family = AF_INET;
udp_terminal_serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
udp_terminal_serv_addr.sin_port = htons(UDP_PORT_FOR_TERMINAL);
bind(udp_terminal_fd, (SA *) &udp_terminal_serv_addr, sizeof(udp_terminal_serv_addr));
/* create a timer mechanism */
if(create_timer (TIMER_INTERVAL, TIMER_ID)) die("timer creat error",1);
/* setup select */
FD_ZERO(&rset);
maxfdp1 = max(max(packet_fd, udp_mcu6_fd),udp_terminal_fd) + 1;
for ( ; ; ) {
FD_SET(packet_fd, &rset);
FD_SET(udp_mcu6_fd, &rset);
FD_SET(udp_terminal_fd, &rset);
if ( (nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {
if (errno == EINTR)
continue; /* back to for() */
else
sys_log("select error");
}
/* handles packet from TCC */
if (FD_ISSET(packet_fd, &rset)) {
socket_addr_len = sizeof(packet_addr);
bytes_received = recvfrom(packet_fd, (char *)packet_r_buf, sizeof(packet_r_buf), 0, (SA *)&packet_addr, &socket_addr_len);
packet_r_buf[bytes_received] = 0;
ptemp = packet_r_buf;
peth = (struct ethhdr *)ptemp;
if (checkupPacket())
{
#if LEVEL(1)
printf("------------------------------> received a packet, len=\t%d\n",bytes_received);
printHex(peth->h_dest,6,"dest=");
printHex(peth->h_source,6,"src=");
printHex((unsigned char *) &(peth->h_proto),2,"proto=");
printHex(ptemp+= sizeof(struct ethhdr),bytes_received-sizeof(struct ethhdr),"packet=");
#endif
onPacket();
}
// sendto(packet_fd, (char *)packet_r_buf, bytes_received, 0, (SA *)&packet_addr, socket_addr_len);
continue;
}
/* handles udp packet from MCU6 */
if (FD_ISSET(udp_mcu6_fd, &rset)) {
socket_addr_len = sizeof(udp_mcu6_cli_addr);
bytes_received = recvfrom(udp_mcu6_fd, udp_mcu6_buf, sizeof(udp_mcu6_buf), 0, \
(SA *) &udp_mcu6_cli_addr, &socket_addr_len);
if(verifyMCU6(udp_mcu6_buf, bytes_received)!=0) {
sys_log("not valid upd");
continue; /* back to for() */
}
pmcu6_to_icu=(MCU6_TO_ICU *)udp_mcu6_buf;
showOTUmessage((MCU6_TO_ICU *) pmcu6_to_icu);
fillupOTUmessage((MCU6_TO_ICU *) pmcu6_to_icu, (SA *) &udp_mcu6_cli_addr);
// generateOTUreply();
// sendto(udp_mcu6_fd, udp_mcu6_buf, bytes_received, 0, (SA *) &udp_mcu6_cli_addr, socket_addr_len);
}
/* handles udp packet from terminal */
if (FD_ISSET(udp_terminal_fd, &rset)) {
socket_addr_len = sizeof(udp_terminal_cli_addr);
bytes_received = recvfrom(udp_terminal_fd, udp_terminal_buf, sizeof(udp_terminal_buf), 0, \
(SA *) &udp_terminal_cli_addr, &socket_addr_len);
sendto(udp_terminal_fd, udp_terminal_buf, bytes_received, 0, (SA *) &udp_terminal_cli_addr, socket_addr_len);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -