- packet-per.[ch]: Open Type support

- asn2wrs.py: TYPE-IDENTIFIER and ABSTRACT-SYNTAX information object classes support

svn path=/trunk/; revision=18338
This commit is contained in:
Tomas Kukosa 2006-06-05 06:49:52 +00:00
parent 8400e6972e
commit 1f24a713be
3 changed files with 151 additions and 14 deletions

View File

@ -112,6 +112,27 @@ void asn_ctx_init(asn_ctx_t *actx, asn_enc_e encoding, gboolean aligned, packet_
offset=(offset&0xfffffff8)+8; \
}
/* 10 Encoding procedures -------------------------------------------------- */
/* 10.2 Open type fields --------------------------------------------------- */
guint32
dissect_per_open_type(tvbuff_t *tvb, guint32 offset, asn_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type)
{
guint32 type_length, end_offset;
offset = dissect_per_length_determinant(tvb, offset, actx, tree, hf_per_open_type_length, &type_length);
if (actx->aligned) BYTE_ALIGN_OFFSET(offset);
end_offset = offset + type_length * 8;
if (type) {
type(tvb, offset, actx, tree, hf_index);
} else {
actx->created_item = proto_tree_add_text(tree, tvb, offset>>3, BLEN(offset, end_offset), "Unknown Open Type");
}
return end_offset;
}
/* 10.9 General rules for encoding a length determinant -------------------- */
guint32
dissect_per_length_determinant(tvbuff_t *tvb, guint32 offset, asn_ctx_t *actx _U_, proto_tree *tree, int hf_index, guint32 *length)

View File

