#include "all.h"
#include "../ip/ip.h"
void
udprecv(Msgbuf *mb, Ifc *ifc)
{
Udppkt *uh;
int udplen, plen;
uh = (Udppkt*)mb->data;
plen = mb->count;
if(plen < Ensize+Ipsize+Udpsize)
goto drop;
udplen = nhgets(uh->udplen);
if(udplen+Ensize+Ipsize > plen)
goto drop;
/* construct pseudo hdr and check sum */
uh->ttl = 0;
hnputs(uh->cksum, udplen);
if(nhgets(uh->udpsum)
&& ptclcsum((uchar*)uh+(Ensize+Ipsize-Udpphsize), udplen + Udpphsize) != 0) {
if(ifc->sumerr < 3)
print("udp: cksum error %I\n", uh->src);
ifc->sumerr++;
goto drop;
}
switch(nhgets(uh->udpdst)) {
case 520:
riprecv(mb, ifc);
break;
case SNTP_LOCAL:
sntprecv(mb, ifc);
break;
default:
mbfree(mb);
break;
}
return;
drop:
mbfree(mb);
}
|