📄 gprs_udp.cpp
字号:
#include <stdio.h>
#include <string.h>
#include "GPRS_ppp.h"
#include "GPRS_net.h"
#include "GPRS_ip.h"
#include "GPRS_udp.h"
extern IPKT *ip_in; /* received ip packedt */
extern IPKT *ip_out; /* being transmit ip packedt */
extern NODE Locnode; /* locate node */
extern NODE hostnode; /* host node */
/* Return UDP data length (-1 if no data), 0 if not UDP */
short is_udp(short len)
{
UDPKT * udp;
unsigned short sum;
short dlen=0;
/* Check protocol & minimum length */
if (len>=sizeof(UDPHDR))
{
udp = (UDPKT *)ip_in; /* Do checksum */
sum = check_udp(udp, ip_in->i.sip, ip_in->i.dip, len);
if (!udp->u.check || sum==0xffff)
{ /* If zero or correct.. */
len -= sizeof(UDPHDR); /* Subtract header len */
dlen = len>0 ? len : -1; /* Return -1 if data len=0 */
}
}
return(dlen);
}
/* Make a UDP datagram given the source & destination, data len */
void make_udp(NODE *srcep, NODE *destp, unsigned short dlen)
{
UDPKT *udp;
unsigned short ulen;
udp = (UDPKT *)ip_out;
udp->u.sport = srcep->port; /* Set ports */
udp->u.dport = destp->port;
ulen = dlen + sizeof(UDPHDR);
udp->u.len = ulen;
udp->u.check = 0;
#ifdef bigend
swap_udp(udp);
#endif
make_ip(srcep, destp, PUDP, (unsigned short)(ulen));
udp->u.check = ~check_udp(udp, srcep->ip, destp->ip, ulen);
if (udp->u.check == 0) /* Change sum of 0 to FFFF */
udp->u.check = 0xffff;
}
/* Return TCP checksum, given UDP (header + data) length.
** The values must be in network byte-order */
unsigned short check_udp(UDPKT *udp, unsigned long sip, unsigned long dip, unsigned short ulen)
{
PHDR tph;
unsigned long sum;
sum = csum(&udp->u, (unsigned short)ulen); /* Checksum TCP segment */
#ifdef bigend
tph.len = swapw((unsigned short)ulen); /* Make pseudo-header */
tph.srce = swapl(sip);
tph.dest = swapl(dip);
#else
tph.len = (unsigned short)ulen; /* Make pseudo-header */
tph.srce = sip;
tph.dest = dip;
#endif
tph.z = 0;
tph.pcol = udp->i.pcol;
sum += csum(&tph, sizeof(tph)); /* Checksum pseudo-header */
return((unsigned short)(sum + (sum /0x10000))); /* Return total plus carry */
}
/* Swap byte order of shorts in TCP header */
void swap_udp(UDPKT *udp)
{
udp->u.sport = swapw(udp->u.sport);
udp->u.dport = swapw(udp->u.dport);
udp->u.len = swapw(udp->u.len);
}
/* Send a UDP datagram, given destination node, data and length */
void udp_transmit(NODE *sp, NODE *dp, void *dat, unsigned short len)
{
UDPKT *udp;
udp = (UDPKT *)ip_out;
memmove(udp->udpdata, dat, len);
make_udp(sp, dp, (unsigned short)max(len, 0));
IPNetSend();
}
/* Get the frame driver type, source port, IP and Ethernet addrs */
void getudp_srce(NODE *np)
{
UDPKT *udp;
memset(np, 0, sizeof(NODE)); /* Clear unused fields */
getip_srce(np); /* Get dtype, srce IP and Ether addrs */
udp = (UDPKT *)ip_in;
np->port = udp->u.sport; /* Get source port */
}
/* Get complete TCP local node data corresponding to frame dest IP address
** Return 0 if no matching node */
short getudp_locdest(NODE *np)
{
UDPKT *udp;
short ok;
ok = getip_locdest(np); /* Get addresses, dtype & netmask */
udp = (UDPKT *)ip_in; /* Get dest port */
np->port = udp->u.dport;
return(ok);
}
// deal udp datagram
void UDP_Handler(unsigned short len)
{
NODE loc,rem;
UDPKT *udp;
udp=(UDPKT *)ip_in;
swap_udp(udp);
getudp_srce(&rem);
getudp_locdest(&loc);
// swap_udp(udp);
if (loc.port == locnode.port) /* Client response */
{
//数据处理
udp_transmit(&loc, &rem, udp->udpdata, len);
}
else if (loc.port == ECHOPORT) /* Echo req: resend data */
udp_transmit(&loc, &rem, udp->udpdata, len);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -