wireshark: add patch to make IPA ports configurable preferences

This commit is contained in:
Harald Welte 2010-12-01 00:02:42 +01:00
parent a36f0ede25
commit 318105d58d
1 changed files with 128 additions and 0 deletions

View File

@ -0,0 +1,128 @@
Index: wireshark/epan/dissectors/packet-gsm_ipa.c
===================================================================
--- wireshark.orig/epan/dissectors/packet-gsm_ipa.c
+++ wireshark/epan/dissectors/packet-gsm_ipa.c
@@ -32,6 +32,14 @@
#include <epan/packet.h>
#include <epan/ipproto.h>
+#include <epan/prefs.h>
+
+#define IPA_TCP_PORTS "3002,3003,3006,5000"
+#define IPA_UDP_PORTS "3006"
+
+static dissector_handle_t ipa_handle;
+static range_t *global_ipa_tcp_ports = NULL;
+static range_t *global_ipa_udp_ports = NULL;
/* Initialize the protocol and registered fields */
static int proto_ipa = -1;
@@ -60,11 +68,6 @@
static dissector_handle_t sub_handles[SUB_MAX];
-#define TCP_PORT_ABISIP_PRIM 3002
-#define TCP_PORT_ABISIP_SEC 3003
-#define TCP_PORT_ABISIP_INST 3006
-#define TCP_PORT_AIP_PRIM 5000
-
#define ABISIP_RSL_MAX 0x20
#define IPA_MGCP 0xfc
#define AIP_SCCP 0xfd
@@ -249,8 +252,12 @@
}
}
+void proto_reg_handoff_gsm_ipa(void);
+
void proto_register_ipa(void)
{
+ module_t *ipa_module;
+
static hf_register_info hf[] = {
{&hf_ipa_data_len,
{"DataLen", "ipa.data_len",
@@ -298,21 +305,71 @@
proto_register_subtree_array(ett, array_length(ett));
register_dissector("gsm_ipa", dissect_ipa, proto_ipa);
+
+ range_convert_str(&global_ipa_tcp_ports, IPA_TCP_PORTS, MAX_TCP_PORT);
+ range_convert_str(&global_ipa_udp_ports, IPA_UDP_PORTS, MAX_UDP_PORT);
+ ipa_module = prefs_register_protocol(proto_ipa,
+ proto_reg_handoff_gsm_ipa);
+
+ prefs_register_range_preference(ipa_module, "tcp_ports",
+ "GSM IPA TCP Port(s)",
+ "Set the port(s) for ip.access IPA"
+ " (default: " IPA_TCP_PORTS ")",
+ &global_ipa_tcp_ports, MAX_TCP_PORT);
+ prefs_register_range_preference(ipa_module, "udp_ports",
+ "GSM IPA UDP Port(s)",
+ "Set the port(s) for ip.access IPA"
+ " (default: " IPA_UDP_PORTS ")",
+ &global_ipa_udp_ports, MAX_UDP_PORT);
+}
+
+static void ipa_tcp_delete_callback(guint32 port)
+{
+ if (port)
+ dissector_delete("tcp.port", port, ipa_handle);
+}
+
+static void ipa_udp_delete_callback(guint32 port)
+{
+ if (port)
+ dissector_delete("udp.port", port, ipa_handle);
+}
+
+static void ipa_tcp_add_callback(guint32 port)
+{
+ if (port)
+ dissector_add("tcp.port", port, ipa_handle);
+}
+
+static void ipa_udp_add_callback(guint32 port)
+{
+ if (port)
+ dissector_add("udp.port", port, ipa_handle);
}
void proto_reg_handoff_gsm_ipa(void)
{
- dissector_handle_t ipa_handle;
+ static gboolean ipa_initialized = FALSE;
+ static range_t *ipa_tcp_ports, *ipa_udp_ports;
+
+ if (!ipa_initialized) {
+ sub_handles[SUB_RSL] = find_dissector("gsm_abis_rsl");
+ sub_handles[SUB_OML] = find_dissector("gsm_abis_oml");
+ sub_handles[SUB_SCCP] = find_dissector("sccp");
+ sub_handles[SUB_MGCP] = find_dissector("mgcp");
+
+ ipa_handle = create_dissector_handle(dissect_ipa, proto_ipa);
+ ipa_initialized = TRUE;
+ } else {
+ range_foreach(ipa_tcp_ports, ipa_tcp_delete_callback);
+ g_free(ipa_tcp_ports);
+ range_foreach(ipa_udp_ports, ipa_udp_delete_callback);
+ g_free(ipa_udp_ports);
+ }
+
+ ipa_tcp_ports = range_copy(global_ipa_tcp_ports);
+ ipa_udp_ports = range_copy(global_ipa_udp_ports);
- sub_handles[SUB_RSL] = find_dissector("gsm_abis_rsl");
- sub_handles[SUB_OML] = find_dissector("gsm_abis_oml");
- sub_handles[SUB_SCCP] = find_dissector("sccp");
- sub_handles[SUB_MGCP] = find_dissector("mgcp");
-
- ipa_handle = create_dissector_handle(dissect_ipa, proto_ipa);
- dissector_add("tcp.port", TCP_PORT_ABISIP_PRIM, ipa_handle);
- dissector_add("tcp.port", TCP_PORT_ABISIP_SEC, ipa_handle);
- dissector_add("tcp.port", TCP_PORT_ABISIP_INST, ipa_handle);
- dissector_add("tcp.port", TCP_PORT_AIP_PRIM, ipa_handle);
- dissector_add("udp.port", TCP_PORT_ABISIP_INST, ipa_handle);
+ range_foreach(ipa_tcp_ports, ipa_tcp_add_callback);
+ range_foreach(ipa_udp_ports, ipa_udp_add_callback);
}