diff options
Diffstat (limited to 'epan/dissectors/asn1/cdt/cdt.cnf')
-rw-r--r-- | epan/dissectors/asn1/cdt/cdt.cnf | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/cdt/cdt.cnf b/epan/dissectors/asn1/cdt/cdt.cnf new file mode 100644 index 0000000000..a3b8e0a7e2 --- /dev/null +++ b/epan/dissectors/asn1/cdt/cdt.cnf @@ -0,0 +1,106 @@ +# cdt.cnf +# Compressed Data Type conformation file + +#.EXPORTS +CompressedData + +#.REGISTER +CompressedData B "1.3.26.0.4406.0.4.2" "cdt" + +#.FN_BODY CompressedData + content_type = 0; + + %(DEFAULT_BODY)s + +#.FN_PARS AlgorithmID-ShortForm + VAL_PTR = &value + +#.FN_BODY AlgorithmID-ShortForm + guint32 value; + + %(DEFAULT_BODY)s + proto_item_append_text (cdt_item, ", %%s", + val_to_str (value, cdt_AlgorithmID_ShortForm_vals, + "unknown")); + + col_append_fstr (actx->pinfo->cinfo, COL_INFO, "%%s ", + val_to_str (value, cdt_AlgorithmID_ShortForm_vals, + "unknown")); + +#.FN_PARS ContentType-ShortForm + VAL_PTR = &content_type + +#.FN_BODY ContentType-ShortForm + + %(DEFAULT_BODY)s + proto_item_append_text (cdt_item, ", %%s", + val_to_str (content_type, cdt_ContentType_ShortForm_vals, + "unknown")); + + col_append_fstr (actx->pinfo->cinfo, COL_INFO, "%%s ", + val_to_str (content_type, cdt_ContentType_ShortForm_vals, + "unknown")); + +#.FN_PARS CompressedContentInfo/contentType/contentType-OID + FN_VARIANT = _str VAL_PTR = &obj_id + +#.FN_BODY CompressedContentInfo/contentType/contentType-OID + const char *obj_id = NULL; + + %(DEFAULT_BODY)s + if (obj_id) { + const char *name = oid_resolved_from_string (wmem_packet_scope(), obj_id); + + if (!name) { + name = obj_id; + } + + proto_item_append_text (cdt_item, ", %%s", name); + + col_append_fstr (actx->pinfo->cinfo, COL_INFO, "%%s ", name); + } + +#.FN_PARS CompressedContent + VAL_PTR = &compr_tvb + +#.FN_BODY CompressedContent + tvbuff_t *next_tvb = NULL, *compr_tvb = NULL; + int save_offset = offset; + + %(DEFAULT_BODY)s + if (compr_tvb == NULL) { + proto_tree_add_expert(top_tree, actx->pinfo, &ei_cdt_unable_compress_content, + tvb, save_offset, -1); + col_append_str (actx->pinfo->cinfo, COL_INFO, + "[Error: Unable to get compressed content]"); + return offset; + } + + next_tvb = tvb_child_uncompress (tvb, compr_tvb, 0, tvb_reported_length (compr_tvb)); + + if (next_tvb == NULL) { + proto_tree_add_expert(top_tree, actx->pinfo, &ei_cdt_unable_uncompress_content, + tvb, save_offset, -1); + col_append_str (actx->pinfo->cinfo, COL_INFO, + "[Error: Unable to uncompress content]"); + return offset; + } + + add_new_data_source (actx->pinfo, next_tvb, "Uncompressed Content"); + + switch (content_type) { + case CDT_UNDEFINED: + call_dissector (data_handle, next_tvb, actx->pinfo, top_tree); + break; + case CDT_EXTERNAL: + dissect_unknown_ber (actx->pinfo, next_tvb, 0, top_tree); + break; + case CDT_P1: + dissect_p1_mts_apdu (next_tvb, actx->pinfo, top_tree, NULL); + break; + default: + call_dissector (data_handle, next_tvb, actx->pinfo, top_tree); + break; + } + +#.END |