1 /* lbm_lbtrm_transport_dialog.cpp
3 * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved.
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "lbm_lbtrm_transport_dialog.h"
25 #include <ui_lbm_lbtrm_transport_dialog.h>
29 #include "qt_ui_utils.h"
30 #include "wireshark_application.h"
34 #include <QMessageBox>
35 #include <QTreeWidget>
36 #include <QTreeWidgetItemIterator>
39 #include <epan/packet_info.h>
41 #include <epan/to_str.h>
42 #include <epan/dissectors/packet-lbm.h>
43 #include <wsutil/nstime.h>
47 static const int Source_AddressTransport_Column = 0;
48 static const int Source_DataFrames_Column = 1;
49 static const int Source_DataBytes_Column = 2;
50 static const int Source_DataFramesBytes_Column = 3;
51 static const int Source_DataRate_Column = 4;
52 static const int Source_RXDataFrames_Column = 5;
53 static const int Source_RXDataBytes_Column = 6;
54 static const int Source_RXDataFramesBytes_Column = 7;
55 static const int Source_RXDataRate_Column = 8;
56 static const int Source_NCFFrames_Column = 9;
57 static const int Source_NCFCount_Column = 10;
58 static const int Source_NCFBytes_Column = 11;
59 static const int Source_NCFFramesBytes_Column = 12;
60 static const int Source_NCFCountBytes_Column = 13;
61 static const int Source_NCFFramesCount_Column = 14;
62 static const int Source_NCFFramesCountBytes_Column = 15;
63 static const int Source_NCFRate_Column = 16;
64 static const int Source_SMFrames_Column = 17;
65 static const int Source_SMBytes_Column = 18;
66 static const int Source_SMFramesBytes_Column = 19;
67 static const int Source_SMRate_Column = 20;
69 static const int Receiver_AddressTransport_Column = 0;
70 static const int Receiver_NAKFrames_Column = 1;
71 static const int Receiver_NAKCount_Column = 2;
72 static const int Receiver_NAKBytes_Column = 3;
73 static const int Receiver_NAKRate_Column = 4;
75 static const int Detail_SQN_Column = 0;
76 static const int Detail_Count_Column = 1;
77 static const int Detail_Frame_Column = 2;
79 static const double OneKilobit = 1000.0;
80 static const double OneMegabit = OneKilobit * OneKilobit;
81 static const double OneGigabit = OneMegabit * OneKilobit;
84 static QString format_rate(const nstime_t & elapsed, guint64 bytes)
90 if (((elapsed.secs == 0) && (elapsed.nsecs == 0)) || (bytes == 0))
92 return (QString("0"));
95 elapsed_sec = elapsed.secs + (((double)elapsed.nsecs) / 1000000000.0);
96 rate = ((double)(bytes * 8)) / elapsed_sec;
98 // Currently rate is in bps
99 if (rate >= OneGigabit)
102 result = QString("%1G").arg(rate, 0, 'f', 2);
104 else if (rate >= OneMegabit)
107 result = QString("%1M").arg(rate, 0, 'f', 2);
109 else if (rate >= OneKilobit)
112 result = QString("%1K").arg(rate, 0, 'f', 2);
116 result = QString("%1").arg(rate, 0, 'f', 2);
122 // LBMLBTRMFrameEntry, LBMLBTRMSQNEntry, LBMLBTRMNCFReasonEntry, LBMLBTRMNCFSQNEntry, LBMLBTRMSourceTransportEntry, LBMLBTRMSourceEntry,
123 // LBMLBTRMReceiverTransportEntry, and LBMLBTRMReceiverEntry are all derived from a QTreeWidgetItem. Each instantiation can exist
124 // in two places: in a QTreeWidget, and in a containing QMap.
127 // - LBMLBTRMTransportDialogInfo contains a QMap of the sources (LBMLBTRMSourceEntry) and receivers (LBMLBTRMReceiverEntry)
128 // - A source (LBMLBTRMSourceEntry) contains a QMap of the source transports originating from it (LBMLBTRMSourceTransportEntry)
129 // - A source transport (LBMLBTRMSourceTransportEntry) contains QMaps of data, RX data, and SM SQNs (LBMLBTRMSQNEntry) and NCF SQNs
130 // (LBMLBTRMNCFSQNEntry)
131 // - A data SQN (LBMLBTRMSQNEntry) contains a QMap of the frames (LBMLBTRMFrameEntry) in which that SQN appears
133 // Not all of the entries actually appear in a QTreeWidget at one time. For example, in the source details, if no specific source
134 // transport is selected, nothing is in the source details tree. If Data SQNs is selected, then those details appear in the source
135 // details tree. Switching to RX Data SQNs removes whatever is currently in the source details tree, and adds the RX details for
136 // the selected transport.
138 // The actual owner of one of the above QTreeWidgetItem-derived items is the QMap container in its parent. The item is "loaned" to
139 // the QTreeWidget for display.
141 // All of this is to explain why
142 // 1) we are frequently adding things to a QTreeWidget
143 // 2) things are removed (takeTopLevelItem) from a QTreeWidget
144 // 3) destruction involves removing all items from all QTreeWidgets (rather than letting QTreeWidget delete them)
145 // 4) the destructor for each item has the form
146 // <for each QMap container>
147 // for (XXXMapIterator it = m_xxx.begin(); it != m_xxx.end(); it++)
152 // The for-loop calls the destructor for each item, while the clear() cleans up the space used by the QMap itself.
155 class LBMLBTRMFrameEntry : public QTreeWidgetItem
158 LBMLBTRMFrameEntry(guint32 frame);
159 virtual ~LBMLBTRMFrameEntry(void) { }
160 guint32 getFrame(void) { return (m_frame); }
163 LBMLBTRMFrameEntry(void) { }
167 LBMLBTRMFrameEntry::LBMLBTRMFrameEntry(guint32 frame) :
171 setText(Detail_SQN_Column, QString(" "));
172 setText(Detail_Count_Column, QString(" "));
173 setText(Detail_Frame_Column, QString("%1").arg(m_frame));
176 typedef QMap<guint32, LBMLBTRMFrameEntry *> LBMLBTRMFrameMap;
177 typedef QMap<guint32, LBMLBTRMFrameEntry *>::iterator LBMLBTRMFrameMapIterator;
179 // A SQN (SeQuence Number) entry
180 class LBMLBTRMSQNEntry : public QTreeWidgetItem
183 LBMLBTRMSQNEntry(guint32 sqn);
184 virtual ~LBMLBTRMSQNEntry(void);
185 void processFrame(guint32 frame);
188 LBMLBTRMSQNEntry(void);
191 LBMLBTRMFrameMap m_frames;
194 LBMLBTRMSQNEntry::LBMLBTRMSQNEntry(guint32 sqn) :
200 setText(Detail_SQN_Column, QString("%1").arg(m_sqn));
201 setTextAlignment(Detail_SQN_Column, Qt::AlignRight);
202 setText(Detail_Count_Column, QString("%1").arg(m_count));
203 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
204 setText(Detail_Frame_Column, QString(" "));
207 LBMLBTRMSQNEntry::~LBMLBTRMSQNEntry(void)
209 for (LBMLBTRMFrameMapIterator it = m_frames.begin(); it != m_frames.end(); it++)
216 void LBMLBTRMSQNEntry::processFrame(guint32 frame)
218 LBMLBTRMFrameMapIterator it;
220 it = m_frames.find(frame);
221 if (m_frames.end() == it)
223 LBMLBTRMFrameEntry * entry = new LBMLBTRMFrameEntry(frame);
224 m_frames.insert(frame, entry);
226 sortChildren(Detail_Frame_Column, Qt::AscendingOrder);
229 setText(Detail_Count_Column, QString("%1").arg(m_count));
230 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
233 // An NCF (Nak ConFirmation) Reason entry
234 class LBMLBTRMNCFReasonEntry : public QTreeWidgetItem
237 LBMLBTRMNCFReasonEntry(guint8 reason);
238 virtual ~LBMLBTRMNCFReasonEntry(void);
239 void processFrame(guint32 frame);
242 LBMLBTRMNCFReasonEntry(void);
244 QString m_reason_string;
246 LBMLBTRMFrameMap m_frames;
249 LBMLBTRMNCFReasonEntry::LBMLBTRMNCFReasonEntry(guint8 reason) :
258 case LBTRM_NCF_REASON_NO_RETRY:
259 m_reason_string = "No Retry";
261 case LBTRM_NCF_REASON_IGNORED:
262 m_reason_string = "Ignored";
264 case LBTRM_NCF_REASON_RX_DELAY:
265 m_reason_string = "Retransmit Delay";
267 case LBTRM_NCF_REASON_SHED:
268 m_reason_string = "Shed";
271 m_reason_string = QString("Unknown (%1)").arg(m_reason);
274 setText(Detail_SQN_Column, m_reason_string);
275 setText(Detail_Count_Column, QString("%1").arg(m_count));
276 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
277 setText(Detail_Frame_Column, QString(" "));
280 LBMLBTRMNCFReasonEntry::~LBMLBTRMNCFReasonEntry(void)
282 for (LBMLBTRMFrameMapIterator it = m_frames.begin(); it != m_frames.end(); it++)
289 void LBMLBTRMNCFReasonEntry::processFrame(guint32 frame)
291 LBMLBTRMFrameMapIterator it;
293 it = m_frames.find(frame);
294 if (m_frames.end() == it)
296 LBMLBTRMFrameEntry * entry = new LBMLBTRMFrameEntry(frame);
297 m_frames.insert(frame, entry);
299 sortChildren(Detail_Frame_Column, Qt::AscendingOrder);
302 setText(Detail_Count_Column, QString("%1").arg(m_count));
303 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
306 typedef QMap<guint32, LBMLBTRMNCFReasonEntry *> LBMLBTRMNCFReasonMap;
307 typedef QMap<guint32, LBMLBTRMNCFReasonEntry *>::iterator LBMLBTRMNCFReasonMapIterator;
310 class LBMLBTRMNCFSQNEntry : public QTreeWidgetItem
313 LBMLBTRMNCFSQNEntry(guint32 sqn);
314 virtual ~LBMLBTRMNCFSQNEntry(void);
315 void processFrame(guint8 reason, guint32 frame);
318 LBMLBTRMNCFSQNEntry(void);
321 LBMLBTRMNCFReasonMap m_reasons;
324 LBMLBTRMNCFSQNEntry::LBMLBTRMNCFSQNEntry(guint32 sqn) :
330 setText(Detail_SQN_Column, QString("%1").arg(m_sqn));
331 setTextAlignment(Detail_SQN_Column, Qt::AlignRight);
332 setText(Detail_Count_Column, QString("%1").arg(m_count));
333 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
334 setText(Detail_Frame_Column, QString(" "));
337 LBMLBTRMNCFSQNEntry::~LBMLBTRMNCFSQNEntry(void)
339 for (LBMLBTRMNCFReasonMapIterator it = m_reasons.begin(); it != m_reasons.end(); it++)
346 void LBMLBTRMNCFSQNEntry::processFrame(guint8 reason, guint32 frame)
348 LBMLBTRMNCFReasonMapIterator it;
349 LBMLBTRMNCFReasonEntry * entry = NULL;
351 it = m_reasons.find(reason);
352 if (m_reasons.end() == it)
354 entry = new LBMLBTRMNCFReasonEntry(reason);
355 m_reasons.insert(reason, entry);
357 sortChildren(Detail_Frame_Column, Qt::AscendingOrder);
364 setText(Detail_Count_Column, QString("%1").arg(m_count));
365 setTextAlignment(Detail_Count_Column, Qt::AlignRight);
366 entry->processFrame(frame);
369 typedef QMap<guint32, LBMLBTRMSQNEntry *> LBMLBTRMSQNMap;
370 typedef QMap<guint32, LBMLBTRMSQNEntry *>::iterator LBMLBTRMSQNMapIterator;
371 typedef QMap<guint32, LBMLBTRMNCFSQNEntry *> LBMLBTRMNCFSQNMap;
372 typedef QMap<guint32, LBMLBTRMNCFSQNEntry *>::iterator LBMLBTRMNCFSQNMapIterator;
374 // A source transport entry
375 class LBMLBTRMSourceTransportEntry : public QTreeWidgetItem
377 friend class LBMLBTRMTransportDialog;
380 LBMLBTRMSourceTransportEntry(const QString & transport);
381 virtual ~LBMLBTRMSourceTransportEntry(void);
382 void processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info);
388 LBMLBTRMSourceTransportEntry(void) { }
390 guint64 m_data_frames;
391 guint64 m_data_bytes;
392 guint64 m_rx_data_frames;
393 guint64 m_rx_data_bytes;
394 guint64 m_ncf_frames;
399 nstime_t m_first_frame_timestamp;
400 bool m_first_frame_timestamp_valid;
401 nstime_t m_last_frame_timestamp;
404 LBMLBTRMSQNMap m_data_sqns;
405 LBMLBTRMSQNMap m_rx_data_sqns;
406 LBMLBTRMNCFSQNMap m_ncf_sqns;
407 LBMLBTRMSQNMap m_sm_sqns;
410 LBMLBTRMSourceTransportEntry::LBMLBTRMSourceTransportEntry(const QString & transport) :
412 m_transport(transport),
422 m_first_frame_timestamp_valid(false),
428 m_first_frame_timestamp.secs = 0;
429 m_first_frame_timestamp.nsecs = 0;
430 m_last_frame_timestamp.secs = 0;
431 m_last_frame_timestamp.nsecs = 0;
432 setText(Source_AddressTransport_Column, m_transport);
435 LBMLBTRMSourceTransportEntry::~LBMLBTRMSourceTransportEntry(void)
437 for (LBMLBTRMSQNMapIterator it = m_data_sqns.begin(); it != m_data_sqns.end(); ++it)
443 for (LBMLBTRMSQNMapIterator it = m_rx_data_sqns.begin(); it != m_rx_data_sqns.end(); ++it)
447 m_rx_data_sqns.clear();
449 for (LBMLBTRMNCFSQNMapIterator it = m_ncf_sqns.begin(); it != m_ncf_sqns.end(); ++it)
455 for (LBMLBTRMSQNMapIterator it = m_sm_sqns.begin(); it != m_sm_sqns.end(); ++it)
462 void LBMLBTRMSourceTransportEntry::processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info)
464 if (m_first_frame_timestamp_valid)
466 if (nstime_cmp(&(pinfo->abs_ts), &m_first_frame_timestamp) < 0)
468 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
473 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
474 m_first_frame_timestamp_valid = true;
476 if (nstime_cmp(&(pinfo->abs_ts), &m_last_frame_timestamp) > 0)
478 nstime_copy(&(m_last_frame_timestamp), &(pinfo->abs_ts));
480 if (tap_info->type == LBTRM_PACKET_TYPE_DATA)
482 LBMLBTRMSQNEntry * sqn = NULL;
483 LBMLBTRMSQNMapIterator it;
485 if (tap_info->retransmission)
488 m_rx_data_bytes += pinfo->fd->pkt_len;
489 it = m_rx_data_sqns.find(tap_info->sqn);
490 if (m_rx_data_sqns.end() == it)
492 sqn = new LBMLBTRMSQNEntry(tap_info->sqn);
493 m_rx_data_sqns.insert(tap_info->sqn, sqn);
503 m_data_bytes += pinfo->fd->pkt_len;
504 it = m_data_sqns.find(tap_info->sqn);
505 if (m_data_sqns.end() == it)
507 sqn = new LBMLBTRMSQNEntry(tap_info->sqn);
508 m_data_sqns.insert(tap_info->sqn, sqn);
515 sqn->processFrame(pinfo->num);
517 else if (tap_info->type == LBTRM_PACKET_TYPE_NCF)
520 LBMLBTRMNCFSQNMapIterator it;
521 LBMLBTRMNCFSQNEntry * sqn = NULL;
524 m_ncf_bytes += pinfo->fd->pkt_len;
525 m_ncf_count += (guint64)tap_info->num_sqns;
526 for (idx = 0; idx < tap_info->num_sqns; idx++)
528 it = m_ncf_sqns.find(tap_info->sqns[idx]);
529 if (m_ncf_sqns.end() == it)
531 sqn = new LBMLBTRMNCFSQNEntry(tap_info->sqns[idx]);
532 m_ncf_sqns.insert(tap_info->sqns[idx], sqn);
538 sqn->processFrame(tap_info->ncf_reason, pinfo->num);
541 else if (tap_info->type == LBTRM_PACKET_TYPE_SM)
543 LBMLBTRMSQNEntry * sqn = NULL;
544 LBMLBTRMSQNMapIterator it;
547 m_sm_bytes += pinfo->fd->pkt_len;
548 it = m_sm_sqns.find(tap_info->sqn);
549 if (m_sm_sqns.end() == it)
551 sqn = new LBMLBTRMSQNEntry(tap_info->sqn);
552 m_sm_sqns.insert(tap_info->sqn, sqn);
558 sqn->processFrame(pinfo->num);
567 void LBMLBTRMSourceTransportEntry::fillItem(void)
571 nstime_delta(&delta, &m_last_frame_timestamp, &m_first_frame_timestamp);
572 setText(Source_DataFrames_Column, QString("%1").arg(m_data_frames));
573 setTextAlignment(Source_DataFrames_Column, Qt::AlignRight);
574 setText(Source_DataBytes_Column, QString("%1").arg(m_data_bytes));
575 setTextAlignment(Source_DataBytes_Column, Qt::AlignRight);
576 setText(Source_DataFramesBytes_Column, QString("%1/%2").arg(m_data_frames).arg(m_data_bytes));
577 setTextAlignment(Source_DataFramesBytes_Column, Qt::AlignHCenter);
578 setText(Source_DataRate_Column, format_rate(delta, m_data_bytes));
579 setTextAlignment(Source_DataRate_Column, Qt::AlignRight);
580 setText(Source_RXDataFrames_Column, QString("%1").arg(m_rx_data_frames));
581 setTextAlignment(Source_RXDataFrames_Column, Qt::AlignRight);
582 setText(Source_RXDataBytes_Column, QString("%1").arg(m_rx_data_bytes));
583 setTextAlignment(Source_RXDataBytes_Column, Qt::AlignRight);
584 setText(Source_RXDataFramesBytes_Column, QString("%1/%2").arg(m_rx_data_frames).arg(m_rx_data_bytes));
585 setTextAlignment(Source_RXDataFramesBytes_Column, Qt::AlignHCenter);
586 setText(Source_RXDataRate_Column, format_rate(delta, m_rx_data_bytes));
587 setTextAlignment(Source_RXDataRate_Column, Qt::AlignRight);
588 setText(Source_NCFFrames_Column, QString("%1").arg(m_ncf_frames));
589 setTextAlignment(Source_NCFFrames_Column, Qt::AlignRight);
590 setText(Source_NCFCount_Column, QString("%1").arg(m_ncf_count));
591 setTextAlignment(Source_NCFCount_Column, Qt::AlignRight);
592 setText(Source_NCFBytes_Column, QString("%1").arg(m_ncf_bytes));
593 setTextAlignment(Source_NCFBytes_Column, Qt::AlignRight);
594 setText(Source_NCFFramesBytes_Column, QString("%1/%2").arg(m_ncf_frames).arg(m_ncf_bytes));
595 setTextAlignment(Source_NCFFramesBytes_Column, Qt::AlignHCenter);
596 setText(Source_NCFCountBytes_Column, QString("%1/%2").arg(m_ncf_count).arg(m_ncf_bytes));
597 setTextAlignment(Source_NCFCountBytes_Column, Qt::AlignHCenter);
598 setText(Source_NCFFramesCount_Column, QString("%1/%2").arg(m_ncf_count).arg(m_ncf_count));
599 setTextAlignment(Source_NCFFramesCount_Column, Qt::AlignHCenter);
600 setText(Source_NCFFramesCountBytes_Column, QString("%1/%2/%3").arg(m_ncf_frames).arg(m_ncf_count).arg(m_ncf_bytes));
601 setTextAlignment(Source_NCFFramesCountBytes_Column, Qt::AlignHCenter);
602 setText(Source_NCFRate_Column, format_rate(delta, m_ncf_bytes));
603 setTextAlignment(Source_NCFRate_Column, Qt::AlignRight);
604 setText(Source_SMFrames_Column, QString("%1").arg(m_sm_frames));
605 setTextAlignment(Source_SMFrames_Column, Qt::AlignRight);
606 setText(Source_SMBytes_Column, QString("%1").arg(m_sm_bytes));
607 setTextAlignment(Source_SMBytes_Column, Qt::AlignRight);
608 setText(Source_SMFramesBytes_Column, QString("%1/%2").arg(m_sm_frames).arg(m_sm_bytes));
609 setTextAlignment(Source_SMFramesBytes_Column, Qt::AlignHCenter);
610 setText(Source_SMRate_Column, format_rate(delta, m_sm_bytes));
611 setTextAlignment(Source_SMRate_Column, Qt::AlignRight);
614 typedef QMap<QString, LBMLBTRMSourceTransportEntry *> LBMLBTRMSourceTransportMap;
615 typedef QMap<QString, LBMLBTRMSourceTransportEntry *>::iterator LBMLBTRMSourceTransportMapIterator;
617 // A source (address) entry
618 class LBMLBTRMSourceEntry : public QTreeWidgetItem
621 LBMLBTRMSourceEntry(const QString & source_address);
622 virtual ~LBMLBTRMSourceEntry(void);
623 void processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info);
626 LBMLBTRMSourceEntry(void) { }
630 guint64 m_data_frames;
631 guint64 m_data_bytes;
632 guint64 m_rx_data_frames;
633 guint64 m_rx_data_bytes;
634 guint64 m_ncf_frames;
639 nstime_t m_first_frame_timestamp;
640 bool m_first_frame_timestamp_valid;
641 nstime_t m_last_frame_timestamp;
642 LBMLBTRMSourceTransportMap m_transports;
645 LBMLBTRMSourceEntry::LBMLBTRMSourceEntry(const QString & source_address) :
647 m_address(source_address),
657 m_first_frame_timestamp_valid(false),
660 m_first_frame_timestamp.secs = 0;
661 m_first_frame_timestamp.nsecs = 0;
662 m_last_frame_timestamp.secs = 0;
663 m_last_frame_timestamp.nsecs = 0;
664 setText(Source_AddressTransport_Column, m_address);
667 LBMLBTRMSourceEntry::~LBMLBTRMSourceEntry(void)
669 for (LBMLBTRMSourceTransportMapIterator it = m_transports.begin(); it != m_transports.end(); ++it)
673 m_transports.clear();
676 void LBMLBTRMSourceEntry::processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info)
678 LBMLBTRMSourceTransportEntry * transport = NULL;
679 LBMLBTRMSourceTransportMapIterator it;
681 if (m_first_frame_timestamp_valid)
683 if (nstime_cmp(&(pinfo->abs_ts), &m_first_frame_timestamp) < 0)
685 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
690 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
691 m_first_frame_timestamp_valid = true;
693 if (nstime_cmp(&(pinfo->abs_ts), &m_last_frame_timestamp) > 0)
695 nstime_copy(&(m_last_frame_timestamp), &(pinfo->abs_ts));
697 if (tap_info->type == LBTRM_PACKET_TYPE_DATA)
699 if (tap_info->retransmission)
702 m_rx_data_bytes += pinfo->fd->pkt_len;
707 m_data_bytes += pinfo->fd->pkt_len;
710 else if (tap_info->type == LBTRM_PACKET_TYPE_NCF)
713 m_ncf_bytes += pinfo->fd->pkt_len;
714 m_ncf_count += tap_info->num_sqns;
716 else if (tap_info->type == LBTRM_PACKET_TYPE_SM)
719 m_sm_bytes += pinfo->fd->pkt_len;
722 it = m_transports.find(tap_info->transport);
723 if (m_transports.end() == it)
725 transport = new LBMLBTRMSourceTransportEntry(tap_info->transport);
726 m_transports.insert(tap_info->transport, transport);
728 sortChildren(Source_AddressTransport_Column, Qt::AscendingOrder);
732 transport = it.value();
735 transport->processPacket(pinfo, tap_info);
738 void LBMLBTRMSourceEntry::fillItem(void)
742 nstime_delta(&delta, &m_last_frame_timestamp, &m_first_frame_timestamp);
743 setText(Source_DataFrames_Column, QString("%1").arg(m_data_frames));
744 setTextAlignment(Source_DataFrames_Column, Qt::AlignRight);
745 setText(Source_DataBytes_Column, QString("%1").arg(m_data_bytes));
746 setTextAlignment(Source_DataBytes_Column, Qt::AlignRight);
747 setText(Source_DataFramesBytes_Column, QString("%1/%2").arg(m_data_frames).arg(m_data_bytes));
748 setTextAlignment(Source_DataFramesBytes_Column, Qt::AlignHCenter);
749 setText(Source_DataRate_Column, format_rate(delta, m_data_bytes));
750 setTextAlignment(Source_DataRate_Column, Qt::AlignRight);
751 setText(Source_RXDataFrames_Column, QString("%1").arg(m_rx_data_frames));
752 setTextAlignment(Source_RXDataFrames_Column, Qt::AlignRight);
753 setText(Source_RXDataBytes_Column, QString("%1").arg(m_rx_data_bytes));
754 setTextAlignment(Source_RXDataBytes_Column, Qt::AlignRight);
755 setText(Source_RXDataFramesBytes_Column, QString("%1/%2").arg(m_rx_data_frames).arg(m_rx_data_bytes));
756 setTextAlignment(Source_RXDataFramesBytes_Column, Qt::AlignHCenter);
757 setText(Source_RXDataRate_Column, format_rate(delta, m_rx_data_bytes));
758 setTextAlignment(Source_RXDataRate_Column, Qt::AlignRight);
759 setText(Source_NCFFrames_Column, QString("%1").arg(m_ncf_frames));
760 setTextAlignment(Source_NCFFrames_Column, Qt::AlignRight);
761 setText(Source_NCFCount_Column, QString("%1").arg(m_ncf_count));
762 setTextAlignment(Source_NCFCount_Column, Qt::AlignRight);
763 setText(Source_NCFBytes_Column, QString("%1").arg(m_ncf_bytes));
764 setTextAlignment(Source_NCFBytes_Column, Qt::AlignRight);
765 setText(Source_NCFFramesBytes_Column, QString("%1/%2").arg(m_ncf_frames).arg(m_ncf_bytes));
766 setTextAlignment(Source_NCFFramesBytes_Column, Qt::AlignHCenter);
767 setText(Source_NCFCountBytes_Column, QString("%1/%2").arg(m_ncf_count).arg(m_ncf_bytes));
768 setTextAlignment(Source_NCFCountBytes_Column, Qt::AlignHCenter);
769 setText(Source_NCFFramesCount_Column, QString("%1/%2").arg(m_ncf_frames).arg(m_ncf_count));
770 setTextAlignment(Source_NCFFramesCount_Column, Qt::AlignHCenter);
771 setText(Source_NCFFramesCountBytes_Column, QString("%1/%2/%3").arg(m_ncf_frames).arg(m_ncf_count).arg(m_ncf_bytes));
772 setTextAlignment(Source_NCFFramesCountBytes_Column, Qt::AlignHCenter);
773 setText(Source_NCFRate_Column, format_rate(delta, m_ncf_bytes));
774 setTextAlignment(Source_NCFRate_Column, Qt::AlignRight);
775 setText(Source_SMFrames_Column, QString("%1").arg(m_sm_frames));
776 setTextAlignment(Source_SMFrames_Column, Qt::AlignRight);
777 setText(Source_SMBytes_Column, QString("%1").arg(m_sm_bytes));
778 setTextAlignment(Source_SMBytes_Column, Qt::AlignRight);
779 setText(Source_SMFramesBytes_Column, QString("%1/%2").arg(m_sm_frames).arg(m_sm_bytes));
780 setTextAlignment(Source_SMFramesBytes_Column, Qt::AlignRight);
781 setText(Source_SMRate_Column, format_rate(delta, m_sm_bytes));
782 setTextAlignment(Source_SMRate_Column, Qt::AlignRight);
785 typedef QMap<QString, LBMLBTRMSourceEntry *> LBMLBTRMSourceMap;
786 typedef QMap<QString, LBMLBTRMSourceEntry *>::iterator LBMLBTRMSourceMapIterator;
788 // A receiver transport entry
789 class LBMLBTRMReceiverTransportEntry : public QTreeWidgetItem
791 friend class LBMLBTRMTransportDialog;
794 LBMLBTRMReceiverTransportEntry(const QString & transport);
795 virtual ~LBMLBTRMReceiverTransportEntry(void);
796 void processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info);
799 LBMLBTRMReceiverTransportEntry(void) { }
802 guint64 m_nak_frames;
805 nstime_t m_first_frame_timestamp;
806 bool m_first_frame_timestamp_valid;
807 nstime_t m_last_frame_timestamp;
810 LBMLBTRMSQNMap m_nak_sqns;
813 LBMLBTRMReceiverTransportEntry::LBMLBTRMReceiverTransportEntry(const QString & transport) :
815 m_transport(transport),
819 m_first_frame_timestamp_valid(false),
822 m_first_frame_timestamp.secs = 0;
823 m_first_frame_timestamp.nsecs = 0;
824 m_last_frame_timestamp.secs = 0;
825 m_last_frame_timestamp.nsecs = 0;
826 setText(Receiver_AddressTransport_Column, m_transport);
829 LBMLBTRMReceiverTransportEntry::~LBMLBTRMReceiverTransportEntry(void)
831 for (LBMLBTRMSQNMapIterator it = m_nak_sqns.begin(); it != m_nak_sqns.end(); ++it)
838 void LBMLBTRMReceiverTransportEntry::processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info)
840 if (m_first_frame_timestamp_valid)
842 if (nstime_cmp(&(pinfo->abs_ts), &m_first_frame_timestamp) < 0)
844 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
849 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
850 m_first_frame_timestamp_valid = true;
852 if (nstime_cmp(&(pinfo->abs_ts), &m_last_frame_timestamp) > 0)
854 nstime_copy(&(m_last_frame_timestamp), &(pinfo->abs_ts));
856 if (tap_info->type == LBTRM_PACKET_TYPE_NAK)
859 LBMLBTRMSQNEntry * sqn = NULL;
860 LBMLBTRMSQNMapIterator it;
863 m_nak_bytes += pinfo->fd->pkt_len;
864 m_nak_count += tap_info->num_sqns;
865 for (idx = 0; idx < tap_info->num_sqns; idx++)
867 it = m_nak_sqns.find(tap_info->sqns[idx]);
868 if (m_nak_sqns.end() == it)
870 sqn = new LBMLBTRMSQNEntry(tap_info->sqns[idx]);
871 m_nak_sqns.insert(tap_info->sqns[idx], sqn);
877 sqn->processFrame(pinfo->num);
887 void LBMLBTRMReceiverTransportEntry::fillItem(void)
891 nstime_delta(&delta, &m_last_frame_timestamp, &m_first_frame_timestamp);
892 setText(Receiver_NAKFrames_Column, QString("%1").arg(m_nak_frames));
893 setTextAlignment(Receiver_NAKFrames_Column, Qt::AlignRight);
894 setText(Receiver_NAKCount_Column, QString("%1").arg(m_nak_count));
895 setTextAlignment(Receiver_NAKCount_Column, Qt::AlignRight);
896 setText(Receiver_NAKBytes_Column, QString("%1").arg(m_nak_bytes));
897 setTextAlignment(Receiver_NAKBytes_Column, Qt::AlignRight);
898 setText(Receiver_NAKRate_Column, format_rate(delta, m_nak_bytes));
899 setTextAlignment(Receiver_NAKRate_Column, Qt::AlignRight);
902 typedef QMap<QString, LBMLBTRMReceiverTransportEntry *> LBMLBTRMReceiverTransportMap;
903 typedef QMap<QString, LBMLBTRMReceiverTransportEntry *>::iterator LBMLBTRMReceiverTransportMapIterator;
905 // A receiver (address) entry
906 class LBMLBTRMReceiverEntry : public QTreeWidgetItem
909 LBMLBTRMReceiverEntry(const QString & receiver_address);
910 virtual ~LBMLBTRMReceiverEntry(void);
911 void processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info);
914 LBMLBTRMReceiverEntry(void);
918 guint64 m_nak_frames;
921 nstime_t m_first_frame_timestamp;
922 bool m_first_frame_timestamp_valid;
923 nstime_t m_last_frame_timestamp;
924 LBMLBTRMReceiverTransportMap m_transports;
927 LBMLBTRMReceiverEntry::LBMLBTRMReceiverEntry(const QString & receiver_address) :
929 m_address(receiver_address),
933 m_first_frame_timestamp_valid(false),
936 m_first_frame_timestamp.secs = 0;
937 m_first_frame_timestamp.nsecs = 0;
938 m_last_frame_timestamp.secs = 0;
939 m_last_frame_timestamp.nsecs = 0;
940 setText(Receiver_AddressTransport_Column, m_address);
943 LBMLBTRMReceiverEntry::~LBMLBTRMReceiverEntry(void)
945 for (LBMLBTRMReceiverTransportMapIterator it = m_transports.begin(); it != m_transports.end(); ++it)
949 m_transports.clear();
952 void LBMLBTRMReceiverEntry::processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info)
954 LBMLBTRMReceiverTransportEntry * transport = NULL;
955 LBMLBTRMReceiverTransportMapIterator it;
957 if (m_first_frame_timestamp_valid)
959 if (nstime_cmp(&(pinfo->abs_ts), &m_first_frame_timestamp) < 0)
961 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
966 nstime_copy(&(m_first_frame_timestamp), &(pinfo->abs_ts));
967 m_first_frame_timestamp_valid = true;
969 if (nstime_cmp(&(pinfo->abs_ts), &m_last_frame_timestamp) > 0)
971 nstime_copy(&(m_last_frame_timestamp), &(pinfo->abs_ts));
973 if (tap_info->type == LBTRM_PACKET_TYPE_NAK)
976 m_nak_bytes += pinfo->fd->pkt_len;
977 m_nak_count += tap_info->num_sqns;
980 it = m_transports.find(tap_info->transport);
981 if (m_transports.end() == it)
983 transport = new LBMLBTRMReceiverTransportEntry(tap_info->transport);
984 m_transports.insert(tap_info->transport, transport);
986 sortChildren(Receiver_AddressTransport_Column, Qt::AscendingOrder);
990 transport = it.value();
993 transport->processPacket(pinfo, tap_info);
996 void LBMLBTRMReceiverEntry::fillItem(void)
1000 nstime_delta(&delta, &m_last_frame_timestamp, &m_first_frame_timestamp);
1001 setText(Receiver_NAKFrames_Column, QString("%1").arg(m_nak_frames));
1002 setTextAlignment(Receiver_NAKFrames_Column, Qt::AlignRight);
1003 setText(Receiver_NAKCount_Column, QString("%1").arg(m_nak_count));
1004 setTextAlignment(Receiver_NAKCount_Column, Qt::AlignRight);
1005 setText(Receiver_NAKBytes_Column, QString("%1").arg(m_nak_bytes));
1006 setTextAlignment(Receiver_NAKBytes_Column, Qt::AlignRight);
1007 setText(Receiver_NAKRate_Column, format_rate(delta, m_nak_bytes));
1008 setTextAlignment(Receiver_NAKRate_Column, Qt::AlignRight);
1011 typedef QMap<QString, LBMLBTRMReceiverEntry *> LBMLBTRMReceiverMap;
1012 typedef QMap<QString, LBMLBTRMReceiverEntry *>::iterator LBMLBTRMReceiverMapIterator;
1014 class LBMLBTRMTransportDialogInfo
1017 LBMLBTRMTransportDialogInfo(void);
1018 ~LBMLBTRMTransportDialogInfo(void);
1019 void setDialog(LBMLBTRMTransportDialog * dialog);
1020 LBMLBTRMTransportDialog * getDialog(void);
1021 void processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info);
1022 void clearMaps(void);
1025 LBMLBTRMTransportDialog * m_dialog;
1026 LBMLBTRMSourceMap m_sources;
1027 LBMLBTRMReceiverMap m_receivers;
1030 LBMLBTRMTransportDialogInfo::LBMLBTRMTransportDialogInfo(void) :
1037 LBMLBTRMTransportDialogInfo::~LBMLBTRMTransportDialogInfo(void)
1042 void LBMLBTRMTransportDialogInfo::setDialog(LBMLBTRMTransportDialog * dialog)
1047 LBMLBTRMTransportDialog * LBMLBTRMTransportDialogInfo::getDialog(void)
1052 void LBMLBTRMTransportDialogInfo::processPacket(const packet_info * pinfo, const lbm_lbtrm_tap_info_t * tap_info)
1054 switch (tap_info->type)
1056 case LBTRM_PACKET_TYPE_DATA:
1057 case LBTRM_PACKET_TYPE_SM:
1058 case LBTRM_PACKET_TYPE_NCF:
1060 LBMLBTRMSourceEntry * source = NULL;
1061 LBMLBTRMSourceMapIterator it;
1062 QString src_address = address_to_qstring(&(pinfo->src));
1064 it = m_sources.find(src_address);
1065 if (m_sources.end() == it)
1067 QTreeWidgetItem * parent = NULL;
1068 Ui::LBMLBTRMTransportDialog * ui = NULL;
1070 source = new LBMLBTRMSourceEntry(src_address);
1071 it = m_sources.insert(src_address, source);
1072 ui = m_dialog->getUI();
1073 ui->sources_TreeWidget->addTopLevelItem(source);
1074 parent = ui->sources_TreeWidget->invisibleRootItem();
1075 parent->sortChildren(Source_AddressTransport_Column, Qt::AscendingOrder);
1076 ui->sources_TreeWidget->resizeColumnToContents(Source_AddressTransport_Column);
1080 source = it.value();
1082 source->processPacket(pinfo, tap_info);
1085 case LBTRM_PACKET_TYPE_NAK:
1087 LBMLBTRMReceiverEntry * receiver = NULL;
1088 LBMLBTRMReceiverMapIterator it;
1089 QString src_address = address_to_qstring(&(pinfo->src));
1091 it = m_receivers.find(src_address);
1092 if (m_receivers.end() == it)
1094 QTreeWidgetItem * parent = NULL;
1095 Ui::LBMLBTRMTransportDialog * ui = NULL;
1097 receiver = new LBMLBTRMReceiverEntry(src_address);
1098 it = m_receivers.insert(src_address, receiver);
1099 ui = m_dialog->getUI();
1100 ui->receivers_TreeWidget->addTopLevelItem(receiver);
1101 parent = ui->receivers_TreeWidget->invisibleRootItem();
1102 parent->sortChildren(Receiver_AddressTransport_Column, Qt::AscendingOrder);
1103 ui->receivers_TreeWidget->resizeColumnToContents(Receiver_AddressTransport_Column);
1107 receiver = it.value();
1109 receiver->processPacket(pinfo, tap_info);
1117 void LBMLBTRMTransportDialogInfo::clearMaps(void)
1119 for (LBMLBTRMSourceMapIterator it = m_sources.begin(); it != m_sources.end(); ++it)
1125 for (LBMLBTRMReceiverMapIterator it = m_receivers.begin(); it != m_receivers.end(); ++it)
1129 m_receivers.clear();
1132 LBMLBTRMTransportDialog::LBMLBTRMTransportDialog(QWidget * parent, capture_file * cfile) :
1134 m_ui(new Ui::LBMLBTRMTransportDialog),
1135 m_dialog_info(NULL),
1136 m_capture_file(cfile),
1137 m_current_source_transport(NULL),
1138 m_current_receiver_transport(NULL),
1139 m_source_context_menu(NULL),
1140 m_source_header(NULL)
1142 m_ui->setupUi(this);
1143 m_dialog_info = new LBMLBTRMTransportDialogInfo();
1145 m_ui->tabWidget->setCurrentIndex(0);
1146 m_ui->sources_detail_ComboBox->setCurrentIndex(0);
1147 m_ui->sources_detail_transport_Label->setText(QString(" "));
1148 m_ui->receivers_detail_transport_Label->setText(QString(" "));
1149 m_ui->stackedWidget->setCurrentIndex(0);
1151 m_source_header = m_ui->sources_TreeWidget->header();
1152 m_source_context_menu = new QMenu(m_source_header);
1154 m_source_context_menu->addAction(m_ui->action_SourceAutoResizeColumns);
1155 connect(m_ui->action_SourceAutoResizeColumns, SIGNAL(triggered()), this, SLOT(actionSourceAutoResizeColumns_triggered()));
1156 m_source_context_menu->addSeparator();
1158 m_ui->action_SourceDataFrames->setChecked(true);
1159 m_source_context_menu->addAction(m_ui->action_SourceDataFrames);
1160 connect(m_ui->action_SourceDataFrames, SIGNAL(triggered(bool)), this, SLOT(actionSourceDataFrames_triggered(bool)));
1161 m_ui->action_SourceDataBytes->setChecked(true);
1162 m_source_context_menu->addAction(m_ui->action_SourceDataBytes);
1163 connect(m_ui->action_SourceDataBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceDataBytes_triggered(bool)));
1164 m_ui->action_SourceDataFramesBytes->setChecked(false);
1165 m_source_context_menu->addAction(m_ui->action_SourceDataFramesBytes);
1166 connect(m_ui->action_SourceDataFramesBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceDataFramesBytes_triggered(bool)));
1167 m_ui->action_SourceDataRate->setChecked(true);
1168 m_source_context_menu->addAction(m_ui->action_SourceDataRate);
1169 connect(m_ui->action_SourceDataRate, SIGNAL(triggered(bool)), this, SLOT(actionSourceDataRate_triggered(bool)));
1171 m_ui->action_SourceRXDataFrames->setChecked(true);
1172 m_source_context_menu->addAction(m_ui->action_SourceRXDataFrames);
1173 connect(m_ui->action_SourceRXDataFrames, SIGNAL(triggered(bool)), this, SLOT(actionSourceRXDataFrames_triggered(bool)));
1174 m_ui->action_SourceRXDataBytes->setChecked(true);
1175 m_source_context_menu->addAction(m_ui->action_SourceRXDataBytes);
1176 connect(m_ui->action_SourceRXDataBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceRXDataBytes_triggered(bool)));
1177 m_ui->action_SourceRXDataFramesBytes->setChecked(false);
1178 m_source_context_menu->addAction(m_ui->action_SourceRXDataFramesBytes);
1179 connect(m_ui->action_SourceRXDataFramesBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceRXDataFramesBytes_triggered(bool)));
1180 m_ui->action_SourceRXDataRate->setChecked(true);
1181 m_source_context_menu->addAction(m_ui->action_SourceRXDataRate);
1182 connect(m_ui->action_SourceRXDataRate, SIGNAL(triggered(bool)), this, SLOT(actionSourceRXDataRate_triggered(bool)));
1184 m_ui->action_SourceNCFFrames->setChecked(true);
1185 m_source_context_menu->addAction(m_ui->action_SourceNCFFrames);
1186 connect(m_ui->action_SourceNCFFrames, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFFrames_triggered(bool)));
1187 m_ui->action_SourceNCFCount->setChecked(true);
1188 m_source_context_menu->addAction(m_ui->action_SourceNCFCount);
1189 connect(m_ui->action_SourceNCFCount, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFCount_triggered(bool)));
1190 m_ui->action_SourceNCFBytes->setChecked(true);
1191 m_source_context_menu->addAction(m_ui->action_SourceNCFBytes);
1192 connect(m_ui->action_SourceNCFBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFBytes_triggered(bool)));
1193 m_ui->action_SourceNCFFramesBytes->setChecked(false);
1194 m_source_context_menu->addAction(m_ui->action_SourceNCFFramesBytes);
1195 connect(m_ui->action_SourceNCFFramesBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFFramesBytes_triggered(bool)));
1196 m_ui->action_SourceNCFCountBytes->setChecked(false);
1197 m_source_context_menu->addAction(m_ui->action_SourceNCFCountBytes);
1198 connect(m_ui->action_SourceNCFCountBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFCountBytes_triggered(bool)));
1199 m_ui->action_SourceNCFFramesCount->setChecked(false);
1200 m_source_context_menu->addAction(m_ui->action_SourceNCFFramesCount);
1201 connect(m_ui->action_SourceNCFFramesCount, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFFramesCount_triggered(bool)));
1202 m_ui->action_SourceNCFFramesCountBytes->setChecked(false);
1203 m_source_context_menu->addAction(m_ui->action_SourceNCFFramesCountBytes);
1204 connect(m_ui->action_SourceNCFFramesCountBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFFramesCountBytes_triggered(bool)));
1205 m_ui->action_SourceNCFRate->setChecked(true);
1206 m_source_context_menu->addAction(m_ui->action_SourceNCFRate);
1207 connect(m_ui->action_SourceNCFRate, SIGNAL(triggered(bool)), this, SLOT(actionSourceNCFRate_triggered(bool)));
1209 m_ui->action_SourceSMFrames->setChecked(true);
1210 m_source_context_menu->addAction(m_ui->action_SourceSMFrames);
1211 connect(m_ui->action_SourceSMFrames, SIGNAL(triggered(bool)), this, SLOT(actionSourceSMFrames_triggered(bool)));
1212 m_ui->action_SourceSMBytes->setChecked(true);
1213 m_source_context_menu->addAction(m_ui->action_SourceSMBytes);
1214 connect(m_ui->action_SourceSMBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceSMBytes_triggered(bool)));
1215 m_ui->action_SourceSMFramesBytes->setChecked(false);
1216 m_source_context_menu->addAction(m_ui->action_SourceSMFramesBytes);
1217 connect(m_ui->action_SourceSMFramesBytes, SIGNAL(triggered(bool)), this, SLOT(actionSourceSMFramesBytes_triggered(bool)));
1218 m_ui->action_SourceSMRate->setChecked(true);
1219 m_source_context_menu->addAction(m_ui->action_SourceSMRate);
1220 connect(m_ui->action_SourceSMRate, SIGNAL(triggered(bool)), this, SLOT(actionSourceSMRate_triggered(bool)));
1222 m_source_header->setContextMenuPolicy(Qt::CustomContextMenu);
1223 connect(m_source_header, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(custom_source_context_menuRequested(const QPoint &)));
1225 m_ui->sources_TreeWidget->setColumnHidden(Source_DataFramesBytes_Column, true);
1226 m_ui->sources_TreeWidget->setColumnHidden(Source_RXDataFramesBytes_Column, true);
1227 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesBytes_Column, true);
1228 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFCountBytes_Column, true);
1229 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesCount_Column, true);
1230 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesCountBytes_Column, true);
1231 m_ui->sources_TreeWidget->setColumnHidden(Source_SMFramesBytes_Column, true);
1233 connect(this, SIGNAL(accepted()), this, SLOT(closeDialog()));
1234 connect(this, SIGNAL(rejected()), this, SLOT(closeDialog()));
1238 LBMLBTRMTransportDialog::~LBMLBTRMTransportDialog(void)
1240 resetSourcesDetail();
1242 resetReceiversDetail();
1244 if (m_dialog_info != NULL)
1246 delete m_dialog_info;
1247 m_dialog_info = NULL;
1249 delete m_source_context_menu;
1250 m_source_context_menu = NULL;
1253 m_capture_file = NULL;
1256 void LBMLBTRMTransportDialog::setCaptureFile(capture_file * cfile)
1258 if (cfile == NULL) // We only want to know when the file closes.
1260 m_capture_file = NULL;
1261 m_ui->displayFilterLineEdit->setEnabled(false);
1262 m_ui->applyFilterButton->setEnabled(false);
1266 void LBMLBTRMTransportDialog::resetSources(void)
1268 while (m_ui->sources_TreeWidget->takeTopLevelItem(0) != NULL)
1272 void LBMLBTRMTransportDialog::resetReceivers(void)
1274 while (m_ui->receivers_TreeWidget->takeTopLevelItem(0) != NULL)
1278 void LBMLBTRMTransportDialog::resetSourcesDetail(void)
1280 while (m_ui->sources_detail_sqn_TreeWidget->takeTopLevelItem(0) != NULL)
1282 while (m_ui->sources_detail_ncf_sqn_TreeWidget->takeTopLevelItem(0) != NULL)
1284 m_ui->sources_detail_transport_Label->setText(QString(" "));
1285 m_current_source_transport = NULL;
1288 void LBMLBTRMTransportDialog::resetReceiversDetail(void)
1290 while (m_ui->receivers_detail_TreeWidget->takeTopLevelItem(0) != NULL)
1292 m_ui->receivers_detail_transport_Label->setText(QString(" "));
1293 m_current_receiver_transport = NULL;
1296 void LBMLBTRMTransportDialog::fillTree(void)
1298 GString * error_string;
1300 if (m_capture_file == NULL)
1304 m_dialog_info->setDialog(this);
1306 error_string = register_tap_listener("lbm_lbtrm",
1307 (void *)m_dialog_info,
1308 m_ui->displayFilterLineEdit->text().toUtf8().constData(),
1309 TL_REQUIRES_COLUMNS,
1315 QMessageBox::critical(this, tr("LBT-RM Statistics failed to attach to tap"),
1317 g_string_free(error_string, TRUE);
1321 cf_retap_packets(m_capture_file);
1322 drawTreeItems(&m_dialog_info);
1323 remove_tap_listener((void *)m_dialog_info);
1326 void LBMLBTRMTransportDialog::resetTap(void * tap_data)
1328 LBMLBTRMTransportDialogInfo * info = (LBMLBTRMTransportDialogInfo *) tap_data;
1329 LBMLBTRMTransportDialog * dialog = info->getDialog();
1334 dialog->resetSourcesDetail();
1335 dialog->resetSources();
1336 dialog->resetReceiversDetail();
1337 dialog->resetReceivers();
1341 gboolean LBMLBTRMTransportDialog::tapPacket(void * tap_data, packet_info * pinfo, epan_dissect_t *, const void * tap_info)
1343 if (pinfo->fd->flags.passed_dfilter == 1)
1345 const lbm_lbtrm_tap_info_t * tapinfo = (const lbm_lbtrm_tap_info_t *)tap_info;
1346 LBMLBTRMTransportDialogInfo * info = (LBMLBTRMTransportDialogInfo *)tap_data;
1348 info->processPacket(pinfo, tapinfo);
1353 void LBMLBTRMTransportDialog::drawTreeItems(void *)
1357 void LBMLBTRMTransportDialog::on_applyFilterButton_clicked(void)
1362 void LBMLBTRMTransportDialog::closeDialog(void)
1367 void LBMLBTRMTransportDialog::sourcesDetailCurrentChanged(int index)
1378 m_ui->stackedWidget->setCurrentIndex(0);
1381 m_ui->stackedWidget->setCurrentIndex(1);
1386 sourcesItemClicked(m_current_source_transport, 0);
1389 void LBMLBTRMTransportDialog::sourcesItemClicked(QTreeWidgetItem * item, int)
1391 LBMLBTRMSourceTransportEntry * transport = dynamic_cast<LBMLBTRMSourceTransportEntry *>(item);
1393 resetSourcesDetail();
1394 if (transport == NULL)
1396 // Must be a source item, ignore it?
1399 m_current_source_transport = transport;
1400 m_ui->sources_detail_transport_Label->setText(transport->m_transport);
1401 int cur_idx = m_ui->sources_detail_ComboBox->currentIndex();
1405 loadSourceDataDetails(transport);
1408 loadSourceRXDataDetails(transport);
1411 loadSourceNCFDetails(transport);
1414 loadSourceSMDetails(transport);
1421 void LBMLBTRMTransportDialog::loadSourceDataDetails(LBMLBTRMSourceTransportEntry * transport)
1423 for (LBMLBTRMSQNMapIterator it = transport->m_data_sqns.begin(); it != transport->m_data_sqns.end(); ++it)
1425 LBMLBTRMSQNEntry * sqn = it.value();
1426 m_ui->sources_detail_sqn_TreeWidget->addTopLevelItem(sqn);
1430 void LBMLBTRMTransportDialog::loadSourceRXDataDetails(LBMLBTRMSourceTransportEntry * transport)
1432 for (LBMLBTRMSQNMapIterator it = transport->m_rx_data_sqns.begin(); it != transport->m_rx_data_sqns.end(); ++it)
1434 LBMLBTRMSQNEntry * sqn = it.value();
1435 m_ui->sources_detail_sqn_TreeWidget->addTopLevelItem(sqn);
1439 void LBMLBTRMTransportDialog::loadSourceNCFDetails(LBMLBTRMSourceTransportEntry * transport)
1441 for (LBMLBTRMNCFSQNMapIterator it = transport->m_ncf_sqns.begin(); it != transport->m_ncf_sqns.end(); ++it)
1443 LBMLBTRMNCFSQNEntry * sqn = it.value();
1444 m_ui->sources_detail_ncf_sqn_TreeWidget->addTopLevelItem(sqn);
1448 void LBMLBTRMTransportDialog::loadSourceSMDetails(LBMLBTRMSourceTransportEntry * transport)
1450 for (LBMLBTRMSQNMapIterator it = transport->m_sm_sqns.begin(); it != transport->m_sm_sqns.end(); ++it)
1452 LBMLBTRMSQNEntry * sqn = it.value();
1453 m_ui->sources_detail_sqn_TreeWidget->addTopLevelItem(sqn);
1457 void LBMLBTRMTransportDialog::receiversItemClicked(QTreeWidgetItem * item, int)
1459 LBMLBTRMReceiverTransportEntry * transport = dynamic_cast<LBMLBTRMReceiverTransportEntry *>(item);
1461 resetReceiversDetail();
1462 if (transport == NULL)
1464 // Must be a receiver item, ignore it?
1467 m_current_receiver_transport = transport;
1468 m_ui->receivers_detail_transport_Label->setText(transport->m_transport);
1469 loadReceiverNAKDetails(transport);
1472 void LBMLBTRMTransportDialog::loadReceiverNAKDetails(LBMLBTRMReceiverTransportEntry * transport)
1474 for (LBMLBTRMSQNMapIterator it = transport->m_nak_sqns.begin(); it != transport->m_nak_sqns.end(); ++it)
1476 LBMLBTRMSQNEntry * sqn = it.value();
1477 m_ui->receivers_detail_TreeWidget->addTopLevelItem(sqn);
1481 void LBMLBTRMTransportDialog::sourcesDetailItemDoubleClicked(QTreeWidgetItem * item, int)
1483 LBMLBTRMFrameEntry * frame = dynamic_cast<LBMLBTRMFrameEntry *>(item);
1486 // Must have double-clicked on something other than an expanded frame entry
1489 emit goToPacket((int)frame->getFrame());
1492 void LBMLBTRMTransportDialog::receiversDetailItemDoubleClicked(QTreeWidgetItem * item, int)
1494 LBMLBTRMFrameEntry * frame = dynamic_cast<LBMLBTRMFrameEntry *>(item);
1497 // Must have double-clicked on something other than an expanded frame entry
1500 emit goToPacket((int)frame->getFrame());
1503 void LBMLBTRMTransportDialog::custom_source_context_menuRequested(const QPoint & pos)
1505 m_source_context_menu->exec(m_source_header->mapToGlobal(pos));
1508 void LBMLBTRMTransportDialog::actionSourceDataFrames_triggered(bool checked)
1510 m_ui->sources_TreeWidget->setColumnHidden(Source_DataFrames_Column, !checked);
1513 void LBMLBTRMTransportDialog::actionSourceDataBytes_triggered(bool checked)
1515 m_ui->sources_TreeWidget->setColumnHidden(Source_DataBytes_Column, !checked);
1518 void LBMLBTRMTransportDialog::actionSourceDataFramesBytes_triggered(bool checked)
1520 m_ui->sources_TreeWidget->setColumnHidden(Source_DataFramesBytes_Column, !checked);
1523 void LBMLBTRMTransportDialog::actionSourceDataRate_triggered(bool checked)
1525 m_ui->sources_TreeWidget->setColumnHidden(Source_DataRate_Column, !checked);
1528 void LBMLBTRMTransportDialog::actionSourceRXDataFrames_triggered(bool checked)
1530 m_ui->sources_TreeWidget->setColumnHidden(Source_RXDataFrames_Column, !checked);
1533 void LBMLBTRMTransportDialog::actionSourceRXDataBytes_triggered(bool checked)
1535 m_ui->sources_TreeWidget->setColumnHidden(Source_RXDataBytes_Column, !checked);
1538 void LBMLBTRMTransportDialog::actionSourceRXDataFramesBytes_triggered(bool checked)
1540 m_ui->sources_TreeWidget->setColumnHidden(Source_RXDataFramesBytes_Column, !checked);
1543 void LBMLBTRMTransportDialog::actionSourceRXDataRate_triggered(bool checked)
1545 m_ui->sources_TreeWidget->setColumnHidden(Source_RXDataRate_Column, !checked);
1548 void LBMLBTRMTransportDialog::actionSourceNCFFrames_triggered(bool checked)
1550 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFrames_Column, !checked);
1553 void LBMLBTRMTransportDialog::actionSourceNCFCount_triggered(bool checked)
1555 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFCount_Column, !checked);
1558 void LBMLBTRMTransportDialog::actionSourceNCFBytes_triggered(bool checked)
1560 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFrames_Column, !checked);
1563 void LBMLBTRMTransportDialog::actionSourceNCFFramesBytes_triggered(bool checked)
1565 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesBytes_Column, !checked);
1568 void LBMLBTRMTransportDialog::actionSourceNCFCountBytes_triggered(bool checked)
1570 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFCountBytes_Column, !checked);
1573 void LBMLBTRMTransportDialog::actionSourceNCFFramesCount_triggered(bool checked)
1575 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesCount_Column, !checked);
1578 void LBMLBTRMTransportDialog::actionSourceNCFFramesCountBytes_triggered(bool checked)
1580 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFFramesCountBytes_Column, !checked);
1583 void LBMLBTRMTransportDialog::actionSourceNCFRate_triggered(bool checked)
1585 m_ui->sources_TreeWidget->setColumnHidden(Source_NCFRate_Column, !checked);
1588 void LBMLBTRMTransportDialog::actionSourceSMFrames_triggered(bool checked)
1590 m_ui->sources_TreeWidget->setColumnHidden(Source_SMFrames_Column, !checked);
1593 void LBMLBTRMTransportDialog::actionSourceSMBytes_triggered(bool checked)
1595 m_ui->sources_TreeWidget->setColumnHidden(Source_SMBytes_Column, !checked);
1598 void LBMLBTRMTransportDialog::actionSourceSMFramesBytes_triggered(bool checked)
1600 m_ui->sources_TreeWidget->setColumnHidden(Source_SMFramesBytes_Column, !checked);
1603 void LBMLBTRMTransportDialog::actionSourceSMRate_triggered(bool checked)
1605 m_ui->sources_TreeWidget->setColumnHidden(Source_SMRate_Column, !checked);
1608 void LBMLBTRMTransportDialog::actionSourceAutoResizeColumns_triggered(void)
1610 m_ui->sources_TreeWidget->resizeColumnToContents(Source_AddressTransport_Column);
1611 m_ui->sources_TreeWidget->resizeColumnToContents(Source_DataFrames_Column);
1612 m_ui->sources_TreeWidget->resizeColumnToContents(Source_DataBytes_Column);
1613 m_ui->sources_TreeWidget->resizeColumnToContents(Source_DataFramesBytes_Column);
1614 m_ui->sources_TreeWidget->resizeColumnToContents(Source_DataRate_Column);
1615 m_ui->sources_TreeWidget->resizeColumnToContents(Source_RXDataFrames_Column);
1616 m_ui->sources_TreeWidget->resizeColumnToContents(Source_RXDataBytes_Column);
1617 m_ui->sources_TreeWidget->resizeColumnToContents(Source_RXDataFramesBytes_Column);
1618 m_ui->sources_TreeWidget->resizeColumnToContents(Source_RXDataRate_Column);
1619 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFFrames_Column);
1620 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFCount_Column);
1621 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFBytes_Column);
1622 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFFramesBytes_Column);
1623 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFCountBytes_Column);
1624 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFFramesCount_Column);
1625 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFFramesCountBytes_Column);
1626 m_ui->sources_TreeWidget->resizeColumnToContents(Source_NCFRate_Column);
1627 m_ui->sources_TreeWidget->resizeColumnToContents(Source_SMFrames_Column);
1628 m_ui->sources_TreeWidget->resizeColumnToContents(Source_SMBytes_Column);
1629 m_ui->sources_TreeWidget->resizeColumnToContents(Source_SMFramesBytes_Column);
1630 m_ui->sources_TreeWidget->resizeColumnToContents(Source_SMRate_Column);
1634 * Editor modelines - http://www.wireshark.org/tools/modelines.html
1639 * indent-tabs-mode: nil
1642 * vi: set shiftwidth=4 tabstop=8 expandtab:
1643 * :indentSize=4:tabSize=8:noTabs=true: