pcap.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* include open_pcap */
  2. #include "udpcksum.h"
  3. #define CMD "udp and src host %s and src port %d"
  4. void
  5. open_pcap(void)
  6. {
  7. uint32_t localnet, netmask;
  8. char cmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE],
  9. str1[INET_ADDRSTRLEN], str2[INET_ADDRSTRLEN];
  10. struct bpf_program fcode;
  11. if (device == NULL) {
  12. if ( (device = pcap_lookupdev(errbuf)) == NULL)
  13. err_quit("pcap_lookup: %s", errbuf);
  14. }
  15. printf("device = %s\n", device);
  16. /* 4hardcode: promisc=0, to_ms=500 */
  17. if ( (pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)
  18. err_quit("pcap_open_live: %s", errbuf);
  19. if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)
  20. err_quit("pcap_lookupnet: %s", errbuf);
  21. if (verbose)
  22. printf("localnet = %s, netmask = %s\n",
  23. Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),
  24. Inet_ntop(AF_INET, &netmask, str2, sizeof(str2)));
  25. snprintf(cmd, sizeof(cmd), CMD,
  26. Sock_ntop_host(dest, destlen),
  27. ntohs(sock_get_port(dest, destlen)));
  28. if (verbose)
  29. printf("cmd = %s\n", cmd);
  30. if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)
  31. err_quit("pcap_compile: %s", pcap_geterr(pd));
  32. if (pcap_setfilter(pd, &fcode) < 0)
  33. err_quit("pcap_setfilter: %s", pcap_geterr(pd));
  34. if ( (datalink = pcap_datalink(pd)) < 0)
  35. err_quit("pcap_datalink: %s", pcap_geterr(pd));
  36. if (verbose)
  37. printf("datalink = %d\n", datalink);
  38. }
  39. /* end open_pcap */
  40. /* include next_pcap */
  41. char *
  42. next_pcap(int *len)
  43. {
  44. char *ptr;
  45. struct pcap_pkthdr hdr;
  46. /* 4keep looping until packet ready */
  47. while ( (ptr = (char *) pcap_next(pd, &hdr)) == NULL)
  48. ;
  49. *len = hdr.caplen; /* captured length */
  50. return(ptr);
  51. }
  52. /* end next_pcap */