Skip to content

Commit 9bb1aa5

Browse files
committed
Fix bug with complex types in ASN.1 choice classes
1 parent c6c54ef commit 9bb1aa5

33 files changed

Lines changed: 60 additions & 90 deletions

src/icspacket/examples/gooseobserv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def _format_data(self, data: Data) -> Any:
146146
text.append(str(data.boolean))
147147
case Data.PRESENT.PR_integer:
148148
text.append(str(data.integer))
149-
case Data.PRESENT.PR_Unsigned:
149+
case Data.PRESENT.PR_unsigned:
150150
text.append(str(data.unsigned))
151151
case Data.PRESENT.PR_visible_string:
152152
text.append(escape(repr(data.visible_string or "<EMPTY>")))

src/icspacket/examples/iedmap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def get_node_value(self, node_ref: ObjectReference) -> Text | None:
187187
text.append(f"{get_floating_point_value(data.floating_point)}")
188188
case Data.PRESENT.PR_integer:
189189
text.append(str(data.integer))
190-
case Data.PRESENT.PR_Unsigned:
190+
case Data.PRESENT.PR_unsigned:
191191
text.append(str(data.unsigned))
192192
case Data.PRESENT.PR_visible_string:
193193
text.append(escape(repr(data.visible_string or "<EMPTY>")))

src/icspacket/proto/iec61850/_iec61850.asn1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ ASDU ::= SEQUENCE {
143143
refrTm [4] IMPLICIT UtcTime OPTIONAL,
144144
smpSynch [5] IMPLICIT INTEGER{none(0),local(1),global(2)} OPTIONAL,
145145
smpRate [6] IMPLICIT INTEGER(0..65535) OPTIONAL,
146-
seqData [7] IMPLICIT Data,
147-
smpMod [8] IMPLICIT INTEGER{samplesPerNormalPeriod(0),samplesPerSecond(1),secondsPerSample(2)} OPTIONAL,
148-
gmidData [9] IMPLICIT GmidData OPTIONAL
146+
seqData [7] Data,
147+
smpMod [8] IMPLICIT INTEGER{samplesPerNormalPeriod(0),samplesPerSecond(1),secondsPerSample(2)} OPTIONAL
148+
-- gmidData [9] IMPLICIT GmidData OPTIONAL
149149
-- ...
150150
}
151151

