aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-isdn.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2011-11-05 20:47:11 +0000
committerGuy Harris <guy@alum.mit.edu>2011-11-05 20:47:11 +0000
commitd0fa4d6df7708861cc9150cd594e22f14309eeb2 (patch)
treeb5e130b73debc99854cc574def40a2c9b919c51b /epan/dissectors/packet-isdn.c
parent74ad858e3a6da8bfc563ac46497028e50ebae9ec (diff)
Add a preference to select whether to use LAPD or DPNSS as the protocol
on the D channel. svn path=/trunk/; revision=39739
Diffstat (limited to 'epan/dissectors/packet-isdn.c')
-rw-r--r--epan/dissectors/packet-isdn.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/epan/dissectors/packet-isdn.c b/epan/dissectors/packet-isdn.c
index 7bf56cdc12..19de077ed3 100644
--- a/epan/dissectors/packet-isdn.c
+++ b/epan/dissectors/packet-isdn.c
@@ -28,6 +28,7 @@
#include <glib.h>
#include <epan/packet.h>
+#include <epan/prefs.h>
#include <epan/circuit.h>
static int proto_isdn = -1;
@@ -35,7 +36,22 @@ static int hf_isdn_channel = -1;
static gint ett_isdn = -1;
+/*
+ * Protocol used on the D channel.
+ */
+#define DCHANNEL_LAPD 0 /* LAPD */
+#define DCHANNEL_DPNSS 1 /* DPNSS link layer */
+
+static enum_val_t dchannel_protocol_options[] = {
+ { "lapd", "LAPD", DCHANNEL_LAPD },
+ { "DPNSS", "DPNSS", DCHANNEL_DPNSS },
+ { NULL, NULL, 0 }
+};
+
+static int dchannel_protocol = DCHANNEL_LAPD;
+
static dissector_handle_t lapd_handle;
+static dissector_handle_t dpnss_link_handle;
static dissector_handle_t ppp_hdlc_handle;
static dissector_handle_t v120_handle;
static dissector_handle_t data_handle;
@@ -121,9 +137,21 @@ dissect_isdn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case 0:
/*
- * D-channel. Treat it as LAPD.
+ * D-channel. Dissect it with whatever protocol
+ * the user specified, or the default of LAPD if
+ * they didn't specify one.
*/
- circuit_set_dissector(circuit, lapd_handle);
+ switch (dchannel_protocol) {
+
+ case DCHANNEL_LAPD:
+ circuit_set_dissector(circuit, lapd_handle);
+ break;
+
+ case DCHANNEL_DPNSS:
+ circuit_set_dissector(circuit,
+ dpnss_link_handle);
+ break;
+ }
break;
default:
@@ -186,9 +214,18 @@ proto_register_isdn(void)
static gint *ett[] = {
&ett_isdn,
};
+ module_t *isdn_module;
+
proto_isdn = proto_register_protocol("ISDN", "ISDN", "isdn");
proto_register_field_array(proto_isdn, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
+ isdn_module = prefs_register_protocol(proto_isdn, NULL);
+
+ prefs_register_enum_preference(isdn_module, "dchannel_protocol",
+ "D-channel protocol",
+ "The protocol running on the D channel",
+ &dchannel_protocol, dchannel_protocol_options, FALSE);
}
void
@@ -197,9 +234,11 @@ proto_reg_handoff_isdn(void)
dissector_handle_t isdn_handle;
/*
- * Get handles for the LAPD, PPP, and V.120 dissectors.
+ * Get handles for the LAPD, DPNSS link-layer, PPP, and V.120
+ * dissectors.
*/
lapd_handle = find_dissector("lapd");
+ dpnss_link_handle = find_dissector("dpnss_link");
ppp_hdlc_handle = find_dissector("ppp_hdlc");
v120_handle = find_dissector("v120");
data_handle = find_dissector("data");