udp.c 754 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "all.h"
  2. #include "../ip/ip.h"
  3. void
  4. udprecv(Msgbuf *mb, Ifc *ifc)
  5. {
  6. Udppkt *uh;
  7. int udplen, plen;
  8. uh = (Udppkt*)mb->data;
  9. plen = mb->count;
  10. if(plen < Ensize+Ipsize+Udpsize)
  11. goto drop;
  12. udplen = nhgets(uh->udplen);
  13. if(udplen+Ensize+Ipsize > plen)
  14. goto drop;
  15. /* construct pseudo hdr and check sum */
  16. uh->ttl = 0;
  17. hnputs(uh->cksum, udplen);
  18. if(nhgets(uh->udpsum)
  19. && ptclcsum((uchar*)uh+(Ensize+Ipsize-Udpphsize), udplen + Udpphsize) != 0) {
  20. if(ifc->sumerr < 3)
  21. print("udp: cksum error %I\n", uh->src);
  22. ifc->sumerr++;
  23. goto drop;
  24. }
  25. switch(nhgets(uh->udpdst)) {
  26. case 520:
  27. riprecv(mb, ifc);
  28. break;
  29. case SNTP_LOCAL:
  30. sntprecv(mb, ifc);
  31. break;
  32. default:
  33. mbfree(mb);
  34. break;
  35. }
  36. return;
  37. drop:
  38. mbfree(mb);
  39. }