| #include "utils/mctp-capture.h" |
| |
| #include <stdio.h> |
| #include <sys/time.h> |
| |
| int capture_init(void) |
| { |
| char errbuf[PCAP_ERRBUF_SIZE]; |
| int rc; |
| |
| if ((rc = pcap_init(PCAP_CHAR_ENC_UTF_8, errbuf)) == -1) { |
| fprintf(stderr, "pcap_init: %s\n", errbuf); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int capture_prepare(struct capture *cap) |
| { |
| int rc; |
| |
| if (cap->linktype < CAPTURE_LINKTYPE_FIRST || |
| cap->linktype > CAPTURE_LINKTYPE_LAST) { |
| fprintf(stderr, |
| "Invalid private linktype value %d: see https://www.tcpdump.org/linktypes.html\n", |
| cap->linktype); |
| return -1; |
| } |
| |
| if (!(cap->pcap = pcap_open_dead(cap->linktype, UINT16_MAX))) { |
| fprintf(stderr, "pcap_open_dead: failed\n"); |
| return -1; |
| } |
| |
| if (!(cap->dumper = pcap_dump_open(cap->pcap, cap->path))) { |
| fprintf(stderr, "pcap_dump_open: failed\n"); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| void capture_close(struct capture *cap) |
| { |
| pcap_dump_close(cap->dumper); |
| |
| pcap_close(cap->pcap); |
| } |
| |
| void capture_binding(struct mctp_pktbuf *pkt, void *user) |
| { |
| pcap_dumper_t *dumper = user; |
| struct pcap_pkthdr hdr; |
| int rc; |
| |
| if ((rc = gettimeofday(&hdr.ts, NULL)) == -1) |
| return; |
| |
| hdr.caplen = mctp_pktbuf_size(pkt); |
| hdr.len = mctp_pktbuf_size(pkt); |
| |
| pcap_dump((u_char *)dumper, &hdr, (const u_char *)mctp_pktbuf_hdr(pkt)); |
| } |
| |
| void capture_socket(pcap_dumper_t *dumper, const void *buf, size_t len) |
| { |
| struct pcap_pkthdr hdr; |
| int rc; |
| |
| if ((rc = gettimeofday(&hdr.ts, NULL)) == -1) |
| return; |
| |
| hdr.caplen = len; |
| hdr.len = len; |
| |
| pcap_dump((u_char *)dumper, &hdr, buf); |
| } |