src/icspacket/proto/iec61850/_iec61850/ASDU.c

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ asn_TYPE_member_t asn_MBR_ASDU_1[] = {
269269
},
270270
{ ATF_NOFLAGS, 0, offsetof(struct ASDU, seqData),
271271
(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
272-
-1, /* IMPLICIT tag at current level */
273-
&asn_DEF_OCTET_STRING,
272+
+1, /* EXPLICIT tag at current level */
273+
&asn_DEF_Data,
274274
0,
275275
{
276276
#if !defined(ASN_DISABLE_OER_SUPPORT)
@@ -287,7 +287,7 @@ asn_TYPE_member_t asn_MBR_ASDU_1[] = {
287287
0, 0, /* No default value */
288288
"seqData"
289289
},
290-
{ ATF_POINTER, 2, offsetof(struct ASDU, smpMod),
290+
{ ATF_POINTER, 1, offsetof(struct ASDU, smpMod),
291291
(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
292292
-1, /* IMPLICIT tag at current level */
293293
&asn_DEF_NativeInteger,
@@ -307,28 +307,8 @@ asn_TYPE_member_t asn_MBR_ASDU_1[] = {
307307
0, 0, /* No default value */
308308
"smpMod"
309309
},
310-
{ ATF_POINTER, 1, offsetof(struct ASDU, gmidData),
311-
(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
312-
-1, /* IMPLICIT tag at current level */
313-
&asn_DEF_OCTET_STRING,
314-
0,
315-
{
316-
#if !defined(ASN_DISABLE_OER_SUPPORT)
317-
0,
318-
#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */
319-
#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT)
320-
0,
321-
#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */
322-
#if !defined(ASN_DISABLE_JER_SUPPORT)
323-
0,
324-
#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */
325-
0
326-
},
327-
0, 0, /* No default value */
328-
"gmidData"
329-
},
330310
};
331-
static const int asn_MAP_ASDU_oms_1[] = { 1, 4, 5, 6, 8, 9 };
311+
static const int asn_MAP_ASDU_oms_1[] = { 1, 4, 5, 6, 8 };
332312
static const ber_tlv_tag_t asn_DEF_ASDU_tags_1[] = {
333313
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
334314
};
@@ -341,16 +321,15 @@ static const asn_TYPE_tag2member_t asn_MAP_ASDU_tag2el_1[] = {
341321
{ (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* smpSynch */
342322
{ (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* smpRate */
343323
{ (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* seqData */
344-
{ (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* smpMod */
345-
{ (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* gmidData */
324+
{ (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* smpMod */
346325
};
347326
asn_SEQUENCE_specifics_t asn_SPC_ASDU_specs_1 = {
348327
sizeof(struct ASDU),
349328
offsetof(struct ASDU, _asn_ctx),
350329
asn_MAP_ASDU_tag2el_1,
351-
10, /* Count of tags in the map */
330+
9, /* Count of tags in the map */
352331
asn_MAP_ASDU_oms_1, /* Optional members */
353-
6, 0, /* Root/Additions */
332+
5, 0, /* Root/Additions */
354333
-1, /* First extension addition */
355334
};
356335
asn_TYPE_descriptor_t asn_DEF_ASDU = {
@@ -376,7 +355,7 @@ asn_TYPE_descriptor_t asn_DEF_ASDU = {
376355
SEQUENCE_constraint
377356
},
378357
asn_MBR_ASDU_1,
379-
10, /* Elements count */
358+
9, /* Elements count */
380359
&asn_SPC_ASDU_specs_1 /* Additional specs */
381360
};
382361

src/icspacket/proto/iec61850/_iec61850/ASDU.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <VisibleString.h>
1414
#include <NativeInteger.h>
1515
#include <UtcTime.h>
16-
#include <OCTET_STRING.h>
16+
#include <Data.h>
1717
#include <constr_SEQUENCE.h>
1818

1919
#ifdef __cplusplus
@@ -41,9 +41,8 @@ typedef struct ASDU {
4141
UtcTime_t *refrTm; /* OPTIONAL */
4242
long *smpSynch; /* OPTIONAL */
4343
long *smpRate; /* OPTIONAL */
44-
OCTET_STRING_t seqData;
44+
Data_t seqData;
4545
long *smpMod; /* OPTIONAL */
46-
OCTET_STRING_t *gmidData; /* OPTIONAL */
4746

4847
/* Context for parsing across buffer boundaries */
4948
asn_struct_ctx_t _asn_ctx;
@@ -53,7 +52,7 @@ typedef struct ASDU {
5352
/* extern asn_TYPE_descriptor_t asn_DEF_confRev_5; // (Use -fall-defs-global to expose) */
5453
extern asn_TYPE_descriptor_t asn_DEF_ASDU;
5554
extern asn_SEQUENCE_specifics_t asn_SPC_ASDU_specs_1;
56-
extern asn_TYPE_member_t asn_MBR_ASDU_1[10];
55+
extern asn_TYPE_member_t asn_MBR_ASDU_1[9];
5756

5857
#ifdef __cplusplus
5958
}

src/icspacket/proto/iec61850/_iec61850/ASDU_Py.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55

66
#include <ASDU_Py.h>
7-
#include <asn_codecs_prim.h>
87

98
/* class implementation */
109
PY_IMPL_SEQ_ATTR_FROMPY(ASDU, svID, PyCompatUnicode_AsUTF8(value, &((OCTET_STRING_t *)(target))->buf, &((OCTET_STRING_t *)(target))->size));
@@ -44,8 +43,8 @@ PY_IMPL_SEQ_ATTR_INDIRECT_FROMPY(ASDU, smpRate, PyCompatLong_FromObject(value, t
4443
PY_IMPL_SEQ_ATTR_INDIRECT_TOPY(ASDU, smpRate, PyCompatLong_AsObject(target, 1));
4544
PY_IMPL_SEQ_OPT_GETATTR(ASDU, smpRate);
4645
PY_IMPL_SEQ_OPT_SETATTR(ASDU, smpRate);
47-
PY_IMPL_SEQ_ATTR_FROMPY(ASDU, seqData, PyCompatBytes_ToStringAndSize(value, &((ASN__PRIMITIVE_TYPE_t *)target)->buf, &((ASN__PRIMITIVE_TYPE_t *)target)->size));
48-
PY_IMPL_SEQ_ATTR_TOPY(ASDU, seqData, PyCompatBytes_FromStringAndSize(((ASN__PRIMITIVE_TYPE_t *)target)->buf, ((ASN__PRIMITIVE_TYPE_t *)target)->size));
46+
PY_IMPL_SEQ_ATTR_FROMPY(ASDU, seqData, PyAsnData_FromPython(value, (Data_t *)target));
47+
PY_IMPL_SEQ_REF_ATTR_TOPY(ASDU, seqData, Data);
4948
PY_IMPL_SEQ_GETATTR(ASDU, seqData);
5049
PY_IMPL_SEQ_SETATTR(ASDU, seqData);
5150
PY_IMPL_SEQ_ATTR_GENERIC_FREE(ASDU, smpMod);
@@ -55,12 +54,6 @@ PY_IMPL_SEQ_ATTR_INDIRECT_FROMPY(ASDU, smpMod, PyCompatEnum_FromObject(value, ta
5554
PY_IMPL_SEQ_ATTR_INDIRECT_TOPY(ASDU, smpMod, PyCompatEnum_AsObject(PyAsnEnumASDU_smpMod_Type, target, 0));
5655
PY_IMPL_SEQ_OPT_GETATTR(ASDU, smpMod);
5756
PY_IMPL_SEQ_OPT_SETATTR(ASDU, smpMod);
58-
PY_IMPL_SEQ_ATTR_GENERIC_FREE(ASDU, gmidData);
59-
PY_IMPL_SEQ_ATTR_GENERIC_NEW(ASDU, gmidData, OCTET_STRING_t);
60-
PY_IMPL_SEQ_ATTR_INDIRECT_FROMPY(ASDU, gmidData, PyCompatBytes_ToStringAndSize(value, &((ASN__PRIMITIVE_TYPE_t *)target)->buf, &((ASN__PRIMITIVE_TYPE_t *)target)->size));
61-
PY_IMPL_SEQ_ATTR_INDIRECT_TOPY(ASDU, gmidData, PyCompatBytes_FromStringAndSize(((ASN__PRIMITIVE_TYPE_t *)target)->buf, ((ASN__PRIMITIVE_TYPE_t *)target)->size));
62-
PY_IMPL_SEQ_OPT_GETATTR(ASDU, gmidData);
63-
PY_IMPL_SEQ_OPT_SETATTR(ASDU, gmidData);
6457
PY_IMPL_GENERIC_DEALLOC(ASDU);
6558
PY_IMPL_GENERIC_CHECK_CONSTRAINTS(ASDU);
6659
PY_IMPL_GENERIC_ENCODE(ASDU);
@@ -90,7 +83,6 @@ PY_IMPL_SEQ_FROMPY(ASDU, &asn_DEF_ASDU,
9083
PY_IMPL_SEQ_INIT_ATTR(ASDU, smpRate, smpRate);
9184
PY_IMPL_SEQ_INIT_ATTR(ASDU, seqData, seqData);
9285
PY_IMPL_SEQ_INIT_ATTR(ASDU, smpMod, smpMod);
93-
PY_IMPL_SEQ_INIT_ATTR(ASDU, gmidData, gmidData);
9486
);
9587
PY_IMPL_SEQ_INIT(ASDU);
9688

@@ -105,7 +97,6 @@ static PyGetSetDef PyAsnASDU_getset[] = {
10597
PY_IMPL_GETSET_ITEM_INTERNAL(ASDU, smpRate, smpRate),
10698
PY_IMPL_GETSET_ITEM_INTERNAL(ASDU, seqData, seqData),
10799
PY_IMPL_GETSET_ITEM_INTERNAL(ASDU, smpMod, smpMod),
108-
PY_IMPL_GETSET_ITEM_INTERNAL(ASDU, gmidData, gmidData),
109100
{NULL, NULL, NULL, NULL, NULL} /* sentinel */
110101
};
111102

src/icspacket/proto/iec61850/_iec61850/ASDU_Py.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <py_application.h>
1414
#include <py_convert.h>
1515
#include <UtcTime_Py.h>
16+
#include <Data_Py.h>
1617

1718
#ifdef __cplusplus
1819
extern "C" {

src/icspacket/proto/iec61850/_iec61850/Data_Py.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ PY_IMPL_ENCODE_JER(Data_array_ANON_2);
3434
PY_IMPL_GENERIC_IS_VALID(Data_array_ANON_2);
3535
PY_IMPL_SEQ_ANON_ATTR_FROMPY(Data, array, &src->choice.array, Data_array_ANON_2);
3636
PY_IMPL_SEQ_ANON_ATTR_TOPY(Data, array, &src->choice.array, Data_array_ANON_2);
37-
PY_IMPL_CHOICE_GENERIC_SETATTR(Data, Data, array, array, *asn_DEF_Data.elements[0].type);
37+
PY_IMPL_CHOICE_GENERIC_SETATTR(Data, Data, array, array, asn_DEF_Data);
3838
PY_IMPL_CHOICE_GETATTR(Data, Data, array, array);
3939
PY_IMPL_SEQ_OF_LEN(Data_array_ANON_2);
4040
PY_IMPL_SEQ_OF_GETITEM(Data_array_ANON_2);
@@ -67,7 +67,7 @@ PY_IMPL_ENCODE_JER(Data_structure_ANON_4);
6767
PY_IMPL_GENERIC_IS_VALID(Data_structure_ANON_4);
6868
PY_IMPL_SEQ_ANON_ATTR_FROMPY(Data, structure, &src->choice.structure, Data_structure_ANON_4);
6969
PY_IMPL_SEQ_ANON_ATTR_TOPY(Data, structure, &src->choice.structure, Data_structure_ANON_4);
70-
PY_IMPL_CHOICE_GENERIC_SETATTR(Data, Data, structure, structure, *asn_DEF_Data.elements[1].type);
70+
PY_IMPL_CHOICE_GENERIC_SETATTR(Data, Data, structure, structure, asn_DEF_Data);
7171
PY_IMPL_CHOICE_GETATTR(Data, Data, structure, structure);
7272
PY_IMPL_SEQ_OF_LEN(Data_structure_ANON_4);
7373
PY_IMPL_SEQ_OF_GETITEM(Data_structure_ANON_4);

src/icspacket/proto/iec61850/_iec61850/GSEMngtResponsePdu_Py.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ PY_IMPL_SEQ_FROMPY(GSEMngtResponsePdu_responsePositive_ANON_5, asn_DEF_GSEMngtRe
7171
PY_IMPL_SEQ_INIT(GSEMngtResponsePdu_responsePositive_ANON_5);
7272
PY_IMPL_SEQ_ANON_ATTR_FROMPY(GSEMngtResponsePdu_positiveNegative_ANON_4, responsePositive, &src->choice.responsePositive, GSEMngtResponsePdu_responsePositive_ANON_5);
7373
PY_IMPL_SEQ_ANON_ATTR_TOPY(GSEMngtResponsePdu_positiveNegative_ANON_4, responsePositive, &src->choice.responsePositive, GSEMngtResponsePdu_responsePositive_ANON_5);
74-
PY_IMPL_CHOICE_GENERIC_SETATTR(GSEMngtResponsePdu_positiveNegative_ANON_4, GSEMngtResponsePdu__positiveNegative, responsePositive, responsePositive, *asn_DEF_GSEMngtResponsePdu.elements[2].type->elements[0].type);
74+
PY_IMPL_CHOICE_GENERIC_SETATTR(GSEMngtResponsePdu_positiveNegative_ANON_4, GSEMngtResponsePdu__positiveNegative, responsePositive, responsePositive, asn_DEF_GSEMngtResponsePdu);
7575
PY_IMPL_CHOICE_GETATTR(GSEMngtResponsePdu_positiveNegative_ANON_4, GSEMngtResponsePdu__positiveNegative, responsePositive, responsePositive);
7676
PY_IMPL_CHOICE_ATTR_FROMPY(GSEMngtResponsePdu_positiveNegative_ANON_4, GSEMngtResponsePdu__positiveNegative, responseNegative, responseNegative,PyAsnGlbErrors_FromPython(value, &dst->choice.responseNegative));
7777
PY_IMPL_CHOICE_ATTR_TOPY(GSEMngtResponsePdu_positiveNegative_ANON_4, responseNegative, PyCompatAsnType_FromParent(&PyAsnGlbErrors_Type, parent, (void *)&src->choice.responseNegative));

src/icspacket/proto/iso_pres/_iso8823/ARU-PPDU_Py.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ PY_IMPL_SEQ_FROMPY(ARU_PPDU_normal_mode_parameters_ANON_2, asn_DEF_ARU_PPDU.elem
4444
PY_IMPL_SEQ_INIT(ARU_PPDU_normal_mode_parameters_ANON_2);
4545
PY_IMPL_SEQ_ANON_ATTR_FROMPY(ARU_PPDU, normal_mode_parameters, &src->choice.normal_mode_parameters, ARU_PPDU_normal_mode_parameters_ANON_2);
4646
PY_IMPL_SEQ_ANON_ATTR_TOPY(ARU_PPDU, normal_mode_parameters, &src->choice.normal_mode_parameters, ARU_PPDU_normal_mode_parameters_ANON_2);
47-
PY_IMPL_CHOICE_GENERIC_SETATTR(ARU_PPDU, ARU_PPDU, normal_mode_parameters, normal_mode_parameters, *asn_DEF_ARU_PPDU.elements[0].type);
47+
PY_IMPL_CHOICE_GENERIC_SETATTR(ARU_PPDU, ARU_PPDU, normal_mode_parameters, normal_mode_parameters, asn_DEF_ARU_PPDU);
4848
PY_IMPL_CHOICE_GETATTR(ARU_PPDU, ARU_PPDU, normal_mode_parameters, normal_mode_parameters);
4949
PY_IMPL_GENERIC_DEALLOC(ARU_PPDU);
5050
PY_IMPL_GENERIC_CHECK_CONSTRAINTS(ARU_PPDU);

0 commit comments

Comments
 (0)