aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2014-06-19 02:42:47 +0200
committerAnders Broman <a.broman58@gmail.com>2014-06-19 06:48:32 +0000
commitbcff3c57cc42acdda9eb9bc6f556dcbcb069e51f (patch)
treedba01dffd0e0baa72d2945ca5928dca157a8ecdd /epan
parent5a6366c9b56990eb7f4af17bf628ad80fc354ece (diff)
Add the ability to dynamically add a new protocol to export PDU dialog box
Change-Id: I83012cc963d514982e40010e837e11a6fcf1bc3e Reviewed-on: https://code.wireshark.org/review/2423 Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-dvbci.c4
-rw-r--r--epan/dissectors/packet-exported_pdu.c6
-rw-r--r--epan/dissectors/packet-logcat.c4
-rw-r--r--epan/exported_pdu.c24
-rw-r--r--epan/exported_pdu.h21
5 files changed, 45 insertions, 14 deletions
diff --git a/epan/dissectors/packet-dvbci.c b/epan/dissectors/packet-dvbci.c
index fb708023c0..47dabd67a9 100644
--- a/epan/dissectors/packet-dvbci.c
+++ b/epan/dissectors/packet-dvbci.c
@@ -6144,6 +6144,8 @@ proto_register_dvbci(void)
/* the dissector for decrypted CI+ SAC messages which we can export */
new_register_dissector(EXPORTED_SAC_MSG_PROTO,
dissect_dvbci_exported_sac_msg, proto_dvbci);
+
+ exported_pdu_tap = register_export_pdu_tap("DVB-CI");
}
@@ -6162,8 +6164,6 @@ proto_reg_handoff_dvbci(void)
tcp_dissector_table = find_dissector_table("tcp.port");
udp_dissector_table = find_dissector_table("udp.port");
- exported_pdu_tap = find_tap_id(EXPORT_PDU_TAP_NAME_DVB_CI);
-
if (dvbci_sek_bin) {
g_free(dvbci_sek_bin);
dvbci_sek_bin = NULL;
diff --git a/epan/dissectors/packet-exported_pdu.c b/epan/dissectors/packet-exported_pdu.c
index ed9e30917c..f220896d2d 100644
--- a/epan/dissectors/packet-exported_pdu.c
+++ b/epan/dissectors/packet-exported_pdu.c
@@ -345,10 +345,8 @@ proto_register_exported_pdu(void)
* The tap is registered here but it is to be used by dissectors that
* want to export their PDUs, see packet-sip.c
*/
- register_tap(EXPORT_PDU_TAP_NAME_LAYER_3);
- register_tap(EXPORT_PDU_TAP_NAME_LAYER_7);
- register_tap(EXPORT_PDU_TAP_NAME_DVB_CI);
- register_tap(EXPORT_PDU_TAP_NAME_LOGCAT);
+ register_export_pdu_tap(EXPORT_PDU_TAP_NAME_LAYER_3);
+ register_export_pdu_tap(EXPORT_PDU_TAP_NAME_LAYER_7);
}
void
diff --git a/epan/dissectors/packet-logcat.c b/epan/dissectors/packet-logcat.c
index 4f8427760c..4d02d9593c 100644
--- a/epan/dissectors/packet-logcat.c
+++ b/epan/dissectors/packet-logcat.c
@@ -277,6 +277,8 @@ proto_register_logcat(void)
expert_module = expert_register_protocol(proto_logcat);
expert_register_field_array(expert_module, ei, array_length(ei));
+
+ exported_pdu_tap = register_export_pdu_tap("Logcat");
}
@@ -286,8 +288,6 @@ proto_reg_handoff_logcat(void)
dissector_add_uint("wtap_encap", WTAP_ENCAP_LOGCAT, logcat_handle);
dissector_add_handle("tcp.port", logcat_handle);
-
- exported_pdu_tap = find_tap_id(EXPORT_PDU_TAP_NAME_LOGCAT);
}
/*
diff --git a/epan/exported_pdu.c b/epan/exported_pdu.c
index a1a205eca8..a57f458697 100644
--- a/epan/exported_pdu.c
+++ b/epan/exported_pdu.c
@@ -27,9 +27,12 @@
#include <epan/packet.h>
#include <epan/exported_pdu.h>
+#include <epan/tap.h>
#include <epan/dissectors/packet-mtp3.h>
#include <epan/dissectors/packet-dvbci.h>
+GSList *export_pdu_tap_name_list = NULL;
+
/**
* Allocates and fills the exp_pdu_data_t struct according to the wanted_exp_tags
* bit field of wanted_exp_tags_len bytes length
@@ -332,3 +335,24 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap
return exp_pdu_data;
}
+
+gint
+register_export_pdu_tap(const char *name)
+{
+ gchar *tap_name = g_strdup(name);
+ export_pdu_tap_name_list = g_slist_prepend(export_pdu_tap_name_list, tap_name);
+ return register_tap(tap_name);
+}
+
+static
+gint sort_pdu_tap_name_list(gconstpointer a, gconstpointer b)
+{
+ return g_strcmp0((const char *)a, (const char*)b);
+}
+
+GSList *
+get_export_pdu_tap_list(void)
+{
+ export_pdu_tap_name_list = g_slist_sort(export_pdu_tap_name_list, sort_pdu_tap_name_list);
+ return export_pdu_tap_name_list;
+}
diff --git a/epan/exported_pdu.h b/epan/exported_pdu.h
index 8b10eca703..632a2b8f2d 100644
--- a/epan/exported_pdu.h
+++ b/epan/exported_pdu.h
@@ -27,20 +27,26 @@
#include "config.h"
+#include "ws_symbol_export.h"
+
#include <glib.h>
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
/*
* Define different common tap names to extract PDUs at different layers,
* otherwise one packet may be exported several times at different layers
* if all taps are run.
- * NOTE if a new tap is added here it needs to be added to export_pdu_dlg.c
- * and packet-exported_pdu.c
- * TODO: Use an enum_val_t instead?
*/
#define EXPORT_PDU_TAP_NAME_LAYER_3 "OSI layer 3"
#define EXPORT_PDU_TAP_NAME_LAYER_7 "OSI layer 7"
-#define EXPORT_PDU_TAP_NAME_DVB_CI "DVB-CI"
-#define EXPORT_PDU_TAP_NAME_LOGCAT "Logcat"
+
+/* To add dynamically an export name, call the following function
+ It returns the registered tap */
+WS_DLL_PUBLIC gint register_export_pdu_tap(const char *name);
+WS_DLL_PUBLIC GSList *get_export_pdu_tap_list(void);
/**
* This struct is used as the data part of tap_queue_packet() and contains a
@@ -151,5 +157,8 @@ typedef struct _exp_pdu_data_t {
WS_DLL_PUBLIC exp_pdu_data_t *load_export_pdu_tags(packet_info *pinfo, const char* proto_name,
int wtap_encap, guint8 *wanted_exp_tags, guint16 wanted_exp_tags_len);
-#endif /* EXPORTED_PDU_H */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXPORTED_PDU_H */