📄 ip_udp_arp.c
字号:
{
int i;
for (i = 0; i < ARP_TABLE_SIZE; i++)
{
if ( arp_entry_table[i].ae_state != AS_FREE
&& arp_entry_table[i].ae_ipaddr == ip)
return &arp_entry_table[i];
}
return NULL;
}
/* ----------------------------------------------------------------------- *\
|* Function:
|* arp_find_a_free_entry()
|*
|* Description:
|* Find a free ARP table entry of the specified IP address. If no
|* entry is free, return NULL.
|*
|* Argument:
|* none
|*
|* Return Value:
|* ARP_ENTRY *: pointer to an free ARP table entry
\* ----------------------------------------------------------------------- */
ARP_ENTRY * arp_find_a_free_entry(void)
{
int i;
for (i = 0; i < ARP_TABLE_SIZE; i++)
{
if (arp_entry_table[i].ae_state == AS_FREE)
return &arp_entry_table[i];
}
return NULL;
}
char * arp_out(ULONG ip)
{
ULONG msg_buf[4], rc;
ARP_ENTRY * pae;
pae = arp_find_entry(ip);
if (pae != NULL)
{
if (pae->ae_state == AS_RESOLVED)
{
if (pae->ae_ttl != ARP_TIMER_NOTIMEOUT)
pae->ae_ttl = ARP_TIMER_TIMEOUT;
return pae->ae_hwaddr;
}
else
return NULL;
}
return NULL;
}
/*************************************************************************************/
int init_udp(int stage)
{
USHORT i,len;
ULONG ret_val,udp_send_task_ID,udp_rece_task_ID;
UCHAR msg[5]={"RESET"};
UCHAR *buff;
int sock;
struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];
memset( (const char *)&app_to_udp_send, 0, sizeof(app_to_udp_send) );
memset( (const char *)&udp_rece_to_app, 0, sizeof(udp_rece_to_app) );
if (stage==0)
{
port[0] = UDP_PORT1;
port[1] = UDP_PORT2;
port[2] = UDP_PORT3;
port[3] = UDP_PORT4;
port[4] = UDP_PORT5;
port[5] = UDP_PORT6;
port[6] = UDP_PORT7;
port[7] = UDP_PORT8;
port[8] = UDP_PORT9;
port[9] = UDP_PORT10;
port[10] = UDP_PORT11;
port[11] = UDP_PORT12;
port[12] = UDP_PORT13;
port[13] = UDP_PORT14;
port[14] = UDP_PORT15;
port[15] = UDP_PORT16;
port[16] = UDP_PORT17;
port[17] = UDP_PORT18;
port[18] = UDP_PORT19;
port[19] = UDP_PORT20;
port[20] = UDP_PORT21;
port[21] = UDP_PORT22;
port[22] = UDP_PORT23;
port[23] = UDP_PORT24;
port[24] = UDP_PORT25;
udp_setup=1;
}
else
{
memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
user_addr[24].sin_family = AF_INET;
user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
user_addr[24].sin_port = htons(port[24]);
for(i=0;i<configdata.RemoteEndpointNumber;i++)
{
sock = socket(AF_INET, SOCK_DGRAM, UDP);
if(sock == -1)
{
ret_val=errno;
Print("socket( %d ) ERROR %x!\n", 24,ret_val);
return;
}
if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
{
ret_val=errno;
close(sock);
Print(" bind( %d ), ERROR %x!\n",24,ret_val);
return;
}
ras_to_udp_send.port=1719;
ras_to_udp_send.ip_addr=configdata.RemoteEndpoint[i].ip;;
ras_to_udp_send.self_port=1719;
ras_to_udp_send.len=5;
ras_to_udp_send.busy=1;
len=5;
memcpy(&ras_to_udp_send.data[0],msg,len);
memset( (const char *)&object, 0, sizeof(object) );
object.sin_family = AF_INET;
object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
object.sin_port = htons(ras_to_udp_send.port);
len = ras_to_udp_send.len;
buff = ras_to_udp_send.data;
ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));
if(ret_val != len)
{ Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
close(sock);
}
}
/* create port use quene */
/* ret_val = q_create("UDPS", 0, Q_FIFO | Q_SYSBUF | Q_NOLIMIT, &udp_send_quene_ID);
if(ret_val != 0)
{Print("Lan create send quene error !\n");
return(-1);
}
ret_val = q_create("UDPR", 0, Q_FIFO | Q_SYSBUF | Q_NOLIMIT, &udp_rece_quene_ID );
if(ret_val != 0)
{Print("Lan create rece quene %d error !\n",i);
return(-1);
}
*/
//create port use task
/* ret_val=t_create("UPST",150,4096,1024,0,&udp_send_task_ID);
if(ret_val!=0)
{
Print("Lan create send task error !\n");
return(-1);
}
*/
/* ret_val=t_create("UPRC",150,4096,1024,0,&udp_rece_task_ID);
if(ret_val != 0)
{
Print("Lan create rece task error !\n");
return(-1);
}
*/
/* create UDP socket */
/* for(i=0; i<UDP_PORT_MAX_NUM-1; i++)
{
memset((const char *)&user_addr[i], 0, sizeof(struct sockaddr_in) );
user_addr[i].sin_family = AF_INET;
user_addr[i].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
user_addr[i].sin_port = htons(port[i]);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock == -1)
{
ret_val=errno;
Print("socket( %d ) ERROR !\n", i);
return(-1);
}
if( bind(sock, (struct sockaddr *)&user_addr[i], sizeof(user_addr[i]) )!=0 )
{
close(sock);
Print(" bind( %d ), ERROR !\n",i);
return(-1);
};
udp_share_sock_send[i] = shr_socket(sock, udp_send_task_ID);
// udp_share_sock_rece[i] = shr_socket(sock, udp_rece_task_ID);
close(sock);
sock =0;
}
*/
/* task start */
// ret_val = t_start(udp_send_task_ID, T_SUPV|T_PREEMPT|T_TSLICE/*T_NOPREEMPT|T_NOTSLICE*/, udp_send, 0);
// if(ret_val != 0)
// {
// Print("UDP start send task error !\n");
// return(-1);
// }
/* ret_val = t_start(udp_rece_task_ID, T_SUPV|T_NOPREEMPT|T_NOTSLICE, udp_rece, 0);
if(ret_val != 0)
{
Print("UDP start rece task 0 error !\n");
return(-1);
}
udp_setup=1;
return(0);*/
return(0);
}
int arpaddr_open(ULONG ip)
{
ULONG rc, msg_buf[4];
if (ip == SysVars.Lan1IP)
{
return 0;
}
else
{
if ( (ip & SysVars.Lan1SubnetMask)
== (SysVars.Lan1IP & SysVars.Lan1SubnetMask))
msg_buf[1] = ip;
else
msg_buf[1] = SysVars.DefGtwyIP;
}
msg_buf[0] = 1;/*ARP_MSG_INCREASE_REFERENCE;*/
rc = q_send(qid_arp, msg_buf);
if (rc != 0)
Print("nwmgip_open: q_send to ARP QUEUE error! errno: 0x%04X\n.", rc);
return 0;
}
int arpaddr_close(ULONG ip)
{
ULONG rc, msg_buf[4];
if (ip == SysVars.Lan1IP)
return 0;
if ( (ip & SysVars.Lan1SubnetMask)
== (SysVars.Lan1IP & SysVars.Lan1SubnetMask))
msg_buf[1] = ip;
else
msg_buf[1] = SysVars.DefGtwyIP;
msg_buf[0] = 2;/*ARP_MSG_DECREASE_REFERENCE;*/
rc = q_send(qid_arp, msg_buf);
if (rc != 0)
Print("nwmgip_open: q_send to ARP QUEUE error! errno: 0x%04X\n.", rc);
return 0;
}
void SCH_udp_send(ULONG ip)
{
long ret_val;
ULONG i,mess[4],ptr;
USHORT len;
UCHAR *buff;
int opt, optsize=4;
int sock;
struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];
memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
user_addr[24].sin_family = AF_INET;
user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
user_addr[24].sin_port = htons(port[24]);
sock = socket(AF_INET, SOCK_DGRAM, UDP);
if(sock == -1)
{
ret_val=errno;
Print("socket( %d ) ERROR %x!\n", 24,ret_val);
return;
}
if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
{
ret_val=errno;
close(sock);
// Print(" bind( %d ), ERROR %x!\n",24,ret_val);
return;
}
opt=1;
ret_val=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&opt, optsize);
if(ret_val != 0)
{ Print(" setsockopt ret=%d errno=%d\n",ret_val,errno); }
ras_to_udp_send.port=1719;
ras_to_udp_send.ip_addr=ip;
ras_to_udp_send.self_port=1719;
ras_to_udp_send.busy=1;
ras_to_udp_send.data[0]='S';
ras_to_udp_send.data[1]=LOCAL_MMC_CONNECT;
ras_to_udp_send.data[2]=LOCAL_RECORD_IP_TABLE.TYPE;
memcpy(&ras_to_udp_send.data[3],LOCAL_RECORD_IP_TABLE.DN,16);
memcpy(&ras_to_udp_send.data[19],&LOCAL_RECORD_IP_TABLE.IP,4);
memcpy(&ras_to_udp_send.data[23],&LOCAL_RECORD_IP_TABLE.R_IP,4);
ras_to_udp_send.len=27;
memset( (const char *)&object, 0, sizeof(object) );
object.sin_family = AF_INET;
object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
object.sin_port = htons(ras_to_udp_send.port);
len = ras_to_udp_send.len;
buff = ras_to_udp_send.data;
ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));
if(ret_val != len)
{ Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
close(sock);
}
void state_udp_send(ULONG ip,char *p)
{
long ret_val;
ULONG i,mess[4],ptr;
USHORT len;
UCHAR *buff;
int sock;
struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];
memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
user_addr[24].sin_family = AF_INET;
user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
user_addr[24].sin_port = htons(1719);
sock = socket(AF_INET, SOCK_DGRAM, UDP);
if(sock == -1)
{
ret_val=errno;
Print("socket( %d ) ERROR %x!\n", 24,ret_val);
return;
}
if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
{
ret_val=errno;
close(sock);
Print(" bind( %d ), ERROR %x!\n",24,ret_val);
return;
}
ras_to_udp_send.port=1719;
ras_to_udp_send.ip_addr=ip;;
ras_to_udp_send.self_port=1719;
ras_to_udp_send.busy=1;
memcpy(&ras_to_udp_send.data[0],p,30);
ras_to_udp_send.len=24;
memset( (const char *)&object, 0, sizeof(object) );
object.sin_family = AF_INET;
object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
object.sin_port = htons(ras_to_udp_send.port);
len = ras_to_udp_send.len;
buff = ras_to_udp_send.data;
ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));
if(ret_val != len)
{ Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
close(sock);
}
/******************************************************************************/
/* udp send task , data from upper_layer to UDP port */
void udp_send(ULONG ip,USHORT port)
{
long ret_val;
ULONG i,mess[4],ptr;
USHORT len;
UCHAR *buff;
int sock;
struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];
memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
user_addr[24].sin_family = AF_INET;
user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
user_addr[24].sin_port = htons(port);
sock = socket(AF_INET, SOCK_DGRAM, UDP);
if(sock == -1)
{
ret_val=errno;
Print("socket( %d ) ERROR %x!\n", 24,ret_val);
return;
}
if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
{
ret_val=errno;
close(sock);
Print(" bind( %d ), ERROR %x!\n",24,ret_val);
return;
}
ras_to_udp_send.port=port;
ras_to_udp_send.ip_addr=ip;;
ras_to_udp_send.self_port=port;
ras_to_udp_send.busy=1;
memcpy(&ras_to_udp_send.data[0],&comid,24);
ras_to_udp_send.len=24;
memset( (const char *)&object, 0, sizeof(object) );
object.sin_family = AF_INET;
object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
object.sin_port = htons(ras_to_udp_send.port);
len = ras_to_udp_send.len;
buff = ras_to_udp_send.data;
ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));
if(ret_val != len)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -