diff options
author | dragorn <dragorn@8d8ab74c-27aa-4a3d-9bde-523a2bc1f624> | 2009-11-21 22:35:05 +0000 |
---|---|---|
committer | dragorn <dragorn@8d8ab74c-27aa-4a3d-9bde-523a2bc1f624> | 2009-11-21 22:35:05 +0000 |
commit | 9d6689fd9220351c2f6c1b1da54b721576aca424 (patch) | |
tree | ce1027fc775005fbda683cbd31327131d2e5177a | |
parent | dfcf4093f33ed270b335a9868db3ff806e729670 (diff) |
Add updated dect client plugin - note does NOT currently work with the new dect
server plugin!
Added 'scandect' pcap log type logging dect_data_scan_t to EN10MB wrapped packets
Disabled callpcap logging until reworked to fit per-call logging
git-svn-id: https://dedected.org/svn/trunk@95 8d8ab74c-27aa-4a3d-9bde-523a2bc1f624
-rw-r--r-- | kismet-dect-v2/Makefile | 15 | ||||
-rw-r--r-- | kismet-dect-v2/dect_client.cc | 497 | ||||
-rw-r--r-- | kismet-dect-v2/kismet_dect.cc | 24 | ||||
-rw-r--r-- | kismet-dect-v2/packet_dect.h | 3 | ||||
-rw-r--r-- | kismet-dect-v2/packetsource_dect.cc | 32 |
5 files changed, 557 insertions, 14 deletions
diff --git a/kismet-dect-v2/Makefile b/kismet-dect-v2/Makefile index 6afe87b..ce9e5de 100644 --- a/kismet-dect-v2/Makefile +++ b/kismet-dect-v2/Makefile @@ -15,18 +15,27 @@ CFLAGS += -I/usr/include -I$(KIS_INC_DIR) -g -fPIC SRVOBJS = packetsource_dect.o tracker_dect.o kismet_dect.o SRVOUT = dedected.so -all: $(SRVOUT) +CLIOBJS = dect_client.o +CLIOUT = dect_client.so + +all: $(SRVOUT) $(CLIOUT) $(SRVOUT): $(SRVOBJS) $(LD) $(PLUGINLDFLAGS) $(SRVOBJS) -o $(SRVOUT) $(LIBS) -install: $(SRVOUT) +$(CLIOUT): $(CLIOBJS) + $(LD) $(PLUGINLDFLAGS) $(CLIOBJS) -o $(CLIOUT) $(LIBS) + +install: $(SRVOUT) $(CLIOUT) mkdir -p $(DESTDIR)$(prefix)/lib/kismet/ install -o $(INSTUSR) -g $(INSTGRP) -m 644 $(SRVOUT) $(DESTDIR)$(prefix)/lib/kismet/$(SRVOUT) + mkdir -p $(DESTDIR)$(prefix)/lib/kismet_client/ + install -o $(INSTUSR) -g $(INSTGRP) -m 644 $(CLIOUT) $(DESTDIR)$(prefix)/lib/kismet_client/$(CLIOUT) -userinstall: $(SRVOUT) +userinstall: $(SRVOUT) $(CLIOUT) mkdir -p ${HOME}/.kismet/plugins/ install -v $(SRVOUT) ${HOME}/.kismet/plugins/$(SRVOUT) + install -v -D $(CLIOUT) ${HOME}/.kismet/client_plugins/$(CLIOUT) clean: @-rm -f *.o diff --git a/kismet-dect-v2/dect_client.cc b/kismet-dect-v2/dect_client.cc new file mode 100644 index 0000000..d53a86a --- /dev/null +++ b/kismet-dect-v2/dect_client.cc @@ -0,0 +1,497 @@ +/* kismet dect client plugin + * (c) 2008 by Mike Kershaw <dragorn (at) kismetwireless (dot) net, + * Jake Appelbaum <ioerror (at) appelbaum (dot) net, + * Christian Fromme <kaner (at) strace (dot) org + * + * GPL'd code, see LICENCE file for licence information + */ + +#include <config.h> + +#include <stdio.h> +#include <string.h> + +#include <globalregistry.h> + +#include <kis_panel_plugin.h> +#include <kis_panel_frontend.h> +#include <kis_panel_windows.h> +#include <kis_panel_widgets.h> + +#define KCLI_DECT_CHANNEL_FIELDS "rfpi,rssi,channel,first_seen,last_seen,count_seen" + +#define SORT_BY_RFPI 0 +#define SORT_BY_RSSI 1 +#define SORT_BY_CHANNEL 2 +#define SORT_BY_COUNTSEEN 5 + +#define MODE_ASYNC_FP_SCAN 0 +#define MODE_ASYNC_PP_SCAN 1 +#define MODE_SYNC_CALL_SCAN 2 + +// default: sort by RSSI +static int sort_by = SORT_BY_RSSI; +static bool descending = true; +static int mode = MODE_ASYNC_FP_SCAN; + +struct dect_data { + Kis_Scrollable_Table *dtable; + Kis_Free_Text *modetxt; + + vector<vector <string> > info_vec_fp; + vector<vector <string> > info_vec_pp; + vector<string> sync_station; + int addref; + int numrows; + + int view; + + int mn_dect, mi_show, mi_showd, mi_showc, mi_fpscan, mi_ppscan, + mi_sort_rfpi, mi_sort_rfpi_desc, mi_sort_rssi, mi_sort_rssi_desc, + mi_sort_channel, mi_sort_view, mi_sort_view_desc; + Kis_Menu *menu; + + KisPanelPluginData *pdata; +}; + +bool less_by_RSSI(const vector<string> &v1, const vector<string> &v2) +{ + if (sort_by == SORT_BY_RFPI) { + if (v1[sort_by].compare(v2[sort_by]) < 0) { + return true; + } + } else { + if (atoi(v1[sort_by].c_str()) < atoi(v2[sort_by].c_str())) { + return true; + } + } + return false; +} + +void DectDetailsProtoDECT(CLIPROTO_CB_PARMS) +{ + KisPanelPluginData *pdata = (KisPanelPluginData *)auxptr; + dect_data *ddata = (dect_data *)pdata->pluginaux; + bool match = false; + vector<string> inf; + vector<string> showinf; + string buf; + stringstream ss(proto_string); + + // Dissect string at whitespace + while (ss >> buf) { + inf.push_back(buf); + } + + // Niceify dates + string f, l; + time_t first, last; + char first_s[30], last_s[30]; + first = atoi(inf[3].c_str()); + last = atoi(inf[4].c_str()); + ctime_r(&first, first_s); + ctime_r(&last, last_s); + inf[3] = first_s; + inf[4] = last_s; + + if (mode == MODE_ASYNC_FP_SCAN) { + vector<vector <string> >::iterator i = ddata->info_vec_fp.begin(); + for (int j = 0; i < ddata->info_vec_fp.end(); ++i, ++j) { + if ((*i)[0] == inf[0]) { + match = true; + // Update + ddata->info_vec_fp[j] = inf; + } + } + if (!match) { + ddata->info_vec_fp.push_back(inf); + } + sort(ddata->info_vec_fp.begin(), ddata->info_vec_fp.end(), less_by_RSSI); + if (descending) { + reverse(ddata->info_vec_fp.begin(), ddata->info_vec_fp.end()); + } + } else if (mode == MODE_ASYNC_PP_SCAN) { + vector<vector <string> >::iterator i = ddata->info_vec_pp.begin(); + for (int j = 0; i < ddata->info_vec_pp.end(); ++i, ++j) { + if ((*i)[0] == inf[0]) { + match = true; + // Update + ddata->info_vec_pp[j] = inf; + } + } + if (!match) { + ddata->info_vec_pp.push_back(inf); + } + sort(ddata->info_vec_pp.begin(), ddata->info_vec_pp.end(), less_by_RSSI); + if (descending) { + reverse(ddata->info_vec_pp.begin(), ddata->info_vec_pp.end()); + } + } + + ddata->dtable->Clear(); + + if (mode == MODE_ASYNC_FP_SCAN) { + vector<vector <string> >::iterator i = ddata->info_vec_fp.begin(); + for (int j = 0; i < ddata->info_vec_fp.end(); ++i, ++j) { + ddata->dtable->AddRow(j, (*i)); + } + } else if (mode == MODE_ASYNC_PP_SCAN || mode == MODE_SYNC_CALL_SCAN) { + vector<vector <string> >::iterator i = ddata->info_vec_pp.begin(); + for (int j = 0; i < ddata->info_vec_pp.end(); ++i, ++j) { + ddata->dtable->AddRow(j, (*i)); + } + } + + ddata->dtable->DrawComponent(); +} + +void dect_prompt_nodect(KIS_PROMPT_CB_PARMS) { + if (check) + globalreg->panel_interface->prefs->SetOpt("PLUGIN_DECT_WARNDECT", "false", 1); +} + +void DectCliConfigured(CLICONF_CB_PARMS) +{ + KisPanelPluginData *pdata = (KisPanelPluginData *) auxptr; + dect_data *ddata = (dect_data *) pdata->pluginaux; + + if (kcli->RegisterProtoHandler("DECT", KCLI_DECT_CHANNEL_FIELDS, + DectDetailsProtoDECT, pdata) < 0) { + _MSG("Could not register DECT protocol with remote server", + MSGFLAG_ERROR); + + if (globalreg->panel_interface->prefs->FetchOpt("PLUGIN_DECT_WARNDECT") == "" || + globalreg->panel_interface->prefs->FetchOpt("PLUGIN_DECT_WARNDECT") == + "true") { + vector<string> t; + t.push_back("No support for the DECT protocol on the Kismet"); + t.push_back("server. The Dedected Kismet server plugin must"); + t.push_back("be loaded as well."); + + Kis_Prompt_Panel *kpp = + new Kis_Prompt_Panel(globalreg, globalreg->panel_interface); + kpp->SetTitle("No DECT support in server"); + kpp->SetDisplayText(t); + kpp->SetCheckText("Do not show this warning in the future"); + kpp->SetChecked(0); + kpp->SetButtonText("OK", ""); + kpp->SetCallback(dect_prompt_nodect, NULL); + globalreg->panel_interface->QueueModalPanel(kpp); + } + } +} + +void DectCliAdd(KPI_ADDCLI_CB_PARMS) +{ + KisPanelPluginData *pdata = (KisPanelPluginData *) auxptr; + dect_data *adata = (dect_data *) pdata->pluginaux; + + if (add == 0) + return; + + netcli->AddConfCallback(DectCliConfigured, 1, pdata); +} + +int DectDListerButtonCB(COMPONENT_CALLBACK_PARMS) +{ + dect_data *ddata = (dect_data *) aux; + + // If in basestation scan mode, switch to call scan mode + if (mode == MODE_ASYNC_FP_SCAN) { + vector<string> data = ddata->dtable->GetSelectedData(); + + if (data.size() < 1) { + // We got a button event even though the table was empty. + // Re-send the PP scan command + string cmd("DECT 1 0 0"); + + if (globalreg && + globalreg->panel_interface && + globalreg->panel_interface->FetchNetClient()) { + globalreg->panel_interface->FetchNetClient()->InjectCommand(cmd); + } + + return 1; + } + + vector<vector<string> >::iterator i = ddata->info_vec_fp.begin(); + + // Switch to + for (int j = 0; i < ddata->info_vec_fp.end(); ++i, ++j) { + if ((*i)[0] == data[0]) { + ddata->sync_station = (*i); + + ddata->dtable->AddRow(0, (*i)); + ddata->dtable->DrawComponent(); + + string cmd("DECT 1 2 " + data[2] + " " + data[0]); + + if (globalreg && + globalreg->panel_interface && + globalreg->panel_interface->FetchNetClient()) { + globalreg->panel_interface->FetchNetClient()->InjectCommand(cmd); + } + + ddata->modetxt->SetText("Syncing calls on station " + data[0]); + + mode = MODE_SYNC_CALL_SCAN; + } + } + } + + return 0; +} + +void DectMenuCB(MENUITEM_CB_PARMS) { + dect_data *ddata = (dect_data *) auxptr; + + if (menuitem == ddata->mi_show) { + if (ddata->pdata->kpinterface->prefs->FetchOpt("PLUGIN_DECT_SHOW") == "true" || + ddata->pdata->kpinterface->prefs->FetchOpt("PLUGIN_DECT_SHOW") == "") { + + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SHOW", "false", 1); + + ddata->dtable->Hide(); + ddata->modetxt->Hide(); + + ddata->menu->SetMenuItemChecked(ddata->mi_show, 0); + ddata->menu->DisableAllItems(ddata->mn_dect); + ddata->menu->EnableMenuItem(ddata->mi_show); + } else { + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SHOW", "true", 1); + + ddata->dtable->Show(); + ddata->modetxt->Show(); + + ddata->menu->SetMenuItemChecked(ddata->mi_show, 1); + ddata->menu->EnableAllItems(ddata->mn_dect); + } + } else if (menuitem == ddata->mi_sort_rfpi) { + sort_by = SORT_BY_RFPI; + descending = false; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "rfpi", 1); + } else if (menuitem == ddata->mi_sort_rfpi_desc) { + sort_by = SORT_BY_RFPI; + descending = true; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "rfpi_desc", 1); + } else if (menuitem == ddata->mi_sort_rssi) { + sort_by = SORT_BY_RSSI; + descending = false; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "rssi", 1); + } else if (menuitem == ddata->mi_sort_rssi_desc) { + sort_by = SORT_BY_RSSI; + descending = true; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "rssi_desc", 1); + } else if (menuitem == ddata->mi_sort_channel) { + sort_by = SORT_BY_CHANNEL; + descending = false; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "channel", 1); + } else if (menuitem == ddata->mi_sort_view) { + sort_by = SORT_BY_COUNTSEEN; + descending = false; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "view", 1); + } else if (menuitem == ddata->mi_sort_view_desc) { + sort_by = SORT_BY_COUNTSEEN; + descending = true; + ddata->pdata->kpinterface->prefs->SetOpt("PLUGIN_DECT_SORT", "view_desc", 1); + } else if (menuitem == ddata->mi_ppscan) { + if (globalreg->panel_interface->FetchNetClient()) { + globalreg->panel_interface->FetchNetClient()->InjectCommand("DECT 1 0 0"); + } + mode = MODE_ASYNC_PP_SCAN; + ddata->info_vec_pp.clear(); + ddata->modetxt->SetText("DECT: Scanning Calls"); + ddata->dtable->Clear(); + } else if (menuitem == ddata->mi_fpscan) { + if (globalreg->panel_interface->FetchNetClient()) { + globalreg->panel_interface->FetchNetClient()->InjectCommand("DECT 1 1 0"); + } + + mode = MODE_ASYNC_FP_SCAN; + ddata->modetxt->SetText("DECT: Scanning Basestations"); + ddata->info_vec_fp.clear(); + ddata->dtable->Clear(); + } + + string s = StrLower(ddata->pdata->kpinterface->prefs->FetchOpt("PLUGIN_DECT_SORT")); + + if (s == "") { + s = "channel"; + sort_by = SORT_BY_CHANNEL; + descending = false; + } + + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rfpi, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rfpi_desc, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rssi, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rssi_desc, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_channel, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_view, 0); + ddata->menu->SetMenuItemChecked(ddata->mi_sort_view_desc, 0); + + if (s == "rfpi") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rfpi_desc, 1); + else if (s == "rfpi_desc") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rfpi, 1); + else if (s == "rssi") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rssi, 1); + else if (s == "rssi_desc") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_rssi_desc, 1); + else if (s == "view") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_view, 1); + else if (s == "view_desc") + ddata->menu->SetMenuItemChecked(ddata->mi_sort_view_desc, 1); + else + ddata->menu->SetMenuItemChecked(ddata->mi_sort_channel, 1); +} + +// Init plugin gets called when plugin loads +extern "C" { + +int panel_plugin_init(GlobalRegistry *globalreg, KisPanelPluginData *pdata) { + dect_data *ddata = new dect_data; + + ddata->pdata = pdata; + + ddata->numrows = 0; + + ddata->view = 0; + + pdata->pluginaux = (void *)ddata; + _MSG("Loading DECT plugin", MSGFLAG_INFO); + + ddata->dtable = new Kis_Scrollable_Table(globalreg, pdata->mainpanel); + + vector<Kis_Scrollable_Table::title_data> ti; + Kis_Scrollable_Table::title_data t1; + t1.width = 15; + t1.draw_width = 15; + t1.title = "RFPI"; + t1.alignment = 15; + ti.push_back(t1); + + Kis_Scrollable_Table::title_data t2; + t2.width = 5; + t2.draw_width = 5; + t2.title = "RSSI"; + t2.alignment = 5; + ti.push_back(t2); + + Kis_Scrollable_Table::title_data t3; + t3.width = 4; + t3.draw_width = 4; + t3.title = "Ch"; + t3.alignment = 4; + ti.push_back(t3); + + Kis_Scrollable_Table::title_data t4; + t4.width = 20; + t4.draw_width = 8; + t4.title = "First"; + t4.alignment = 8; + ti.push_back(t4); + + Kis_Scrollable_Table::title_data t5; + t5.width = 20; + t5.draw_width = 8; + t5.title = "Last"; + t5.alignment = 8; + ti.push_back(t5); + + Kis_Scrollable_Table::title_data t6; + t6.width = 10; + t6.draw_width = 10; + t6.title = "Seen"; + t6.alignment = 10; + ti.push_back(t6); + + ddata->dtable->AddTitles(ti); + pdata->mainpanel->AddComponentVec(ddata->dtable, + (KIS_PANEL_COMP_DRAW | KIS_PANEL_COMP_TAB | + KIS_PANEL_COMP_EVT)); + + ddata->modetxt = new Kis_Free_Text(globalreg, pdata->mainpanel); + ddata->modetxt->SetText("DECT: Scanning Basestations"); + ddata->modetxt->SetPreferredSize(0, 1); + + pdata->mainpanel->FetchNetBox()->Pack_End(ddata->dtable, 1, 0); + pdata->mainpanel->FetchNetBox()->Pack_End(ddata->modetxt, 0, 0); + + // Callback shows details on the station list + ddata->dtable->SetCallback(COMPONENT_CBTYPE_ACTIVATED, + DectDListerButtonCB, ddata); + + ddata->addref = + pdata->kpinterface->Add_NetCli_AddCli_CB(DectCliAdd, (void *) pdata); + + Kis_Menu *menu = pdata->kpinterface->FetchMainPanel()->FetchMenu(); + + ddata->mn_dect = menu->AddMenu("DECT", -1); + + ddata->mi_show = menu->AddMenuItem("Show DECT", ddata->mn_dect, 'D'); + menu->SetMenuItemCallback(ddata->mi_show, DectMenuCB, ddata); + + menu->AddMenuItem("-", ddata->mn_dect, 0); + ddata->mi_fpscan = menu->AddMenuItem("Basestation Scan", ddata->mn_dect, 'F'); + menu->SetMenuItemCallback(ddata->mi_fpscan, DectMenuCB, ddata); + ddata->mi_ppscan = menu->AddMenuItem("Call Scan", ddata->mn_dect, 'P'); + menu->SetMenuItemCallback(ddata->mi_ppscan, DectMenuCB, ddata); + + menu->AddMenuItem("-", ddata->mn_dect, 0); + + ddata->mi_sort_channel = menu->AddMenuItem("Sort Channel", ddata->mn_dect, 'c'); + menu->SetMenuItemCallback(ddata->mi_sort_channel, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_channel, '*'); + ddata->mi_sort_rfpi = menu->AddMenuItem("Sort RFPI", ddata->mn_dect, 'R'); + menu->SetMenuItemCallback(ddata->mi_sort_rfpi, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_rfpi, '*'); + ddata->mi_sort_rfpi_desc = menu->AddMenuItem("Sort Reverse RFPI", + ddata->mn_dect, 'r'); + menu->SetMenuItemCallback(ddata->mi_sort_rfpi_desc, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_rfpi_desc, '*'); + ddata->mi_sort_rssi = menu->AddMenuItem("Sort RSSI", ddata->mn_dect, 'S'); + menu->SetMenuItemCallback(ddata->mi_sort_rssi, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_rssi, '*'); + ddata->mi_sort_rssi_desc = menu->AddMenuItem("Sort Reverse RSSI", + ddata->mn_dect, 's'); + menu->SetMenuItemCallback(ddata->mi_sort_rssi_desc, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_rssi_desc, '*'); + ddata->mi_sort_view = menu->AddMenuItem("Sort Count", ddata->mn_dect, 'V'); + menu->SetMenuItemCallback(ddata->mi_sort_view, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_view, '*'); + ddata->mi_sort_view_desc = menu->AddMenuItem("Sort Reverse View Count", + ddata->mn_dect, 'V'); + menu->SetMenuItemCallback(ddata->mi_sort_view_desc, DectMenuCB, ddata); + menu->SetMenuItemCheckSymbol(ddata->mi_sort_view_desc, '*'); + + ddata->menu = menu; + + menu->SetMenuItemChecked(ddata->mi_showd, 1); + menu->SetMenuItemChecked(ddata->mi_showc, 0); + ddata->dtable->Hide(); + ddata->modetxt->Hide(); + + if (pdata->kpinterface->prefs->FetchOpt("PLUGIN_DECT_SHOW") == "true" || + pdata->kpinterface->prefs->FetchOpt("PLUGIN_DECT_SHOW") == "") { + + menu->SetMenuItemChecked(ddata->mi_show, 1); + + menu->EnableAllItems(ddata->mn_dect); + + ddata->dtable->Show(); + ddata->modetxt->Show(); + + } else { + menu->SetMenuItemChecked(ddata->mi_show, 0); + menu->DisableAllItems(ddata->mn_dect); + menu->EnableMenuItem(ddata->mi_show); + } + + // Fire the menu handler to update sort + DectMenuCB(globalreg, -1, ddata); + + return 1; +} + +} + diff --git a/kismet-dect-v2/kismet_dect.cc b/kismet-dect-v2/kismet_dect.cc index 3981414..3d665f1 100644 --- a/kismet-dect-v2/kismet_dect.cc +++ b/kismet-dect-v2/kismet_dect.cc @@ -60,7 +60,19 @@ kis_datachunk *dumpfile_dect_filter(DUMPFILE_PCAP_FILTER_PARMS) { if (link == NULL) return NULL; - if (link->dlt == KDLT_DECT) + if (link->dlt == KDLT_DECTCALL) + return link; + + return NULL; +} + +kis_datachunk *dumpfile_dect_scanfilter(DUMPFILE_PCAP_FILTER_PARMS) { + kis_datachunk *link = (kis_datachunk *) in_pack->fetch(_PCM(PACK_COMP_LINKFRAME)); + + if (link == NULL) + return NULL; + + if (link->dlt == KDLT_DECTSCAN) return link; return NULL; @@ -164,6 +176,9 @@ int dect_register(GlobalRegistry *in_globalreg) { pack_comp_dect = globalreg->packetchain->RegisterPacketComponent("DECT"); +#if 0 + // Call logging to be implemented elsewhere for per-call pcap files + // dumpfile that inherits from the global one, with a hack in the matcher to // pick the dect packets out but log them as EN10MB Dumpfile_Pcap *dectdump; @@ -171,6 +186,13 @@ int dect_register(GlobalRegistry *in_globalreg) { new Dumpfile_Pcap(globalreg, "pcapdect", DLT_EN10MB, globalreg->pcapdump, dumpfile_dect_filter, NULL); dectdump->SetVolatile(1); +#endif + + // Scan logging file, EN10MB structured from dect_data_scan_t, volatile, + // inheriting the PPI callbacks + Dumpfile_Pcap *dectscandump = + new Dumpfile_Pcap(globalreg, "scandect", DLT_EN10MB, + globalreg->pcapdump, dumpfile_dect_scanfilter, NULL); Tracker_Dect *trackdect; trackdect = new Tracker_Dect(globalreg); diff --git a/kismet-dect-v2/packet_dect.h b/kismet-dect-v2/packet_dect.h index 875dbad..63e5f2c 100644 --- a/kismet-dect-v2/packet_dect.h +++ b/kismet-dect-v2/packet_dect.h @@ -29,7 +29,8 @@ #include <packet.h> // Internal DLT - -0xDEC -#define KDLT_DECT -3564 +#define KDLT_DECTCALL -3564 +#define KDLT_DECTSCAN -3565 extern int pack_comp_dect; diff --git a/kismet-dect-v2/packetsource_dect.cc b/kismet-dect-v2/packetsource_dect.cc index 26f87d9..e6e249f 100644 --- a/kismet-dect-v2/packetsource_dect.cc +++ b/kismet-dect-v2/packetsource_dect.cc @@ -225,7 +225,7 @@ int PacketSource_Dect::Poll() { int rbytes = -1; dect_packinfo *pi = new dect_packinfo; kis_packet *newpack; - kis_datachunk *callchunk = NULL; + kis_datachunk *dectchunk = NULL; pi->sync = sync; pi->scanmode = scan_mode; @@ -239,6 +239,15 @@ int PacketSource_Dect::Poll() { delete(pi); return 0; } + + // Make a scan chunk + dectchunk = new kis_datachunk; + dectchunk->length = sizeof(dect_data_scan_t); + dectchunk->data = new uint8_t[dectchunk->length]; + memcpy(dectchunk->data, &(pi->sdata), dectchunk->length); + dectchunk->source_id = source_id; + dectchunk->dlt = KDLT_DECTSCAN; + } else if (scan_mode == MODE_SYNC_CALL_SCAN) { if ((rbytes = read(serial_fd, &(pi->pdata), sizeof(pp_packet_t))) != sizeof(pp_packet_t)) { @@ -253,12 +262,12 @@ int PacketSource_Dect::Poll() { } // Make a data chunk - callchunk = new kis_datachunk; - callchunk->length = 53; - callchunk->data = new uint8_t[callchunk->length]; - memcpy(callchunk->data, pi->pdata.data, callchunk->length); - callchunk->source_id = source_id; - callchunk->dlt = KDLT_DECT; + dectchunk = new kis_datachunk; + dectchunk->length = 53; + dectchunk->data = new uint8_t[dectchunk->length]; + memcpy(dectchunk->data, pi->pdata.data, dectchunk->length); + dectchunk->source_id = source_id; + dectchunk->dlt = KDLT_DECTCALL; } } else { // Unknown mode during poll @@ -267,9 +276,14 @@ int PacketSource_Dect::Poll() { } newpack = globalreg->packetchain->GeneratePacket(); + + kis_ref_capsource *csrc_ref = new kis_ref_capsource; + csrc_ref->ref_source = this; + newpack->insert(_PCM(PACK_COMP_KISCAPSRC), csrc_ref); + newpack->insert(pack_comp_dect, pi); - if (callchunk) - newpack->insert(_PCM(PACK_COMP_LINKFRAME), callchunk); + if (dectchunk) + newpack->insert(_PCM(PACK_COMP_LINKFRAME), dectchunk); globalreg->packetchain->ProcessPacket(newpack); // printf("debug - dect newpack\n"); |