@ -56,6 +56,7 @@ if (check_col(actx->pinfo->cinfo, COL_INFO)){ \
tvb_get_guint8(tvb, 9999);
typedef int (*per_callback)(tvbuff_t *, int, asn_ctx_t *, proto_tree *);
typedef int (*per_type_fn)(tvbuff_t*, int, asn_ctx_t*, proto_tree*, int);
/* in all functions here, offset is guint32 and is
byteposition<<3 + bitposition
@ -133,4 +134,6 @@ extern guint32 dissect_per_restricted_character_string(tvbuff_t *tvb, guint32 of
extern guint32 dissect_per_enumerated(tvbuff_t *tvb, guint32 offset, asn_ctx_t *actx, proto_tree *tree, int hf_index, guint32 root_num, guint32 *value, gboolean has_extension, guint32 ext_num, guint32 *value_map);
extern guint32 dissect_per_open_type(tvbuff_t *tvb, guint32 offset, asn_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type);
#endif /* __PACKET_PER_H__ */

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#
# competh.py
# asn2wrs.py
# ASN.1 to Wireshark dissector compiler
# 2004 Tomas Kukosa
#
@ -24,6 +24,9 @@
# ITU-T Recommendation X.680 (07/2002),
# Information technology - Abstract Syntax Notation One (ASN.1): Specification of basic notation
#
# ITU-T Recommendation X.681 (07/2002),
# Information technology - Abstract Syntax Notation One (ASN.1): Information object specification
#
# ITU-T Recommendation X.682 (07/2002),
# Information technology - Abstract Syntax Notation One (ASN.1): Constraint specification
#
@ -169,7 +172,8 @@ static_tokens = {
r';' : 'SEMICOLON',
#r'@' : 'AT',
#r'\!' : 'EXCLAMATION',
r'\^' : 'CIRCUMFLEX'
r'\^' : 'CIRCUMFLEX',
r'\&' : 'AMPERSAND'
}
# 11.27 Reserved words
@ -230,6 +234,8 @@ reserved_words = {
'AUTOMATIC': 'AUTOMATIC',
'OBJECT': 'OBJECT',
'IDENTIFIER': 'IDENTIFIER',
'TYPE-IDENTIFIER' : 'TYPE_IDENTIFIER',
'ABSTRACT-SYNTAX' : 'ABSTRACT_SYNTAX',
# 'OPERATION' : 'OPERATION',
# 'ARGUMENT' : 'ARGUMENT',
# 'RESULT' : 'RESULT',
@ -2942,6 +2948,56 @@ class EnumeratedType (Type):
body = '#error Can not decode %s' % (tname)
return body
#--- OpenType -----------------------------------------------------------
class OpenType (Type):
def to_python (self, ctx):
return "asn1.ANY"
def single_type(self):
if (self.HasConstraint() and
self.constr.type == 'Type' and
self.constr.subtype.type == 'Type_Ref'):
return self.constr.subtype.val
return None
def eth_reg_sub(self, ident, ectx):
t = self.single_type()
if t:
ectx.eth_dep_add(ident, t)
def eth_tname(self):
t = self.single_type()
if t:
return 'OpenType_' + t
else:
return Type.eth_tname(self)
def eth_ftype(self, ectx):
return ('FT_NONE', 'BASE_NONE')
def GetTTag(self, ectx):
return ('BER_CLASS_ANY', '0')
def eth_type_default_pars(self, ectx, tname):
pars = Type.eth_type_default_pars(self, ectx, tname)
t = self.single_type()
if t:
t = ectx.type[t]['ethname']
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'
else:
pars['TYPE_REF_FN'] = 'NULL'
return pars
def eth_type_default_body(self, ectx, tname):
if (ectx.Per()):
body = ectx.eth_fn_call('dissect_%(ER)s_open_type', ret='offset',
par=(('%(TVB)s', '%(OFFSET)s', '%(ACTX)s', '%(TREE)s', '%(HF_INDEX)s', '%(TYPE_REF_FN)s',),))
else:
body = '#error Can not decode %s' % (tname)
return body
#--- AnyType -----------------------------------------------------------
class AnyType (Type):
def to_python (self, ctx):
@ -3635,8 +3691,8 @@ def p_ValueAssignment (t):
# 16.1
def p_Type (t):
'''Type : BuiltinType
| ReferencedType
| ConstrainedType'''
| ReferencedType
| ConstrainedType'''
t[0] = t[1]
# 16.2
@ -3649,6 +3705,7 @@ def p_BuiltinType (t):
| EnumeratedType
| IntegerType
| NullType
| ObjectClassFieldType
| ObjectIdentifierType
| OctetStringType
| RealType
@ -4084,7 +4141,7 @@ def p_AnyType (t):
# 31.1
def p_ObjectIdentifierType (t):
'ObjectIdentifierType : OBJECT IDENTIFIER'
t[0] = ObjectIdentifierType ()
t[0] = ObjectIdentifierType()
# 31.3
def p_ObjectIdentifierValue (t):
@ -4274,6 +4331,7 @@ def p_SubtypeElements (t):
| ValueRange
| PermittedAlphabet
| SizeConstraint
| TypeConstraint
| InnerTypeConstraints
| PatternConstraint'''
t[0] = t[1]
@ -4335,9 +4393,9 @@ def p_SizeConstraint (t):
# 47.6 Type constraint
# 47.6.1
#def p_TypeConstraint (t):
# 'TypeConstraint : Type'
# t[0] = Constraint (type = 'Type', subtype = t[2])
def p_TypeConstraint (t):
'TypeConstraint : Type'
t[0] = Constraint (type = 'Type', subtype = t[1])
# 47.7 Permitted alphabet
# 47.7.1
@ -4477,27 +4535,82 @@ def p_char_string (t):
t[0] = t[1]
def p_number (t):
'number : NUMBER'
t[0] = t[1]
'number : NUMBER'
t[0] = t[1]
#--- ITU-T Recommendation X.681 -----------------------------------------------
# 7 ASN.1 lexical items -------------------------------------------------------
# 7.4 Type field references
def p_typefieldreference (t):
'typefieldreference : AMPERSAND UCASE_IDENT'
t[0] = t[2]
# 7.5 Value field references
def p_valuefieldreference (t):
'valuefieldreference : AMPERSAND LCASE_IDENT'
t[0] = t[2]
# 8 Referencing definitions
# 8.1
def p_DefinedObjectClass (t):
'DefinedObjectClass : UsefulObjectClassReference'
t[0] = t[1]
# 8.4
def p_UsefulObjectClassReference (t):
'''UsefulObjectClassReference : TYPE_IDENTIFIER
| ABSTRACT_SYNTAX'''
t[0] = t[1]
# 9 Information object class definition and assignment
# 9.14
def p_FieldName (t):
'''FieldName : typefieldreference
| valuefieldreference'''
t[0] = t[1]
# 14 Notation for the object class field type ---------------------------------
# 14.1
def p_ObjectClassFieldType (t):
'ObjectClassFieldType : DefinedObjectClass DOT FieldName'''
t[0] = get_type_from_class(t[1], t[3])
object_class_types = {
'TYPE-IDENTIFIER/id' : lambda : ObjectIdentifierType(),
'TYPE-IDENTIFIER/Type' : lambda : OpenType(),
'ABSTRACT-SYNTAX/id' : lambda : ObjectIdentifierType(),
'ABSTRACT-SYNTAX/Type' : lambda : OpenType(),
'ABSTRACT-SYNTAX/property' : lambda : BitStringType(),
}
def get_type_from_class(cls, fld):
return object_class_types.get(cls + '/' + fld, lambda : AnyType())()
#--- ITU-T Recommendation X.682 -----------------------------------------------
# 8 General constraint specification ------------------------------------------
# 8.1
def p_GeneralConstraint (t):
'''GeneralConstraint : UserDefinedConstraint'''
'''GeneralConstraint : UserDefinedConstraint'''
# | TableConstraint
# | ContentsConstraint''
t[0] = t[1]
t[0] = t[1]
# 9 User-defined constraints --------------------------------------------------
# 9.1
def p_UserDefinedConstraint (t):
'UserDefinedConstraint : CONSTRAINED BY LBRACE UserDefinedConstraintParameterList RBRACE'
t[0] = Constraint(type = 'UserDefined', subtype = t[4])
'UserDefinedConstraint : CONSTRAINED BY LBRACE UserDefinedConstraintParameterList RBRACE'
t[0] = Constraint(type = 'UserDefined', subtype = t[4])
def p_UserDefinedConstraintParameterList_1 (t):
'UserDefinedConstraintParameterList : '