diff options
-rw-r--r-- | asn1/h225/h225.cnf | 15 | ||||
-rw-r--r-- | epan/asn1.c | 16 | ||||
-rw-r--r-- | epan/asn1.h | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-h225.c | 132 | ||||
-rw-r--r-- | epan/dissectors/packet-h225.h | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-per.c | 38 | ||||
-rw-r--r-- | epan/dissectors/packet-per.h | 3 | ||||
-rwxr-xr-x | tools/asn2wrs.py | 24 |
8 files changed, 186 insertions, 48 deletions
diff --git a/asn1/h225/h225.cnf b/asn1/h225/h225.cnf index 510bd74b23..21b309cec3 100644 --- a/asn1/h225/h225.cnf +++ b/asn1/h225/h225.cnf @@ -697,6 +697,21 @@ H221NonStandard/manufacturerCode VAL_PTR = &manufacturerCode #=== end of GEF ========================================================================= +# TBCD-STRING is additionally constrained +# parameter stack is used for passing this constraint + +#.FN_HDR TBCD-STRING + int min_len, max_len; + gboolean has_extension; + + get_size_constraint_from_stack(actx, "TBCD_STRING", &min_len, &max_len, &has_extension); +#.FN_PARS TBCD-STRING +MIN_VAL = min_len +MAX_VAL = max_len +EXT = has_extension +#.END + + #.TYPE_ATTR H221NonStandard/t35CountryCode TYPE = FT_UINT32 DISPLAY = BASE_DEC STRINGS = VALS(T35CountryCode_vals) TransportAddress/ipAddress/ip TYPE = FT_IPv4 DISPLAY = BASE_NONE STRINGS = NULL diff --git a/epan/asn1.c b/epan/asn1.c index 19038ae7e8..801e00aa54 100644 --- a/epan/asn1.c +++ b/epan/asn1.c @@ -125,6 +125,14 @@ static asn1_par_t *push_new_par(asn1_ctx_t *actx) { return par; } +void asn1_param_push_boolean(asn1_ctx_t *actx, gboolean value) { + asn1_par_t *par; + + par = push_new_par(actx); + par->ptype = ASN1_PAR_BOOLEAN; + par->value.v_boolean = value; +} + void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value) { asn1_par_t *par; @@ -133,6 +141,14 @@ void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value) { par->value.v_integer = value; } +gboolean asn1_param_get_boolean(asn1_ctx_t *actx, const gchar *name) { + asn1_par_t *par = NULL; + + par = get_par_by_name(actx, name); + DISSECTOR_ASSERT(par); + return par->value.v_boolean; +} + gint32 asn1_param_get_integer(asn1_ctx_t *actx, const gchar *name) { asn1_par_t *par = NULL; diff --git a/epan/asn1.h b/epan/asn1.h index 0f792bd482..5d0c9e306c 100644 --- a/epan/asn1.h +++ b/epan/asn1.h @@ -43,6 +43,7 @@ typedef enum { typedef enum { ASN1_PAR_IRR, /* irrelevant parameter */ /* value */ + ASN1_PAR_BOOLEAN, ASN1_PAR_INTEGER, /* type */ ASN1_PAR_TYPE @@ -57,6 +58,7 @@ typedef struct _asn1_par_t { const gchar *name; asn1_par_type ptype; union { + gboolean v_boolean; gint32 v_integer; void *v_type; } value; @@ -179,7 +181,9 @@ extern void asn1_stack_frame_push(asn1_ctx_t *actx, const gchar *name); extern void asn1_stack_frame_pop(asn1_ctx_t *actx, const gchar *name); extern void asn1_stack_frame_check(asn1_ctx_t *actx, const gchar *name, const asn1_par_def_t *par_def); +extern void asn1_param_push_boolean(asn1_ctx_t *actx, gboolean value); extern void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value); +extern gboolean asn1_param_get_boolean(asn1_ctx_t *actx, const gchar *name); extern gint32 asn1_param_get_integer(asn1_ctx_t *actx, const gchar *name); extern void rose_ctx_init(rose_ctx_t *rctx); diff --git a/epan/dissectors/packet-h225.c b/epan/dissectors/packet-h225.c index 556cec691f..96b2087c89 100644 --- a/epan/dissectors/packet-h225.c +++ b/epan/dissectors/packet-h225.c @@ -1,7 +1,7 @@ /* Do not modify this file. */ /* It is created automatically by the ASN.1 to Wireshark dissector compiler */ /* packet-h225.c */ -/* ../../tools/asn2wrs.py -e -p h225 -c ./h225.cnf -s ./packet-h225-template -D . H323-MESSAGES.asn */ +/* ../../tools/asn2wrs.py -e -p h225 -c h225.cnf -s packet-h225-template H323-MESSAGES.asn */ /* Input file: packet-h225-template.c */ @@ -406,24 +406,24 @@ static int hf_h225_pISNSpecificNumber = -1; /* NULL */ static int hf_h225_localNumber = -1; /* NULL */ static int hf_h225_ansi_41_uim = -1; /* ANSI_41_UIM */ static int hf_h225_gsm_uim = -1; /* GSM_UIM */ -static int hf_h225_imsi = -1; /* TBCD_STRING */ -static int hf_h225_min = -1; /* TBCD_STRING */ -static int hf_h225_mdn = -1; /* TBCD_STRING */ -static int hf_h225_msisdn = -1; /* TBCD_STRING */ -static int hf_h225_esn = -1; /* TBCD_STRING */ -static int hf_h225_mscid = -1; /* TBCD_STRING */ +static int hf_h225_imsi = -1; /* TBCD_STRING_SIZE_3_16 */ +static int hf_h225_min = -1; /* TBCD_STRING_SIZE_3_16 */ +static int hf_h225_mdn = -1; /* TBCD_STRING_SIZE_3_16 */ +static int hf_h225_msisdn = -1; /* TBCD_STRING_SIZE_3_16 */ +static int hf_h225_esn = -1; /* TBCD_STRING_SIZE_16 */ +static int hf_h225_mscid = -1; /* TBCD_STRING_SIZE_3_16 */ static int hf_h225_system_id = -1; /* T_system_id */ -static int hf_h225_sid = -1; /* TBCD_STRING */ -static int hf_h225_mid = -1; /* TBCD_STRING */ +static int hf_h225_sid = -1; /* TBCD_STRING_SIZE_1_4 */ +static int hf_h225_mid = -1; /* TBCD_STRING_SIZE_1_4 */ static int hf_h225_systemMyTypeCode = -1; /* OCTET_STRING_SIZE_1 */ static int hf_h225_systemAccessType = -1; /* OCTET_STRING_SIZE_1 */ static int hf_h225_qualificationInformationCode = -1; /* OCTET_STRING_SIZE_1 */ -static int hf_h225_sesn = -1; /* TBCD_STRING */ -static int hf_h225_soc = -1; /* TBCD_STRING */ +static int hf_h225_sesn = -1; /* TBCD_STRING_SIZE_16 */ +static int hf_h225_soc = -1; /* TBCD_STRING_SIZE_3_16 */ static int hf_h225_tmsi = -1; /* OCTET_STRING_SIZE_1_4 */ -static int hf_h225_imei = -1; /* TBCD_STRING */ -static int hf_h225_hplmn = -1; /* TBCD_STRING */ -static int hf_h225_vplmn = -1; /* TBCD_STRING */ +static int hf_h225_imei = -1; /* TBCD_STRING_SIZE_15_16 */ +static int hf_h225_hplmn = -1; /* TBCD_STRING_SIZE_1_4 */ +static int hf_h225_vplmn = -1; /* TBCD_STRING_SIZE_1_4 */ static int hf_h225_isupE164Number = -1; /* IsupPublicPartyNumber */ static int hf_h225_isupDataPartyNumber = -1; /* IsupDigits */ static int hf_h225_isupTelexPartyNumber = -1; /* IsupDigits */ @@ -1895,14 +1895,50 @@ dissect_h225_PartyNumber(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_ static int dissect_h225_TBCD_STRING(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { +#line 704 "h225.cnf" + int min_len, max_len; + gboolean has_extension; + + get_size_constraint_from_stack(actx, "TBCD_STRING", &min_len, &max_len, &has_extension); + offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index, - NO_BOUND, NO_BOUND, "0123456789#*abc", 15, + min_len, max_len, "0123456789#*abc", 15, NULL); return offset; } + +static int +dissect_h225_TBCD_STRING_SIZE_3_16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + offset = dissect_per_size_constrained_type(tvb, offset, actx, tree, hf_index, dissect_h225_TBCD_STRING, + "TBCD_STRING", 3, 16, FALSE); + + return offset; +} + + + +static int +dissect_h225_TBCD_STRING_SIZE_16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + offset = dissect_per_size_constrained_type(tvb, offset, actx, tree, hf_index, dissect_h225_TBCD_STRING, + "TBCD_STRING", 16, 16, FALSE); + + return offset; +} + + + +static int +dissect_h225_TBCD_STRING_SIZE_1_4(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + offset = dissect_per_size_constrained_type(tvb, offset, actx, tree, hf_index, dissect_h225_TBCD_STRING, + "TBCD_STRING", 1, 4, FALSE); + + return offset; +} + + static const value_string h225_T_system_id_vals[] = { { 0, "sid" }, { 1, "mid" }, @@ -1910,8 +1946,8 @@ static const value_string h225_T_system_id_vals[] = { }; static const per_choice_t T_system_id_choice[] = { - { 0, &hf_h225_sid , ASN1_EXTENSION_ROOT , dissect_h225_TBCD_STRING }, - { 1, &hf_h225_mid , ASN1_EXTENSION_ROOT , dissect_h225_TBCD_STRING }, + { 0, &hf_h225_sid , ASN1_EXTENSION_ROOT , dissect_h225_TBCD_STRING_SIZE_1_4 }, + { 1, &hf_h225_mid , ASN1_EXTENSION_ROOT , dissect_h225_TBCD_STRING_SIZE_1_4 }, { 0, NULL, 0, NULL } }; @@ -1936,18 +1972,18 @@ dissect_h225_OCTET_STRING_SIZE_1(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t * static const per_sequence_t ANSI_41_UIM_sequence[] = { - { &hf_h225_imsi , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_min , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_mdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_msisdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_esn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_mscid , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, + { &hf_h225_imsi , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, + { &hf_h225_min , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, + { &hf_h225_mdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, + { &hf_h225_msisdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, + { &hf_h225_esn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_16 }, + { &hf_h225_mscid , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, { &hf_h225_system_id , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_h225_T_system_id }, { &hf_h225_systemMyTypeCode, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_OCTET_STRING_SIZE_1 }, { &hf_h225_systemAccessType, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_OCTET_STRING_SIZE_1 }, { &hf_h225_qualificationInformationCode, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_OCTET_STRING_SIZE_1 }, - { &hf_h225_sesn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_soc , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, + { &hf_h225_sesn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_16 }, + { &hf_h225_soc , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, { NULL, 0, 0, NULL } }; @@ -1970,13 +2006,23 @@ dissect_h225_OCTET_STRING_SIZE_1_4(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t } + +static int +dissect_h225_TBCD_STRING_SIZE_15_16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + offset = dissect_per_size_constrained_type(tvb, offset, actx, tree, hf_index, dissect_h225_TBCD_STRING, + "TBCD_STRING", 15, 16, FALSE); + + return offset; +} + + static const per_sequence_t GSM_UIM_sequence[] = { - { &hf_h225_imsi , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, + { &hf_h225_imsi , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, { &hf_h225_tmsi , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_OCTET_STRING_SIZE_1_4 }, - { &hf_h225_msisdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_imei , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_hplmn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, - { &hf_h225_vplmn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING }, + { &hf_h225_msisdn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_3_16 }, + { &hf_h225_imei , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_15_16 }, + { &hf_h225_hplmn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_1_4 }, + { &hf_h225_vplmn , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_h225_TBCD_STRING_SIZE_1_4 }, { NULL, 0, 0, NULL } }; @@ -8688,27 +8734,27 @@ void proto_register_h225(void) { { &hf_h225_imsi, { "imsi", "h225.imsi", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_min, { "min", "h225.min", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_mdn, { "mdn", "h225.mdn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_msisdn, { "msisdn", "h225.msisdn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_esn, { "esn", "h225.esn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_16", HFILL }}, { &hf_h225_mscid, { "mscid", "h225.mscid", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_system_id, { "system-id", "h225.system_id", FT_UINT32, BASE_DEC, VALS(h225_T_system_id_vals), 0, @@ -8716,11 +8762,11 @@ void proto_register_h225(void) { { &hf_h225_sid, { "sid", "h225.sid", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_1_4", HFILL }}, { &hf_h225_mid, { "mid", "h225.mid", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_1_4", HFILL }}, { &hf_h225_systemMyTypeCode, { "systemMyTypeCode", "h225.systemMyTypeCode", FT_BYTES, BASE_HEX, NULL, 0, @@ -8736,11 +8782,11 @@ void proto_register_h225(void) { { &hf_h225_sesn, { "sesn", "h225.sesn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_16", HFILL }}, { &hf_h225_soc, { "soc", "h225.soc", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_3_16", HFILL }}, { &hf_h225_tmsi, { "tmsi", "h225.tmsi", FT_BYTES, BASE_HEX, NULL, 0, @@ -8748,15 +8794,15 @@ void proto_register_h225(void) { { &hf_h225_imei, { "imei", "h225.imei", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_15_16", HFILL }}, { &hf_h225_hplmn, { "hplmn", "h225.hplmn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_1_4", HFILL }}, { &hf_h225_vplmn, { "vplmn", "h225.vplmn", FT_STRING, BASE_NONE, NULL, 0, - "h225.TBCD_STRING", HFILL }}, + "h225.TBCD_STRING_SIZE_1_4", HFILL }}, { &hf_h225_isupE164Number, { "e164Number", "h225.e164Number", FT_NONE, BASE_NONE, NULL, 0, diff --git a/epan/dissectors/packet-h225.h b/epan/dissectors/packet-h225.h index b9145b3d0e..8521fab2aa 100644 --- a/epan/dissectors/packet-h225.h +++ b/epan/dissectors/packet-h225.h @@ -1,7 +1,7 @@ /* Do not modify this file. */ /* It is created automatically by the ASN.1 to Wireshark dissector compiler */ /* packet-h225.h */ -/* ../../tools/asn2wrs.py -e -p h225 -c ./h225.cnf -s ./packet-h225-template -D . H323-MESSAGES.asn */ +/* ../../tools/asn2wrs.py -e -p h225 -c h225.cnf -s packet-h225-template H323-MESSAGES.asn */ /* Input file: packet-h225-template.h */ diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c index 33998810f4..f2a9a36ba0 100644 --- a/epan/dissectors/packet-per.c +++ b/epan/dissectors/packet-per.c @@ -1880,6 +1880,44 @@ guint32 dissect_per_octet_string_containing_pdu_new(tvbuff_t *tvb, guint32 offse return offset; } +guint32 dissect_per_size_constrained_type(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type_cb, const gchar *name, int min_len, int max_len, gboolean has_extension) +{ + asn1_stack_frame_push(actx, name); + asn1_param_push_integer(actx, min_len); + asn1_param_push_integer(actx, max_len); + asn1_param_push_boolean(actx, has_extension); + + offset = type_cb(tvb, offset, actx, tree, hf_index); + + asn1_stack_frame_pop(actx, name); + + return offset; +} + +gboolean get_size_constraint_from_stack(asn1_ctx_t *actx, const gchar *name, int *pmin_len, int *pmax_len, gboolean *phas_extension) +{ + asn1_par_t *par; + + if (pmin_len) *pmin_len = NO_BOUND; + if (pmax_len) *pmax_len = NO_BOUND; + if (phas_extension) *phas_extension = FALSE; + + if (!actx->stack) return FALSE; + if (strcmp(actx->stack->name, name)) return FALSE; + + par = actx->stack->par; + if (!par || (par->ptype != ASN1_PAR_INTEGER)) return FALSE; + if (pmin_len) *pmin_len = par->value.v_integer; + par = par->next; + if (!par || (par->ptype != ASN1_PAR_INTEGER)) return FALSE; + if (pmax_len) *pmax_len = par->value.v_integer; + par = par->next; + if (!par || (par->ptype != ASN1_PAR_BOOLEAN)) return FALSE; + if (phas_extension) *phas_extension = par->value.v_boolean; + + return TRUE; +} + /* 26 Encoding of a value of the external type */ diff --git a/epan/dissectors/packet-per.h b/epan/dissectors/packet-per.h index 68416b9b10..1b89e9eeac 100644 --- a/epan/dissectors/packet-per.h +++ b/epan/dissectors/packet-per.h @@ -124,4 +124,7 @@ extern guint32 dissect_per_open_type_pdu_new(tvbuff_t *tvb, guint32 offset, asn1 extern guint32 dissect_per_external_type(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type_cb); +extern guint32 dissect_per_size_constrained_type(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type_cb, const gchar *name, int min_len, int max_len, gboolean has_extension); +extern gboolean get_size_constraint_from_stack(asn1_ctx_t *actx, const gchar *name, int *pmin_len, int *pmax_len, gboolean *phas_extension); + #endif /* __PACKET_PER_H__ */ diff --git a/tools/asn2wrs.py b/tools/asn2wrs.py index aa8fb2a2ea..f3f9a1bb2d 100755 --- a/tools/asn2wrs.py +++ b/tools/asn2wrs.py @@ -3011,7 +3011,7 @@ class Type (Node): if not ident and ectx.conform.omit_assignment('T', nm, ectx.Module()): return # Assignment to omit if not ident: # Assignment ectx.eth_reg_assign(nm, self) - if self.type == 'Type_Ref': + if self.type == 'Type_Ref' and not self.tr_need_own_fn(ectx): ectx.eth_reg_type(nm, self) virtual_tr = Type_Ref(val=ectx.conform.use_item('SET_TYPE', nm)) if (self.type == 'Type_Ref') or ectx.conform.check_item('SET_TYPE', nm): @@ -3023,6 +3023,9 @@ class Type (Node): trnm = nm elif ectx.conform.check_item('SET_TYPE', nm): trnm = ectx.conform.use_item('SET_TYPE', nm) + elif (self.type == 'Type_Ref') and self.tr_need_own_fn(ectx): + ectx.eth_reg_type(nm, self) # need own function, e.g. for constraints + trnm = nm else: trnm = self.val else: @@ -3484,7 +3487,13 @@ class Type_Ref (Type): ectx.eth_dep_add(ident, self.val) def eth_tname(self): - return asn2c(self.val) + if self.HasSizeConstraint(): + return asn2c(self.val) + '_' + self.constr.eth_constrname() + else: + return asn2c(self.val) + + def tr_need_own_fn(self, ectx): + return ectx.Per() and self.HasSizeConstraint() def fld_obj_repr(self, ectx): return self.val @@ -3526,6 +3535,8 @@ class Type_Ref (Type): pars['TYPE_REF_PROTO'] = ectx.eth_type[t]['proto'] pars['TYPE_REF_TNAME'] = t pars['TYPE_REF_FN'] = 'dissect_%(TYPE_REF_PROTO)s_%(TYPE_REF_TNAME)s' + if self.HasSizeConstraint(): + (pars['MIN_VAL'], pars['MAX_VAL'], pars['EXT']) = self.eth_get_size_constr(ectx) return pars def eth_type_default_body(self, ectx, tname): @@ -3533,8 +3544,13 @@ class Type_Ref (Type): body = ectx.eth_fn_call('%(TYPE_REF_FN)s', ret='offset', par=(('%(IMPLICIT_TAG)s', '%(TVB)s', '%(OFFSET)s', '%(ACTX)s', '%(TREE)s', '%(HF_INDEX)s'),)) elif (ectx.Per()): - body = ectx.eth_fn_call('%(TYPE_REF_FN)s', ret='offset', - par=(('%(TVB)s', '%(OFFSET)s', '%(ACTX)s', '%(TREE)s', '%(HF_INDEX)s'),)) + if self.HasSizeConstraint(): + body = ectx.eth_fn_call('dissect_%(ER)s_size_constrained_type', ret='offset', + par=(('%(TVB)s', '%(OFFSET)s', '%(ACTX)s', '%(TREE)s', '%(HF_INDEX)s', '%(TYPE_REF_FN)s',), + ('"%(TYPE_REF_TNAME)s"', '%(MIN_VAL)s', '%(MAX_VAL)s', '%(EXT)s',),)) + else: + body = ectx.eth_fn_call('%(TYPE_REF_FN)s', ret='offset', + par=(('%(TVB)s', '%(OFFSET)s', '%(ACTX)s', '%(TREE)s', '%(HF_INDEX)s'),)) else: body = '#error Can not decode %s' % (tname) return body |