aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docbook/release-notes.adoc1
-rw-r--r--docbook/wsug_src/WSUG_chapter_use.adoc21
-rw-r--r--epan/dissectors/packet-ip.c18
-rw-r--r--epan/dissectors/packet-tcp.c1
-rw-r--r--epan/prefs.c1
-rw-r--r--epan/prefs.h3
-rw-r--r--epan/proto.c9
-rw-r--r--epan/proto.h9
-rw-r--r--test/README.test1
-rw-r--r--test/baseline/dhcp-raw.ek8
-rw-r--r--test/baseline/dhcp.jsonraw16
-rw-r--r--ui/qt/CMakeLists.txt2
-rw-r--r--ui/qt/io_graph_dialog.cpp2
-rw-r--r--ui/qt/layout_preferences_frame.cpp39
-rw-r--r--ui/qt/layout_preferences_frame.h3
-rw-r--r--ui/qt/layout_preferences_frame.ui30
-rw-r--r--ui/qt/main_window.cpp44
-rw-r--r--ui/qt/main_window.h4
-rw-r--r--ui/qt/main_window.ui15
-rw-r--r--ui/qt/main_window_layout.cpp12
-rw-r--r--ui/qt/main_window_slots.cpp6
-rw-r--r--ui/qt/packet_diagram.cpp736
-rw-r--r--ui/qt/packet_diagram.h72
-rw-r--r--ui/qt/tcp_stream_dialog.cpp1
-rw-r--r--ui/qt/utils/field_information.cpp19
-rw-r--r--ui/qt/utils/field_information.h1
-rw-r--r--ui/qt/wireshark_application.cpp8
-rw-r--r--ui/qt/wireshark_application.h1
-rw-r--r--ui/recent.c8
-rw-r--r--ui/recent.h1
30 files changed, 1037 insertions, 55 deletions
diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc
index 18c9204232..125e870480 100644
--- a/docbook/release-notes.adoc
+++ b/docbook/release-notes.adoc
@@ -42,6 +42,7 @@ since version 3.2.0:
* Wireshark is able to decode, play and save iLBC payload on platforms where iLBC library (https://github.com/TimothyGu/libilbc) is available.
* Decode As entries can now be copied from other profiles using a button in the dialog.
* sshdump can now be copied in multiple instances. Each instance will show up a different interface and will have its own profile.
+* The main window now supports a packet diagram view, which shows each packet as a textbook-style diagram.
// === Removed Features and Support
diff --git a/docbook/wsug_src/WSUG_chapter_use.adoc b/docbook/wsug_src/WSUG_chapter_use.adoc
index 2d0732ac11..921e3bab59 100644
--- a/docbook/wsug_src/WSUG_chapter_use.adoc
+++ b/docbook/wsug_src/WSUG_chapter_use.adoc
@@ -66,6 +66,7 @@ other GUI programs.
. The _packet bytes pane_ (see <<ChUsePacketBytesPaneSection>>) displays the
data from the packet selected in the packet list pane, and highlights the field
selected in the packet details pane.
+// . The _packet diagram pane_ (see <<ChUsePacketDiagramPaneSection>>) displays the packet selected in the packet list as a textbook-style diagram.
. The _statusbar_ (see <<ChUseStatusbarSection>>) shows some detailed
information about the current program state and the captured data.
@@ -406,6 +407,7 @@ image::wsug_graphics/ws-view-menu.png[{screenshot-attrs}]
|menu:Packet List[] ||This menu item hides or shows the packet list pane, see <<ChUsePacketListPaneSection>>.
|menu:Packet Details[] ||This menu item hides or shows the packet details pane, see <<ChUsePacketDetailsPaneSection>>.
|menu:Packet Bytes[] ||This menu item hides or shows the packet bytes pane, see <<ChUsePacketBytesPaneSection>>.
+// |menu:Packet Diagram[] ||This menu item hides or shows the packet diagram pane. See <<ChUsePacketDiagramPaneSection>>.
|menu:Time Display Format[Date and Time of Day: 1970-01-01 01:02:03.123456]|| Selecting this tells Wireshark to display the time stamps in date and time of day format, see <<ChWorkTimeFormatsSection>>.
The fields “Time of Day”, “Date and Time of Day”, “Seconds Since Beginning of
@@ -1042,6 +1044,25 @@ The context menu (right mouse click) of the tab labels will show a list of all
available pages. This can be helpful if the size in the pane is too small for
all the tab labels.
+[[ChUsePacketDiagramPaneSection]]
+
+////
+=== The “Packet Diagram” Pane
+
+The packet diagram pane shows the current packet (selected in the “Packet List”
+pane) as a diagram, similar to ones used in textbooks and IETF RFCs.
+
+[[ChUseWiresharkDiagramPane]]
+
+.The “Packet Diagram” pane
+image::wsug_graphics/ws-diagram-pane.png[{screenshot-attrs}]
+
+This pane shows the protocols and top-level protocol fields of the packet selected in the “Packet List” pane as a series of diagrams.
+
+There is a context menu (right mouse click) available.
+For details see <<ChWorkPacketDiagramPanePopUpMenu>>.
+////
+
[[ChUseStatusbarSection]]
=== The Statusbar
diff --git a/epan/dissectors/packet-ip.c b/epan/dissectors/packet-ip.c
index c5609afdc4..8e5ba4df03 100644
--- a/epan/dissectors/packet-ip.c
+++ b/epan/dissectors/packet-ip.c
@@ -1860,7 +1860,7 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
ti = proto_tree_add_item(tree, proto_ip, tvb, offset, hlen, ENC_NA);
ip_tree = proto_item_add_subtree(ti, ett_ip);
- tf = proto_tree_add_item(ip_tree, hf_ip_version, tvb, offset, 1, ENC_NA);
+ tf = proto_tree_add_bits_item(ip_tree, hf_ip_version, tvb, 0, 4, ENC_NA);
if (iph->ip_ver != 4) {
col_add_fstr(pinfo->cinfo, COL_INFO,
"Bogus IPv4 version (%u, must be 4)", iph->ip_ver);
@@ -1997,7 +1997,6 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
if (ip_security_flag) {
/* RFC 3514 - The Security Flag in the IPv4 Header (April Fool's joke) */
- proto_item *sf;
static int * const ip_flags_evil[] = {
&hf_ip_flags_sf,
&hf_ip_flags_df,
@@ -2005,10 +2004,10 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
NULL
};
- sf = proto_tree_add_bitmask_with_flags(ip_tree, tvb, offset + 6, hf_ip_flags,
+ tf = proto_tree_add_bitmask_with_flags(ip_tree, tvb, offset + 6, hf_ip_flags,
ett_ip_flags, ip_flags_evil, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_TFS | BMT_NO_INT);
if (iph->ip_off & IP_RF) {
- expert_add_info(pinfo, sf, &ei_ip_evil_packet);
+ expert_add_info(pinfo, tf, &ei_ip_evil_packet);
}
} else {
static int * const ip_flags[] = {
@@ -2017,12 +2016,13 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
&hf_ip_flags_mf,
NULL
};
- proto_tree_add_bitmask_with_flags(ip_tree, tvb, offset + 6, hf_ip_flags,
+ tf = proto_tree_add_bitmask_with_flags(ip_tree, tvb, offset + 6, hf_ip_flags,
ett_ip_flags, ip_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_TFS | BMT_NO_INT);
}
+ proto_item_set_bits_offset_len(tf, 0, 3);
- proto_tree_add_uint(ip_tree, hf_ip_frag_offset, tvb, offset + 6, 2, (iph->ip_off & IP_OFFSET)*8);
-
+ tf = proto_tree_add_uint(ip_tree, hf_ip_frag_offset, tvb, offset + 6, 2, (iph->ip_off & IP_OFFSET)*8);
+ proto_item_set_bits_offset_len(tf, 3, 13);
iph->ip_ttl = tvb_get_guint8(tvb, offset + 8);
if (tree) {
@@ -2334,7 +2334,7 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
col_clear(pinfo->cinfo, COL_INFO);
col_add_fstr(pinfo->cinfo, COL_INFO, "Bogus IP version (%u)", version);
ip_tree = proto_item_add_subtree(ti, ett_ip);
- tf = proto_tree_add_item(ip_tree, hf_ip_version, tvb, 0, 1, ENC_NA);
+ tf = proto_tree_add_bits_item(ip_tree, hf_ip_version, tvb, 0, 4, ENC_NA);
expert_add_info(pinfo, tf, &ei_ip_bogus_ip_version);
return 1;
}
@@ -2438,7 +2438,7 @@ proto_register_ip(void)
static hf_register_info hf[] = {
{ &hf_ip_version,
{ "Version", "ip.version", FT_UINT8, BASE_DEC,
- NULL, 0xF0, NULL, HFILL }},
+ NULL, 0x00, NULL, HFILL }},
{ &hf_ip_hdr_len,
{ "Header Length", "ip.hdr_len", FT_UINT8, BASE_DEC,
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c
index 107f76b962..e6fc913818 100644
--- a/epan/dissectors/packet-tcp.c
+++ b/epan/dissectors/packet-tcp.c
@@ -6439,6 +6439,7 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
"%u bytes (%u)", tcph->th_hlen, tcph->th_hlen>>2);
tf = proto_tree_add_uint_format(tcp_tree, hf_tcp_flags, tvb, offset + 12, 2,
tcph->th_flags, "Flags: 0x%03x (%s)", tcph->th_flags, flags_str);
+ proto_item_set_bits_offset_len(tf, 4, 12);
field_tree = proto_item_add_subtree(tf, ett_tcp_flags);
proto_tree_add_boolean(field_tree, hf_tcp_flags_res, tvb, offset + 12, 1, tcph->th_flags);
proto_tree_add_boolean(field_tree, hf_tcp_flags_ns, tvb, offset + 12, 1, tcph->th_flags);
diff --git a/epan/prefs.c b/epan/prefs.c
index d4daa2b422..26c52de01f 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -122,6 +122,7 @@ static const enum_val_t gui_layout_content[] = {
{"PLIST", "PLIST", 1},
{"PDETAILS", "PDETAILS", 2},
{"PBYTES", "PBYTES", 3},
+ {"PDIAGRAM", "PDIAGRAM", 4},
{NULL, NULL, -1}
};
diff --git a/epan/prefs.h b/epan/prefs.h
index 8e15673d53..ac13d2b935 100644
--- a/epan/prefs.h
+++ b/epan/prefs.h
@@ -91,7 +91,8 @@ typedef enum {
layout_pane_content_none,
layout_pane_content_plist,
layout_pane_content_pdetails,
- layout_pane_content_pbytes
+ layout_pane_content_pbytes,
+ layout_pane_content_pdiagram,
} layout_pane_content_e;
/*
diff --git a/epan/proto.c b/epan/proto.c
index e894b8f464..e478ed6e78 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -6827,6 +6827,15 @@ proto_item_get_len(const proto_item *pi)
return fi ? fi->length : -1;
}
+void
+proto_item_set_bits_offset_len(proto_item *ti, int bits_offset, int bits_len) {
+ if (!ti) {
+ return;
+ }
+ FI_SET_FLAG(PNODE_FINFO(ti), FI_BITS_OFFSET(bits_offset));
+ FI_SET_FLAG(PNODE_FINFO(ti), FI_BITS_SIZE(bits_len));
+}
+
char *
proto_item_get_display_repr(wmem_allocator_t *scope, proto_item *pi)
{
diff --git a/epan/proto.h b/epan/proto.h
index 8938c5bb43..df20b8af1c 100644
--- a/epan/proto.h
+++ b/epan/proto.h
@@ -991,7 +991,7 @@ static inline gboolean proto_item_is_url(proto_item *ti) {
#define PROTO_ITEM_IS_URL(ti) proto_item_is_url((ti))
/** Mark this protocol field as a URL
-* @param ti The item to mark as a URL. May be NULL.
+ * @param ti The item to mark as a URL. May be NULL.
*/
static inline void proto_item_set_url(proto_item *ti) {
if (ti) {
@@ -1107,6 +1107,13 @@ WS_DLL_PUBLIC void proto_item_set_end(proto_item *pi, tvbuff_t *tvb, gint end);
@return the current length */
WS_DLL_PUBLIC int proto_item_get_len(const proto_item *pi);
+/** Set the bit offset and length for the specified proto_item.
+ * @param ti The item to set.
+ * @param bits_offset The number of bits from the beginning of the field.
+ * @param bits_offset The new length in bits.
+ */
+void proto_item_set_bits_offset_len(proto_item *ti, int bits_offset, int bits_len);
+
/** Get display representation of a proto_item.
* Can be used, for example, to append that to the parent item of
* that item.
diff --git a/test/README.test b/test/README.test
index 2571686462..a8ec1cfe1c 100644
--- a/test/README.test
+++ b/test/README.test
@@ -17,3 +17,4 @@ mkdir ~/.config/wireshark/profiles/ctest
TZ=UTC WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 build/run/tshark -C ctest -T ek -r test/captures/dhcp.pcap > test/baseline/dhcp.ek
TZ=UTC WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 build/run/tshark -C ctest -T json -r test/captures/dhcp.pcap > test/baseline/dhcp.json
TZ=UTC WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 build/run/tshark -C ctest -T jsonraw -r test/captures/dhcp.pcap > test/baseline/dhcp.jsonraw
+TZ=UTC WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 build/run/tshark -C ctest -T ek -r test/captures/dhcp.pcap -x > test/baseline/dhcp-raw.ek
diff --git a/test/baseline/dhcp-raw.ek b/test/baseline/dhcp-raw.ek
index 8809d99ca4..d76bb740ac 100644
--- a/test/baseline/dhcp-raw.ek
+++ b/test/baseline/dhcp-raw.ek
@@ -1,8 +1,8 @@
{"index":{"_index":"packets-2004-12-05","_type":"doc"}}
-{"timestamp":"1102274184317","layers":{"frame_raw":"ffffffffffff000b8201fc4208004500012ca8360000fa11178b00000000ffffffff004400430118591f0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.317453000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.317453000","frame_frame_time_delta":"0.000000000","frame_frame_time_delta_displayed":"0.000000000","frame_frame_time_relative":"0.000000000","frame_frame_number":"1","frame_frame_len":"314","frame_frame_cap_len":"314","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"ffffffffffff000b8201fc420800","eth":{"eth_eth_dst_raw":"ffffffffffff","eth_eth_dst":"ff:ff:ff:ff:ff:ff","eth_eth_dst_resolved_raw":"ffffffffffff","eth_eth_dst_resolved":"Broadcast","eth_eth_dst_oui_raw":"ffffff","eth_eth_dst_oui":"16777215","eth_eth_addr_raw":"ffffffffffff","eth_eth_addr":"ff:ff:ff:ff:ff:ff","eth_eth_addr_resolved_raw":"ffffffffffff","eth_eth_addr_resolved":"Broadcast","eth_eth_addr_oui_raw":"ffffff","eth_eth_addr_oui":"16777215","eth_eth_dst_lg_raw":"1","eth_eth_dst_lg":true,"eth_eth_lg_raw":"1","eth_eth_lg":true,"eth_eth_dst_ig_raw":"1","eth_eth_dst_ig":true,"eth_eth_ig_raw":"1","eth_eth_ig":true,"eth_eth_src_raw":"000b8201fc42","eth_eth_src":"00:0b:82:01:fc:42","eth_eth_src_resolved_raw":"000b8201fc42","eth_eth_src_resolved":"Grandstr_01:fc:42","eth_eth_src_oui_raw":"000b82","eth_eth_src_oui":"2946","eth_eth_src_oui_resolved_raw":"000b8201fc42","eth_eth_src_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"4500012ca8360000fa11178b00000000ffffffff","ip":{"ip_ip_version_raw":"4","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"012c","ip_ip_len":"300","ip_ip_id_raw":"a836","ip_ip_id":"0x0000a836","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"fa","ip_ip_ttl":"250","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"178b","ip_ip_checksum":"0x0000178b","ip_ip_checksum_status":"2","ip_ip_src_raw":"00000000","ip_ip_src":"0.0.0.0","ip_ip_addr_raw":["00000000","ffffffff"],"ip_ip_addr":["0.0.0.0","255.255.255.255"],"ip_ip_src_host_raw":"00000000","ip_ip_src_host":"0.0.0.0","ip_ip_host_raw":["00000000","ffffffff"],"ip_ip_host":["0.0.0.0","255.255.255.255"],"ip_ip_dst_raw":"ffffffff","ip_ip_dst":"255.255.255.255","ip_ip_dst_host_raw":"ffffffff","ip_ip_dst_host":"255.255.255.255"},"udp_raw":"004400430118591f","udp":{"udp_udp_srcport_raw":"0044","udp_udp_srcport":"68","udp_udp_dstport_raw":"0043","udp_udp_dstport":"67","udp_udp_port_raw":["0044","0043"],"udp_udp_port":["68","67"],"udp_udp_length_raw":"0118","udp_udp_length":"280","udp_udp_checksum_raw":"591f","udp_udp_checksum":"0x0000591f","udp_udp_checksum_status":"2","udp_udp_stream":"0","text":"Timestamps","udp_udp_time_relative":"0.000000000","udp_udp_time_delta":"0.000000000","udp_udp_payload_raw":"0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","udp_udp_payload":"01:01:06:00:00:00:3d:1d:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:01:3d:07:01:00:0b:82:01:fc:42:32:04:00:00:00:00:37:04:01:03:06:2a:ff:00:00:00:00:00:00:00"},"dhcp_raw":"0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","dhcp":{"dhcp_dhcp_type_raw":"01","dhcp_dhcp_type":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1d","dhcp_dhcp_id":"0x00003d1d","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"00000000","dhcp_dhcp_ip_your":"0.0.0.0","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350101","3d0701000b8201fc42","320400000000","37040103062a","ff"],"dhcp_dhcp_option_type":["53","61","50","55","0"],"dhcp_dhcp_option_length_raw":["01","07","04","04"],"dhcp_dhcp_option_length":["1","7","4","4"],"dhcp_dhcp_option_value_raw":["01","01000b8201fc42","00000000","0103062a"],"dhcp_dhcp_option_value":["01","01:00:0b:82:01:fc:42","00:00:00:00","01:03:06:2a"],"dhcp_dhcp_option_dhcp_raw":"01","dhcp_dhcp_option_dhcp":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_option_requested_ip_address_raw":"00000000","dhcp_dhcp_option_requested_ip_address":"0.0.0.0","dhcp_dhcp_option_request_list_item_raw":["01","03","06","2a"],"dhcp_dhcp_option_request_list_item":["1","3","6","42"],"dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"00000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00"}}}
+{"timestamp":"1102274184317","layers":{"frame_raw":"ffffffffffff000b8201fc4208004500012ca8360000fa11178b00000000ffffffff004400430118591f0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.317453000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.317453000","frame_frame_time_delta":"0.000000000","frame_frame_time_delta_displayed":"0.000000000","frame_frame_time_relative":"0.000000000","frame_frame_number":"1","frame_frame_len":"314","frame_frame_cap_len":"314","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"ffffffffffff000b8201fc420800","eth":{"eth_eth_dst_raw":"ffffffffffff","eth_eth_dst":"ff:ff:ff:ff:ff:ff","eth_eth_dst_resolved_raw":"ffffffffffff","eth_eth_dst_resolved":"Broadcast","eth_eth_dst_oui_raw":"ffffff","eth_eth_dst_oui":"16777215","eth_eth_addr_raw":"ffffffffffff","eth_eth_addr":"ff:ff:ff:ff:ff:ff","eth_eth_addr_resolved_raw":"ffffffffffff","eth_eth_addr_resolved":"Broadcast","eth_eth_addr_oui_raw":"ffffff","eth_eth_addr_oui":"16777215","eth_eth_dst_lg_raw":"1","eth_eth_dst_lg":true,"eth_eth_lg_raw":"1","eth_eth_lg":true,"eth_eth_dst_ig_raw":"1","eth_eth_dst_ig":true,"eth_eth_ig_raw":"1","eth_eth_ig":true,"eth_eth_src_raw":"000b8201fc42","eth_eth_src":"00:0b:82:01:fc:42","eth_eth_src_resolved_raw":"000b8201fc42","eth_eth_src_resolved":"Grandstr_01:fc:42","eth_eth_src_oui_raw":"000b82","eth_eth_src_oui":"2946","eth_eth_src_oui_resolved_raw":"000b8201fc42","eth_eth_src_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"4500012ca8360000fa11178b00000000ffffffff","ip":{"ip_ip_version_raw":"45","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"012c","ip_ip_len":"300","ip_ip_id_raw":"a836","ip_ip_id":"0x0000a836","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"fa","ip_ip_ttl":"250","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"178b","ip_ip_checksum":"0x0000178b","ip_ip_checksum_status":"2","ip_ip_src_raw":"00000000","ip_ip_src":"0.0.0.0","ip_ip_addr_raw":["00000000","ffffffff"],"ip_ip_addr":["0.0.0.0","255.255.255.255"],"ip_ip_src_host_raw":"00000000","ip_ip_src_host":"0.0.0.0","ip_ip_host_raw":["00000000","ffffffff"],"ip_ip_host":["0.0.0.0","255.255.255.255"],"ip_ip_dst_raw":"ffffffff","ip_ip_dst":"255.255.255.255","ip_ip_dst_host_raw":"ffffffff","ip_ip_dst_host":"255.255.255.255"},"udp_raw":"004400430118591f","udp":{"udp_udp_srcport_raw":"0044","udp_udp_srcport":"68","udp_udp_dstport_raw":"0043","udp_udp_dstport":"67","udp_udp_port_raw":["0044","0043"],"udp_udp_port":["68","67"],"udp_udp_length_raw":"0118","udp_udp_length":"280","udp_udp_checksum_raw":"591f","udp_udp_checksum":"0x0000591f","udp_udp_checksum_status":"2","udp_udp_stream":"0","text":"Timestamps","udp_udp_time_relative":"0.000000000","udp_udp_time_delta":"0.000000000","udp_udp_payload_raw":"0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","udp_udp_payload":"01:01:06:00:00:00:3d:1d:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:01:3d:07:01:00:0b:82:01:fc:42:32:04:00:00:00:00:37:04:01:03:06:2a:ff:00:00:00:00:00:00:00"},"dhcp_raw":"0101060000003d1d0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501013d0701000b8201fc4232040000000037040103062aff00000000000000","dhcp":{"dhcp_dhcp_type_raw":"01","dhcp_dhcp_type":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1d","dhcp_dhcp_id":"0x00003d1d","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"00000000","dhcp_dhcp_ip_your":"0.0.0.0","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350101","3d0701000b8201fc42","320400000000","37040103062a","ff"],"dhcp_dhcp_option_type":["53","61","50","55","0"],"dhcp_dhcp_option_length_raw":["01","07","04","04"],"dhcp_dhcp_option_length":["1","7","4","4"],"dhcp_dhcp_option_value_raw":["01","01000b8201fc42","00000000","0103062a"],"dhcp_dhcp_option_value":["01","01:00:0b:82:01:fc:42","00:00:00:00","01:03:06:2a"],"dhcp_dhcp_option_dhcp_raw":"01","dhcp_dhcp_option_dhcp":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_option_requested_ip_address_raw":"00000000","dhcp_dhcp_option_requested_ip_address":"0.0.0.0","dhcp_dhcp_option_request_list_item_raw":["01","03","06","2a"],"dhcp_dhcp_option_request_list_item":["1","3","6","42"],"dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"00000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00"}}}
{"index":{"_index":"packets-2004-12-05","_type":"doc"}}
-{"timestamp":"1102274184317","layers":{"frame_raw":"000b8201fc42000874adf19b0800450001480445000080110000c0a80001c0a8000a00430044013422330201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.317748000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.317748000","frame_frame_time_delta":"0.000295000","frame_frame_time_delta_displayed":"0.000295000","frame_frame_time_relative":"0.000295000","frame_frame_number":"2","frame_frame_len":"342","frame_frame_cap_len":"342","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"000b8201fc42000874adf19b0800","eth":{"eth_eth_dst_raw":"000b8201fc42","eth_eth_dst":"00:0b:82:01:fc:42","eth_eth_dst_resolved_raw":"000b8201fc42","eth_eth_dst_resolved":"Grandstr_01:fc:42","eth_eth_dst_oui_raw":"000b82","eth_eth_dst_oui":"2946","eth_eth_dst_oui_resolved_raw":"000b8201fc42","eth_eth_dst_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_dst_lg_raw":"0","eth_eth_dst_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_dst_ig_raw":"0","eth_eth_dst_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_src_raw":"000874adf19b","eth_eth_src":"00:08:74:ad:f1:9b","eth_eth_src_resolved_raw":"000874adf19b","eth_eth_src_resolved":"Dell_ad:f1:9b","eth_eth_src_oui_raw":"000874","eth_eth_src_oui":"2164","eth_eth_src_oui_resolved_raw":"000874adf19b","eth_eth_src_oui_resolved":"Dell Inc.","eth_eth_addr_raw":"000874adf19b","eth_eth_addr":"00:08:74:ad:f1:9b","eth_eth_addr_resolved_raw":"000874adf19b","eth_eth_addr_resolved":"Dell_ad:f1:9b","eth_eth_addr_oui_raw":"000874","eth_eth_addr_oui":"2164","eth_eth_addr_oui_resolved_raw":"000874adf19b","eth_eth_addr_oui_resolved":"Dell Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"450001480445000080110000c0a80001c0a8000a","ip":{"ip_ip_version_raw":"4","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"0148","ip_ip_len":"328","ip_ip_id_raw":"0445","ip_ip_id":"0x00000445","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"80","ip_ip_ttl":"128","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"0000","ip_ip_checksum":"0x00000000","ip_ip_checksum_status":"2","ip_ip_src_raw":"c0a80001","ip_ip_src":"192.168.0.1","ip_ip_addr_raw":["c0a80001","c0a8000a"],"ip_ip_addr":["192.168.0.1","192.168.0.10"],"ip_ip_src_host_raw":"c0a80001","ip_ip_src_host":"192.168.0.1","ip_ip_host_raw":["c0a80001","c0a8000a"],"ip_ip_host":["192.168.0.1","192.168.0.10"],"ip_ip_dst_raw":"c0a8000a","ip_ip_dst":"192.168.0.10","ip_ip_dst_host_raw":"c0a8000a","ip_ip_dst_host":"192.168.0.10"},"udp_raw":"0043004401342233","udp":{"udp_udp_srcport_raw":"0043","udp_udp_srcport":"67","udp_udp_dstport_raw":"0044","udp_udp_dstport":"68","udp_udp_port_raw":["0043","0044"],"udp_udp_port":["67","68"],"udp_udp_length_raw":"0134","udp_udp_length":"308","udp_udp_checksum_raw":"2233","udp_udp_checksum":"0x00002233","udp_udp_checksum_status":"2","udp_udp_stream":"1","text":"Timestamps","udp_udp_time_relative":"0.000000000","udp_udp_time_delta":"0.000000000","udp_udp_payload_raw":"0201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","udp_udp_payload":"02:01:06:00:00:00:3d:1d:00:00:00:00:00:00:00:00:c0:a8:00:0a:c0:a8:00:01:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:02:01:04:ff:ff:ff:00:3a:04:00:00:07:08:3b:04:00:00:0c:4e:33:04:00:00:0e:10:36:04:c0:a8:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"},"dhcp_raw":"0201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","dhcp":{"dhcp_dhcp_type_raw":"02","dhcp_dhcp_type":"2","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1d","dhcp_dhcp_id":"0x00003d1d","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"c0a8000a","dhcp_dhcp_ip_your":"192.168.0.10","dhcp_dhcp_ip_server_raw":"c0a80001","dhcp_dhcp_ip_server":"192.168.0.1","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350102","0104ffffff00","3a0400000708","3b0400000c4e","330400000e10","3604c0a80001","ff"],"dhcp_dhcp_option_type":["53","1","58","59","51","54","0"],"dhcp_dhcp_option_length_raw":["01","04","04","04","04","04"],"dhcp_dhcp_option_length":["1","4","4","4","4","4"],"dhcp_dhcp_option_value_raw":["02","ffffff00","00000708","00000c4e","00000e10","c0a80001"],"dhcp_dhcp_option_value":["02","ff:ff:ff:00","00:00:07:08","00:00:0c:4e","00:00:0e:10","c0:a8:00:01"],"dhcp_dhcp_option_dhcp_raw":"02","dhcp_dhcp_option_dhcp":"2","dhcp_dhcp_option_subnet_mask_raw":"ffffff00","dhcp_dhcp_option_subnet_mask":"255.255.255.0","dhcp_dhcp_option_renewal_time_value_raw":"00000708","dhcp_dhcp_option_renewal_time_value":"1800","dhcp_dhcp_option_rebinding_time_value_raw":"00000c4e","dhcp_dhcp_option_rebinding_time_value":"3150","dhcp_dhcp_option_ip_address_lease_time_raw":"00000e10","dhcp_dhcp_option_ip_address_lease_time":"3600","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"0000000000000000000000000000000000000000000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"}}}
+{"timestamp":"1102274184317","layers":{"frame_raw":"000b8201fc42000874adf19b0800450001480445000080110000c0a80001c0a8000a00430044013422330201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.317748000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.317748000","frame_frame_time_delta":"0.000295000","frame_frame_time_delta_displayed":"0.000295000","frame_frame_time_relative":"0.000295000","frame_frame_number":"2","frame_frame_len":"342","frame_frame_cap_len":"342","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"000b8201fc42000874adf19b0800","eth":{"eth_eth_dst_raw":"000b8201fc42","eth_eth_dst":"00:0b:82:01:fc:42","eth_eth_dst_resolved_raw":"000b8201fc42","eth_eth_dst_resolved":"Grandstr_01:fc:42","eth_eth_dst_oui_raw":"000b82","eth_eth_dst_oui":"2946","eth_eth_dst_oui_resolved_raw":"000b8201fc42","eth_eth_dst_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_dst_lg_raw":"0","eth_eth_dst_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_dst_ig_raw":"0","eth_eth_dst_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_src_raw":"000874adf19b","eth_eth_src":"00:08:74:ad:f1:9b","eth_eth_src_resolved_raw":"000874adf19b","eth_eth_src_resolved":"Dell_ad:f1:9b","eth_eth_src_oui_raw":"000874","eth_eth_src_oui":"2164","eth_eth_src_oui_resolved_raw":"000874adf19b","eth_eth_src_oui_resolved":"Dell Inc.","eth_eth_addr_raw":"000874adf19b","eth_eth_addr":"00:08:74:ad:f1:9b","eth_eth_addr_resolved_raw":"000874adf19b","eth_eth_addr_resolved":"Dell_ad:f1:9b","eth_eth_addr_oui_raw":"000874","eth_eth_addr_oui":"2164","eth_eth_addr_oui_resolved_raw":"000874adf19b","eth_eth_addr_oui_resolved":"Dell Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"450001480445000080110000c0a80001c0a8000a","ip":{"ip_ip_version_raw":"45","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"0148","ip_ip_len":"328","ip_ip_id_raw":"0445","ip_ip_id":"0x00000445","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"80","ip_ip_ttl":"128","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"0000","ip_ip_checksum":"0x00000000","ip_ip_checksum_status":"2","ip_ip_src_raw":"c0a80001","ip_ip_src":"192.168.0.1","ip_ip_addr_raw":["c0a80001","c0a8000a"],"ip_ip_addr":["192.168.0.1","192.168.0.10"],"ip_ip_src_host_raw":"c0a80001","ip_ip_src_host":"192.168.0.1","ip_ip_host_raw":["c0a80001","c0a8000a"],"ip_ip_host":["192.168.0.1","192.168.0.10"],"ip_ip_dst_raw":"c0a8000a","ip_ip_dst":"192.168.0.10","ip_ip_dst_host_raw":"c0a8000a","ip_ip_dst_host":"192.168.0.10"},"udp_raw":"0043004401342233","udp":{"udp_udp_srcport_raw":"0043","udp_udp_srcport":"67","udp_udp_dstport_raw":"0044","udp_udp_dstport":"68","udp_udp_port_raw":["0043","0044"],"udp_udp_port":["67","68"],"udp_udp_length_raw":"0134","udp_udp_length":"308","udp_udp_checksum_raw":"2233","udp_udp_checksum":"0x00002233","udp_udp_checksum_status":"2","udp_udp_stream":"1","text":"Timestamps","udp_udp_time_relative":"0.000000000","udp_udp_time_delta":"0.000000000","udp_udp_payload_raw":"0201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","udp_udp_payload":"02:01:06:00:00:00:3d:1d:00:00:00:00:00:00:00:00:c0:a8:00:0a:c0:a8:00:01:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:02:01:04:ff:ff:ff:00:3a:04:00:00:07:08:3b:04:00:00:0c:4e:33:04:00:00:0e:10:36:04:c0:a8:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"},"dhcp_raw":"0201060000003d1d0000000000000000c0a8000ac0a8000100000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501020104ffffff003a04000007083b0400000c4e330400000e103604c0a80001ff0000000000000000000000000000000000000000000000000000","dhcp":{"dhcp_dhcp_type_raw":"02","dhcp_dhcp_type":"2","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1d","dhcp_dhcp_id":"0x00003d1d","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"c0a8000a","dhcp_dhcp_ip_your":"192.168.0.10","dhcp_dhcp_ip_server_raw":"c0a80001","dhcp_dhcp_ip_server":"192.168.0.1","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350102","0104ffffff00","3a0400000708","3b0400000c4e","330400000e10","3604c0a80001","ff"],"dhcp_dhcp_option_type":["53","1","58","59","51","54","0"],"dhcp_dhcp_option_length_raw":["01","04","04","04","04","04"],"dhcp_dhcp_option_length":["1","4","4","4","4","4"],"dhcp_dhcp_option_value_raw":["02","ffffff00","00000708","00000c4e","00000e10","c0a80001"],"dhcp_dhcp_option_value":["02","ff:ff:ff:00","00:00:07:08","00:00:0c:4e","00:00:0e:10","c0:a8:00:01"],"dhcp_dhcp_option_dhcp_raw":"02","dhcp_dhcp_option_dhcp":"2","dhcp_dhcp_option_subnet_mask_raw":"ffffff00","dhcp_dhcp_option_subnet_mask":"255.255.255.0","dhcp_dhcp_option_renewal_time_value_raw":"00000708","dhcp_dhcp_option_renewal_time_value":"1800","dhcp_dhcp_option_rebinding_time_value_raw":"00000c4e","dhcp_dhcp_option_rebinding_time_value":"3150","dhcp_dhcp_option_ip_address_lease_time_raw":"00000e10","dhcp_dhcp_option_ip_address_lease_time":"3600","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"0000000000000000000000000000000000000000000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"}}}
{"index":{"_index":"packets-2004-12-05","_type":"doc"}}
-{"timestamp":"1102274184387","layers":{"frame_raw":"ffffffffffff000b8201fc4208004500012ca8370000fa11178a00000000ffffffff0044004301189fbd0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.387484000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.387484000","frame_frame_time_delta":"0.069736000","frame_frame_time_delta_displayed":"0.069736000","frame_frame_time_relative":"0.070031000","frame_frame_number":"3","frame_frame_len":"314","frame_frame_cap_len":"314","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"ffffffffffff000b8201fc420800","eth":{"eth_eth_dst_raw":"ffffffffffff","eth_eth_dst":"ff:ff:ff:ff:ff:ff","eth_eth_dst_resolved_raw":"ffffffffffff","eth_eth_dst_resolved":"Broadcast","eth_eth_dst_oui_raw":"ffffff","eth_eth_dst_oui":"16777215","eth_eth_addr_raw":"ffffffffffff","eth_eth_addr":"ff:ff:ff:ff:ff:ff","eth_eth_addr_resolved_raw":"ffffffffffff","eth_eth_addr_resolved":"Broadcast","eth_eth_addr_oui_raw":"ffffff","eth_eth_addr_oui":"16777215","eth_eth_dst_lg_raw":"1","eth_eth_dst_lg":true,"eth_eth_lg_raw":"1","eth_eth_lg":true,"eth_eth_dst_ig_raw":"1","eth_eth_dst_ig":true,"eth_eth_ig_raw":"1","eth_eth_ig":true,"eth_eth_src_raw":"000b8201fc42","eth_eth_src":"00:0b:82:01:fc:42","eth_eth_src_resolved_raw":"000b8201fc42","eth_eth_src_resolved":"Grandstr_01:fc:42","eth_eth_src_oui_raw":"000b82","eth_eth_src_oui":"2946","eth_eth_src_oui_resolved_raw":"000b8201fc42","eth_eth_src_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"4500012ca8370000fa11178a00000000ffffffff","ip":{"ip_ip_version_raw":"4","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"012c","ip_ip_len":"300","ip_ip_id_raw":"a837","ip_ip_id":"0x0000a837","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"fa","ip_ip_ttl":"250","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"178a","ip_ip_checksum":"0x0000178a","ip_ip_checksum_status":"2","ip_ip_src_raw":"00000000","ip_ip_src":"0.0.0.0","ip_ip_addr_raw":["00000000","ffffffff"],"ip_ip_addr":["0.0.0.0","255.255.255.255"],"ip_ip_src_host_raw":"00000000","ip_ip_src_host":"0.0.0.0","ip_ip_host_raw":["00000000","ffffffff"],"ip_ip_host":["0.0.0.0","255.255.255.255"],"ip_ip_dst_raw":"ffffffff","ip_ip_dst":"255.255.255.255","ip_ip_dst_host_raw":"ffffffff","ip_ip_dst_host":"255.255.255.255"},"udp_raw":"0044004301189fbd","udp":{"udp_udp_srcport_raw":"0044","udp_udp_srcport":"68","udp_udp_dstport_raw":"0043","udp_udp_dstport":"67","udp_udp_port_raw":["0044","0043"],"udp_udp_port":["68","67"],"udp_udp_length_raw":"0118","udp_udp_length":"280","udp_udp_checksum_raw":"9fbd","udp_udp_checksum":"0x00009fbd","udp_udp_checksum_status":"2","udp_udp_stream":"0","text":"Timestamps","udp_udp_time_relative":"0.070031000","udp_udp_time_delta":"0.070031000","udp_udp_payload_raw":"0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","udp_udp_payload":"01:01:06:00:00:00:3d:1e:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:03:3d:07:01:00:0b:82:01:fc:42:32:04:c0:a8:00:0a:36:04:c0:a8:00:01:37:04:01:03:06:2a:ff:00"},"dhcp_raw":"0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","dhcp":{"dhcp_dhcp_type_raw":"01","dhcp_dhcp_type":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1e","dhcp_dhcp_id":"0x00003d1e","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"00000000","dhcp_dhcp_ip_your":"0.0.0.0","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350103","3d0701000b8201fc42","3204c0a8000a","3604c0a80001","37040103062a","ff"],"dhcp_dhcp_option_type":["53","61","50","54","55","0"],"dhcp_dhcp_option_length_raw":["01","07","04","04","04"],"dhcp_dhcp_option_length":["1","7","4","4","4"],"dhcp_dhcp_option_value_raw":["03","01000b8201fc42","c0a8000a","c0a80001","0103062a"],"dhcp_dhcp_option_value":["03","01:00:0b:82:01:fc:42","c0:a8:00:0a","c0:a8:00:01","01:03:06:2a"],"dhcp_dhcp_option_dhcp_raw":"03","dhcp_dhcp_option_dhcp":"3","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_option_requested_ip_address_raw":"c0a8000a","dhcp_dhcp_option_requested_ip_address":"192.168.0.10","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_request_list_item_raw":["01","03","06","2a"],"dhcp_dhcp_option_request_list_item":["1","3","6","42"],"dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"00","dhcp_dhcp_option_padding":"00"}}}
+{"timestamp":"1102274184387","layers":{"frame_raw":"ffffffffffff000b8201fc4208004500012ca8370000fa11178a00000000ffffffff0044004301189fbd0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.387484000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.387484000","frame_frame_time_delta":"0.069736000","frame_frame_time_delta_displayed":"0.069736000","frame_frame_time_relative":"0.070031000","frame_frame_number":"3","frame_frame_len":"314","frame_frame_cap_len":"314","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"ffffffffffff000b8201fc420800","eth":{"eth_eth_dst_raw":"ffffffffffff","eth_eth_dst":"ff:ff:ff:ff:ff:ff","eth_eth_dst_resolved_raw":"ffffffffffff","eth_eth_dst_resolved":"Broadcast","eth_eth_dst_oui_raw":"ffffff","eth_eth_dst_oui":"16777215","eth_eth_addr_raw":"ffffffffffff","eth_eth_addr":"ff:ff:ff:ff:ff:ff","eth_eth_addr_resolved_raw":"ffffffffffff","eth_eth_addr_resolved":"Broadcast","eth_eth_addr_oui_raw":"ffffff","eth_eth_addr_oui":"16777215","eth_eth_dst_lg_raw":"1","eth_eth_dst_lg":true,"eth_eth_lg_raw":"1","eth_eth_lg":true,"eth_eth_dst_ig_raw":"1","eth_eth_dst_ig":true,"eth_eth_ig_raw":"1","eth_eth_ig":true,"eth_eth_src_raw":"000b8201fc42","eth_eth_src":"00:0b:82:01:fc:42","eth_eth_src_resolved_raw":"000b8201fc42","eth_eth_src_resolved":"Grandstr_01:fc:42","eth_eth_src_oui_raw":"000b82","eth_eth_src_oui":"2946","eth_eth_src_oui_resolved_raw":"000b8201fc42","eth_eth_src_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"4500012ca8370000fa11178a00000000ffffffff","ip":{"ip_ip_version_raw":"45","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"012c","ip_ip_len":"300","ip_ip_id_raw":"a837","ip_ip_id":"0x0000a837","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"fa","ip_ip_ttl":"250","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"178a","ip_ip_checksum":"0x0000178a","ip_ip_checksum_status":"2","ip_ip_src_raw":"00000000","ip_ip_src":"0.0.0.0","ip_ip_addr_raw":["00000000","ffffffff"],"ip_ip_addr":["0.0.0.0","255.255.255.255"],"ip_ip_src_host_raw":"00000000","ip_ip_src_host":"0.0.0.0","ip_ip_host_raw":["00000000","ffffffff"],"ip_ip_host":["0.0.0.0","255.255.255.255"],"ip_ip_dst_raw":"ffffffff","ip_ip_dst":"255.255.255.255","ip_ip_dst_host_raw":"ffffffff","ip_ip_dst_host":"255.255.255.255"},"udp_raw":"0044004301189fbd","udp":{"udp_udp_srcport_raw":"0044","udp_udp_srcport":"68","udp_udp_dstport_raw":"0043","udp_udp_dstport":"67","udp_udp_port_raw":["0044","0043"],"udp_udp_port":["68","67"],"udp_udp_length_raw":"0118","udp_udp_length":"280","udp_udp_checksum_raw":"9fbd","udp_udp_checksum":"0x00009fbd","udp_udp_checksum_status":"2","udp_udp_stream":"0","text":"Timestamps","udp_udp_time_relative":"0.070031000","udp_udp_time_delta":"0.070031000","udp_udp_payload_raw":"0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","udp_udp_payload":"01:01:06:00:00:00:3d:1e:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:03:3d:07:01:00:0b:82:01:fc:42:32:04:c0:a8:00:0a:36:04:c0:a8:00:01:37:04:01:03:06:2a:ff:00"},"dhcp_raw":"0101060000003d1e0000000000000000000000000000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501033d0701000b8201fc423204c0a8000a3604c0a8000137040103062aff00","dhcp":{"dhcp_dhcp_type_raw":"01","dhcp_dhcp_type":"1","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1e","dhcp_dhcp_id":"0x00003d1e","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"00000000","dhcp_dhcp_ip_your":"0.0.0.0","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350103","3d0701000b8201fc42","3204c0a8000a","3604c0a80001","37040103062a","ff"],"dhcp_dhcp_option_type":["53","61","50","54","55","0"],"dhcp_dhcp_option_length_raw":["01","07","04","04","04"],"dhcp_dhcp_option_length":["1","7","4","4","4"],"dhcp_dhcp_option_value_raw":["03","01000b8201fc42","c0a8000a","c0a80001","0103062a"],"dhcp_dhcp_option_value":["03","01:00:0b:82:01:fc:42","c0:a8:00:0a","c0:a8:00:01","01:03:06:2a"],"dhcp_dhcp_option_dhcp_raw":"03","dhcp_dhcp_option_dhcp":"3","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_option_requested_ip_address_raw":"c0a8000a","dhcp_dhcp_option_requested_ip_address":"192.168.0.10","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_request_list_item_raw":["01","03","06","2a"],"dhcp_dhcp_option_request_list_item":["1","3","6","42"],"dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"00","dhcp_dhcp_option_padding":"00"}}}
{"index":{"_index":"packets-2004-12-05","_type":"doc"}}
-{"timestamp":"1102274184387","layers":{"frame_raw":"000b8201fc42000874adf19b0800450001480446000080110000c0a80001c0a8000a004300440134dfdb0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.387798000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.387798000","frame_frame_time_delta":"0.000314000","frame_frame_time_delta_displayed":"0.000314000","frame_frame_time_relative":"0.070345000","frame_frame_number":"4","frame_frame_len":"342","frame_frame_cap_len":"342","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"000b8201fc42000874adf19b0800","eth":{"eth_eth_dst_raw":"000b8201fc42","eth_eth_dst":"00:0b:82:01:fc:42","eth_eth_dst_resolved_raw":"000b8201fc42","eth_eth_dst_resolved":"Grandstr_01:fc:42","eth_eth_dst_oui_raw":"000b82","eth_eth_dst_oui":"2946","eth_eth_dst_oui_resolved_raw":"000b8201fc42","eth_eth_dst_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_dst_lg_raw":"0","eth_eth_dst_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_dst_ig_raw":"0","eth_eth_dst_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_src_raw":"000874adf19b","eth_eth_src":"00:08:74:ad:f1:9b","eth_eth_src_resolved_raw":"000874adf19b","eth_eth_src_resolved":"Dell_ad:f1:9b","eth_eth_src_oui_raw":"000874","eth_eth_src_oui":"2164","eth_eth_src_oui_resolved_raw":"000874adf19b","eth_eth_src_oui_resolved":"Dell Inc.","eth_eth_addr_raw":"000874adf19b","eth_eth_addr":"00:08:74:ad:f1:9b","eth_eth_addr_resolved_raw":"000874adf19b","eth_eth_addr_resolved":"Dell_ad:f1:9b","eth_eth_addr_oui_raw":"000874","eth_eth_addr_oui":"2164","eth_eth_addr_oui_resolved_raw":"000874adf19b","eth_eth_addr_oui_resolved":"Dell Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"450001480446000080110000c0a80001c0a8000a","ip":{"ip_ip_version_raw":"4","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"0148","ip_ip_len":"328","ip_ip_id_raw":"0446","ip_ip_id":"0x00000446","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"80","ip_ip_ttl":"128","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"0000","ip_ip_checksum":"0x00000000","ip_ip_checksum_status":"2","ip_ip_src_raw":"c0a80001","ip_ip_src":"192.168.0.1","ip_ip_addr_raw":["c0a80001","c0a8000a"],"ip_ip_addr":["192.168.0.1","192.168.0.10"],"ip_ip_src_host_raw":"c0a80001","ip_ip_src_host":"192.168.0.1","ip_ip_host_raw":["c0a80001","c0a8000a"],"ip_ip_host":["192.168.0.1","192.168.0.10"],"ip_ip_dst_raw":"c0a8000a","ip_ip_dst":"192.168.0.10","ip_ip_dst_host_raw":"c0a8000a","ip_ip_dst_host":"192.168.0.10"},"udp_raw":"004300440134dfdb","udp":{"udp_udp_srcport_raw":"0043","udp_udp_srcport":"67","udp_udp_dstport_raw":"0044","udp_udp_dstport":"68","udp_udp_port_raw":["0043","0044"],"udp_udp_port":["67","68"],"udp_udp_length_raw":"0134","udp_udp_length":"308","udp_udp_checksum_raw":"dfdb","udp_udp_checksum":"0x0000dfdb","udp_udp_checksum_status":"2","udp_udp_stream":"1","text":"Timestamps","udp_udp_time_relative":"0.070050000","udp_udp_time_delta":"0.070050000","udp_udp_payload_raw":"0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","udp_udp_payload":"02:01:06:00:00:00:3d:1e:00:00:00:00:00:00:00:00:c0:a8:00:0a:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:05:3a:04:00:00:07:08:3b:04:00:00:0c:4e:33:04:00:00:0e:10:36:04:c0:a8:00:01:01:04:ff:ff:ff:00:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"},"dhcp_raw":"0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","dhcp":{"dhcp_dhcp_type_raw":"02","dhcp_dhcp_type":"2","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1e","dhcp_dhcp_id":"0x00003d1e","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"c0a8000a","dhcp_dhcp_ip_your":"192.168.0.10","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350105","3a0400000708","3b0400000c4e","330400000e10","3604c0a80001","0104ffffff00","ff"],"dhcp_dhcp_option_type":["53","58","59","51","54","1","0"],"dhcp_dhcp_option_length_raw":["01","04","04","04","04","04"],"dhcp_dhcp_option_length":["1","4","4","4","4","4"],"dhcp_dhcp_option_value_raw":["05","00000708","00000c4e","00000e10","c0a80001","ffffff00"],"dhcp_dhcp_option_value":["05","00:00:07:08","00:00:0c:4e","00:00:0e:10","c0:a8:00:01","ff:ff:ff:00"],"dhcp_dhcp_option_dhcp_raw":"05","dhcp_dhcp_option_dhcp":"5","dhcp_dhcp_option_renewal_time_value_raw":"00000708","dhcp_dhcp_option_renewal_time_value":"1800","dhcp_dhcp_option_rebinding_time_value_raw":"00000c4e","dhcp_dhcp_option_rebinding_time_value":"3150","dhcp_dhcp_option_ip_address_lease_time_raw":"00000e10","dhcp_dhcp_option_ip_address_lease_time":"3600","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_subnet_mask_raw":"ffffff00","dhcp_dhcp_option_subnet_mask":"255.255.255.0","dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"0000000000000000000000000000000000000000000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"}}}
+{"timestamp":"1102274184387","layers":{"frame_raw":"000b8201fc42000874adf19b0800450001480446000080110000c0a80001c0a8000a004300440134dfdb0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","frame":{"frame_frame_encap_type":"1","frame_frame_time":"2004-12-05T19:16:24.387798000Z","frame_frame_offset_shift":"0.000000000","frame_frame_time_epoch":"1102274184.387798000","frame_frame_time_delta":"0.000314000","frame_frame_time_delta_displayed":"0.000314000","frame_frame_time_relative":"0.070345000","frame_frame_number":"4","frame_frame_len":"342","frame_frame_cap_len":"342","frame_frame_marked":false,"frame_frame_ignored":false,"frame_frame_protocols":"eth:ethertype:ip:udp:dhcp"},"eth_raw":"000b8201fc42000874adf19b0800","eth":{"eth_eth_dst_raw":"000b8201fc42","eth_eth_dst":"00:0b:82:01:fc:42","eth_eth_dst_resolved_raw":"000b8201fc42","eth_eth_dst_resolved":"Grandstr_01:fc:42","eth_eth_dst_oui_raw":"000b82","eth_eth_dst_oui":"2946","eth_eth_dst_oui_resolved_raw":"000b8201fc42","eth_eth_dst_oui_resolved":"Grandstream Networks, Inc.","eth_eth_addr_raw":"000b8201fc42","eth_eth_addr":"00:0b:82:01:fc:42","eth_eth_addr_resolved_raw":"000b8201fc42","eth_eth_addr_resolved":"Grandstr_01:fc:42","eth_eth_addr_oui_raw":"000b82","eth_eth_addr_oui":"2946","eth_eth_addr_oui_resolved_raw":"000b8201fc42","eth_eth_addr_oui_resolved":"Grandstream Networks, Inc.","eth_eth_dst_lg_raw":"0","eth_eth_dst_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_dst_ig_raw":"0","eth_eth_dst_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_src_raw":"000874adf19b","eth_eth_src":"00:08:74:ad:f1:9b","eth_eth_src_resolved_raw":"000874adf19b","eth_eth_src_resolved":"Dell_ad:f1:9b","eth_eth_src_oui_raw":"000874","eth_eth_src_oui":"2164","eth_eth_src_oui_resolved_raw":"000874adf19b","eth_eth_src_oui_resolved":"Dell Inc.","eth_eth_addr_raw":"000874adf19b","eth_eth_addr":"00:08:74:ad:f1:9b","eth_eth_addr_resolved_raw":"000874adf19b","eth_eth_addr_resolved":"Dell_ad:f1:9b","eth_eth_addr_oui_raw":"000874","eth_eth_addr_oui":"2164","eth_eth_addr_oui_resolved_raw":"000874adf19b","eth_eth_addr_oui_resolved":"Dell Inc.","eth_eth_src_lg_raw":"0","eth_eth_src_lg":false,"eth_eth_lg_raw":"0","eth_eth_lg":false,"eth_eth_src_ig_raw":"0","eth_eth_src_ig":false,"eth_eth_ig_raw":"0","eth_eth_ig":false,"eth_eth_type_raw":"0800","eth_eth_type":"0x00000800"},"ip_raw":"450001480446000080110000c0a80001c0a8000a","ip":{"ip_ip_version_raw":"45","ip_ip_version":"4","ip_ip_hdr_len_raw":"45","ip_ip_hdr_len":"20","ip_ip_dsfield_raw":"00","ip_ip_dsfield":"0x00000000","ip_ip_dsfield_dscp_raw":"0","ip_ip_dsfield_dscp":"0","ip_ip_dsfield_ecn_raw":"0","ip_ip_dsfield_ecn":"0","ip_ip_len_raw":"0148","ip_ip_len":"328","ip_ip_id_raw":"0446","ip_ip_id":"0x00000446","ip_ip_flags_raw":"00","ip_ip_flags":"0x00000000","ip_ip_flags_rb_raw":"0","ip_ip_flags_rb":false,"ip_ip_flags_df_raw":"0","ip_ip_flags_df":false,"ip_ip_flags_mf_raw":"0","ip_ip_flags_mf":false,"ip_ip_frag_offset_raw":"0000","ip_ip_frag_offset":"0","ip_ip_ttl_raw":"80","ip_ip_ttl":"128","ip_ip_proto_raw":"11","ip_ip_proto":"17","ip_ip_checksum_raw":"0000","ip_ip_checksum":"0x00000000","ip_ip_checksum_status":"2","ip_ip_src_raw":"c0a80001","ip_ip_src":"192.168.0.1","ip_ip_addr_raw":["c0a80001","c0a8000a"],"ip_ip_addr":["192.168.0.1","192.168.0.10"],"ip_ip_src_host_raw":"c0a80001","ip_ip_src_host":"192.168.0.1","ip_ip_host_raw":["c0a80001","c0a8000a"],"ip_ip_host":["192.168.0.1","192.168.0.10"],"ip_ip_dst_raw":"c0a8000a","ip_ip_dst":"192.168.0.10","ip_ip_dst_host_raw":"c0a8000a","ip_ip_dst_host":"192.168.0.10"},"udp_raw":"004300440134dfdb","udp":{"udp_udp_srcport_raw":"0043","udp_udp_srcport":"67","udp_udp_dstport_raw":"0044","udp_udp_dstport":"68","udp_udp_port_raw":["0043","0044"],"udp_udp_port":["67","68"],"udp_udp_length_raw":"0134","udp_udp_length":"308","udp_udp_checksum_raw":"dfdb","udp_udp_checksum":"0x0000dfdb","udp_udp_checksum_status":"2","udp_udp_stream":"1","text":"Timestamps","udp_udp_time_relative":"0.070050000","udp_udp_time_delta":"0.070050000","udp_udp_payload_raw":"0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","udp_udp_payload":"02:01:06:00:00:00:3d:1e:00:00:00:00:00:00:00:00:c0:a8:00:0a:00:00:00:00:00:00:00:00:00:0b:82:01:fc:42:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:63:82:53:63:35:01:05:3a:04:00:00:07:08:3b:04:00:00:0c:4e:33:04:00:00:0e:10:36:04:c0:a8:00:01:01:04:ff:ff:ff:00:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"},"dhcp_raw":"0201060000003d1e0000000000000000c0a8000a0000000000000000000b8201fc4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638253633501053a04000007083b0400000c4e330400000e103604c0a800010104ffffff00ff0000000000000000000000000000000000000000000000000000","dhcp":{"dhcp_dhcp_type_raw":"02","dhcp_dhcp_type":"2","dhcp_dhcp_hw_type_raw":"01","dhcp_dhcp_hw_type":"0x00000001","dhcp_dhcp_hw_len_raw":"06","dhcp_dhcp_hw_len":"6","dhcp_dhcp_hops_raw":"00","dhcp_dhcp_hops":"0","dhcp_dhcp_id_raw":"00003d1e","dhcp_dhcp_id":"0x00003d1e","dhcp_dhcp_secs_raw":"0000","dhcp_dhcp_secs":"0","dhcp_dhcp_flags_raw":"0000","dhcp_dhcp_flags":"0x00000000","dhcp_dhcp_flags_bc_raw":"0","dhcp_dhcp_flags_bc":false,"dhcp_dhcp_flags_reserved_raw":"0","dhcp_dhcp_flags_reserved":"0x00000000","dhcp_dhcp_ip_client_raw":"00000000","dhcp_dhcp_ip_client":"0.0.0.0","dhcp_dhcp_ip_your_raw":"c0a8000a","dhcp_dhcp_ip_your":"192.168.0.10","dhcp_dhcp_ip_server_raw":"00000000","dhcp_dhcp_ip_server":"0.0.0.0","dhcp_dhcp_ip_relay_raw":"00000000","dhcp_dhcp_ip_relay":"0.0.0.0","dhcp_dhcp_hw_mac_addr_raw":"000b8201fc42","dhcp_dhcp_hw_mac_addr":"00:0b:82:01:fc:42","dhcp_dhcp_hw_addr_padding_raw":"00000000000000000000","dhcp_dhcp_hw_addr_padding":"00:00:00:00:00:00:00:00:00:00","dhcp_dhcp_server_raw":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_server":"","dhcp_dhcp_file_raw":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","dhcp_dhcp_file":"","dhcp_dhcp_cookie_raw":"63825363","dhcp_dhcp_cookie":"99.130.83.99","dhcp_dhcp_option_type_raw":["350105","3a0400000708","3b0400000c4e","330400000e10","3604c0a80001","0104ffffff00","ff"],"dhcp_dhcp_option_type":["53","58","59","51","54","1","0"],"dhcp_dhcp_option_length_raw":["01","04","04","04","04","04"],"dhcp_dhcp_option_length":["1","4","4","4","4","4"],"dhcp_dhcp_option_value_raw":["05","00000708","00000c4e","00000e10","c0a80001","ffffff00"],"dhcp_dhcp_option_value":["05","00:00:07:08","00:00:0c:4e","00:00:0e:10","c0:a8:00:01","ff:ff:ff:00"],"dhcp_dhcp_option_dhcp_raw":"05","dhcp_dhcp_option_dhcp":"5","dhcp_dhcp_option_renewal_time_value_raw":"00000708","dhcp_dhcp_option_renewal_time_value":"1800","dhcp_dhcp_option_rebinding_time_value_raw":"00000c4e","dhcp_dhcp_option_rebinding_time_value":"3150","dhcp_dhcp_option_ip_address_lease_time_raw":"00000e10","dhcp_dhcp_option_ip_address_lease_time":"3600","dhcp_dhcp_option_dhcp_server_id_raw":"c0a80001","dhcp_dhcp_option_dhcp_server_id":"192.168.0.1","dhcp_dhcp_option_subnet_mask_raw":"ffffff00","dhcp_dhcp_option_subnet_mask":"255.255.255.0","dhcp_dhcp_option_end_raw":"ff","dhcp_dhcp_option_end":"255","dhcp_dhcp_option_padding_raw":"0000000000000000000000000000000000000000000000000000","dhcp_dhcp_option_padding":"00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"}}}
diff --git a/test/baseline/dhcp.jsonraw b/test/baseline/dhcp.jsonraw
index 2a69e6087c..8b7c00ca6d 100644
--- a/test/baseline/dhcp.jsonraw
+++ b/test/baseline/dhcp.jsonraw
@@ -288,10 +288,10 @@
],
"ip": {
"ip.version_raw": [
- "4",
+ "45",
14,
1,
- 240,
+ 0,
4
],
"ip.hdr_len_raw": [
@@ -1162,10 +1162,10 @@
],
"ip": {
"ip.version_raw": [
- "4",
+ "45",
14,
1,
- 240,
+ 0,
4
],
"ip.hdr_len_raw": [
@@ -2054,10 +2054,10 @@
],
"ip": {
"ip.version_raw": [
- "4",
+ "45",
14,
1,
- 240,
+ 0,
4
],
"ip.hdr_len_raw": [
@@ -2958,10 +2958,10 @@
],
"ip": {
"ip.version_raw": [
- "4",
+ "45",
14,
1,
- 240,
+ 0,
4
],
"ip.hdr_len_raw": [
diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt
index 2903124d10..c7751bc87b 100644
--- a/ui/qt/CMakeLists.txt
+++ b/ui/qt/CMakeLists.txt
@@ -181,6 +181,7 @@ set(WIRESHARK_QT_HEADERS
mtp3_summary_dialog.h
multicast_statistics_dialog.h
packet_comment_dialog.h
+ packet_diagram.h
packet_dialog.h
packet_format_group_box.h
packet_list.h
@@ -406,6 +407,7 @@ set(WIRESHARK_QT_SRC
manage_interfaces_dialog.cpp
module_preferences_scroll_area.cpp
packet_comment_dialog.cpp
+ packet_diagram.cpp
packet_dialog.cpp
packet_format_group_box.cpp
packet_list.cpp
diff --git a/ui/qt/io_graph_dialog.cpp b/ui/qt/io_graph_dialog.cpp
index fde5f4fdc9..e5c6c73efe 100644
--- a/ui/qt/io_graph_dialog.cpp
+++ b/ui/qt/io_graph_dialog.cpp
@@ -1462,7 +1462,7 @@ void IOGraphDialog::on_buttonBox_helpRequested()
wsApp->helpTopicAction(HELP_STATS_IO_GRAPH_DIALOG);
}
-// XXX - Copied from tcp_stream_dialog. This should be common code.
+// XXX - We have similar code in tcp_stream_dialog and packet_diagram. Should this be a common routine?
void IOGraphDialog::on_buttonBox_accepted()
{
QString file_name, extension;
diff --git a/ui/qt/layout_preferences_frame.cpp b/ui/qt/layout_preferences_frame.cpp
index bef7507062..a1bf03c5b5 100644
--- a/ui/qt/layout_preferences_frame.cpp
+++ b/ui/qt/layout_preferences_frame.cpp
@@ -106,6 +106,9 @@ void LayoutPreferencesFrame::updateWidgets()
case layout_pane_content_pbytes:
ui->pane1PacketBytesRadioButton->setChecked(true);
break;
+ case layout_pane_content_pdiagram:
+ ui->pane1PacketDiagramRadioButton->setChecked(true);
+ break;
case layout_pane_content_none:
ui->pane1NoneRadioButton->setChecked(true);
break;
@@ -121,6 +124,9 @@ void LayoutPreferencesFrame::updateWidgets()
case layout_pane_content_pbytes:
ui->pane2PacketBytesRadioButton->setChecked(true);
break;
+ case layout_pane_content_pdiagram:
+ ui->pane2PacketDiagramRadioButton->setChecked(true);
+ break;
case layout_pane_content_none:
ui->pane2NoneRadioButton->setChecked(true);
break;
@@ -136,6 +142,9 @@ void LayoutPreferencesFrame::updateWidgets()
case layout_pane_content_pbytes:
ui->pane3PacketBytesRadioButton->setChecked(true);
break;
+ case layout_pane_content_pdiagram:
+ ui->pane3PacketDiagramRadioButton->setChecked(true);
+ break;
case layout_pane_content_none:
ui->pane3NoneRadioButton->setChecked(true);
break;
@@ -208,6 +217,16 @@ void LayoutPreferencesFrame::on_pane1PacketBytesRadioButton_toggled(bool checked
ui->pane3NoneRadioButton->click();
}
+void LayoutPreferencesFrame::on_pane1PacketDiagramRadioButton_toggled(bool checked)
+{
+ if (!checked) return;
+ prefs_set_enum_value(pref_layout_content_1_, layout_pane_content_pdiagram, pref_stashed);
+ if (ui->pane2PacketDiagramRadioButton->isChecked())
+ ui->pane2NoneRadioButton->click();
+ if (ui->pane3PacketDiagramRadioButton->isChecked())
+ ui->pane3NoneRadioButton->click();
+}
+
void LayoutPreferencesFrame::on_pane1NoneRadioButton_toggled(bool checked)
{
if (!checked) return;
@@ -244,6 +263,16 @@ void LayoutPreferencesFrame::on_pane2PacketBytesRadioButton_toggled(bool checked
ui->pane3NoneRadioButton->click();
}
+void LayoutPreferencesFrame::on_pane2PacketDiagramRadioButton_toggled(bool checked)
+{
+ if (!checked) return;
+ prefs_set_enum_value(pref_layout_content_2_, layout_pane_content_pdiagram, pref_stashed);
+ if (ui->pane1PacketDiagramRadioButton->isChecked())
+ ui->pane1NoneRadioButton->click();
+ if (ui->pane3PacketDiagramRadioButton->isChecked())
+ ui->pane3NoneRadioButton->click();
+}
+
void LayoutPreferencesFrame::on_pane2NoneRadioButton_toggled(bool checked)
{
if (!checked) return;
@@ -280,6 +309,16 @@ void LayoutPreferencesFrame::on_pane3PacketBytesRadioButton_toggled(bool checked
ui->pane2NoneRadioButton->click();
}
+void LayoutPreferencesFrame::on_pane3PacketDiagramRadioButton_toggled(bool checked)
+{
+ if (!checked) return;
+ prefs_set_enum_value(pref_layout_content_3_, layout_pane_content_pdiagram, pref_stashed);
+ if (ui->pane1PacketDiagramRadioButton->isChecked())
+ ui->pane1NoneRadioButton->click();
+ if (ui->pane2PacketDiagramRadioButton->isChecked())
+ ui->pane2NoneRadioButton->click();
+}
+
void LayoutPreferencesFrame::on_pane3NoneRadioButton_toggled(bool checked)
{
if (!checked) return;
diff --git a/ui/qt/layout_preferences_frame.h b/ui/qt/layout_preferences_frame.h
index 246e8c6060..342f3cf5b4 100644
--- a/ui/qt/layout_preferences_frame.h
+++ b/ui/qt/layout_preferences_frame.h
@@ -54,14 +54,17 @@ private slots:
void on_pane1PacketListRadioButton_toggled(bool checked);
void on_pane1PacketDetailsRadioButton_toggled(bool checked);
void on_pane1PacketBytesRadioButton_toggled(bool checked);
+ void on_pane1PacketDiagramRadioButton_toggled(bool checked);
void on_pane1NoneRadioButton_toggled(bool checked);
void on_pane2PacketListRadioButton_toggled(bool checked);
void on_pane2PacketDetailsRadioButton_toggled(bool checked);
void on_pane2PacketBytesRadioButton_toggled(bool checked);
+ void on_pane2PacketDiagramRadioButton_toggled(bool checked);
void on_pane2NoneRadioButton_toggled(bool checked);
void on_pane3PacketListRadioButton_toggled(bool checked);
void on_pane3PacketDetailsRadioButton_toggled(bool checked);
void on_pane3PacketBytesRadioButton_toggled(bool checked);
+ void on_pane3PacketDiagramRadioButton_toggled(bool checked);
void on_pane3NoneRadioButton_toggled(bool checked);
void on_restoreButtonBox_clicked(QAbstractButton *button);
void on_packetListSeparatorCheckBox_toggled(bool checked);
diff --git a/ui/qt/layout_preferences_frame.ui b/ui/qt/layout_preferences_frame.ui
index 02d03045cb..0ce09cad74 100644
--- a/ui/qt/layout_preferences_frame.ui
+++ b/ui/qt/layout_preferences_frame.ui
@@ -213,6 +213,16 @@
</widget>
</item>
<item>
+ <widget class="QRadioButton" name="pane1PacketDiagramRadioButton">
+ <property name="text">
+ <string>Packet Diagram</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">pane1ButtonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
<widget class="QRadioButton" name="pane1NoneRadioButton">
<property name="text">
<string>None</string>
@@ -264,6 +274,16 @@
</widget>
</item>
<item>
+ <widget class="QRadioButton" name="pane2PacketDiagramRadioButton">
+ <property name="text">
+ <string>Packet Diagram</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">pane2ButtonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
<widget class="QRadioButton" name="pane2NoneRadioButton">
<property name="text">
<string>None</string>
@@ -315,6 +335,16 @@
</widget>
</item>
<item>
+ <widget class="QRadioButton" name="pane3PacketDiagramRadioButton">
+ <property name="text">
+ <string>Packet Diagram</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">pane3ButtonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
<widget class="QRadioButton" name="pane3NoneRadioButton">
<property name="text">
<string>None</string>
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index 4cb3ef5cf9..4c1a7c0243 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -57,6 +57,7 @@ DIAG_ON(frame-larger-than=)
#include "funnel_statistics.h"
#include "import_text_dialog.h"
#include "interface_toolbar.h"
+#include "packet_diagram.h"
#include "packet_list.h"
#include "proto_tree.h"
#include "simple_dialog.h"
@@ -466,20 +467,23 @@ MainWindow::MainWindow(QWidget *parent) :
packet_list_->setProtoTree(proto_tree_);
packet_list_->installEventFilter(this);
+ packet_diagram_ = new PacketDiagram(&master_split_);
+
welcome_page_ = main_ui_->welcomePage;
- connect(proto_tree_, SIGNAL(fieldSelected(FieldInformation *)),
- this, SIGNAL(fieldSelected(FieldInformation *)));
- connect(packet_list_, SIGNAL(fieldSelected(FieldInformation *)),
- this, SIGNAL(fieldSelected(FieldInformation *)));
- connect(this, SIGNAL(fieldSelected(FieldInformation *)),
- this, SLOT(setMenusForSelectedTreeRow(FieldInformation *)));
- connect(this, SIGNAL(fieldSelected(FieldInformation *)),
- main_ui_->statusBar, SLOT(selectedFieldChanged(FieldInformation *)));
+ connect(proto_tree_, &ProtoTree::fieldSelected,
+ this, &MainWindow::fieldSelected);
+ connect(packet_list_, &PacketList::fieldSelected,
+ this, &MainWindow::fieldSelected);
+ connect(this, &MainWindow::fieldSelected,
+ this, &MainWindow::setMenusForSelectedTreeRow);
+ connect(this, &MainWindow::fieldSelected,
+ main_ui_->statusBar, &MainStatusBar::selectedFieldChanged);
- connect(this, SIGNAL(fieldHighlight(FieldInformation *)),
- main_ui_->statusBar, SLOT(highlightedFieldChanged(FieldInformation *)));
- connect(wsApp, SIGNAL(captureActive(int)), this, SIGNAL(captureActive(int)));
+ connect(this, &MainWindow::fieldHighlight,
+ main_ui_->statusBar, &MainStatusBar::highlightedFieldChanged);
+ connect(wsApp, &WiresharkApplication::captureActive,
+ this, &MainWindow::captureActive);
byte_view_tab_ = new ByteViewTab(&master_split_);
@@ -543,14 +547,14 @@ MainWindow::MainWindow(QWidget *parent) :
filter_expression_toolbar_, &FilterExpressionToolBar::filterExpressionsChanged);
/* Connect change of capture file */
- connect(this, SIGNAL(setCaptureFile(capture_file*)),
- main_ui_->searchFrame, SLOT(setCaptureFile(capture_file*)));
- connect(this, SIGNAL(setCaptureFile(capture_file*)),
- main_ui_->statusBar, SLOT(setCaptureFile(capture_file*)));
- connect(this, SIGNAL(setCaptureFile(capture_file*)),
- packet_list_, SLOT(setCaptureFile(capture_file*)));
- connect(this, SIGNAL(setCaptureFile(capture_file*)),
- proto_tree_, SLOT(setCaptureFile(capture_file*)));
+ connect(this, &MainWindow::setCaptureFile,
+ main_ui_->searchFrame, &SearchFrame::setCaptureFile);
+ connect(this, &MainWindow::setCaptureFile,
+ main_ui_->statusBar, &MainStatusBar::setCaptureFile);
+ connect(this, &MainWindow::setCaptureFile,
+ packet_list_, &PacketList::setCaptureFile);
+ connect(this, &MainWindow::setCaptureFile,
+ proto_tree_, &ProtoTree::setCaptureFile);
connect(wsApp, SIGNAL(zoomMonospaceFont(QFont)),
packet_list_, SLOT(setMonospaceFont(QFont)));
@@ -701,6 +705,7 @@ QMenu *MainWindow::createPopupMenu()
menu->addAction(main_ui_->actionViewPacketList);
menu->addAction(main_ui_->actionViewPacketDetails);
menu->addAction(main_ui_->actionViewPacketBytes);
+ menu->addAction(main_ui_->actionViewPacketDiagram);
return menu;
}
@@ -2058,6 +2063,7 @@ void MainWindow::initShowHideMainWidgets()
shmw_actions[main_ui_->actionViewPacketList] = packet_list_;
shmw_actions[main_ui_->actionViewPacketDetails] = proto_tree_;
shmw_actions[main_ui_->actionViewPacketBytes] = byte_view_tab_;
+ shmw_actions[main_ui_->actionViewPacketDiagram] = packet_diagram_;
foreach(QAction *shmwa, shmw_actions.keys()) {
shmwa->setData(QVariant::fromValue(shmw_actions[shmwa]));
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index e1125c816b..74f4a68068 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -85,6 +85,7 @@ class FilterDialog;
class FunnelStatistics;
class WelcomePage;
class PacketCommentDialog;
+class PacketDiagram;
class PacketList;
class ProtoTree;
#if defined(HAVE_LIBNL) && defined(HAVE_NL80211)
@@ -191,7 +192,8 @@ private:
// probably be full-on values instead of pointers.
PacketList *packet_list_;
ProtoTree *proto_tree_;
- ByteViewTab * byte_view_tab_;
+ ByteViewTab *byte_view_tab_;
+ PacketDiagram *packet_diagram_;
QWidget *previous_focus_;
FileSetDialog *file_set_dialog_;
QWidget empty_pane_;
diff --git a/ui/qt/main_window.ui b/ui/qt/main_window.ui
index 024e3eebc5..79b6ffc08c 100644
--- a/ui/qt/main_window.ui
+++ b/ui/qt/main_window.ui
@@ -362,6 +362,7 @@
<addaction name="actionViewPacketList"/>
<addaction name="actionViewPacketDetails"/>
<addaction name="actionViewPacketBytes"/>
+ <addaction name="actionViewPacketDiagram"/>
<addaction name="separator"/>
<addaction name="menuTime_Display_Format"/>
<addaction name="menuName_Resolution"/>
@@ -2473,6 +2474,20 @@
<string>Show or hide the packet bytes</string>
</property>
</action>
+ <action name="actionViewPacketDiagram">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Packet &amp;Diagram</string>
+ </property>
+ <property name="toolTip">
+ <string>Show or hide the packet diagram</string>
+ </property>
+ </action>
<action name="actionViewInternalsConversationHashTables">
<property name="text">
<string>&amp;Conversation Hash Tables</string>
diff --git a/ui/qt/main_window_layout.cpp b/ui/qt/main_window_layout.cpp
index 741a563301..f201784f37 100644
--- a/ui/qt/main_window_layout.cpp
+++ b/ui/qt/main_window_layout.cpp
@@ -24,9 +24,10 @@
#include <QAction>
#include <QToolBar>
+#include <ui/qt/byte_view_tab.h>
#include <ui/qt/packet_list.h>
+#include <ui/qt/packet_diagram.h>
#include <ui/qt/proto_tree.h>
-#include <ui/qt/byte_view_tab.h>
/*
* The generated Ui_MainWindow::setupUi() can grow larger than our configured limit,
@@ -56,6 +57,8 @@ QWidget* MainWindow::getLayoutWidget(layout_pane_content_e type) {
return proto_tree_;
case layout_pane_content_pbytes:
return byte_view_tab_;
+ case layout_pane_content_pdiagram:
+ return packet_diagram_;
default:
g_assert_not_reached();
return NULL;
@@ -76,7 +79,8 @@ void MainWindow::layoutPanes()
<< prefs.gui_layout_content_3
<< recent.packet_list_show
<< recent.tree_view_show
- << recent.byte_view_show;
+ << recent.byte_view_show
+ << recent.packet_diagram_show;
if (cur_layout_ == new_layout) return;
@@ -84,10 +88,11 @@ void MainWindow::layoutPanes()
// Reparent all widgets and add them back in the proper order below.
// This hides each widget as well.
- packet_list_->freeze(); // Clears tree and byte view tabs.
+ packet_list_->freeze(); // Clears tree, byte view tabs, and diagram.
packet_list_->setParent(main_ui_->mainStack);
proto_tree_->setParent(main_ui_->mainStack);
byte_view_tab_->setParent(main_ui_->mainStack);
+ packet_diagram_->setParent(main_ui_->mainStack);
empty_pane_.setParent(main_ui_->mainStack);
extra_split_.setParent(main_ui_->mainStack);
@@ -156,6 +161,7 @@ void MainWindow::layoutPanes()
packet_list_->setVisible(ms_children.contains(packet_list_) && recent.packet_list_show);
proto_tree_->setVisible(ms_children.contains(proto_tree_) && recent.tree_view_show);
byte_view_tab_->setVisible(ms_children.contains(byte_view_tab_) && recent.byte_view_show);
+ packet_diagram_->setVisible(ms_children.contains(packet_diagram_) && recent.packet_diagram_show);
// Show the packet list here to prevent pending resize events changing columns
// when the packet list is set as current widget for the first time.
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index 6ae4238e36..a0d3250cf3 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -127,6 +127,7 @@ DIAG_ON(frame-larger-than=)
#include "mtp3_summary_dialog.h"
#include "multicast_statistics_dialog.h"
#include "packet_comment_dialog.h"
+#include "packet_diagram.h"
#include "packet_dialog.h"
#include "packet_list.h"
#include "credentials_dialog.h"
@@ -360,6 +361,7 @@ void MainWindow::updatePreferenceActions()
main_ui_->actionViewPacketList->setEnabled(prefs_has_layout_pane_content(layout_pane_content_plist));
main_ui_->actionViewPacketDetails->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pdetails));
main_ui_->actionViewPacketBytes->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pbytes));
+ main_ui_->actionViewPacketDiagram->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pdiagram));
main_ui_->actionViewNameResolutionPhysical->setChecked(gbl_resolv_flags.mac_name);
main_ui_->actionViewNameResolutionNetwork->setChecked(gbl_resolv_flags.network_name);
@@ -378,6 +380,7 @@ void MainWindow::updateRecentActions()
main_ui_->actionViewPacketList->setChecked(recent.packet_list_show && prefs_has_layout_pane_content(layout_pane_content_plist));
main_ui_->actionViewPacketDetails->setChecked(recent.tree_view_show && prefs_has_layout_pane_content(layout_pane_content_pdetails));
main_ui_->actionViewPacketBytes->setChecked(recent.byte_view_show && prefs_has_layout_pane_content(layout_pane_content_pbytes));
+ main_ui_->actionViewPacketDiagram->setChecked(recent.packet_diagram_show && prefs_has_layout_pane_content(layout_pane_content_pdiagram));
foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) {
if (g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc)strcmp)) {
@@ -2299,6 +2302,9 @@ void MainWindow::showHideMainWidgets(QAction *action)
} else if (widget == byte_view_tab_) {
recent.byte_view_show = show;
main_ui_->actionViewPacketBytes->setChecked(show);
+ } else if (widget == packet_diagram_) {
+ recent.packet_diagram_show = show;
+ main_ui_->actionViewPacketDiagram->setChecked(show);
} else {
foreach(QAction *action, main_ui_->menuInterfaceToolbars->actions()) {
QToolBar *toolbar = action->data().value<QToolBar *>();
diff --git a/ui/qt/packet_diagram.cpp b/ui/qt/packet_diagram.cpp
new file mode 100644
index 0000000000..f83f782ec1
--- /dev/null
+++ b/ui/qt/packet_diagram.cpp
@@ -0,0 +1,736 @@
+/* packet_diagram.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "packet_diagram.h"
+
+#include "math.h"
+
+#include "epan/epan.h"
+#include "epan/epan_dissect.h"
+
+#include "wsutil/utf8_entities.h"
+
+#include "wireshark_application.h"
+
+#include "ui/qt/main_window.h"
+#include "ui/qt/utils/proto_node.h"
+#include "ui/qt/utils/variant_pointer.h"
+
+
+#include <QContextMenuEvent>
+#include <QGraphicsItem>
+#include <QMenu>
+
+#if defined(QT_SVG_LIB) && 0
+#include <QBuffer>
+#include <QMimeData>
+#include <QSvgGenerator>
+#endif
+
+#include <QDebug>
+
+// "rems" are root em widths, aka the regular font height, similar to rems in CSS.
+class DiagramLayout {
+public:
+ DiagramLayout() :
+ bits_per_row_(32),
+ small_font_rems_(0.75),
+ bit_width_rems_(1.0),
+ padding_rems_(0.5),
+ span_mark_offset_rems_(0.2),
+ show_fields_(false)
+ {
+ setFont(wsApp->font());
+ }
+
+ void setFont(QFont font) {
+ regular_font_ = font;
+ small_font_ = font;
+ small_font_.setPointSize(regular_font_.pointSize() * small_font_rems_);
+
+ QFontMetrics fm(regular_font_);
+ root_em_ = fm.height();
+ }
+ void setShowFields(bool show_fields = false) { show_fields_ = show_fields; }
+
+ int bitsPerRow() const { return bits_per_row_; }
+ const QFont regularFont() const { return regular_font_; }
+ const QFont smallFont() const { return small_font_; }
+ int bitWidth() const { return root_em_ * bit_width_rems_; }
+ int lineHeight() const { return root_em_; }
+ int hPadding() const { return root_em_ * padding_rems_; }
+ int vPadding() const { return root_em_ * padding_rems_; }
+ int spanMarkOffset() const { return root_em_ * span_mark_offset_rems_; }
+ int rowHeight() const {
+ int rows = show_fields_ ? 2 : 1;
+ return ((lineHeight() * rows) + (vPadding() * 2));
+ }
+ bool showFields() const { return show_fields_; }
+private:
+ int bits_per_row_;
+ double small_font_rems_;
+ double bit_width_rems_;
+ double padding_rems_;
+ double span_mark_offset_rems_; // XXX Make this padding_rems_ / 2 instead?
+ bool show_fields_;
+ QFont regular_font_;
+ QFont small_font_;
+ int root_em_;
+};
+
+class FieldInformationGraphicsItem : public QGraphicsPolygonItem
+{
+public:
+ FieldInformationGraphicsItem(field_info *fi, int start_bit, int fi_length, const DiagramLayout *layout, QGraphicsItem *parent = nullptr) :
+ QGraphicsPolygonItem(QPolygonF(), parent),
+ finfo_(new FieldInformation(fi)),
+ start_bit_(start_bit),
+ layout_(layout),
+ collapsed_len_(fi_length),
+ collapsed_row_(-1)
+ {
+ Q_ASSERT(layout_);
+
+ for (int idx = 0; idx < NumSpanMarks; idx++) {
+ span_marks_[idx] = new QGraphicsLineItem(this);
+ span_marks_[idx]->hide();
+ }
+
+ int bits_per_row = layout_->bitsPerRow();
+ int row1_start = start_bit_ % bits_per_row;
+ int bits_remain = fi_length;
+
+ int row1_bits = bits_remain;
+ if (bits_remain + row1_start > bits_per_row) {
+ row1_bits = bits_per_row - row1_start;
+ bits_remain -= row1_bits;
+ if (row1_start == 0 && bits_remain > bits_per_row) {
+ // Collapse first row
+ bits_remain %= bits_per_row;
+ collapsed_row_ = 0;
+ }
+ } else {
+ bits_remain = 0;
+ }
+
+ int row2_bits = bits_remain;
+ if (bits_remain > bits_per_row) {
+ row2_bits = bits_per_row;
+ bits_remain -= bits_per_row;
+ if (bits_remain > bits_per_row) {
+ // Collapse second row
+ bits_remain %= bits_per_row;
+ collapsed_row_ = 1;
+ }
+ } else {
+ bits_remain = 0;
+ }
+ int row3_bits = bits_remain;
+
+ collapsed_len_ = row1_bits + row2_bits + row3_bits;
+
+ QRectF rr1, rr2, rr3;
+ QRectF row_rect = QRectF(row1_start, 0, row1_bits, 1);
+ unit_shape_ = QPolygonF(row_rect);
+ rr1 = row_rect;
+ unit_tr_ = row_rect;
+
+ if (row2_bits > 0) {
+ row_rect = QRectF(0, 1, row2_bits, 1);
+ unit_shape_ = unit_shape_.united(QPolygonF(row_rect));
+ rr2 = row_rect;
+ if (row2_bits > row1_bits) {
+ unit_tr_ = row_rect;
+ }
+
+ if (row3_bits > 0) {
+ row_rect = QRectF(0, 2, row3_bits, 1);
+ unit_shape_ = unit_shape_.united(QPolygonF(row_rect));
+ rr3 = row_rect;
+ }
+ QPainterPath pp;
+ pp.addPolygon(unit_shape_);
+ unit_shape_ = pp.simplified().toFillPolygon();
+ }
+
+ updateLayout();
+
+ if (finfo_->isValid()) {
+ setToolTip(QString("%1 (%2) = %3")
+ .arg(finfo_->headerInfo().name)
+ .arg(finfo_->headerInfo().abbreviation)
+ .arg(finfo_->toString()));
+ setData(Qt::UserRole, VariantPointer<field_info>::asQVariant(finfo_->fieldInfo()));
+ } else {
+ setToolTip(QObject::tr("Gap in dissection"));
+ }
+ }
+
+ int collapsedLength() { return collapsed_len_; }
+
+ void setPos(qreal x, qreal y) {
+ QGraphicsPolygonItem::setPos(x, y);
+ updateLayout();
+ }
+
+ int maxLeftY() {
+ qreal rel_len = (start_bit_ % layout_->bitsPerRow()) + collapsed_len_;
+ QPointF pt = mapToParent(QPointF(0, ceil(rel_len / layout_->bitsPerRow()) * layout_->rowHeight()));
+ return pt.y();
+ }
+
+ int maxRightY() {
+ qreal rel_len = (start_bit_ % layout_->bitsPerRow()) + collapsed_len_;
+ QPointF pt = mapToParent(QPointF(0, floor(rel_len / layout_->bitsPerRow()) * layout_->rowHeight()));
+ return pt.y();
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) {
+
+ painter->setPen(Qt::NoPen);
+ painter->save();
+ if (!finfo_->isValid()) {
+ QBrush brush = QBrush(option->palette.text().color(), Qt::BDiagPattern);
+ painter->setBrush(brush);
+ } else if (isSelected()) {
+ painter->setBrush(option->palette.highlight().color());
+ }
+ painter->drawPolygon(polygon());
+ painter->restore();
+
+ // Lower and inner right borders
+ painter->setPen(option->palette.text().color());
+ QPolygonF shape = polygon();
+ for (int idx = 1; idx < unit_shape_.size(); idx++) {
+ QPointF u_start = unit_shape_[idx - 1];
+ QPointF u_end = unit_shape_[idx];
+ QPointF start, end;
+ bool draw_line = false;
+
+ if (u_start.y() > 0 && u_start.y() == u_end.y()) {
+ draw_line = true;
+ } else if (u_start.x() > 0 && u_start.x() < layout_->bitsPerRow() && u_start.x() == u_end.x()) {
+ draw_line = true;
+ }
+ if (draw_line) {
+ start = shape[idx - 1];
+ end = shape[idx];
+ painter->drawLine(start, end);
+ }
+ }
+
+ if (!finfo_->isValid()) {
+ return;
+ }
+
+ // Field label(s)
+ QString label = finfo_->headerInfo().name;
+ paintLabel(painter, label, scaled_tr_);
+
+ if (layout_->showFields()) {
+ label = finfo_->toString();
+ paintLabel(painter, label, scaled_tr_.adjusted(0, scaled_tr_.height(), 0, scaled_tr_.height()));
+ }
+ }
+
+private:
+ enum SpanMark {
+ TopLeft,
+ BottomLeft,
+ TopRight,
+ BottomRight,
+ NumSpanMarks
+ };
+ FieldInformation *finfo_;
+ int start_bit_;
+ const DiagramLayout *layout_;
+ int collapsed_len_;
+ int collapsed_row_;
+ QPolygonF unit_shape_;
+ QRectF unit_tr_;
+ QRectF scaled_tr_;
+ QGraphicsLineItem *span_marks_[NumSpanMarks];
+
+ void updateLayout() {
+ QTransform xform;
+
+ xform.scale(layout_->bitWidth(), layout_->rowHeight());
+ setPolygon(xform.map(unit_shape_));
+ scaled_tr_ = xform.mapRect(unit_tr_);
+ scaled_tr_.adjust(layout_->hPadding(), layout_->vPadding(), -layout_->hPadding(), -layout_->vPadding());
+ scaled_tr_.setHeight(layout_->lineHeight());
+
+ // Collapsed / span marks
+ for (int idx = 0; idx < NumSpanMarks; idx++) {
+ span_marks_[idx]->hide();
+ }
+ if (collapsed_row_ >= 0) {
+ QRectF bounding_rect = polygon().boundingRect();
+ qreal center_y = bounding_rect.top() + (layout_->rowHeight() * collapsed_row_) + (layout_->rowHeight() / 2);
+ qreal mark_w = layout_->bitWidth() / 3; // Each mark side to center
+ QLineF span_l = QLineF(-mark_w, mark_w / 2, mark_w, -mark_w / 2);
+ for (int idx = 0; idx < NumSpanMarks; idx++) {
+ QPointF center;
+ switch (idx) {
+ case TopLeft:
+ center = QPointF(bounding_rect.left(), center_y - layout_->spanMarkOffset());
+ break;
+ case BottomLeft:
+ center = QPointF(bounding_rect.left(), center_y + layout_->spanMarkOffset());
+ break;
+ case TopRight:
+ center = QPointF(bounding_rect.right(), center_y - layout_->spanMarkOffset());
+ break;
+ case BottomRight:
+ center = QPointF(bounding_rect.right(), center_y + layout_->spanMarkOffset());
+ break;
+ }
+
+ span_marks_[idx]->setLine(span_l.translated(center));
+ span_marks_[idx]->setZValue(zValue() - 0.1);
+ span_marks_[idx]->show();
+ }
+ }
+ }
+
+ void paintLabel(QPainter *painter, QString label, QRectF label_rect) {
+ QFontMetrics fm = QFontMetrics(layout_->regularFont());
+
+ painter->setFont(layout_->regularFont());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
+ int label_w = fm.horizontalAdvance(label);
+#else
+ int label_w = fm.width(label);
+#endif
+ if (label_w > label_rect.width()) {
+ painter->setFont(layout_->smallFont());
+ fm = QFontMetrics(layout_->smallFont());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
+ label_w = fm.horizontalAdvance(label);
+#else
+ label_w = fm.width(label);
+#endif
+ if (label_w > label_rect.width()) {
+ // XXX Use parent+ItemClipsChildrenToShape or setScale instead?
+ label = fm.elidedText(label, Qt::ElideRight, label_rect.width());
+ }
+ }
+ painter->drawText(label_rect, Qt::AlignCenter, label);
+ }
+};
+
+PacketDiagram::PacketDiagram(QWidget *parent) :
+ QGraphicsView(new QGraphicsScene(), parent),
+ layout_(new DiagramLayout),
+ cap_file_(nullptr),
+ root_node_(nullptr),
+ selected_field_(nullptr),
+ y_pos_(0)
+{
+ setAccessibleName(tr("Packet diagram"));
+
+ setRenderHint(QPainter::Antialiasing);
+
+ // XXX Move to setMonospaceFont similar to ProtoTree
+ layout_->setFont(font());
+
+ connect(wsApp, &WiresharkApplication::appInitialized, this, &PacketDiagram::connectToMainWindow);
+ QGraphicsScene *this_scene = scene();
+ connect(this_scene, &QGraphicsScene::selectionChanged, this, &PacketDiagram::sceneSelectionChanged);
+
+ connect(wsApp, &WiresharkApplication::zoomRegularFont, this, &PacketDiagram::setFont);
+}
+
+PacketDiagram::~PacketDiagram()
+{
+ delete layout_;
+}
+
+void PacketDiagram::setRootNode(proto_node *root_node)
+{
+ scene()->clear();
+ root_node_ = root_node;
+ selected_field_ = nullptr;
+ y_pos_ = 0;
+
+ ProtoNode parent_node(root_node_);
+ if (!parent_node.isValid()) {
+ return;
+ }
+
+ ProtoNode::ChildIterator kids = parent_node.children();
+ while (kids.element().isValid())
+ {
+ proto_node *tl_node = kids.element().protoNode();
+ kids.next();
+
+ // Exclude all ("Frame") and nothing
+ if (tl_node->finfo->start == 0 && tl_node->finfo->length == (int) tvb_captured_length(cap_file_->edt->tvb)) {
+ continue;
+ }
+ if (tl_node->finfo->length < 1) {
+ continue;
+ }
+ addDiagram(tl_node);
+ }
+}
+
+void PacketDiagram::clear()
+{
+ setRootNode(nullptr);
+}
+
+void PacketDiagram::setCaptureFile(capture_file *cf)
+{
+ // For use by the main view, set the capture file which will later have a
+ // dissection (EDT) ready.
+ // The packet dialog sets a fixed EDT context and MUST NOT use this.
+ cap_file_ = cf;
+}
+
+void PacketDiagram::setFont(const QFont &font)
+{
+ layout_->setFont(font);
+ setRootNode(root_node_);
+}
+
+void PacketDiagram::selectedFieldChanged(FieldInformation *finfo)
+{
+ setSelectedField(finfo ? finfo->fieldInfo() : nullptr);
+}
+
+void PacketDiagram::selectedFrameChanged(QList<int> frames)
+{
+ if (frames.count() == 1 && cap_file_ && cap_file_->edt && cap_file_->edt->tree) {
+ setRootNode(cap_file_->edt->tree);
+ } else {
+ // Clear the proto tree contents as they have become invalid.
+ setRootNode(nullptr);
+ }
+}
+
+void PacketDiagram::contextMenuEvent(QContextMenuEvent *event)
+{
+ if (!event) {
+ return;
+ }
+
+ QAction *action;
+ QMenu ctx_menu(this);
+
+ action = ctx_menu.addAction(tr("Show Field Values"));
+ action->setCheckable(true);
+ action->setChecked(layout_->showFields());
+ connect(action, &QAction::toggled, this, &PacketDiagram::showFieldsToggled);
+
+ ctx_menu.addSeparator();
+
+ action = ctx_menu.addAction(tr("Save Diagram As" UTF8_HORIZONTAL_ELLIPSIS));
+ connect(action, &QAction::triggered, this, &PacketDiagram::saveAsTriggered);
+
+ action = ctx_menu.addAction(tr("Copy as Raster Image"));
+ connect(action, &QAction::triggered, this, &PacketDiagram::copyAsRasterTriggered);
+
+#if defined(QT_SVG_LIB) && !defined(Q_OS_MAC)
+ action = ctx_menu.addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as SVG"));
+ connect(action, &QAction::triggered, this, &PacketDiagram::copyAsSvgTriggered);
+#endif
+
+ ctx_menu.exec(event->globalPos());
+}
+
+void PacketDiagram::connectToMainWindow()
+{
+ MainWindow *main_window = qobject_cast<MainWindow *>(wsApp->mainWindow());
+ if (!main_window) {
+ return;
+ }
+ connect(main_window, &MainWindow::setCaptureFile, this, &PacketDiagram::setCaptureFile);
+ connect(main_window, &MainWindow::fieldSelected, this, &PacketDiagram::selectedFieldChanged);
+ connect(main_window, &MainWindow::framesSelected, this, &PacketDiagram::selectedFrameChanged);
+
+ connect(this, &PacketDiagram::fieldSelected, main_window, &MainWindow::fieldSelected);
+}
+
+void PacketDiagram::sceneSelectionChanged()
+{
+ field_info *sel_fi = nullptr;
+ if (! scene()->selectedItems().isEmpty()) {
+ sel_fi = VariantPointer<field_info>::asPtr(scene()->selectedItems().first()->data(Qt::UserRole));
+ }
+
+ if (sel_fi) {
+ FieldInformation finfo(sel_fi, this);
+ emit fieldSelected(&finfo);
+ } else {
+ emit fieldSelected(nullptr);
+ }
+}
+
+struct WireItem {
+ proto_item *item;
+ int start_bit;
+ int length;
+};
+
+void PacketDiagram::addDiagram(proto_node *tl_node)
+{
+ QGraphicsItem *item;
+ QGraphicsSimpleTextItem *t_item;
+ int bits_per_row = layout_->bitsPerRow();
+ int bit_width = layout_->bitWidth();
+ int diag_w = bit_width * layout_->bitsPerRow();
+ qreal x = layout_->hPadding();
+
+ // Title
+ t_item = scene()->addSimpleText(tl_node->finfo->hfinfo->name);
+ t_item->setFont(layout_->regularFont());
+ t_item->setPos(0, y_pos_);
+ y_pos_ += layout_->lineHeight() + (bit_width / 4);
+
+ int border_top = y_pos_;
+
+ // Bit scale + tick marks
+ QList<int> tick_nums;
+ for (int tn = 0 ; tn < layout_->bitsPerRow(); tn += 16) {
+ tick_nums << tn << tn + 15;
+ }
+ qreal y_bottom = y_pos_ + bit_width;
+ QGraphicsItem *tl_item = scene()->addLine(x, y_bottom, x + diag_w, y_bottom);
+ for (int tick_n = 0; tick_n < bits_per_row; tick_n++) {
+ x = layout_->hPadding() + (tick_n * bit_width);
+ qreal y_top = y_pos_ + (tick_n % 8 == 0 ? 0 : bit_width / 2);
+ if (tick_n > 0) {
+ scene()->addLine(x, y_top, x, y_bottom);
+ }
+
+ if (tick_nums.contains(tick_n)) {
+ t_item = scene()->addSimpleText(QString::number(tick_n));
+ t_item->setFont(layout_->smallFont());
+ t_item->setPos(x + ((bit_width - t_item->boundingRect().width()) / 2.0) + 2, y_pos_);
+ }
+ }
+ y_pos_ = y_bottom;
+ x = layout_->hPadding();
+
+ // Top-level fields
+ int last_start_bit = -1;
+ int max_l_y = y_bottom;
+ QList<WireItem>wire_items;
+ for (proto_item *cur_item = tl_node->first_child; cur_item; cur_item = cur_item->next) {
+ if (proto_item_is_generated(cur_item) || proto_item_is_hidden(cur_item)) {
+ continue;
+ }
+
+ field_info *fi = cur_item->finfo;
+ int start_bit = ((fi->start - tl_node->finfo->start) * 8) + FI_GET_BITS_OFFSET(fi);
+ int length = FI_GET_BITS_SIZE(fi) ? FI_GET_BITS_SIZE(fi) : fi->length * 8;
+
+ if (start_bit <= last_start_bit || length <= 0) {
+ qDebug() << "Skipping pass 1" << fi->hfinfo->abbrev << start_bit << last_start_bit << length;
+ continue;
+ }
+ last_start_bit = start_bit;
+
+ WireItem wire_item = { cur_item, start_bit, length };
+ wire_items << wire_item;
+ }
+ qreal z_value = tl_item->zValue();
+ for (int idx = 0; idx < wire_items.size(); idx++) {
+ WireItem *wire_item = &wire_items[idx];
+ field_info *fi = wire_item->item->finfo;
+
+ if (idx < wire_items.size() - 1) {
+ WireItem *next_item = &wire_items[idx + 1];
+ if (wire_item->start_bit + wire_item->length > next_item->start_bit) {
+ wire_item->length = next_item->start_bit - wire_item->start_bit;
+ qDebug() << "Resized pass 2" << fi->hfinfo->abbrev << wire_item->start_bit << wire_item->length << next_item->start_bit;
+ if (wire_item->length <= 0) {
+ qDebug() << "Skipping pass 2" << fi->hfinfo->abbrev << wire_item->start_bit << wire_item->length;
+ continue;
+ }
+ }
+
+ if (next_item->start_bit > wire_item->start_bit + wire_item->length) {
+ int gap_start_bit = wire_item->start_bit + wire_item->length;
+ int gap_len = next_item->start_bit - gap_start_bit;
+ int y_off = (gap_start_bit / bits_per_row) * layout_->rowHeight();
+ // Stack each item behind the previous one.
+ z_value -= .01;
+ FieldInformationGraphicsItem *gap_item = new FieldInformationGraphicsItem(nullptr, gap_start_bit, gap_len, layout_);
+ gap_item->setPos(x, y_bottom + y_off);
+ gap_item->setZValue(z_value);
+ scene()->addItem(gap_item);
+ }
+ }
+
+ int y_off = (wire_item->start_bit / bits_per_row) * layout_->rowHeight();
+ // Stack each item behind the previous one.
+ z_value -= .01;
+ FieldInformationGraphicsItem *fi_item = new FieldInformationGraphicsItem(fi, wire_item->start_bit, wire_item->length, layout_);
+ fi_item->setPos(x, y_bottom + y_off);
+ fi_item->setFlag(QGraphicsItem::ItemIsSelectable);
+ fi_item->setAcceptedMouseButtons(Qt::LeftButton);
+ fi_item->setZValue(z_value);
+ scene()->addItem(fi_item);
+
+ y_pos_ = fi_item->maxRightY();
+ max_l_y = fi_item->maxLeftY();
+ }
+
+ // Left & right borders
+ scene()->addLine(x, border_top, x, max_l_y);
+ scene()->addLine(x + diag_w, border_top, x + diag_w, y_pos_);
+
+ // Inter-diagram margin
+ y_pos_ = max_l_y + bit_width;
+
+ // Set the proper color. Needed for dark mode on macOS + Qt 5.15.0 at least, possibly other cases.
+ foreach (item, scene()->items()) {
+ QGraphicsSimpleTextItem *t_item = qgraphicsitem_cast<QGraphicsSimpleTextItem *>(item);
+ if (t_item) {
+ t_item->setBrush(palette().text().color());
+ }
+ QGraphicsLineItem *l_item = qgraphicsitem_cast<QGraphicsLineItem *>(item);
+ if (l_item) {
+ l_item->setPen(palette().text().color());
+ }
+ }
+}
+
+void PacketDiagram::setSelectedField(field_info *fi)
+{
+ QSignalBlocker blocker(this);
+ FieldInformationGraphicsItem *fi_item;
+
+ foreach (QGraphicsItem *item, scene()->items()) {
+ if (item->isSelected()) {
+ item->setSelected(false);
+ fi_item = qgraphicsitem_cast<FieldInformationGraphicsItem *>(item);
+ }
+ if (fi && VariantPointer<field_info>::asPtr(item->data(Qt::UserRole)) == fi) {
+ fi_item = qgraphicsitem_cast<FieldInformationGraphicsItem *>(item);
+ if (fi_item) {
+ fi_item->setSelected(true);
+ }
+ }
+ }
+}
+
+QImage PacketDiagram::exportToImage()
+{
+ // Create a hi-res 2x scaled image.
+ int scale = 2;
+ QRect rr = QRect(0, 0, sceneRect().size().width() * scale, sceneRect().size().height() * scale);
+ QImage raster_diagram = QImage(rr.size(), QImage::Format_ARGB32);
+ QPainter raster_painter(&raster_diagram);
+
+ raster_painter.setRenderHint(QPainter::Antialiasing);
+ raster_painter.fillRect(rr, palette().base().color());
+ scene()->render(&raster_painter);
+
+ raster_painter.end();
+
+ return raster_diagram;
+}
+
+#if defined(QT_SVG_LIB) && 0
+QByteArray PacketDiagram::exportToSvg()
+{
+ QRect sr = QRect(0, 0, sceneRect().size().width(), sceneRect().size().height());
+ QBuffer svg_buf;
+ QSvgGenerator svg_diagram;
+ svg_diagram.setSize(sr.size());
+ svg_diagram.setViewBox(sr);
+ svg_diagram.setOutputDevice(&svg_buf);
+
+ QPainter svg_painter(&svg_diagram);
+ svg_painter.fillRect(sr, palette().base().color());
+ scene()->render(&svg_painter);
+
+ svg_painter.end();
+
+ return svg_buf.buffer();
+}
+#endif
+
+void PacketDiagram::showFieldsToggled(bool checked)
+{
+ layout_->setShowFields(checked);
+ setRootNode(root_node_);
+}
+
+// XXX - We have similar code in tcp_stream_dialog and io_graph_dialog. Should this be a common routine?
+void PacketDiagram::saveAsTriggered()
+{
+ QString file_name, extension;
+ QDir path(wsApp->lastOpenDir());
+ QString png_filter = tr("Portable Network Graphics (*.png)");
+ QString bmp_filter = tr("Windows Bitmap (*.bmp)");
+ // Gaze upon my beautiful graph with lossy artifacts!
+ QString jpeg_filter = tr("JPEG File Interchange Format (*.jpeg *.jpg)");
+ QStringList fl = QStringList() << png_filter << bmp_filter << jpeg_filter;
+#if defined(QT_SVG_LIB) && 0
+ QString svg_filter = tr("Scalable Vector Graphics (*.svg)");
+ fl << svg_filter;
+#endif
+ QString filter = fl.join(";;");
+
+ file_name = WiresharkFileDialog::getSaveFileName(this, wsApp->windowTitleString(tr("Save Graph As" UTF8_HORIZONTAL_ELLIPSIS)),
+ path.canonicalPath(), filter, &extension);
+
+ if (file_name.length() > 0) {
+ bool save_ok = false;
+ if (extension.compare(png_filter) == 0) {
+ QImage raster_diagram = exportToImage();
+ save_ok = raster_diagram.save(file_name, "PNG");
+ } else if (extension.compare(bmp_filter) == 0) {
+ QImage raster_diagram = exportToImage();
+ save_ok = raster_diagram.save(file_name, "BMP");
+ } else if (extension.compare(jpeg_filter) == 0) {
+ QImage raster_diagram = exportToImage();
+ save_ok = raster_diagram.save(file_name, "JPG");
+ }
+#if defined(QT_SVG_LIB) && 0
+ else if (extension.compare(svg_filter) == 0) {
+ QByteArray svg_diagram = exportToSvg();
+ QFile file(file_name);
+ if (file.open(QIODevice::WriteOnly)) {
+ save_ok = file.write(svg_diagram) > 0;
+ file.close();
+ }
+ }
+#endif
+ // else error dialog?
+ if (save_ok) {
+ path = QDir(file_name);
+ wsApp->setLastOpenDir(path.canonicalPath().toUtf8().constData());
+ }
+ }
+}
+
+void PacketDiagram::copyAsRasterTriggered()
+{
+ QImage raster_diagram = exportToImage();
+ wsApp->clipboard()->setImage(raster_diagram);
+}
+
+#if defined(QT_SVG_LIB) && !defined(Q_OS_MAC) && 0
+void PacketDiagram::copyAsSvgTriggered()
+{
+ QByteArray svg_ba = exportToSvg();
+
+ // XXX It looks like we have to use/subclass QMacPasteboardMime in
+ // order for this to work on macOS.
+ // It might be easier to just do "Save As" instead.
+ QMimeData *md = new QMimeData();
+ md->setData("image/svg+xml", svg_buf);
+ wsApp->clipboard()->setMimeData(md);
+}
+#endif
diff --git a/ui/qt/packet_diagram.h b/ui/qt/packet_diagram.h
new file mode 100644
index 0000000000..328b67111f
--- /dev/null
+++ b/ui/qt/packet_diagram.h
@@ -0,0 +1,72 @@
+/* packet_diagram.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef PACKET_DIAGRAM_H
+#define PACKET_DIAGRAM_H
+
+#include <config.h>
+
+#include <epan/proto.h>
+
+#include "cfile.h"
+
+#include <ui/qt/utils/field_information.h>
+
+#include <QGraphicsView>
+
+class DiagramLayout;
+
+class PacketDiagram : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ PacketDiagram(QWidget *parent = nullptr);
+ ~PacketDiagram();
+ void setRootNode(proto_node *root_node);
+ void clear();
+
+signals:
+ void fieldSelected(FieldInformation *);
+
+public slots:
+ void setCaptureFile(capture_file *cf);
+ void setFont(const QFont &font);
+ void selectedFieldChanged(FieldInformation *finfo);
+ void selectedFrameChanged(QList<int> frames);
+
+protected:
+ virtual void contextMenuEvent(QContextMenuEvent *event) override;
+
+private slots:
+ void connectToMainWindow();
+ void sceneSelectionChanged();
+
+private:
+ void addDiagram(proto_node *tl_node);
+ void setSelectedField(field_info *fi);
+ QImage exportToImage();
+#if defined(QT_SVG_LIB) && 0
+ QByteArray exportToSvg();
+#endif
+
+ void showFieldsToggled(bool checked);
+ void saveAsTriggered();
+ void copyAsRasterTriggered();
+#if defined(QT_SVG_LIB) && !defined(Q_OS_MAC) && 0
+ void copyAsSvgTriggered();
+#endif
+
+ DiagramLayout *layout_;
+ capture_file *cap_file_;
+ proto_node *root_node_;
+ field_info *selected_field_;
+ int y_pos_;
+};
+
+#endif // PACKET_DIAGRAM_H
diff --git a/ui/qt/tcp_stream_dialog.cpp b/ui/qt/tcp_stream_dialog.cpp
index b0b0f9c9ad..a19e3cd434 100644
--- a/ui/qt/tcp_stream_dialog.cpp
+++ b/ui/qt/tcp_stream_dialog.cpp
@@ -1823,6 +1823,7 @@ void TCPStreamDialog::transformYRange(const QCPRange &y_range1)
sp->yAxis2->setRangeLower(yp2.y1());
}
+// XXX - We have similar code in io_graph_dialog and packet_diagram. Should this be a common routine?
void TCPStreamDialog::on_buttonBox_accepted()
{
QString file_name, extension;
diff --git a/ui/qt/utils/field_information.cpp b/ui/qt/utils/field_information.cpp
index 2648930c83..7dd1221084 100644
--- a/ui/qt/utils/field_information.cpp
+++ b/ui/qt/utils/field_information.cpp
@@ -136,16 +136,23 @@ const QString FieldInformation::moduleName()
return module_name;
}
+QString FieldInformation::toString()
+{
+ QString repr;
+ gchar *repr_str;
+ repr_str = fvalue_to_string_repr(NULL, &fi_->value, FTREPR_DISPLAY, fi_->hfinfo->display);
+ if (repr_str) {
+ repr = repr_str;
+ }
+ wmem_free(NULL, repr_str);
+ return repr;
+}
+
QString FieldInformation::url()
{
QString url;
if (flag(FI_URL) && headerInfo().isValid && IS_FT_STRING(fi_->hfinfo->type)) {
- gchar *url_str;
- url_str = fvalue_to_string_repr(NULL, &fi_->value, FTREPR_DISPLAY, fi_->hfinfo->display);
- if (url_str) {
- url = url_str;
- }
- wmem_free(NULL, url_str);
+ url = toString();
}
return url;
}
diff --git a/ui/qt/utils/field_information.h b/ui/qt/utils/field_information.h
index e021b4ad1b..19df83e552 100644
--- a/ui/qt/utils/field_information.h
+++ b/ui/qt/utils/field_information.h
@@ -60,6 +60,7 @@ public:
bool tvbContains(FieldInformation *);
unsigned flag(unsigned mask);
const QString moduleName();
+ QString toString();
QString url();
const QByteArray printableData();
diff --git a/ui/qt/wireshark_application.cpp b/ui/qt/wireshark_application.cpp
index 35daf14f69..9bf6ad931d 100644
--- a/ui/qt/wireshark_application.cpp
+++ b/ui/qt/wireshark_application.cpp
@@ -1188,13 +1188,17 @@ void WiresharkApplication::zoomTextFont(int zoomLevel)
{
// Scale by 10%, rounding to nearest half point, minimum 1 point.
// XXX Small sizes repeat. It might just be easier to create a map of multipliers.
- zoomed_font_ = mono_font_;
qreal zoom_size = mono_font_.pointSize() * 2 * qPow(qreal(1.1), zoomLevel);
zoom_size = qRound(zoom_size) / qreal(2.0);
zoom_size = qMax(zoom_size, qreal(1.0));
- zoomed_font_.setPointSizeF(zoom_size);
+ zoomed_font_ = mono_font_;
+ zoomed_font_.setPointSizeF(zoom_size);
emit zoomMonospaceFont(zoomed_font_);
+
+ QFont zoomed_application_font = font();
+ zoomed_application_font.setPointSizeF(zoom_size);
+ emit zoomRegularFont(zoomed_application_font);
}
#if defined(HAVE_SOFTWARE_UPDATE) && defined(Q_OS_WIN)
diff --git a/ui/qt/wireshark_application.h b/ui/qt/wireshark_application.h
index 70d61c2f95..7b0af2098b 100644
--- a/ui/qt/wireshark_application.h
+++ b/ui/qt/wireshark_application.h
@@ -205,6 +205,7 @@ signals:
/* Signals activation and stop of a capture. The value provides the number of active captures */
void captureActive(int);
+ void zoomRegularFont(const QFont & font);
void zoomMonospaceFont(const QFont & font);
public slots:
diff --git a/ui/recent.c b/ui/recent.c
index 4905666423..c36dbcad7b 100644
--- a/ui/recent.c
+++ b/ui/recent.c
@@ -35,6 +35,7 @@
#define RECENT_KEY_PACKET_LIST_SHOW "gui.packet_list_show"
#define RECENT_KEY_TREE_VIEW_SHOW "gui.tree_view_show"
#define RECENT_KEY_BYTE_VIEW_SHOW "gui.byte_view_show"
+#define RECENT_KEY_PACKET_DIAGRAM_SHOW "gui.packet_diagram_show"
#define RECENT_KEY_STATUSBAR_SHOW "gui.statusbar_show"
#define RECENT_KEY_PACKET_LIST_COLORIZE "gui.packet_list_colorize"
#define RECENT_GUI_TIME_FORMAT "gui.time_format"
@@ -844,6 +845,10 @@ write_profile_recent(void)
RECENT_KEY_BYTE_VIEW_SHOW,
recent.byte_view_show);
+ write_recent_boolean(rf, "Packet diagram show (hide)",
+ RECENT_KEY_PACKET_DIAGRAM_SHOW,
+ recent.packet_diagram_show);
+
write_recent_boolean(rf, "Statusbar show (hide)",
RECENT_KEY_STATUSBAR_SHOW,
recent.statusbar_show);
@@ -1054,6 +1059,8 @@ read_set_recent_pair_static(gchar *key, const gchar *value,
parse_recent_boolean(value, &recent.tree_view_show);
} else if (strcmp(key, RECENT_KEY_BYTE_VIEW_SHOW) == 0) {
parse_recent_boolean(value, &recent.byte_view_show);
+ } else if (strcmp(key, RECENT_KEY_PACKET_DIAGRAM_SHOW) == 0) {
+ parse_recent_boolean(value, &recent.packet_diagram_show);
} else if (strcmp(key, RECENT_KEY_STATUSBAR_SHOW) == 0) {
parse_recent_boolean(value, &recent.statusbar_show);
} else if (strcmp(key, RECENT_KEY_PACKET_LIST_COLORIZE) == 0) {
@@ -1323,6 +1330,7 @@ recent_read_profile_static(char **rf_path_return, int *rf_errno_return)
recent.packet_list_show = TRUE;
recent.tree_view_show = TRUE;
recent.byte_view_show = TRUE;
+ recent.packet_diagram_show = TRUE;
recent.statusbar_show = TRUE;
recent.packet_list_colorize = TRUE;
recent.gui_time_format = TS_RELATIVE;
diff --git a/ui/recent.h b/ui/recent.h
index 2ba7110108..b154a57741 100644
--- a/ui/recent.h
+++ b/ui/recent.h
@@ -89,6 +89,7 @@ typedef struct recent_settings_tag {
gboolean packet_list_show;
gboolean tree_view_show;
gboolean byte_view_show;
+ gboolean packet_diagram_show;
gboolean statusbar_show;
gboolean packet_list_colorize;
ts_type gui_time_format;