diff options
-rw-r--r-- | epan/dissectors/packet-dccp.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-http.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-http2.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-quic.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-sip.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-tcp.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-tls.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-udp.c | 2 | ||||
-rw-r--r-- | epan/follow.c | 9 | ||||
-rw-r--r-- | epan/follow.h | 11 | ||||
-rw-r--r-- | packaging/debian/libwireshark0.symbols | 1 | ||||
-rw-r--r-- | ui/qt/follow_stream_dialog.cpp | 80 |
12 files changed, 42 insertions, 76 deletions
diff --git a/epan/dissectors/packet-dccp.c b/epan/dissectors/packet-dccp.c index d077804ea5..1d17cbdb45 100644 --- a/epan/dissectors/packet-dccp.c +++ b/epan/dissectors/packet-dccp.c @@ -1733,7 +1733,7 @@ proto_register_dccp(void) register_conversation_table(proto_dccp, FALSE, dccpip_conversation_packet, dccpip_endpoint_packet); register_conversation_filter("dccp", "DCCP", dccp_filter_valid, dccp_build_filter); register_follow_stream(proto_dccp, "dccp_follow", dccp_follow_conv_filter, dccp_follow_index_filter, dccp_follow_address_filter, - dccp_port_to_display, follow_tvb_tap_listener); + dccp_port_to_display, follow_tvb_tap_listener, get_dccp_stream_count); register_init_routine(dccp_init); } diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c index 697a94f01e..1c9d5d5610 100644 --- a/epan/dissectors/packet-http.c +++ b/epan/dissectors/packet-http.c @@ -4436,7 +4436,8 @@ proto_register_http(void) credentials_tap = register_tap("credentials"); /* credentials tap */ register_follow_stream(proto_http, "http_follow", tcp_follow_conv_filter, tcp_follow_index_filter, tcp_follow_address_filter, - tcp_port_to_display, follow_tvb_tap_listener); + tcp_port_to_display, follow_tvb_tap_listener, + get_tcp_stream_count); http_eo_tap = register_export_object(proto_http, http_eo_packet, NULL); /* compile patterns, exluding "/" */ diff --git a/epan/dissectors/packet-http2.c b/epan/dissectors/packet-http2.c index e903fa8e76..81ec3f89cb 100644 --- a/epan/dissectors/packet-http2.c +++ b/epan/dissectors/packet-http2.c @@ -4603,7 +4603,7 @@ proto_register_http2(void) http2_follow_tap = register_tap("http2_follow"); register_follow_stream(proto_http2, "http2_follow", http2_follow_conv_filter, http2_follow_index_filter, tcp_follow_address_filter, - tcp_port_to_display, follow_http2_tap_listener); + tcp_port_to_display, follow_http2_tap_listener, get_tcp_stream_count); } static void http2_stats_tree_init(stats_tree* st) diff --git a/epan/dissectors/packet-quic.c b/epan/dissectors/packet-quic.c index 3481ddf135..fadb62eddb 100644 --- a/epan/dissectors/packet-quic.c +++ b/epan/dissectors/packet-quic.c @@ -5377,7 +5377,7 @@ proto_register_quic(void) register_cleanup_routine(quic_cleanup); register_follow_stream(proto_quic, "quic_follow", quic_follow_conv_filter, quic_follow_index_filter, quic_follow_address_filter, - udp_port_to_display, follow_quic_tap_listener); + udp_port_to_display, follow_quic_tap_listener, get_quic_connections_count); // TODO implement custom reassembly functions that uses the QUIC Connection // ID instead of address and port numbers. diff --git a/epan/dissectors/packet-sip.c b/epan/dissectors/packet-sip.c index 2325e68be1..b52023bfd9 100644 --- a/epan/dissectors/packet-sip.c +++ b/epan/dissectors/packet-sip.c @@ -7755,7 +7755,7 @@ void proto_register_sip(void) ws_mempbrk_compile(&pbrk_via_param_end, "\t;, "); register_follow_stream(proto_sip, "sip_follow", sip_follow_conv_filter, sip_follow_index_filter, sip_follow_address_filter, - udp_port_to_display, follow_tvb_tap_listener); + udp_port_to_display, follow_tvb_tap_listener, NULL); } void diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index 0ffa8f0491..d1334137ff 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -9633,7 +9633,7 @@ proto_register_tcp(void) register_conversation_table(proto_mptcp, FALSE, mptcpip_conversation_packet, tcpip_endpoint_packet); register_follow_stream(proto_tcp, "tcp_follow", tcp_follow_conv_filter, tcp_follow_index_filter, tcp_follow_address_filter, - tcp_port_to_display, follow_tcp_tap_listener); + tcp_port_to_display, follow_tcp_tap_listener, get_tcp_stream_count); } void diff --git a/epan/dissectors/packet-tls.c b/epan/dissectors/packet-tls.c index e292c548be..03aba7601c 100644 --- a/epan/dissectors/packet-tls.c +++ b/epan/dissectors/packet-tls.c @@ -4597,7 +4597,7 @@ proto_register_tls(void) "tls", tls_tap); register_follow_stream(proto_tls, "tls", tcp_follow_conv_filter, tcp_follow_index_filter, tcp_follow_address_filter, - tcp_port_to_display, ssl_follow_tap_listener); + tcp_port_to_display, ssl_follow_tap_listener, get_tcp_stream_count); secrets_register_type(SECRETS_TYPE_TLS, tls_secrets_block_callback); } diff --git a/epan/dissectors/packet-udp.c b/epan/dissectors/packet-udp.c index 987a8929e9..7a07d5fc5b 100644 --- a/epan/dissectors/packet-udp.c +++ b/epan/dissectors/packet-udp.c @@ -1476,7 +1476,7 @@ proto_register_udp(void) register_conversation_table(proto_udp, FALSE, udpip_conversation_packet, udpip_endpoint_packet); register_conversation_filter("udp", "UDP", udp_filter_valid, udp_build_filter); register_follow_stream(proto_udp, "udp_follow", udp_follow_conv_filter, udp_follow_index_filter, udp_follow_address_filter, - udp_port_to_display, follow_tvb_tap_listener); + udp_port_to_display, follow_tvb_tap_listener, get_udp_stream_count); register_init_routine(udp_init); } diff --git a/epan/follow.c b/epan/follow.c index ebad23b26d..0b1325e01c 100644 --- a/epan/follow.c +++ b/epan/follow.c @@ -28,13 +28,15 @@ struct register_follow { follow_address_filter_func address_filter; /* generate address filter to follow */ follow_port_to_display_func port_to_display; /* port to name resolution for follow type */ tap_packet_cb tap_handler; /* tap listener handler */ + follow_stream_count_func stream_count; /* maximum stream count, used for UI */ }; static wmem_tree_t *registered_followers = NULL; void register_follow_stream(const int proto_id, const char* tap_listener, follow_conv_filter_func conv_filter, follow_index_filter_func index_filter, follow_address_filter_func address_filter, - follow_port_to_display_func port_to_display, tap_packet_cb tap_handler) + follow_port_to_display_func port_to_display, tap_packet_cb tap_handler, + follow_stream_count_func stream_count) { register_follow_t *follower; DISSECTOR_ASSERT(tap_listener); @@ -53,6 +55,7 @@ void register_follow_stream(const int proto_id, const char* tap_listener, follower->address_filter = address_filter; follower->port_to_display = port_to_display; follower->tap_handler = tap_handler; + follower->stream_count = stream_count; if (registered_followers == NULL) registered_followers = wmem_tree_new(wmem_epan_scope()); @@ -101,6 +104,10 @@ tap_packet_cb get_follow_tap_handler(register_follow_t* follower) return follower->tap_handler; } +follow_stream_count_func get_follow_stream_count_func(register_follow_t* follower) +{ + return follower->stream_count; +} register_follow_t* get_follow_by_name(const char* proto_short_name) { diff --git a/epan/follow.h b/epan/follow.h index 3a8ab0e61c..474f1e52c6 100644 --- a/epan/follow.h +++ b/epan/follow.h @@ -110,11 +110,13 @@ typedef gchar* (*follow_conv_filter_func)(epan_dissect_t *edt, packet_info *pinf typedef gchar* (*follow_index_filter_func)(guint stream, guint sub_stream); typedef gchar* (*follow_address_filter_func)(address* src_addr, address* dst_addr, int src_port, int dst_port); typedef gchar* (*follow_port_to_display_func)(wmem_allocator_t *allocator, guint port); +typedef guint32 (*follow_stream_count_func)(void); WS_DLL_PUBLIC void register_follow_stream(const int proto_id, const char* tap_listener, follow_conv_filter_func conv_filter, follow_index_filter_func index_filter, follow_address_filter_func address_filter, - follow_port_to_display_func port_to_display, tap_packet_cb tap_handler); + follow_port_to_display_func port_to_display, tap_packet_cb tap_handler, + follow_stream_count_func stream_count); /** Get protocol ID from registered follower * @@ -172,6 +174,13 @@ WS_DLL_PUBLIC follow_port_to_display_func get_follow_port_to_display(register_fo */ WS_DLL_PUBLIC tap_packet_cb get_follow_tap_handler(register_follow_t* follower); +/** Provide function that gets the total number of streams for a registered follower + * The function can be NULL if the follower does not count the number of streams + * + * @param follower [in] Registered follower + * @return A stream count handler + */ +WS_DLL_PUBLIC follow_stream_count_func get_follow_stream_count_func(register_follow_t* follower); /** Tap function handler when dissector's tap provides follow data as a tvb. * Used by TCP, UDP and HTTP followers diff --git a/packaging/debian/libwireshark0.symbols b/packaging/debian/libwireshark0.symbols index 9c83091c61..5b0f55085b 100644 --- a/packaging/debian/libwireshark0.symbols +++ b/packaging/debian/libwireshark0.symbols @@ -856,6 +856,7 @@ libwireshark.so.0 libwireshark0 #MINVER# get_follow_index_func@Base 2.1.0 get_follow_port_to_display@Base 2.1.0 get_follow_proto_id@Base 2.1.0 + get_follow_stream_count_func@Base 4.1.0 get_follow_tap_handler@Base 2.1.0 get_follow_tap_string@Base 2.1.0 get_export_pdu_tap_list@Base 1.99.0 diff --git a/ui/qt/follow_stream_dialog.cpp b/ui/qt/follow_stream_dialog.cpp index 318c5cff2b..102eafdfe6 100644 --- a/ui/qt/follow_stream_dialog.cpp +++ b/ui/qt/follow_stream_dialog.cpp @@ -15,9 +15,6 @@ #include "frame_tvbuff.h" #include "epan/follow.h" -#include "epan/dissectors/packet-tcp.h" -#include "epan/dissectors/packet-udp.h" -#include "epan/dissectors/packet-dccp.h" #include "epan/dissectors/packet-http2.h" #include "epan/dissectors/packet-quic.h" #include "epan/prefs.h" @@ -434,6 +431,10 @@ void FollowStreamDialog::on_streamNumberSpinBox_valueChanged(int stream_num) } sub_stream_num = static_cast<gint>(sub_stream_num_new); } else { + /* XXX: For HTTP and TLS, we use the TCP stream index, and really should + * return false if the TCP stream doesn't have HTTP or TLS. (Or we could + * switch to having separate HTTP and TLS stream numbers.) + */ ok = true; } @@ -948,6 +949,8 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index, QString client_to_server_string; QString both_directions_string; gboolean is_follower = FALSE; + int stream_count; + follow_stream_count_func stream_count_func = NULL; resetStream(); @@ -971,12 +974,6 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index, } } - if (follow_type_ == FOLLOW_TLS || follow_type_ == FOLLOW_HTTP) - { - /* we got tls/http so we can follow */ - removeStreamControls(); - } - follow_reset_stream(&follow_info_); /* Create a new filter that matches all packets in the TCP stream, @@ -1032,54 +1029,24 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index, ui->subStreamNumberSpinBox->setVisible(false); ui->subStreamNumberLabel->setVisible(false); - switch (follow_type_) - { - case FOLLOW_TCP: - { - int stream_count = get_tcp_stream_count(); - ui->streamNumberSpinBox->blockSignals(true); - ui->streamNumberSpinBox->setMaximum(stream_count-1); - ui->streamNumberSpinBox->setValue(stream_num); - ui->streamNumberSpinBox->blockSignals(false); - ui->streamNumberSpinBox->setToolTip(tr("%Ln total stream(s).", "", stream_count)); - ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); + stream_count_func = get_follow_stream_count_func(follower_); - break; - } - case FOLLOW_UDP: - { - int stream_count = get_udp_stream_count(); + if (stream_count_func == NULL) { + removeStreamControls(); + } else { + stream_count = stream_count_func(); ui->streamNumberSpinBox->blockSignals(true); ui->streamNumberSpinBox->setMaximum(stream_count-1); ui->streamNumberSpinBox->setValue(stream_num); ui->streamNumberSpinBox->blockSignals(false); ui->streamNumberSpinBox->setToolTip(tr("%Ln total stream(s).", "", stream_count)); ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); - - break; } - case FOLLOW_DCCP: - { - int stream_count = get_dccp_stream_count(); - ui->streamNumberSpinBox->blockSignals(true); - ui->streamNumberSpinBox->setMaximum(stream_count-1); - ui->streamNumberSpinBox->setValue(stream_num); - ui->streamNumberSpinBox->blockSignals(false); - ui->streamNumberSpinBox->setToolTip(tr("%Ln total stream(s).", "", stream_count)); - ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); - break; - } + switch (follow_type_) + { case FOLLOW_HTTP2: { - int stream_count = get_tcp_stream_count(); - ui->streamNumberSpinBox->blockSignals(true); - ui->streamNumberSpinBox->setMaximum(stream_count-1); - ui->streamNumberSpinBox->setValue(stream_num); - ui->streamNumberSpinBox->blockSignals(false); - ui->streamNumberSpinBox->setToolTip(tr("%Ln total stream(s).", "", stream_count)); - ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); - guint substream_max_id = 0; http2_get_stream_id_le(static_cast<guint>(stream_num), G_MAXINT32, &substream_max_id); stream_count = static_cast<gint>(substream_max_id); @@ -1097,11 +1064,6 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index, } case FOLLOW_QUIC: { - int stream_count = get_quic_connections_count(); - ui->streamNumberSpinBox->blockSignals(true); - ui->streamNumberSpinBox->setMaximum(stream_count-1); - ui->streamNumberSpinBox->setValue(stream_num); - ui->streamNumberSpinBox->blockSignals(false); ui->streamNumberSpinBox->setToolTip(tr("Total number of QUIC connections: %Ln", "", stream_count)); ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); @@ -1120,23 +1082,9 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index, break; } - case FOLLOW_TLS: - case FOLLOW_HTTP: + default: /* No extra handling */ break; - case FOLLOW_SIP: - { - /* There are no more streams */ - ui->streamNumberSpinBox->setEnabled(false); - ui->streamNumberSpinBox->blockSignals(true); - ui->streamNumberSpinBox->setMaximum(0); - ui->streamNumberSpinBox->setValue(0); - ui->streamNumberSpinBox->blockSignals(false); - ui->streamNumberSpinBox->setToolTip(tr("No streams")); - ui->streamNumberLabel->setToolTip(ui->streamNumberSpinBox->toolTip()); - - break; - } } beginRetapPackets(); |