aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-per.c
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2011-08-09 08:00:06 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2011-08-09 08:00:06 +0000
commit733452afd76a4d9036f88416a96578ddd83c1b7b (patch)
treea7cdc8658f0e8e2dd434ae8db85bd43abc25e1ce /epan/dissectors/packet-per.c
parente22f19f645f992062aacb234f2daaeefe6e94028 (diff)
Support for Extension Addition Group in PER encoding
Fix for bug 6196 https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6199 svn path=/trunk/; revision=38421
Diffstat (limited to 'epan/dissectors/packet-per.c')
-rw-r--r--epan/dissectors/packet-per.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c
index 4751f33648..d264d3a817 100644
--- a/epan/dissectors/packet-per.c
+++ b/epan/dissectors/packet-per.c
@@ -1802,6 +1802,7 @@ index_get_extension_name(const per_sequence_t *sequence, int idx)
for(i=0;sequence[i].p_id;i++){
if(sequence[i].extension==ASN1_NOT_EXTENSION_ROOT){
if (idx == 0) {
+ if (*sequence[i].p_id == -1) return "extension addition group";
hfi = proto_registrar_get_nth(*sequence[i].p_id);
return (hfi) ? hfi->name : "<unknown filed>";
}
@@ -2011,6 +2012,57 @@ DEBUG_ENTRY("dissect_per_sequence");
return offset;
}
+guint32
+dissect_per_sequence_eag(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, const per_sequence_t *sequence)
+{
+ gboolean optional_field_flag;
+ guint32 i, num_opts;
+ guint32 optional_mask;
+
+DEBUG_ENTRY("dissect_per_sequence_eag");
+
+ num_opts=0;
+ for(i=0;sequence[i].p_id;i++){
+ if(sequence[i].optional==ASN1_OPTIONAL){
+ num_opts++;
+ }
+ }
+
+ optional_mask=0;
+ for(i=0;i<num_opts;i++){
+ offset=dissect_per_boolean(tvb, offset, actx, tree, hf_per_optional_field_bit, &optional_field_flag);
+ if (tree) {
+ proto_item_append_text(actx->created_item, " (%s %s present)",
+ index_get_optional_name(sequence, i), optional_field_flag?"is":"is NOT");
+ }
+ if (!display_internal_per_fields) PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ optional_mask<<=1;
+ if(optional_field_flag){
+ optional_mask|=0x01;
+ }
+ }
+
+ for(i=0;sequence[i].p_id;i++){
+ if(sequence[i].optional==ASN1_OPTIONAL){
+ gboolean is_present;
+ if (num_opts == 0){
+ continue;
+ }
+ is_present=(1<<(num_opts-1))&optional_mask;
+ num_opts--;
+ if(!is_present){
+ continue;
+ }
+ }
+ if(sequence[i].func){
+ offset=sequence[i].func(tvb, offset, actx, tree, *sequence[i].p_id);
+ } else {
+ PER_NOT_DECODED_YET(index_get_field_name(sequence, i));
+ }
+ }
+
+ return offset;
+}
/* 15 Encoding the bitstring type