summaryrefslogtreecommitdiffstats
path: root/com-on-air_cs-linux/tools/dectshark/packetsaver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'com-on-air_cs-linux/tools/dectshark/packetsaver.cpp')
-rw-r--r--com-on-air_cs-linux/tools/dectshark/packetsaver.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/com-on-air_cs-linux/tools/dectshark/packetsaver.cpp b/com-on-air_cs-linux/tools/dectshark/packetsaver.cpp
new file mode 100644
index 0000000..b5d6d82
--- /dev/null
+++ b/com-on-air_cs-linux/tools/dectshark/packetsaver.cpp
@@ -0,0 +1,102 @@
+#include "packetsaver.h"
+
+
+packetsaver::packetsaver()
+{
+ pcap=NULL;
+}
+
+packetsaver::~packetsaver()
+{
+ closefile();
+}
+
+int packetsaver::openfilerfpi(unsigned char *RFPI)
+{
+ char fn[512];
+ char ftime[256];
+ time_t rawtime;
+ struct tm *timeinfo;
+
+ time (&rawtime);
+ timeinfo = localtime(&rawtime);
+
+ strftime(ftime, sizeof(ftime), "%Y-%m-%d_%H_%M_%S", timeinfo);
+
+ sprintf(fn, "dump_%s_RFPI_%.2x_%.2x_%.2x_%.2x_%.2x.pcap",ftime,
+ RFPI[0],RFPI[1],RFPI[2],RFPI[3],RFPI[4]);
+
+ LOG("### dumping to %s\n", fn);
+
+ return openfile(fn);
+}
+
+int packetsaver::openfile(char *fn)
+{
+ pcap = pcap_open_dead(DLT_EN10MB, 74);
+ if (!pcap)
+ {
+ LOG("!!! couldn't pcap_open_dead(\"%s\")\n", fn);
+ return 0;
+ }
+
+ pcap_d = pcap_dump_open(pcap, fn);
+ if (!pcap_d)
+ {
+ LOG("!!! couldn't pcap_dump_open(\"%s\")\n", fn);
+ return 0;
+ }
+
+ return 1;
+}
+
+void packetsaver::closefile()
+{
+ if (pcap)
+ {
+ pcap_dump_close(pcap_d);
+ pcap_close(pcap);
+ pcap_d = NULL;
+ pcap = NULL;
+ }
+}
+
+void packetsaver::savepacket(sniffed_packet packet)
+{
+ struct pcap_pkthdr pcap_hdr;
+ int ret,length;
+
+ if(pcap_d)
+ {
+ if ((packet.data[5] & 0x0e) != 0x0e)
+ length = 74;
+ else
+ length = 33;
+
+ pcap_hdr.caplen = length;
+ pcap_hdr.len = length;
+ ret = gettimeofday(&pcap_hdr.ts, NULL);
+ if (ret)
+ {
+ LOG("!!! couldn't gettimeofday(): %s\n",
+ strerror(errno));
+ exit(1);
+ }
+
+ uint8_t pcap_packet[74];
+ memset(pcap_packet, 0, 74);
+ pcap_packet[12] = 0x23;
+ pcap_packet[13] = 0x23;
+ pcap_packet[14] = 0x00; /* decttype (receive) */
+ pcap_packet[15] = packet.channel;
+ pcap_packet[16] = 0x00;
+ pcap_packet[17] = packet.slot;
+ pcap_packet[18] = packet.frameflags&0x0f;
+ pcap_packet[19] = packet.rssi;
+ memcpy(&pcap_packet[20], packet.data, 53);
+ pcap_packet[73] = 0x00;
+
+ pcap_dump((u_char*)pcap_d, &pcap_hdr, pcap_packet);
+
+ }
+}