udpread.lc 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "udpcksum.h"## 1 ##src/udpcksum/udpread.c##
  2. struct udpiphdr *udp_check(char *, int);## 2 ##src/udpcksum/udpread.c##
  3. /*## 3 ##src/udpcksum/udpread.c##
  4. * Read from the network until a UDP datagram is read that matches## 4 ##src/udpcksum/udpread.c##
  5. * the arguments.## 5 ##src/udpcksum/udpread.c##
  6. */## 6 ##src/udpcksum/udpread.c##
  7. /* include udp_read */
  8. struct udpiphdr *## 7 ##src/udpcksum/udpread.c##
  9. udp_read(void)## 8 ##src/udpcksum/udpread.c##
  10. {## 9 ##src/udpcksum/udpread.c##
  11. int len;## 10 ##src/udpcksum/udpread.c##
  12. char *ptr;## 11 ##src/udpcksum/udpread.c##
  13. struct ether_header *eptr;## 12 ##src/udpcksum/udpread.c##
  14. for (;;) {## 13 ##src/udpcksum/udpread.c##
  15. ptr = next_pcap(&len);## 14 ##src/udpcksum/udpread.c##
  16. switch (datalink) {## 15 ##src/udpcksum/udpread.c##
  17. case DLT_NULL: /* loopback header = 4 bytes */## 16 ##src/udpcksum/udpread.c##
  18. return (udp_check(ptr + 4, len - 4));## 17 ##src/udpcksum/udpread.c##
  19. case DLT_EN10MB:## 18 ##src/udpcksum/udpread.c##
  20. eptr = (struct ether_header *) ptr;## 19 ##src/udpcksum/udpread.c##
  21. if (ntohs(eptr->ether_type) != ETHERTYPE_IP)## 20 ##src/udpcksum/udpread.c##
  22. err_quit("Ethernet type %x not IP", ntohs(eptr->ether_type));## 21 ##src/udpcksum/udpread.c##
  23. return (udp_check(ptr + 14, len - 14));## 22 ##src/udpcksum/udpread.c##
  24. case DLT_SLIP: /* SLIP header = 24 bytes */## 23 ##src/udpcksum/udpread.c##
  25. return (udp_check(ptr + 24, len - 24));## 24 ##src/udpcksum/udpread.c##
  26. case DLT_PPP: /* PPP header = 24 bytes */## 25 ##src/udpcksum/udpread.c##
  27. return (udp_check(ptr + 24, len - 24));## 26 ##src/udpcksum/udpread.c##
  28. default:## 27 ##src/udpcksum/udpread.c##
  29. err_quit("unsupported datalink (%d)", datalink);## 28 ##src/udpcksum/udpread.c##
  30. }## 29 ##src/udpcksum/udpread.c##
  31. }## 30 ##src/udpcksum/udpread.c##
  32. }## 31 ##src/udpcksum/udpread.c##
  33. /* end udp_read */
  34. /*## 32 ##src/udpcksum/udpread.c##
  35. * Check the received packet.## 33 ##src/udpcksum/udpread.c##
  36. * If UDP and OK, return pointer to packet.## 34 ##src/udpcksum/udpread.c##
  37. * If ICMP error, return NULL.## 35 ##src/udpcksum/udpread.c##
  38. * We assume the filter picks out desired UDP datagrams.## 36 ##src/udpcksum/udpread.c##
  39. */## 37 ##src/udpcksum/udpread.c##
  40. /* include udp_check */
  41. struct udpiphdr *## 38 ##src/udpcksum/udpread.c##
  42. udp_check(char *ptr, int len)## 39 ##src/udpcksum/udpread.c##
  43. {## 40 ##src/udpcksum/udpread.c##
  44. int hlen;## 41 ##src/udpcksum/udpread.c##
  45. struct ip *ip;## 42 ##src/udpcksum/udpread.c##
  46. struct udpiphdr *ui;## 43 ##src/udpcksum/udpread.c##
  47. if (len < sizeof(struct ip) + sizeof(struct udphdr))## 44 ##src/udpcksum/udpread.c##
  48. err_quit("len = %d", len);## 45 ##src/udpcksum/udpread.c##
  49. /* 4minimal verification of IP header */## 46 ##src/udpcksum/udpread.c##
  50. ip = (struct ip *) ptr;## 47 ##src/udpcksum/udpread.c##
  51. if (ip->ip_v != IPVERSION)## 48 ##src/udpcksum/udpread.c##
  52. err_quit("ip_v = %d", ip->ip_v);## 49 ##src/udpcksum/udpread.c##
  53. hlen = ip->ip_hl << 2;## 50 ##src/udpcksum/udpread.c##
  54. if (hlen < sizeof(struct ip))## 51 ##src/udpcksum/udpread.c##
  55. err_quit("ip_hl = %d", ip->ip_hl);## 52 ##src/udpcksum/udpread.c##
  56. if (len < hlen + sizeof(struct udphdr))## 53 ##src/udpcksum/udpread.c##
  57. err_quit("len = %d, hlen = %d", len, hlen);## 54 ##src/udpcksum/udpread.c##
  58. if ((ip->ip_sum = in_cksum((uint16_t *) ip, hlen)) != 0)## 55 ##src/udpcksum/udpread.c##
  59. err_quit("ip checksum error");## 56 ##src/udpcksum/udpread.c##
  60. if (ip->ip_p == IPPROTO_UDP) {## 57 ##src/udpcksum/udpread.c##
  61. ui = (struct udpiphdr *) ip;## 58 ##src/udpcksum/udpread.c##
  62. return (ui);## 59 ##src/udpcksum/udpread.c##
  63. } else## 60 ##src/udpcksum/udpread.c##
  64. err_quit("not a UDP packet");## 61 ##src/udpcksum/udpread.c##
  65. }## 62 ##src/udpcksum/udpread.c##
  66. /* end udp_check */