diff options
author | Jakub Zawadzki <darkjames@darkjames.pl> | 2014-06-21 23:06:54 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2014-06-23 03:33:59 +0000 |
commit | 6e0be0173b2037df2653e2a9d47e0213eda386f7 (patch) | |
tree | 82d60bc21de9e6bfbbfb39cf2c9a789dd7be4b2c /epan | |
parent | ab6a45aec605c4694b9094a7a9ace16e7e66c484 (diff) |
Add col_append_lstr(), speedup column generation for TCP.
When dissecting with columns TCP dissector spends
around 1/4 time in col_append_fstr(), add col_append_lstr()
and do formatting by ourselves.
Change-Id: If90bc26242761884b4991e8db0db62c8f9e32690
Reviewed-on: https://code.wireshark.org/review/2527
Reviewed-by: Evan Huus <eapache@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/column-utils.c | 39 | ||||
-rw-r--r-- | epan/column-utils.h | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-tcp.c | 23 |
3 files changed, 63 insertions, 5 deletions
diff --git a/epan/column-utils.c b/epan/column-utils.c index 401dae865f..f27e4702c4 100644 --- a/epan/column-utils.c +++ b/epan/column-utils.c @@ -312,6 +312,45 @@ col_custom_prime_edt(epan_dissect_t *edt, column_info *cinfo) } } +void +col_append_lstr(column_info *cinfo, const gint el, const gchar *str, ...) +{ + va_list ap; + size_t pos, max_len; + int i; + + if (!CHECK_COL(cinfo, el)) + return; + + if (el == COL_INFO) + max_len = COL_MAX_INFO_LEN; + else + max_len = COL_MAX_LEN; + + for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) { + if (cinfo->fmt_matx[i][el]) { + /* + * First arrange that we can append, if necessary. + */ + COL_CHECK_APPEND(cinfo, i, max_len); + + pos = strlen(cinfo->col_buf[i]); + if (pos >= max_len) + return; + + va_start(ap, str); + do { + if G_UNLIKELY(str == NULL) + str = "(null)"; + + pos += g_strlcpy(&cinfo->col_buf[i][pos], str, max_len - pos); + + } while (pos < max_len && (str = va_arg(ap, const char *)) != COL_ADD_LSTR_TERMINATOR); + va_end(ap); + } + } +} + static void col_do_append_fstr(column_info *cinfo, const int el, const char *separator, const char *format, va_list ap) { diff --git a/epan/column-utils.h b/epan/column-utils.h index 3a4587fb90..331bdf517f 100644 --- a/epan/column-utils.h +++ b/epan/column-utils.h @@ -269,6 +269,12 @@ gboolean col_based_on_frame_data(column_info *cinfo, const gint col); */ WS_DLL_PUBLIC void col_append_str(column_info *cinfo, const gint col, const gchar *str); +/* Append the given strings (terminated by COL_ADD_LSTR_TERMINATOR) to a column element, + * + * Same result as col_append_str() called for every string element. + */ +WS_DLL_PUBLIC void col_append_lstr(column_info *cinfo, const gint el, const gchar *str, ...); + /** Append the given text to a column element, the text will be formatted and copied. * * Same function as col_append_str() but using a printf-like format string. diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index a163e680b8..107efa3f62 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -2361,7 +2361,13 @@ tcp_dissect_pdus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void tcp_info_append_uint(packet_info *pinfo, const char *abbrev, guint32 val) { - col_append_fstr(pinfo->cinfo, COL_INFO, " %s=%u", abbrev, val); + char buf[16]; + + guint32_to_str_buf(val, buf, sizeof(buf)); + /* fstr(" %s=%u", abbrev, val) */ + col_append_lstr(pinfo->cinfo, COL_INFO, + " ", abbrev, "=", buf, + COL_ADD_LSTR_TERMINATOR); } static void @@ -2935,7 +2941,9 @@ dissect_tcpopt_qs(const ip_tcp_opt *optp, tvbuff_t *tvb, "%s: Rate response, %s, TTL diff %u ", optp->name, val_to_str_ext_const(rate, &qs_rate_vals_ext, "Unknown"), tvb_get_guint8(tvb, offset + 3)); - col_append_fstr(pinfo->cinfo, COL_INFO, " QSresp=%s", val_to_str_ext_const(rate, &qs_rate_vals_ext, "Unknown")); + col_append_lstr(pinfo->cinfo, COL_INFO, + " QSresp=", val_to_str_ext_const(rate, &qs_rate_vals_ext, "Unknown"), + COL_ADD_LSTR_TERMINATOR); field_tree = proto_item_add_subtree(tf, ett_tcp_opt_qs); proto_tree_add_item(field_tree, hf_tcp_option_kind, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -3025,8 +3033,10 @@ dissect_tcpopt_scps(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, if (capvector & capvecs[i].mask) { proto_item_append_text(tf, "%s%s", anyflag ? ", " : " (", capvecs[i].str); - col_append_fstr(pinfo->cinfo, COL_INFO, "%s%s", - anyflag ? ", " : "", capvecs[i].str); + col_append_lstr(pinfo->cinfo, COL_INFO, + anyflag ? ", " : "", + capvecs[i].str, + COL_ADD_LSTR_TERMINATOR); anyflag = TRUE; } } @@ -4356,7 +4366,10 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) flags_str = tcp_flags_to_str(tcph); - col_append_fstr(pinfo->cinfo, COL_INFO, " [%s] Seq=%u", flags_str, tcph->th_seq); + col_append_lstr(pinfo->cinfo, COL_INFO, + " [", flags_str, "]", + COL_ADD_LSTR_TERMINATOR); + tcp_info_append_uint(pinfo, "Seq", tcph->th_seq); if (tcph->th_flags&TH_ACK) tcp_info_append_uint(pinfo, "Ack", tcph->th_ack); |