aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asn1/acse/acse.cnf2
-rw-r--r--asn1/acse/packet-acse-template.c44
-rw-r--r--asn1/pres/ISO8823-PRESENTATION.asn40
-rw-r--r--asn1/pres/packet-pres-template.c65
-rw-r--r--asn1/pres/pres.cnf2
-rw-r--r--epan/dissectors/packet-acse.c60
-rw-r--r--epan/dissectors/packet-ositp.c24
-rw-r--r--epan/dissectors/packet-pres.c137
-rw-r--r--epan/dissectors/packet-ses.c79
-rw-r--r--epan/dissectors/packet-ses.h5
-rw-r--r--epan/osi-utils.c7
11 files changed, 377 insertions, 88 deletions
diff --git a/asn1/acse/acse.cnf b/asn1/acse/acse.cnf
index 9b41f16336..c9c8b0ac33 100644
--- a/asn1/acse/acse.cnf
+++ b/asn1/acse/acse.cnf
@@ -40,7 +40,7 @@ AARE-apdu/_untag/protocol-version aARE_protocol_version
AARQ-apdu/_untag/aSO-context-name aARQ_aSO_context_name
AARE-apdu/_untag/aSO-context-name aARE_aSO_context_name
ACRQ-apdu/_untag/aSO-context-name aCRQ_aSO_context_name
-
+PDV-list/presentation-data-values/octet-aligned pDVList_octet_aligned
#.FN_PARS Authentication-value-other/other-mechanism-name
FN_VARIANT = _str VAL_PTR = &object_identifier_id
diff --git a/asn1/acse/packet-acse-template.c b/asn1/acse/packet-acse-template.c
index 4764c9e20a..46056b166e 100644
--- a/asn1/acse/packet-acse-template.c
+++ b/asn1/acse/packet-acse-template.c
@@ -58,10 +58,19 @@
#define PSNAME "ACSE"
#define PFNAME "acse"
+#define CLPNAME "ISO 10035-1 OSI Connectionless Association Control Service"
+#define CLPSNAME "CLACSE"
+#define CLPFNAME "clacse"
+
+
#define ACSE_APDU_OID "2.2.1.0.1"
/* Initialize the protocol and registered fields */
-static int proto_acse = -1;
+int proto_acse = -1;
+int proto_clacse = -1;
+
+
+
#include "packet-acse-hf.c"
/* Initialize the subtree pointers */
@@ -196,6 +205,7 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
+ case CLSES_UNIT_DATA: /* AARQ Connetctionless session */
break;
case SES_DATA_TRANSFER:
oid=find_oid_by_pres_ctx_id(pinfo, indir_ref);
@@ -217,14 +227,28 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
return;
}
- /* create display subtree for the protocol */
- if(parent_tree){
- item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, FALSE);
- tree = proto_item_add_subtree(item, ett_acse);
+ if(session->spdu_type == CLSES_UNIT_DATA)
+ {
+ /* create display subtree for the connectionless protocol */
+ if(parent_tree)
+ {
+ item = proto_tree_add_item(parent_tree, proto_clacse, tvb, 0, -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_acse);
+ }
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "CL-ACSE");
+ col_clear(pinfo->cinfo, COL_INFO);
+ }
+ else
+ {
+ /* create display subtree for the protocol */
+ if(parent_tree)
+ {
+ item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_acse);
+ }
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE");
+ col_clear(pinfo->cinfo, COL_INFO);
}
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE");
- col_clear(pinfo->cinfo, COL_INFO);
-
/* we can't make any additional checking here */
/* postpone it before dissector will have more information */
@@ -258,6 +282,10 @@ void proto_register_acse(void) {
proto_acse = proto_register_protocol(PNAME, PSNAME, PFNAME);
register_dissector("acse", dissect_acse, proto_acse);
+ /* Register connectionless protocol */
+ proto_clacse = proto_register_protocol(CLPNAME, CLPSNAME, CLPFNAME);
+
+
/* Register fields and subtrees */
proto_register_field_array(proto_acse, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
diff --git a/asn1/pres/ISO8823-PRESENTATION.asn b/asn1/pres/ISO8823-PRESENTATION.asn
index 2255198774..d36d5a2c12 100644
--- a/asn1/pres/ISO8823-PRESENTATION.asn
+++ b/asn1/pres/ISO8823-PRESENTATION.asn
@@ -388,5 +388,45 @@ User-session-requirements ::= BIT STRING {
END
+-- Module ISO9576-PRESENTATION (X.236)
+ISO9576-CONNECTIONLESS-PRESENTATION DEFINITIONS ::=
+BEGIN
+
+--
+-- The value of the SS-user data parameter of the S-UNIT-DATA request and indication
+-- session-service primitives shall be a UD-type value, followed as a requestor’s
+-- option by zero or more UDC-type values.
+--
+
+UD-type ::= SEQUENCE {
+ protocol-version [0] IMPLICIT Protocol-version DEFAULT {version-1},
+ calling-presentation-selector [1] IMPLICIT Calling-presentation-selector OPTIONAL,
+ called-presentation-selector [2] IMPLICIT Called-presentation-selector OPTIONAL,
+ presentation-context-definition-list [4] IMPLICIT
+ Presentation-context-definition-list OPTIONAL,
+ user-data User-data
+}
+
+-- Shall be the parameters of the UD PPDU.
+--
+-- As an initiator’s option, the presentation data values contained in a UD PPDU may be
+-- encoded more than once, using UDC-type values, to allow the transfer of the same
+-- presentation data values using a number of different transfer syntaxes.
+--
+
+UDC-type ::= User-data
+-- Shall not be present if the Presentation context definition list parameter is not present
+-- in the UD PPDU. Each instance of this data type shall contain all of the presentation data
+-- values which were contained in the User data parameter of the UD PPDU.
+-- This shall be the same set of presentation data values which were contained in the UD-type.
+--
+
+-- WS: trunkated here as the rest is present in the previous ASN1 def.
+END
+
+
+
+
+
-- Generated by Asnp, the ASN.1 pretty-printer of France Telecom R&D
diff --git a/asn1/pres/packet-pres-template.c b/asn1/pres/packet-pres-template.c
index f7cba4b951..1f73ec85ed 100644
--- a/asn1/pres/packet-pres-template.c
+++ b/asn1/pres/packet-pres-template.c
@@ -1,6 +1,6 @@
/* packet-pres.c
* Routine to dissect ISO 8823 OSI Presentation Protocol packets
- * Based on the dissector by
+ * Based on the dissector by
* Yuriy Sidelnikov <YSidelnikov@hotmail.com>
*
* $Id$
@@ -51,9 +51,17 @@
#define PSNAME "PRES"
#define PFNAME "pres"
+#define CLPNAME "ISO 9576-1 OSI Connectionless Presentation Protocol"
+#define CLPSNAME "CLPRES"
+#define CLPFNAME "clpres"
+
/* Initialize the protocol and registered fields */
static int proto_pres = -1;
+/* Initialize the connectionles protocol */
+static int proto_clpres = -1;
+
+
/* type of session envelop */
static struct SESSION_DATA_STRUCTURE* session = NULL;
@@ -137,7 +145,7 @@ register_ctx_id_and_oid(packet_info *pinfo _U_, guint32 idx, const char *oid)
pco=se_alloc(sizeof(pres_ctx_oid_t));
pco->ctx_id=idx;
pco->oid=se_strdup(oid);
- conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conversation) {
pco->index = conversation->index;
@@ -161,7 +169,7 @@ find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx)
conversation_t *conversation;
pco.ctx_id=idx;
- conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conversation) {
pco.index = conversation->index;
@@ -201,7 +209,7 @@ pres_try_users_table(guint32 ctx_id, tvbuff_t *tvb, int offset, packet_info *pin
{
tvbuff_t *next_tvb;
guint i;
-
+
for (i = 0; i < num_pres_users; i++) {
pres_user_t *u = &(pres_users[i]);
@@ -300,25 +308,48 @@ dissect_pres(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
{
int offset = 0, old_offset;
+ session = ((struct SESSION_DATA_STRUCTURE*)(pinfo->private_data));
+
/* first, try to check length */
/* do we have at least 4 bytes */
if (!tvb_bytes_exist(tvb, 0, 4)){
- session = ((struct SESSION_DATA_STRUCTURE*)(pinfo->private_data));
if (session && session->spdu_type != SES_MAJOR_SYNC_POINT) {
- proto_tree_add_text(parent_tree, tvb, offset,
+ proto_tree_add_text(parent_tree, tvb, offset,
tvb_reported_length_remaining(tvb,offset),"User data");
return; /* no, it isn't a presentation PDU */
}
}
+ /* save pointers for calling the acse dissector */
+ global_tree = parent_tree;
+ global_pinfo = pinfo;
+
+ /* if the session unit-data packet then we process it */
+ /* as a connectionless presentation protocol unit data */
+ if(session && session->spdu_type == CLSES_UNIT_DATA)
+ {
+ proto_tree * clpres_tree = NULL;
+ proto_item *ti;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "CL-PRES");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ if (parent_tree)
+ {
+ ti = proto_tree_add_item(parent_tree, proto_clpres, tvb, offset, -1, FALSE);
+ clpres_tree = proto_item_add_subtree(ti, ett_pres);
+ }
+
+ /* dissect the packet */
+ dissect_UD_type_PDU(tvb, pinfo, clpres_tree);
+ return;
+ }
+
/* we can't make any additional checking here */
/* postpone it before dissector will have more information */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PRES");
col_clear(pinfo->cinfo, COL_INFO);
- /* save pointers for calling the acse dissector */
- global_tree = parent_tree;
- global_pinfo = pinfo;
if (session && session->spdu_type == SES_MAJOR_SYNC_POINT) {
/* This is a reassembly initiated in packet-ses */
@@ -326,12 +357,12 @@ dissect_pres(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
if (oid) {
call_ber_oid_callback (oid, tvb, offset, pinfo, parent_tree);
} else {
- proto_tree_add_text(parent_tree, tvb, offset,
+ proto_tree_add_text(parent_tree, tvb, offset,
tvb_reported_length_remaining(tvb,offset),"User data");
}
return;
}
-
+
while (tvb_reported_length_remaining(tvb, offset) > 0){
old_offset = offset;
offset = dissect_ppdu(tvb, offset, pinfo, parent_tree);
@@ -378,7 +409,7 @@ void proto_register_pres(void) {
&ett_pres,
#include "packet-pres-ettarr.c"
};
-
+
static uat_field_t users_flds[] = {
UAT_FLD_DEC(pres_users,ctx_id,"Context Id","Presentation Context Identifier"),
UAT_FLD_CSTRING(pres_users,oid,"Syntax Name OID","Abstract Syntax Name (Object Identifier)"),
@@ -397,12 +428,16 @@ void proto_register_pres(void) {
NULL,
pres_free_cb,
users_flds);
-
+
static module_t *pres_module;
-
+
/* Register protocol */
proto_pres = proto_register_protocol(PNAME, PSNAME, PFNAME);
register_dissector("pres", dissect_pres, proto_pres);
+
+ /* Register connectionless protocol (just for the description) */
+ proto_clpres = proto_register_protocol(CLPNAME, CLPSNAME, CLPFNAME);
+
/* Register fields and subtrees */
proto_register_field_array(proto_pres, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
@@ -420,7 +455,7 @@ void proto_register_pres(void) {
/*--- proto_reg_handoff_pres ---------------------------------------*/
void proto_reg_handoff_pres(void) {
-/* register_ber_oid_dissector("0.4.0.0.1.1.1.1", dissect_pres, proto_pres,
+/* register_ber_oid_dissector("0.4.0.0.1.1.1.1", dissect_pres, proto_pres,
"itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) abstractSyntax(1) pres(1) version1(1)"); */
}
diff --git a/asn1/pres/pres.cnf b/asn1/pres/pres.cnf
index 9bc98ea6fa..bfefbfd120 100644
--- a/asn1/pres/pres.cnf
+++ b/asn1/pres/pres.cnf
@@ -8,6 +8,8 @@
#.EXPORTS
#.PDU
+UD-type
+UDC-type
#.NO_EMIT
diff --git a/epan/dissectors/packet-acse.c b/epan/dissectors/packet-acse.c
index 5db854322a..ecf994f94a 100644
--- a/epan/dissectors/packet-acse.c
+++ b/epan/dissectors/packet-acse.c
@@ -66,10 +66,19 @@
#define PSNAME "ACSE"
#define PFNAME "acse"
+#define CLPNAME "ISO 10035-1 OSI Connectionless Association Control Service"
+#define CLPSNAME "CLACSE"
+#define CLPFNAME "clacse"
+
+
#define ACSE_APDU_OID "2.2.1.0.1"
/* Initialize the protocol and registered fields */
-static int proto_acse = -1;
+int proto_acse = -1;
+int proto_clacse = -1;
+
+
+
/*--- Included file: packet-acse-hf.c ---*/
#line 1 "packet-acse-hf.c"
@@ -167,7 +176,7 @@ static int hf_acse_fully_encoded_data = -1; /* PDV_list */
static int hf_acse_presentation_context_identifier = -1; /* Presentation_context_identifier */
static int hf_acse_presentation_data_values = -1; /* T_presentation_data_values */
static int hf_acse_simple_ASN1_type = -1; /* T_simple_ASN1_type */
-static int hf_acse_octet_aligned_01 = -1; /* OCTET_STRING */
+static int hf_acse_pDVList_octet_aligned = -1; /* OCTET_STRING */
static int hf_acse_other_mechanism_name = -1; /* T_other_mechanism_name */
static int hf_acse_other_mechanism_value = -1; /* T_other_mechanism_value */
static int hf_acse_charstring = -1; /* GraphicString */
@@ -183,7 +192,7 @@ static int hf_acse_ACSE_requirements_higher_level_association = -1;
static int hf_acse_ACSE_requirements_nested_association = -1;
/*--- End of included file: packet-acse-hf.c ---*/
-#line 66 "packet-acse-template.c"
+#line 75 "packet-acse-template.c"
/* Initialize the subtree pointers */
static gint ett_acse = -1;
@@ -227,7 +236,7 @@ static gint ett_acse_Authentication_value_other = -1;
static gint ett_acse_Authentication_value = -1;
/*--- End of included file: packet-acse-ett.c ---*/
-#line 70 "packet-acse-template.c"
+#line 79 "packet-acse-template.c"
static struct SESSION_DATA_STRUCTURE* session = NULL;
@@ -1406,7 +1415,7 @@ static const value_string acse_T_presentation_data_values_vals[] = {
static const ber_choice_t T_presentation_data_values_choice[] = {
{ 0, &hf_acse_simple_ASN1_type, BER_CLASS_CON, 0, 0, dissect_acse_T_simple_ASN1_type },
- { 1, &hf_acse_octet_aligned_01, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_OCTET_STRING },
+ { 1, &hf_acse_pDVList_octet_aligned, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_OCTET_STRING },
{ 2, &hf_acse_arbitrary , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_acse_BIT_STRING },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -1645,7 +1654,7 @@ dissect_acse_AE_title(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _
/*--- End of included file: packet-acse-fn.c ---*/
-#line 146 "packet-acse-template.c"
+#line 155 "packet-acse-template.c"
/*
@@ -1699,6 +1708,7 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
+ case CLSES_UNIT_DATA: /* AARQ Connetctionless session */
break;
case SES_DATA_TRANSFER:
oid=find_oid_by_pres_ctx_id(pinfo, indir_ref);
@@ -1720,14 +1730,28 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
return;
}
- /* create display subtree for the protocol */
- if(parent_tree){
- item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, FALSE);
- tree = proto_item_add_subtree(item, ett_acse);
+ if(session->spdu_type == CLSES_UNIT_DATA)
+ {
+ /* create display subtree for the connectionless protocol */
+ if(parent_tree)
+ {
+ item = proto_tree_add_item(parent_tree, proto_clacse, tvb, 0, -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_acse);
+ }
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "CL-ACSE");
+ col_clear(pinfo->cinfo, COL_INFO);
+ }
+ else
+ {
+ /* create display subtree for the protocol */
+ if(parent_tree)
+ {
+ item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_acse);
+ }
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE");
+ col_clear(pinfo->cinfo, COL_INFO);
}
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE");
- col_clear(pinfo->cinfo, COL_INFO);
-
/* we can't make any additional checking here */
/* postpone it before dissector will have more information */
@@ -2127,7 +2151,7 @@ void proto_register_acse(void) {
{ "simple-ASN1-type", "acse.simple_ASN1_type",
FT_NONE, BASE_NONE, NULL, 0,
"acse.T_simple_ASN1_type", HFILL }},
- { &hf_acse_octet_aligned_01,
+ { &hf_acse_pDVList_octet_aligned,
{ "octet-aligned", "acse.octet_aligned",
FT_BYTES, BASE_NONE, NULL, 0,
"acse.OCTET_STRING", HFILL }},
@@ -2181,7 +2205,7 @@ void proto_register_acse(void) {
NULL, HFILL }},
/*--- End of included file: packet-acse-hfarr.c ---*/
-#line 249 "packet-acse-template.c"
+#line 273 "packet-acse-template.c"
};
/* List of subtrees */
@@ -2227,13 +2251,17 @@ void proto_register_acse(void) {
&ett_acse_Authentication_value,
/*--- End of included file: packet-acse-ettarr.c ---*/
-#line 255 "packet-acse-template.c"
+#line 279 "packet-acse-template.c"
};
/* Register protocol */
proto_acse = proto_register_protocol(PNAME, PSNAME, PFNAME);
register_dissector("acse", dissect_acse, proto_acse);
+ /* Register connectionless protocol */
+ proto_clacse = proto_register_protocol(CLPNAME, CLPSNAME, CLPFNAME);
+
+
/* Register fields and subtrees */
proto_register_field_array(proto_acse, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
diff --git a/epan/dissectors/packet-ositp.c b/epan/dissectors/packet-ositp.c
index bbd25fc0fd..4b337d202c 100644
--- a/epan/dissectors/packet-ositp.c
+++ b/epan/dissectors/packet-ositp.c
@@ -248,6 +248,8 @@ static int hf_cotp_vp_dst_tsap_bytes = -1;
static heur_dissector_list_t cotp_is_heur_subdissector_list;
/* List of dissectors to call for COTP packets put atop CLNP */
static heur_dissector_list_t cotp_heur_subdissector_list;
+/* List of dissectors to call for CLTP packets put atop CLNP */
+static heur_dissector_list_t cltp_heur_subdissector_list;
/*
* Reassembly of COTP.
@@ -1555,7 +1557,8 @@ static int ositp_decode_ER(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
} /* ositp_decode_ER */
static int ositp_decode_UD(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
- packet_info *pinfo, proto_tree *tree)
+ packet_info *pinfo, proto_tree *tree,
+ gboolean *subdissector_found)
{
proto_item *ti;
proto_tree *cltp_tree = NULL;
@@ -1581,7 +1584,19 @@ static int ositp_decode_UD(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
offset += li;
next_tvb = tvb_new_subset_remaining(tvb, offset);
- call_dissector(data_handle,next_tvb, pinfo, tree);
+
+ if (dissector_try_heuristic(cltp_heur_subdissector_list, next_tvb,
+ pinfo, tree)) {
+ *subdissector_found = TRUE;
+ } else {
+ call_dissector(data_handle,next_tvb, pinfo, tree);
+ }
+
+
+ /*call_dissector(data_handle,next_tvb, pinfo, tree); */
+
+
+
offset += tvb_length_remaining(tvb, offset);
/* we dissected all of the containing PDU */
@@ -1669,7 +1684,7 @@ static gint dissect_ositp_internal(tvbuff_t *tvb, packet_info *pinfo,
new_offset = ositp_decode_ER(tvb, offset, li, tpdu, pinfo, tree);
break;
case UD_TPDU :
- new_offset = ositp_decode_UD(tvb, offset, li, tpdu, pinfo, tree);
+ new_offset = ositp_decode_UD(tvb, offset, li, tpdu, pinfo, tree, &subdissector_found);
is_cltp = TRUE;
break;
default :
@@ -1859,6 +1874,9 @@ void proto_register_cltp(void)
proto_cltp = proto_register_protocol(PROTO_STRING_CLTP, "CLTP", "cltp");
proto_register_field_array(proto_cltp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
+ register_heur_dissector_list("cltp", &cltp_heur_subdissector_list);
+
}
void
diff --git a/epan/dissectors/packet-pres.c b/epan/dissectors/packet-pres.c
index 643606211d..d6580f239e 100644
--- a/epan/dissectors/packet-pres.c
+++ b/epan/dissectors/packet-pres.c
@@ -8,7 +8,7 @@
#line 1 "packet-pres-template.c"
/* packet-pres.c
* Routine to dissect ISO 8823 OSI Presentation Protocol packets
- * Based on the dissector by
+ * Based on the dissector by
* Yuriy Sidelnikov <YSidelnikov@hotmail.com>
*
* $Id$
@@ -59,9 +59,17 @@
#define PSNAME "PRES"
#define PFNAME "pres"
+#define CLPNAME "ISO 9576-1 OSI Connectionless Presentation Protocol"
+#define CLPSNAME "CLPRES"
+#define CLPFNAME "clpres"
+
/* Initialize the protocol and registered fields */
static int proto_pres = -1;
+/* Initialize the connectionles protocol */
+static int proto_clpres = -1;
+
+
/* type of session envelop */
static struct SESSION_DATA_STRUCTURE* session = NULL;
@@ -97,6 +105,8 @@ static int hf_pres_Typed_data_type = -1;
/*--- Included file: packet-pres-hf.c ---*/
#line 1 "packet-pres-hf.c"
+static int hf_pres_UD_type_PDU = -1; /* UD_type */
+static int hf_pres_UDC_type_PDU = -1; /* UDC_type */
static int hf_pres_mode_selector = -1; /* Mode_selector */
static int hf_pres_x410_mode_parameters = -1; /* RTORQapdu */
static int hf_pres_normal_mode_parameters = -1; /* T_normal_mode_parameters */
@@ -176,7 +186,7 @@ static int hf_pres_User_session_requirements_symmetric_synchronize = -1;
static int hf_pres_User_session_requirements_data_separation = -1;
/*--- End of included file: packet-pres-hf.c ---*/
-#line 90 "packet-pres-template.c"
+#line 98 "packet-pres-template.c"
/* Initialize the subtree pointers */
static gint ett_pres = -1;
@@ -219,9 +229,10 @@ static gint ett_pres_Fully_encoded_data = -1;
static gint ett_pres_PDV_list = -1;
static gint ett_pres_T_presentation_data_values = -1;
static gint ett_pres_User_session_requirements = -1;
+static gint ett_pres_UD_type = -1;
/*--- End of included file: packet-pres-ett.c ---*/
-#line 95 "packet-pres-template.c"
+#line 103 "packet-pres-template.c"
UAT_DEC_CB_DEF(pres_users, ctx_id, pres_user_t)
UAT_CSTRING_CB_DEF(pres_users, oid, pres_user_t)
@@ -267,7 +278,7 @@ register_ctx_id_and_oid(packet_info *pinfo _U_, guint32 idx, const char *oid)
pco=se_alloc(sizeof(pres_ctx_oid_t));
pco->ctx_id=idx;
pco->oid=se_strdup(oid);
- conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conversation) {
pco->index = conversation->index;
@@ -291,7 +302,7 @@ find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx)
conversation_t *conversation;
pco.ctx_id=idx;
- conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ conversation=find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conversation) {
pco.index = conversation->index;
@@ -331,7 +342,7 @@ pres_try_users_table(guint32 ctx_id, tvbuff_t *tvb, int offset, packet_info *pin
{
tvbuff_t *next_tvb;
guint i;
-
+
for (i = 0; i < num_pres_users; i++) {
pres_user_t *u = &(pres_users[i]);
@@ -428,7 +439,7 @@ dissect_pres_Called_presentation_selector(gboolean implicit_tag _U_, tvbuff_t *t
static int
dissect_pres_Presentation_context_identifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 75 "pres.cnf"
+#line 77 "pres.cnf"
const char *name;
char *oid;
@@ -491,13 +502,13 @@ static const ber_sequence_t Context_list_item_sequence[] = {
static int
dissect_pres_Context_list_item(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 90 "pres.cnf"
+#line 92 "pres.cnf"
abstract_syntax_name_oid=NULL;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
Context_list_item_sequence, hf_index, ett_pres_Context_list_item);
-#line 93 "pres.cnf"
+#line 95 "pres.cnf"
register_ctx_id_and_oid(actx->pinfo, presentation_context_identifier, abstract_syntax_name_oid);
return offset;
@@ -627,7 +638,7 @@ dissect_pres_Simply_encoded_data(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i
static int
dissect_pres_T_single_ASN1_type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 35 "pres.cnf"
+#line 37 "pres.cnf"
tvbuff_t *next_tvb;
char *oid;
@@ -654,7 +665,7 @@ dissect_pres_T_single_ASN1_type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in
static int
dissect_pres_T_octet_aligned(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 51 "pres.cnf"
+#line 53 "pres.cnf"
tvbuff_t *next_tvb;
char *oid;
@@ -1322,8 +1333,48 @@ dissect_pres_RSA_PPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _
}
+static const ber_sequence_t UD_type_sequence[] = {
+ { &hf_pres_protocol_version, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pres_Protocol_version },
+ { &hf_pres_calling_presentation_selector, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pres_Calling_presentation_selector },
+ { &hf_pres_called_presentation_selector, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pres_Called_presentation_selector },
+ { &hf_pres_presentation_context_definition_list, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pres_Presentation_context_definition_list },
+ { &hf_pres_user_data , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_pres_User_data },
+ { NULL, 0, 0, 0, NULL }
+};
+
+static int
+dissect_pres_UD_type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+ offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
+ UD_type_sequence, hf_index, ett_pres_UD_type);
+
+ return offset;
+}
+
+
+
+static int
+dissect_pres_UDC_type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+ offset = dissect_pres_User_data(implicit_tag, tvb, offset, actx, tree, hf_index);
+
+ return offset;
+}
+
+/*--- PDUs ---*/
+
+static void dissect_UD_type_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
+ asn1_ctx_t asn1_ctx;
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+ dissect_pres_UD_type(FALSE, tvb, 0, &asn1_ctx, tree, hf_pres_UD_type_PDU);
+}
+static void dissect_UDC_type_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
+ asn1_ctx_t asn1_ctx;
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+ dissect_pres_UDC_type(FALSE, tvb, 0, &asn1_ctx, tree, hf_pres_UDC_type_PDU);
+}
+
+
/*--- End of included file: packet-pres-fn.c ---*/
-#line 222 "packet-pres-template.c"
+#line 230 "packet-pres-template.c"
/*
@@ -1405,25 +1456,48 @@ dissect_pres(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
{
int offset = 0, old_offset;
+ session = ((struct SESSION_DATA_STRUCTURE*)(pinfo->private_data));
+
/* first, try to check length */
/* do we have at least 4 bytes */
if (!tvb_bytes_exist(tvb, 0, 4)){
- session = ((struct SESSION_DATA_STRUCTURE*)(pinfo->private_data));
if (session && session->spdu_type != SES_MAJOR_SYNC_POINT) {
- proto_tree_add_text(parent_tree, tvb, offset,
+ proto_tree_add_text(parent_tree, tvb, offset,
tvb_reported_length_remaining(tvb,offset),"User data");
return; /* no, it isn't a presentation PDU */
}
}
+ /* save pointers for calling the acse dissector */
+ global_tree = parent_tree;
+ global_pinfo = pinfo;
+
+ /* if the session unit-data packet then we process it */
+ /* as a connectionless presentation protocol unit data */
+ if(session && session->spdu_type == CLSES_UNIT_DATA)
+ {
+ proto_tree * clpres_tree = NULL;
+ proto_item *ti;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "CL-PRES");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ if (parent_tree)
+ {
+ ti = proto_tree_add_item(parent_tree, proto_clpres, tvb, offset, -1, FALSE);
+ clpres_tree = proto_item_add_subtree(ti, ett_pres);
+ }
+
+ /* dissect the packet */
+ dissect_UD_type_PDU(tvb, pinfo, clpres_tree);
+ return;
+ }
+
/* we can't make any additional checking here */
/* postpone it before dissector will have more information */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PRES");
col_clear(pinfo->cinfo, COL_INFO);
- /* save pointers for calling the acse dissector */
- global_tree = parent_tree;
- global_pinfo = pinfo;
if (session && session->spdu_type == SES_MAJOR_SYNC_POINT) {
/* This is a reassembly initiated in packet-ses */
@@ -1431,12 +1505,12 @@ dissect_pres(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
if (oid) {
call_ber_oid_callback (oid, tvb, offset, pinfo, parent_tree);
} else {
- proto_tree_add_text(parent_tree, tvb, offset,
+ proto_tree_add_text(parent_tree, tvb, offset,
tvb_reported_length_remaining(tvb,offset),"User data");
}
return;
}
-
+
while (tvb_reported_length_remaining(tvb, offset) > 0){
old_offset = offset;
offset = dissect_ppdu(tvb, offset, pinfo, parent_tree);
@@ -1478,6 +1552,14 @@ void proto_register_pres(void) {
/*--- Included file: packet-pres-hfarr.c ---*/
#line 1 "packet-pres-hfarr.c"
+ { &hf_pres_UD_type_PDU,
+ { "UD-type", "pres.UD_type",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "pres.UD_type", HFILL }},
+ { &hf_pres_UDC_type_PDU,
+ { "UDC-type", "pres.UDC_type",
+ FT_UINT32, BASE_DEC, VALS(pres_User_data_vals), 0,
+ "pres.UDC_type", HFILL }},
{ &hf_pres_mode_selector,
{ "mode-selector", "pres.mode_selector",
FT_NONE, BASE_NONE, NULL, 0,
@@ -1784,7 +1866,7 @@ void proto_register_pres(void) {
NULL, HFILL }},
/*--- End of included file: packet-pres-hfarr.c ---*/
-#line 374 "packet-pres-template.c"
+#line 405 "packet-pres-template.c"
};
/* List of subtrees */
@@ -1828,11 +1910,12 @@ void proto_register_pres(void) {
&ett_pres_PDV_list,
&ett_pres_T_presentation_data_values,
&ett_pres_User_session_requirements,
+ &ett_pres_UD_type,
/*--- End of included file: packet-pres-ettarr.c ---*/
-#line 380 "packet-pres-template.c"
+#line 411 "packet-pres-template.c"
};
-
+
static uat_field_t users_flds[] = {
UAT_FLD_DEC(pres_users,ctx_id,"Context Id","Presentation Context Identifier"),
UAT_FLD_CSTRING(pres_users,oid,"Syntax Name OID","Abstract Syntax Name (Object Identifier)"),
@@ -1851,12 +1934,16 @@ void proto_register_pres(void) {
NULL,
pres_free_cb,
users_flds);
-
+
static module_t *pres_module;
-
+
/* Register protocol */
proto_pres = proto_register_protocol(PNAME, PSNAME, PFNAME);
register_dissector("pres", dissect_pres, proto_pres);
+
+ /* Register connectionless protocol (just for the description) */
+ proto_clpres = proto_register_protocol(CLPNAME, CLPSNAME, CLPFNAME);
+
/* Register fields and subtrees */
proto_register_field_array(proto_pres, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
@@ -1874,7 +1961,7 @@ void proto_register_pres(void) {
/*--- proto_reg_handoff_pres ---------------------------------------*/
void proto_reg_handoff_pres(void) {
-/* register_ber_oid_dissector("0.4.0.0.1.1.1.1", dissect_pres, proto_pres,
+/* register_ber_oid_dissector("0.4.0.0.1.1.1.1", dissect_pres, proto_pres,
"itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) abstractSyntax(1) pres(1) version1(1)"); */
}
diff --git a/epan/dissectors/packet-ses.c b/epan/dissectors/packet-ses.c
index 9f518609fd..3435c6bd60 100644
--- a/epan/dissectors/packet-ses.c
+++ b/epan/dissectors/packet-ses.c
@@ -56,12 +56,6 @@ static int hf_ses_reserved = -1;
static gint ett_ses = -1;
static gint ett_ses_param = -1;
-/*
-----------------------------------------------------------------------------------------------------------*/
-static dissector_handle_t pres_handle = NULL;
-/*
-----------------------------------------------------------------------------------------------------------*/
-
/* flags */
static int hf_connect_protocol_options_flags = -1;
@@ -167,6 +161,19 @@ static int hf_large_initial_serial_number = -1;
/* large second initial serial number */
static int hf_large_second_initial_serial_number = -1;
+static int hf_cltp_li = -1;
+static int hf_cltp_type = -1;
+
+/* clses header fields */
+static int proto_clses = -1;
+
+#define PROTO_STRING_CLSES "ISO 9548-1 OSI Connectionless Session Protocol"
+
+static dissector_handle_t pres_handle = NULL;
+
+
+
+
const value_string ses_vals[] =
{
{SES_CONNECTION_REQUEST, "CONNECT (CN) SPDU" }, /* 13 */
@@ -200,6 +207,7 @@ const value_string ses_vals[] =
{SES_ACTIVITY_DISCARD_ACK, "ACTIVITY DISCARD ACK (ADA) SPDU" },/* 58 */
{SES_CAPABILITY, "CAPABILITY DATA (CD) SPDU" }, /* 61 */
{SES_CAPABILITY_DATA_ACK, "CAPABILITY DATA ACK (CDA) SPDU" }, /* 62 */
+ {CLSES_UNIT_DATA, "UNIT DATA (UD) SPDU" }, /* 64 */
{0, NULL }
};
@@ -975,7 +983,7 @@ dissect_parameters(tvbuff_t *tvb, int offset, guint16 len, proto_tree *tree,
*/
static int
dissect_spdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
- gboolean tokens)
+ gboolean tokens, gboolean connectionless)
{
gboolean has_user_information = FALSE;
guint8 type;
@@ -997,7 +1005,20 @@ dissect_spdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
session.ros_op = 0;
session.rtse_reassemble = FALSE;
- if (tokens) {
+ if(connectionless) {
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_add_str(pinfo->cinfo, COL_INFO,
+ val_to_str(type, ses_vals, "Unknown SPDU type (0x%02x)"));
+ if (tree) {
+ ti = proto_tree_add_item(tree, proto_clses, tvb, offset,
+ -1, FALSE);
+ ses_tree = proto_item_add_subtree(ti, ett_ses);
+ proto_tree_add_uint(ses_tree, hf_ses_type, tvb,
+ offset, 1, type);
+ }
+ has_user_information = TRUE;
+ }
+ else if (tokens) {
if (check_col(pinfo->cinfo, COL_INFO))
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str(type, ses_category0_vals, "Unknown SPDU type (0x%02x)"));
@@ -1014,17 +1035,16 @@ dissect_spdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
val_to_str(type, ses_vals, "Unknown SPDU type (0x%02x)"));
if (tree) {
ti = proto_tree_add_item(tree, proto_ses, tvb, offset,
- -1, FALSE);
+ -1, FALSE);
ses_tree = proto_item_add_subtree(ti, ett_ses);
proto_tree_add_uint(ses_tree, hf_ses_type, tvb,
- offset, 1, type);
+ offset, 1, type);
}
/*
* Might this SPDU have a User Information field?
*/
switch (type) {
-
case SES_DATA_TRANSFER:
case SES_EXPEDITED:
case SES_TYPED_DATA:
@@ -1068,12 +1088,10 @@ dissect_spdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
if (has_user_information) {
if (tvb_reported_length_remaining(tvb, offset) > 0 || type == SES_MAJOR_SYNC_POINT) {
next_tvb = tvb_new_subset_remaining(tvb, offset);
-
- /* do we have OSI presentation packet dissector ? */
if(!pres_handle)
{
call_dissector(data_handle, next_tvb, pinfo,
- tree);
+ tree);
}
else
{
@@ -1081,7 +1099,7 @@ dissect_spdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
save_private_data = pinfo->private_data;
pinfo->private_data = &session;
call_dissector(pres_handle, next_tvb, pinfo,
- tree);
+ tree);
pinfo->private_data = save_private_data;
}
@@ -1107,10 +1125,17 @@ dissect_ses(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
int offset = 0;
guint8 type;
+ gboolean is_clsp = FALSE;
+
+ type = tvb_get_guint8(tvb, offset);
+ if(type == CLSES_UNIT_DATA)
+ is_clsp = TRUE;
+
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "SES");
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, is_clsp ? "CLSES" : "SES");
col_clear(pinfo->cinfo, COL_INFO);
+
/*
* Do we have a category 0 SPDU (GIVE_TOKENS/PLEASE_TOKENS) as
* the first SPDU?
@@ -1118,13 +1143,13 @@ dissect_ses(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* If so, dissect it as such (GIVE_TOKENS and DATA_TRANSFER have
* the same SPDU type value).
*/
- type = tvb_get_guint8(tvb, offset);
if (type == SES_PLEASE_TOKENS || type == SES_GIVE_TOKENS)
- offset = dissect_spdu(tvb, offset, pinfo, tree, TOKENS_SPDU);
+ offset = dissect_spdu(tvb, offset, pinfo, tree, TOKENS_SPDU, FALSE);
+
/* Dissect the remaining SPDUs. */
while (tvb_reported_length_remaining(tvb, offset) > 0)
- offset = dissect_spdu(tvb, offset, pinfo, tree, NON_TOKENS_SPDU);
+ offset = dissect_spdu(tvb, offset, pinfo, tree, NON_TOKENS_SPDU, is_clsp);
}
void
@@ -1788,6 +1813,7 @@ proto_register_ses(void)
proto_register_field_array(proto_ses, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
/*
ses_module = prefs_register_protocol(proto_ses, NULL);
@@ -1878,3 +1904,18 @@ proto_reg_handoff_ses(void)
heur_dissector_add("cotp", dissect_ses_heur, proto_ses);
heur_dissector_add("cotp_is", dissect_ses_heur, proto_ses);
}
+
+
+
+void proto_register_clses(void)
+{
+ proto_clses = proto_register_protocol(PROTO_STRING_CLSES, "CLSP", "clsp");
+}
+
+void
+proto_reg_handoff_clses(void)
+{
+ /* add our session dissector to cltp dissector list */
+ heur_dissector_add("cltp", dissect_ses_heur, proto_clses);
+}
+
diff --git a/epan/dissectors/packet-ses.h b/epan/dissectors/packet-ses.h
index 72e2417382..98a599e330 100644
--- a/epan/dissectors/packet-ses.h
+++ b/epan/dissectors/packet-ses.h
@@ -25,8 +25,12 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+
#define PROTO_STRING_SES "ISO 8327-1 OSI Session Protocol"
#define PROTO_STRING_SES_INFO "ISO 8327-1 OSI Session Protocol."
+
+
+
/*
* Dissect ses-encapsulated data in a TCP stream.
*/
@@ -99,6 +103,7 @@
#define SES_ACTIVITY_DISCARD_ACK 58
#define SES_CAPABILITY 61
#define SES_CAPABILITY_DATA_ACK 62
+#define CLSES_UNIT_DATA 64
/*
reason code
diff --git a/epan/osi-utils.c b/epan/osi-utils.c
index 81e1a956a6..00632a6e6b 100644
--- a/epan/osi-utils.c
+++ b/epan/osi-utils.c
@@ -188,7 +188,12 @@ print_area_buf(const guint8 *ad, int length, gchar *buf, int buf_len)
g_snprintf(buf, buf_len, "%02x.%02x%02x", ad[0], ad[1], ad[2] );
return;
}
- if ( 4 < length ) {
+ if(length == 4)
+ {
+ g_snprintf(buf, buf_len, "%02x%02x%02x%02x", ad[0], ad[1], ad[2], ad[3] );
+ }
+ if ( 4 < length )
+ {
while ( tmp < length / 4 ) { /* 16/4==4 > four Octets left to print */
cur += g_snprintf(cur, (gulong) (buf_len-(cur-buf)), "%02x", ad[tmp++] );
cur += g_snprintf(cur, (gulong) (buf_len-(cur-buf)), "%02x", ad[tmp++] );