aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames@darkjames.pl>2014-05-14 01:56:23 +0200
committerAnders Broman <a.broman58@gmail.com>2014-05-17 21:33:26 +0000
commitea95c837fe62cb89ae7a0507e3ca437b822d658c (patch)
tree4474e48708ed60c27eb35d4ee3904381086daed7 /epan
parent24082972a3650c0e743776b47549a17ab0ad20fe (diff)
Introduce col_add_lstr(), use it instead of slower col_add_fstr.
We have callgrind benchmarks which shows that col_add_fstr() takes 5% of Ir count cause of formatting done in g_vsnprintf(). New col_add_lstr() can be used in few dissectors without much ugliness, and it should be a little faster. Change-Id: Ifddd951063dfd3a27c2a7da4dafce9b242c0472c Reviewed-on: https://code.wireshark.org/review/1629 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.c48
-rw-r--r--epan/column-utils.h4
-rw-r--r--epan/dissectors/packet-sip.c13
-rw-r--r--epan/dissectors/packet-stun.c7
-rw-r--r--epan/dissectors/packet-tcp.c8
-rw-r--r--epan/dissectors/packet-udp.c6
-rw-r--r--epan/dissectors/packet-vlan.c22
7 files changed, 93 insertions, 15 deletions
diff --git a/epan/column-utils.c b/epan/column-utils.c
index 747f34f4f4..ae7610d1ce 100644
--- a/epan/column-utils.c
+++ b/epan/column-utils.c
@@ -557,9 +557,55 @@ col_set_str(column_info *cinfo, const gint el, const gchar* str)
}
}
+void
+col_add_lstr(column_info *cinfo, const gint el, const gchar *str, ...)
+{
+ va_list ap;
+ int i;
+ int pos;
+ int max_len;
+
+ 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]) {
+ pos = cinfo->col_fence[i];
+ if (pos != 0) {
+ /*
+ * We will append the string after the fence.
+ * First arrange that we can append, if necessary.
+ */
+ COL_CHECK_APPEND(cinfo, i, max_len);
+ } else {
+ /*
+ * There's no fence, so we can just write to the string.
+ */
+ cinfo->col_data[i] = cinfo->col_buf[i];
+ }
+
+ 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);
+ }
+ }
+}
+
/* Adds a vararg list to a packet info string. */
void
-col_add_fstr(column_info *cinfo, const gint el, const gchar *format, ...) {
+col_add_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
+{
va_list ap;
int i;
int fence;
diff --git a/epan/column-utils.h b/epan/column-utils.h
index 25efa8a75a..3a4587fb90 100644
--- a/epan/column-utils.h
+++ b/epan/column-utils.h
@@ -228,6 +228,10 @@ WS_DLL_PUBLIC void col_set_str(column_info *cinfo, const gint col, const gchar *
*/
WS_DLL_PUBLIC void col_add_str(column_info *cinfo, const gint col, const gchar *str);
+/* terminator argument for col_add_lstr() function */
+#define COL_ADD_LSTR_TERMINATOR (const char *) -1
+WS_DLL_PUBLIC void col_add_lstr(column_info *cinfo, const gint el, const gchar *str, ...);
+
/** Add (replace) the text of a column element, the text will be formatted and copied.
*
* Same function as col_add_str() but using a printf-like format string.
diff --git a/epan/dissectors/packet-sip.c b/epan/dissectors/packet-sip.c
index 99712c288e..4aae0c6392 100644
--- a/epan/dissectors/packet-sip.c
+++ b/epan/dissectors/packet-sip.c
@@ -2435,17 +2435,20 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case REQUEST_LINE:
is_known_request = sip_is_known_request(tvb, offset, token_1_len, &current_method_idx);
descr = is_known_request ? "Request" : "Unknown request";
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s",
- descr,
- tvb_format_text(tvb, offset, linelen - SIP2_HDR_LEN - 1));
+ col_add_lstr(pinfo->cinfo, COL_INFO,
+ descr, ": ",
+ tvb_format_text(tvb, offset, linelen - SIP2_HDR_LEN - 1),
+ COL_ADD_LSTR_TERMINATOR);
DPRINT(("got %s: %s", descr,
tvb_format_text(tvb, offset, linelen - SIP2_HDR_LEN - 1)));
break;
case STATUS_LINE:
descr = "Status";
- col_add_fstr(pinfo->cinfo, COL_INFO, "Status: %s",
- tvb_format_text(tvb, offset + SIP2_HDR_LEN + 1, linelen - SIP2_HDR_LEN - 1));
+ col_add_lstr(pinfo->cinfo, COL_INFO,
+ "Status: ",
+ tvb_format_text(tvb, offset + SIP2_HDR_LEN + 1, linelen - SIP2_HDR_LEN - 1),
+ COL_ADD_LSTR_TERMINATOR);
stat_info->reason_phrase = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + SIP2_HDR_LEN + 5,
linelen - (SIP2_HDR_LEN + 5),ENC_UTF_8|ENC_NA);
DPRINT(("got Response: %s",
diff --git a/epan/dissectors/packet-stun.c b/epan/dissectors/packet-stun.c
index 8721716eeb..f539b85027 100644
--- a/epan/dissectors/packet-stun.c
+++ b/epan/dissectors/packet-stun.c
@@ -541,8 +541,11 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
msg_class_str = val_to_str_const(msg_type_class, classes, "Unknown");
msg_method_str = val_to_str_const(msg_type_method, methods, "Unknown");
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
- msg_method_str, msg_class_str);
+ col_add_lstr(pinfo->cinfo, COL_INFO,
+ msg_method_str,
+ " ",
+ msg_class_str,
+ COL_ADD_LSTR_TERMINATOR);
ti = proto_tree_add_item(tree, proto_stun, tvb, 0, -1, ENC_NA);
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c
index df55ff5adb..85ef8c34f5 100644
--- a/epan/dissectors/packet-tcp.c
+++ b/epan/dissectors/packet-tcp.c
@@ -4145,8 +4145,12 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
tcph->th_sport = tvb_get_ntohs(tvb, offset);
tcph->th_dport = tvb_get_ntohs(tvb, offset + 2);
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s \xe2\x86\x92 %s", /* UTF8_RIGHTWARDS_ARROW */
- ep_tcp_port_to_display(tcph->th_sport), ep_tcp_port_to_display(tcph->th_dport));
+ col_add_lstr(pinfo->cinfo, COL_INFO,
+ ep_tcp_port_to_display(tcph->th_sport),
+ "\xe2\x86\x92", /* UTF8_RIGHTWARDS_ARROW */
+ ep_tcp_port_to_display(tcph->th_dport),
+ COL_ADD_LSTR_TERMINATOR);
+
if (tree) {
if (tcp_summary_in_tree) {
ti = proto_tree_add_protocol_format(tree, proto_tcp, tvb, 0, -1,
diff --git a/epan/dissectors/packet-udp.c b/epan/dissectors/packet-udp.c
index 82952a5b85..4d191fd17c 100644
--- a/epan/dissectors/packet-udp.c
+++ b/epan/dissectors/packet-udp.c
@@ -458,8 +458,10 @@ dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 ip_proto)
udph->uh_sport=tvb_get_ntohs(tvb, offset);
udph->uh_dport=tvb_get_ntohs(tvb, offset+2);
- col_add_fstr(pinfo->cinfo, COL_INFO, "Source port: %s Destination port: %s",
- ep_udp_port_to_display(udph->uh_sport), ep_udp_port_to_display(udph->uh_dport));
+ col_add_lstr(pinfo->cinfo, COL_INFO,
+ "Source port: ", ep_udp_port_to_display(udph->uh_sport), " "
+ "Destination port: ", ep_udp_port_to_display(udph->uh_dport),
+ COL_ADD_LSTR_TERMINATOR);
if (tree) {
if (udp_summary_in_tree) {
diff --git a/epan/dissectors/packet-vlan.c b/epan/dissectors/packet-vlan.c
index 239bb68c6c..4479ce67cb 100644
--- a/epan/dissectors/packet-vlan.c
+++ b/epan/dissectors/packet-vlan.c
@@ -34,6 +34,7 @@
#include "packet-vlan.h"
#include <epan/etypes.h>
#include <epan/prefs.h>
+#include <epan/to_str.h>
void proto_register_vlan(void);
void proto_reg_handoff_vlan(void);
@@ -118,6 +119,23 @@ capture_vlan(const guchar *pd, int offset, int len, packet_counts *ld ) {
}
static void
+columns_set_vlan(column_info *cinfo, guint16 tci)
+{
+ static const char fast_str[][2] = { "0", "1", "2", "3", "4", "5", "6", "7" };
+
+ char id_str[16];
+
+ guint32_to_str_buf(tci & 0xFFF, id_str, sizeof(id_str));
+
+ col_add_lstr(cinfo, COL_INFO,
+ "PRI: ", fast_str[(tci >> 13) & 7], " "
+ "CFI: ", fast_str[(tci >> 12) & 1], " "
+ "ID: ", id_str,
+ COL_ADD_LSTR_TERMINATOR);
+ col_add_str(cinfo, COL_8021Q_VLAN_ID, id_str);
+}
+
+static void
dissect_vlan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
@@ -131,9 +149,7 @@ dissect_vlan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
tci = tvb_get_ntohs( tvb, 0 );
- col_add_fstr(pinfo->cinfo, COL_INFO, "PRI: %u CFI: %u ID: %u",
- (tci >> 13), ((tci >> 12) & 1), (tci & 0xFFF));
- col_add_fstr(pinfo->cinfo, COL_8021Q_VLAN_ID, "%u", (tci & 0xFFF));
+ columns_set_vlan(pinfo->cinfo, tci);
vlan_tree = NULL;