aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-nas_eps.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/epan/dissectors/packet-nas_eps.c b/epan/dissectors/packet-nas_eps.c
index 9bfdb95acf..047f39012d 100644
--- a/epan/dissectors/packet-nas_eps.c
+++ b/epan/dissectors/packet-nas_eps.c
@@ -7750,9 +7750,44 @@ proto_register_nas_eps(void)
&g_nas_eps_user_data_container_as_ip);
}
+/* Heuristic dissector looks for "nas-eps" string at packet start */
+static gboolean dissect_nas_eps_heur(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void *data _U_)
+{
+ gint offset = 0;
+ tvbuff_t *nas_tvb;
+
+ /* Needs to be at least as long as:
+ - the signature string
+ - at least one byte of NAS PDU payload */
+ if (tvb_captured_length_remaining(tvb, offset) < (gint)(strlen(PFNAME)+1)) {
+ return FALSE;
+ }
+
+ /* OK, compare with signature string */
+ if (tvb_strneql(tvb, offset, PFNAME, strlen(PFNAME)) != 0) {
+ return FALSE;
+ }
+ offset += (gint)strlen(PFNAME);
+
+ /* Clear protocol name */
+ col_clear(pinfo->cinfo, COL_PROTOCOL);
+
+ /* Clear info column */
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ /* Create tvb that starts at actual NAS PDU */
+ nas_tvb = tvb_new_subset_remaining(tvb, offset);
+ dissect_nas_eps(nas_tvb, pinfo, tree, NULL);
+
+ return TRUE;
+}
+
void
proto_reg_handoff_nas_eps(void)
{
+ heur_dissector_add("udp", dissect_nas_eps_heur, "NAS-EPS over UDP", "nas_eps_udp", proto_nas_eps, HEURISTIC_DISABLE);
+
gsm_a_dtap_handle = find_dissector_add_dependency("gsm_a_dtap", proto_nas_eps);
lpp_handle = find_dissector_add_dependency("lpp", proto_nas_eps);
nbifom_handle = find_dissector_add_dependency("nbifom", proto_nas_eps);