diff options
author | krater <krater@8d8ab74c-27aa-4a3d-9bde-523a2bc1f624> | 2009-03-29 03:45:05 +0000 |
---|---|---|
committer | krater <krater@8d8ab74c-27aa-4a3d-9bde-523a2bc1f624> | 2009-03-29 03:45:05 +0000 |
commit | 7f1c82655be009855741d1109e69ea829b7491fb (patch) | |
tree | 4d513f26396f90cf043ca1008ef6225402b719f2 | |
parent | 4819d4375e5f21abd575f3181df581213900c496 (diff) |
dectshark now saves pcaps
git-svn-id: https://dedected.org/svn/trunk@87 8d8ab74c-27aa-4a3d-9bde-523a2bc1f624
-rw-r--r-- | com-on-air_cs-linux/sc14421_sniffer.c | 15 | ||||
-rw-r--r-- | com-on-air_cs-linux/sc14421_sniffer.h | 3 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dect_cli.c | 2 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dect_cli.h | 3 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/Makefile | 4 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/dectshark.h | 18 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/packetparser.cpp | 13 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/packetparser.h | 11 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/packetsaver.cpp | 102 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/packetsaver.h | 41 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/syncmode_gui.cpp | 3 | ||||
-rw-r--r-- | com-on-air_cs-linux/tools/dectshark/syncmode_gui.h | 1 |
12 files changed, 192 insertions, 24 deletions
diff --git a/com-on-air_cs-linux/sc14421_sniffer.c b/com-on-air_cs-linux/sc14421_sniffer.c index b781f22..0301fdb 100644 --- a/com-on-air_cs-linux/sc14421_sniffer.c +++ b/com-on-air_cs-linux/sc14421_sniffer.c @@ -494,9 +494,10 @@ void sniffer_sniff_sync_irq(struct coa_info *dev, int irq) if ( (SC14421_READ(1+memofs) & 0xc0) == 0xc0) /* Checksum ok */ { + unsigned char bfok = ((SC14421_READ(1+memofs) & 0x03) == 0x03)<<7; /* BField Checksum ok */ + struct sniffed_packet packet; packet.rssi = SC14421_READ(memofs); - //packet.bfok = ((SC14421_READ(1+memofs) & 0x03) == 0x03); packet.channel = config->slottable[a].channel; packet.slot = a; memcpy(packet.data,fppacket,5); @@ -523,9 +524,9 @@ void sniffer_sniff_sync_irq(struct coa_info *dev, int irq) /* if (dev->open) */ { if(config->framenumber) - packet.framenumber = config->framenumber-1; + packet.frameflags = (config->framenumber-1)|bfok; else - packet.framenumber = 7; + packet.frameflags = 7|bfok; packet.timestamp = dev->irq_timestamp; ret = kfifo_put(dev->rx_fifo, (unsigned char*) &packet, sizeof(struct sniffed_packet)); @@ -593,10 +594,10 @@ void sniffer_sniff_sync_irq(struct coa_info *dev, int irq) if ( (SC14421_READ(1+memofs) & 0xc0) == 0xc0) /* Checksum ok */ { - struct sniffed_packet packet; + unsigned char bfok = ((SC14421_READ(1+memofs) & 0x03) == 0x03)<<7; /* BField Checksum ok */ + struct sniffed_packet packet; packet.rssi = SC14421_READ(memofs); - //packet.bfok = ((SC14421_READ(1+memofs) & 0x03) == 0x03); packet.channel = config->slottable[a].channel; packet.slot = a; memcpy(packet.data, pppacket, 5); @@ -610,9 +611,9 @@ void sniffer_sniff_sync_irq(struct coa_info *dev, int irq) /* if (dev->open) */ { if(config->framenumber) - packet.framenumber = config->framenumber-1; + packet.frameflags = (config->framenumber-1)|bfok; else - packet.framenumber = 7; + packet.frameflags = 7|bfok; packet.timestamp = dev->irq_timestamp; ret = kfifo_put( diff --git a/com-on-air_cs-linux/sc14421_sniffer.h b/com-on-air_cs-linux/sc14421_sniffer.h index 30e6d73..aa75469 100644 --- a/com-on-air_cs-linux/sc14421_sniffer.h +++ b/com-on-air_cs-linux/sc14421_sniffer.h @@ -56,8 +56,7 @@ struct sniffed_packet unsigned char rssi; unsigned char channel; unsigned char slot; - unsigned char framenumber; -// unsigned char bfok; + unsigned char frameflags; struct timespec timestamp; unsigned char data[53]; }; diff --git a/com-on-air_cs-linux/tools/dect_cli.c b/com-on-air_cs-linux/tools/dect_cli.c index 89eefe9..13dfa2d 100644 --- a/com-on-air_cs-linux/tools/dect_cli.c +++ b/com-on-air_cs-linux/tools/dect_cli.c @@ -858,7 +858,7 @@ void process_dect_data() pcap_packet[15] = cli.packet.channel; pcap_packet[16] = 0x00; pcap_packet[17] = cli.packet.slot; - pcap_packet[18] = cli.packet.framenumber; + pcap_packet[18] = cli.packet.frameflags&0x0f; pcap_packet[19] = cli.packet.rssi; memcpy(&pcap_packet[20], cli.packet.data, 53); diff --git a/com-on-air_cs-linux/tools/dect_cli.h b/com-on-air_cs-linux/tools/dect_cli.h index be13e45..3303091 100644 --- a/com-on-air_cs-linux/tools/dect_cli.h +++ b/com-on-air_cs-linux/tools/dect_cli.h @@ -41,8 +41,7 @@ struct sniffed_packet unsigned char rssi; unsigned char channel; unsigned char slot; - unsigned char framenumber; -// unsigned char bfok; + unsigned char frameflags; struct timespec timestamp; unsigned char data[53]; }; diff --git a/com-on-air_cs-linux/tools/dectshark/Makefile b/com-on-air_cs-linux/tools/dectshark/Makefile index c27b84d..8e500e9 100644 --- a/com-on-air_cs-linux/tools/dectshark/Makefile +++ b/com-on-air_cs-linux/tools/dectshark/Makefile @@ -1,6 +1,6 @@ CPPFLAGS=-Wall -O2 -I../.. -dectshark: dectshark.o gui.o foundinfo.o scanmode_gui.o syncmode_gui.o packetparser.o - g++ $(CPPFLAGS) dectshark.o gui.o scanmode_gui.o syncmode_gui.o foundinfo.o packetparser.o -o dectshark -lcurses -lpthread +dectshark: dectshark.o gui.o foundinfo.o scanmode_gui.o syncmode_gui.o packetparser.o packetsaver.o + g++ $(CPPFLAGS) dectshark.o gui.o scanmode_gui.o syncmode_gui.o foundinfo.o packetparser.o packetsaver.o -o dectshark -lcurses -lpthread -lpcap clean: rm *.o *~ dectshark diff --git a/com-on-air_cs-linux/tools/dectshark/dectshark.h b/com-on-air_cs-linux/tools/dectshark/dectshark.h index bac1d11..6f986aa 100644 --- a/com-on-air_cs-linux/tools/dectshark/dectshark.h +++ b/com-on-air_cs-linux/tools/dectshark/dectshark.h @@ -1,3 +1,6 @@ +#if !defined(DECTSHARK_GUI_H) +#define DECTSHARK_GUI_H + #include <ncurses.h> #include <unistd.h> #include <pthread.h> @@ -18,6 +21,7 @@ #include <sys/stat.h> #include <sys/select.h> #include <fcntl.h> +#include <pcap.h> #include "com_on_air_user.h" @@ -34,3 +38,17 @@ void printnil(char *,...); #else #define LOG printnil #endif + + +struct sniffed_packet +{ + unsigned char rssi; + unsigned char channel; + unsigned char slot; + unsigned char frameflags; + struct timespec timestamp; + unsigned char data[53]; +}; + + +#endif diff --git a/com-on-air_cs-linux/tools/dectshark/packetparser.cpp b/com-on-air_cs-linux/tools/dectshark/packetparser.cpp index b23d021..8ffa3a5 100644 --- a/com-on-air_cs-linux/tools/dectshark/packetparser.cpp +++ b/com-on-air_cs-linux/tools/dectshark/packetparser.cpp @@ -36,8 +36,13 @@ void packetparser::parsepacket(sniffed_packet packet) syncinfo.slot[slot].afields++; if(bfieldactive(packet)) + { syncinfo.slot[slot].bfields++; + if(!bfieldok(packet)) + syncinfo.slot[slot].berrors++; + } + syncinfo.slot[slot].channel=packet.channel; syncinfo.slot[slot].lastrssi=packet.rssi; @@ -58,6 +63,14 @@ int packetparser::bfieldactive(sniffed_packet packet) return 0; } +int packetparser::bfieldok(sniffed_packet packet) +{ + if(packet.frameflags&0xf0) + return 1; + + return 0; +} + void packetparser::processrfpi(sniffed_packet packet) { /* diff --git a/com-on-air_cs-linux/tools/dectshark/packetparser.h b/com-on-air_cs-linux/tools/dectshark/packetparser.h index 1611814..66a752d 100644 --- a/com-on-air_cs-linux/tools/dectshark/packetparser.h +++ b/com-on-air_cs-linux/tools/dectshark/packetparser.h @@ -3,16 +3,6 @@ #include "dectshark.h" -struct sniffed_packet -{ - unsigned char rssi; - unsigned char channel; - unsigned char slot; - unsigned char framenumber; -// unsigned char bfok; - struct timespec timestamp; - unsigned char data[53]; -}; struct slotinfo_str @@ -45,6 +35,7 @@ protected: syncinfo_str syncinfo; int bfieldactive(sniffed_packet packet); + int bfieldok(sniffed_packet packet); void processrfpi(sniffed_packet packet); }; 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); + + } +} diff --git a/com-on-air_cs-linux/tools/dectshark/packetsaver.h b/com-on-air_cs-linux/tools/dectshark/packetsaver.h new file mode 100644 index 0000000..55b4f83 --- /dev/null +++ b/com-on-air_cs-linux/tools/dectshark/packetsaver.h @@ -0,0 +1,41 @@ +#if !defined(PACKETSAVER_H) +#define PACKETSAVER_H + +#include "dectshark.h" + +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdint.h> +#include <sys/ioctl.h> +#include <time.h> +#include <limits.h> +#include <signal.h> +#include <ctype.h> + +class packetsaver +{ +public: + packetsaver(); + ~packetsaver(); + + int openfilerfpi(unsigned char *RFPI); + int openfile(char *fn); + void closefile(); + + void savepacket(sniffed_packet packet); + +protected: + char errbuf[PCAP_ERRBUF_SIZE]; + + pcap_t *pcap; + pcap_dumper_t *pcap_d; +}; + + + + +#endif diff --git a/com-on-air_cs-linux/tools/dectshark/syncmode_gui.cpp b/com-on-air_cs-linux/tools/dectshark/syncmode_gui.cpp index 7fcbcd2..58ce506 100644 --- a/com-on-air_cs-linux/tools/dectshark/syncmode_gui.cpp +++ b/com-on-air_cs-linux/tools/dectshark/syncmode_gui.cpp @@ -2,6 +2,7 @@ packetparser pparser; +packetsaver psaver; @@ -258,6 +259,7 @@ void *syncthread(void *threadid) if (ioctl(dev, COA_IOCTL_CHAN, &channel)) printf("couldn't set channel\n"); + psaver.openfilerfpi(RFPI); while (0xDEC + 'T') { @@ -298,6 +300,7 @@ void process_dect_data(int dev) while ( sizeof(packet) == read(dev, &packet, sizeof(packet))) { + psaver.savepacket(packet); pparser.parsepacket(packet); } } diff --git a/com-on-air_cs-linux/tools/dectshark/syncmode_gui.h b/com-on-air_cs-linux/tools/dectshark/syncmode_gui.h index bc62c11..89aa7a0 100644 --- a/com-on-air_cs-linux/tools/dectshark/syncmode_gui.h +++ b/com-on-air_cs-linux/tools/dectshark/syncmode_gui.h @@ -4,6 +4,7 @@ #include "dectshark.h" #include "mode_gui.h" #include "packetparser.h" +#include "packetsaver.h" void *syncthread(void *threadid); |