forked from osmocom/wireshark
From Lori Tribble:
I found many new properties in BACnet that were not decoded correctly in Wireshark. I have attached a patch that adds decoding to the following properties: Fixed the following properties to decode: In the Accumulator Object: scale (187) prescale (185) logging-record (184) In Access Door Object: door-members (228) masked-alarm-values (234) In the Pulse Converter Object: input-reference (181) In the Group Object: list-of-group-members (53) In the Event Enrollment Object: object-property-reference (78) In the Command Object: action (2) In the Trend Log Multiple object: log-buffer (131) In the Event Log Object: log-buffer (131) In the Structured View object: subordinate-list (211) Added decoding for the following enumeration type properties: Logging-type (197) event-state (36) reliability (103) notify-type (208) door-status (231) lock-status (233) secured-status (235) maintenance-required (158) program-state (92) program-change (90) reason-for-halt (100) mode (160) silenced (163) operation-expected (161) tracking-value (164) file-access-method (41) The above fixes also fixed the log-buffer decoding of the old trend log recorded as Wireshark bug: #6458 I believe this patch also fixes bug: #6235. But the original bug did not contain a capture file so I am not positive my capture represents the originators issue. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6475 svn path=/trunk/; revision=39676
This commit is contained in:
parent
773f294db6
commit
798fabed72
|
@ -1538,6 +1538,21 @@ fDestination (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
static guint
|
static guint
|
||||||
fDeviceObjectPropertyReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
fDeviceObjectPropertyReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BACnetObjectPropertyReference ::= SEQUENCE {
|
||||||
|
* objectIdentifier [0] BACnetObjectIdentifier,
|
||||||
|
* propertyIdentifier [1] BACnetPropertyIdentifier,
|
||||||
|
* propertyArrayIndex [2] Unsigend OPTIONAL,
|
||||||
|
* }
|
||||||
|
* @param tvb
|
||||||
|
* @param pinfo
|
||||||
|
* @param tree
|
||||||
|
* @param offset
|
||||||
|
* @return modified offset
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fObjectPropertyReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BACnetDeviceObjectReference ::= SEQUENCE {
|
* BACnetDeviceObjectReference ::= SEQUENCE {
|
||||||
* deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL,
|
* deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL,
|
||||||
|
@ -1635,6 +1650,26 @@ fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offs
|
||||||
static guint
|
static guint
|
||||||
fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BACnetEventLogRecord ::= SEQUENCE {
|
||||||
|
* timestamp [0] BACnetDateTime,
|
||||||
|
* logDatum [1] CHOICE {
|
||||||
|
* log-status [0] BACnetLogStatus,
|
||||||
|
* notification [1] ConfirmedEventNotification-Request,
|
||||||
|
* time-change [2] REAL,
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* @param tvb
|
||||||
|
* @param pinfo
|
||||||
|
* @param tree
|
||||||
|
* @param offset
|
||||||
|
* @return modified offset
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fEventLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
|
static guint
|
||||||
|
fLogMultipleRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BACnetNotificationParameters ::= CHOICE {
|
* BACnetNotificationParameters ::= CHOICE {
|
||||||
|
@ -1866,6 +1901,9 @@ fSpecialEvent (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset
|
||||||
static guint
|
static guint
|
||||||
fTimeStamp (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label);
|
fTimeStamp (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label);
|
||||||
|
|
||||||
|
static guint
|
||||||
|
fEventTimeStamps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BACnetTimeValue ::= SEQUENCE {
|
* BACnetTimeValue ::= SEQUENCE {
|
||||||
* time Time,
|
* time Time,
|
||||||
|
@ -3473,6 +3511,7 @@ BACnetErrorClass [] = {
|
||||||
{4,"security" },
|
{4,"security" },
|
||||||
{5,"services" },
|
{5,"services" },
|
||||||
{6,"vt" },
|
{6,"vt" },
|
||||||
|
{7,"communication" },
|
||||||
{0,NULL }
|
{0,NULL }
|
||||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE.
|
/* Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||||
Enumerated values64-65535 may be used by others subject to
|
Enumerated values64-65535 may be used by others subject to
|
||||||
|
@ -3635,11 +3674,13 @@ BACnetPropertyStates [] = {
|
||||||
{27,"shed-state"},
|
{27,"shed-state"},
|
||||||
{28,"silenced-state"},
|
{28,"silenced-state"},
|
||||||
/* context tag 29 reserved for future addenda */
|
/* context tag 29 reserved for future addenda */
|
||||||
|
{29,"unknown-29"},
|
||||||
{30,"access-event"},
|
{30,"access-event"},
|
||||||
{31,"zone-occupancy-state"},
|
{31,"zone-occupancy-state"},
|
||||||
{32,"access-credential-disable-reason"},
|
{32,"access-credential-disable-reason"},
|
||||||
{33,"access-credential-disable"},
|
{33,"access-credential-disable"},
|
||||||
{34,"authentication-status"},
|
{34,"authentication-status"},
|
||||||
|
{35,"unknown-35"},
|
||||||
{36,"backup-state"},
|
{36,"backup-state"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
/* Tag values 0-63 are reserved for definition by ASHRAE.
|
/* Tag values 0-63 are reserved for definition by ASHRAE.
|
||||||
|
@ -3730,6 +3771,80 @@ BACnetShedState[] = {
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetNodeType [] = {
|
||||||
|
{ 0, "unknown" },
|
||||||
|
{ 1, "system" },
|
||||||
|
{ 2, "network" },
|
||||||
|
{ 3, "device" },
|
||||||
|
{ 4, "organizational" },
|
||||||
|
{ 5, "area" },
|
||||||
|
{ 6, "equipment" },
|
||||||
|
{ 7, "point" },
|
||||||
|
{ 8, "collection" },
|
||||||
|
{ 9, "property" },
|
||||||
|
{ 10, "functional" },
|
||||||
|
{ 11, "other" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetLoggingType [] = {
|
||||||
|
{ 0, "polled" },
|
||||||
|
{ 1, "cov" },
|
||||||
|
{ 2, "triggered" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetDoorStatus [] = {
|
||||||
|
{ 0, "closed" },
|
||||||
|
{ 1, "opened" },
|
||||||
|
{ 2, "unknown" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetLockStatus [] = {
|
||||||
|
{ 0, "locked" },
|
||||||
|
{ 1, "unlocked" },
|
||||||
|
{ 2, "fault" },
|
||||||
|
{ 3, "unknown" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetDoorSecuredStatus [] = {
|
||||||
|
{ 0, "secured" },
|
||||||
|
{ 1, "unsecured" },
|
||||||
|
{ 2, "unknown" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetDoorAlarmState [] = {
|
||||||
|
{ 0, "normal" },
|
||||||
|
{ 1, "alarm" },
|
||||||
|
{ 2, "door-open-too-long" },
|
||||||
|
{ 3, "forced-open" },
|
||||||
|
{ 4, "tamper" },
|
||||||
|
{ 5, "door-fault" },
|
||||||
|
{ 6, "lock-down" },
|
||||||
|
{ 7, "free-access" },
|
||||||
|
{ 8, "egress-open" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const value_string
|
||||||
|
BACnetAccumulatorStatus [] = {
|
||||||
|
{ 0, "normal" },
|
||||||
|
{ 1, "starting" },
|
||||||
|
{ 2, "recovered" },
|
||||||
|
{ 3, "abnormal" },
|
||||||
|
{ 4, "failed" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
static const value_string
|
static const value_string
|
||||||
BACnetVendorIdentifiers [] = {
|
BACnetVendorIdentifiers [] = {
|
||||||
{ 0, "ASHRAE" },
|
{ 0, "ASHRAE" },
|
||||||
|
@ -5163,7 +5278,7 @@ fDateTime (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label)
|
||||||
proto_item *tt;
|
proto_item *tt;
|
||||||
|
|
||||||
if (label != NULL) {
|
if (label != NULL) {
|
||||||
tt = proto_tree_add_text (subtree, tvb, offset, 1, "%s", label);
|
tt = proto_tree_add_text (subtree, tvb, offset, 10, "%s", label);
|
||||||
subtree = proto_item_add_subtree(tt, ett_bacapp_value);
|
subtree = proto_item_add_subtree(tt, ett_bacapp_value);
|
||||||
}
|
}
|
||||||
offset = fDate (tvb,subtree,offset,"Date: ");
|
offset = fDate (tvb,subtree,offset,"Date: ");
|
||||||
|
@ -5216,6 +5331,26 @@ fCalendarEntry (tvbuff_t *tvb, proto_tree *tree, guint offset)
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
fEventTimeStamps( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no = 0, tag_info = 0;
|
||||||
|
guint32 lvt = 0;
|
||||||
|
proto_tree* subtree = tree;
|
||||||
|
proto_item* ti = 0;
|
||||||
|
|
||||||
|
if (tvb_reported_length_remaining(tvb, offset) > 0) {
|
||||||
|
ti = proto_tree_add_text(tree, tvb, offset, lvt, "eventTimeStamps");
|
||||||
|
if (ti) {
|
||||||
|
subtree = proto_item_add_subtree(ti, ett_bacapp_tag);
|
||||||
|
}
|
||||||
|
offset = fTimeStamp (tvb, subtree, offset,"TO-OFFNORMAL timestamp: ");
|
||||||
|
offset = fTimeStamp (tvb, subtree, offset,"TO-FAULT timestamp: ");
|
||||||
|
offset = fTimeStamp (tvb, subtree, offset,"TO-NORMAL timestamp: ");
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
fTimeStamp (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label)
|
fTimeStamp (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label)
|
||||||
{
|
{
|
||||||
|
@ -5225,15 +5360,15 @@ fTimeStamp (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label)
|
||||||
if (tvb_reported_length_remaining(tvb, offset) > 0) { /* don't loop, it's a CHOICE */
|
if (tvb_reported_length_remaining(tvb, offset) > 0) { /* don't loop, it's a CHOICE */
|
||||||
switch (fTagNo(tvb, offset)) {
|
switch (fTagNo(tvb, offset)) {
|
||||||
case 0: /* time */
|
case 0: /* time */
|
||||||
offset = fTime (tvb, tree, offset, label?label:"timestamp: ");
|
offset = fTime (tvb, tree, offset, label?label:"time: ");
|
||||||
break;
|
break;
|
||||||
case 1: /* sequenceNumber */
|
case 1: /* sequenceNumber */
|
||||||
offset = fUnsignedTag (tvb, tree, offset,
|
offset = fUnsignedTag (tvb, tree, offset,
|
||||||
label?label:"sequence Number: ");
|
label?label:"sequence number: ");
|
||||||
break;
|
break;
|
||||||
case 2: /* dateTime */
|
case 2: /* dateTime */
|
||||||
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
offset = fDateTime (tvb, tree, offset, label?label:"timestamp: ");
|
offset = fDateTime (tvb, tree, offset, label?label:"date time: ");
|
||||||
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -5629,8 +5764,10 @@ fActionList (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
lastoffset = offset;
|
lastoffset = offset;
|
||||||
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
if (tag_is_closing(tag_info)) {
|
if (tag_is_closing(tag_info)) {
|
||||||
offset += len;
|
|
||||||
subtree = tree;
|
subtree = tree;
|
||||||
|
if ( tag_no != 0 ) /* don't eat the closing property tag, just return */
|
||||||
|
return offset;
|
||||||
|
offset += len;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (tag_is_opening(tag_info)) {
|
if (tag_is_opening(tag_info)) {
|
||||||
|
@ -6008,6 +6145,188 @@ fContextTaggedValue(tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *
|
||||||
|
|
||||||
return offset + tag_len + lvt;
|
return offset + tag_len + lvt;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
BACnetPrescale ::= SEQUENCE {
|
||||||
|
multiplier [0] Unsigned,
|
||||||
|
moduloDivide [1] Unsigned
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fPrescale (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
switch (tag_no) {
|
||||||
|
case 0: /* multiplier */
|
||||||
|
offset = fUnsignedTag (tvb,tree,offset,"Multiplier: ");
|
||||||
|
break;
|
||||||
|
case 1: /* moduloDivide */
|
||||||
|
offset = fUnsignedTag (tvb,tree,offset,"Modulo Divide: ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
BACnetScale ::= CHOICE {
|
||||||
|
floatScale [0] REAL,
|
||||||
|
integerScale [1] INTEGER
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fScale (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
switch (tag_no) {
|
||||||
|
case 0: /* floatScale */
|
||||||
|
offset = fRealTag (tvb,tree,offset,"Float Scale: ");
|
||||||
|
break;
|
||||||
|
case 1: /* integerScale */
|
||||||
|
offset = fSignedTag (tvb,tree,offset,"Integer Scale: ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
BACnetAccumulatorRecord ::= SEQUENCE {
|
||||||
|
timestamp [0] BACnetDateTime,
|
||||||
|
presentValue [1] Unsigned,
|
||||||
|
accumulatedValue [2] Unsigned,
|
||||||
|
accumulatortStatus [3] ENUMERATED {
|
||||||
|
normal (0),
|
||||||
|
starting (1),
|
||||||
|
recovered (2),
|
||||||
|
abnormal (3),
|
||||||
|
failed (4)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fLoggingRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
switch (tag_no) {
|
||||||
|
case 0: /* timestamp */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fDateTime (tvb, tree, offset, "Timestamp: ");
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 1: /* presentValue */
|
||||||
|
offset = fUnsignedTag (tvb,tree,offset,"Present Value: ");
|
||||||
|
break;
|
||||||
|
case 2: /* accumulatedValue */
|
||||||
|
offset = fUnsignedTag (tvb,tree,offset,"Accumulated Value: ");
|
||||||
|
break;
|
||||||
|
case 3: /* accumulatorStatus */
|
||||||
|
offset = fEnumeratedTag (tvb, tree, offset, "Accumulator Status: ", BACnetAccumulatorStatus);
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SEQ OF Any enumeration (current usage is SEQ OF BACnetDoorAlarmState
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fSequenceOfEnums (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, const gchar *label, const value_string *vs)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, label, vs);
|
||||||
|
if ( offset == lastoffset ) break;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SEQ OF BACnetDeviceObjectReference (accessed as an array)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fDoorMembers (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
offset = fDeviceObjectReference(tvb, pinfo, tree, offset);
|
||||||
|
if (offset == lastoffset) break;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SEQ OF ReadAccessSpecification
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fListOfGroupMembers (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt, len;
|
||||||
|
guint lastoffset = 0, depth = 0;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info) ) {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
offset = fReadAccessSpecification(tvb, pinfo, tree, offset);
|
||||||
|
if ( offset == lastoffset ) break;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
@ -6016,6 +6335,7 @@ fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
|
||||||
guint32 lvt;
|
guint32 lvt;
|
||||||
guint lastoffset = 0, depth = 0;
|
guint lastoffset = 0, depth = 0;
|
||||||
char ar[256];
|
char ar[256];
|
||||||
|
guint32 save_object_type = object_type;
|
||||||
|
|
||||||
if (propertyIdentifier >= 0) {
|
if (propertyIdentifier >= 0) {
|
||||||
g_snprintf (ar, sizeof(ar), "%s: ",
|
g_snprintf (ar, sizeof(ar), "%s: ",
|
||||||
|
@ -6125,7 +6445,12 @@ fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
|
||||||
offset = fClientCOV (tvb, pinfo, tree, offset);
|
offset = fClientCOV (tvb, pinfo, tree, offset);
|
||||||
break;
|
break;
|
||||||
case 131: /* log-buffer */
|
case 131: /* log-buffer */
|
||||||
offset = fLogRecord (tvb, pinfo, tree, offset);
|
if ( object_type == 25 )
|
||||||
|
offset = fEventLogRecord(tvb, pinfo, tree, offset);
|
||||||
|
else if ( object_type == 27 )
|
||||||
|
offset = fLogMultipleRecord (tvb, pinfo, tree, offset);
|
||||||
|
else
|
||||||
|
offset = fLogRecord (tvb, pinfo, tree, offset);
|
||||||
break;
|
break;
|
||||||
case 159: /* member-of */
|
case 159: /* member-of */
|
||||||
case 165: /* zone-members */
|
case 165: /* zone-members */
|
||||||
|
@ -6151,6 +6476,96 @@ fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
|
||||||
case 83: /* event-parameters */
|
case 83: /* event-parameters */
|
||||||
offset = fEventParameter(tvb, pinfo, tree, offset);
|
offset = fEventParameter(tvb, pinfo, tree, offset);
|
||||||
break;
|
break;
|
||||||
|
case 211: /* subordinate-list */
|
||||||
|
offset = fDeviceObjectReference (tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 130: /* event-time-stamp */
|
||||||
|
offset = fEventTimeStamps(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 197: /* logging-type */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetLoggingType);
|
||||||
|
break;
|
||||||
|
case 36: /* event-state */
|
||||||
|
offset = fApplicationTypesEnumeratedSplit(tvb, pinfo, tree, offset, ar, BACnetEventState, 64);
|
||||||
|
break;
|
||||||
|
case 103: /* reliability */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetReliability);
|
||||||
|
break;
|
||||||
|
case 72: /* notify-type */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetNotifyType);
|
||||||
|
break;
|
||||||
|
case 208: /* node-type */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetNodeType);
|
||||||
|
break;
|
||||||
|
case 231: /* door-status */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetDoorStatus);
|
||||||
|
break;
|
||||||
|
case 233: /* lock-status */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetLockStatus);
|
||||||
|
break;
|
||||||
|
case 235: /* secured-status */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetDoorSecuredStatus);
|
||||||
|
break;
|
||||||
|
case 158: /* maintenance-required */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetMaintenance);
|
||||||
|
break;
|
||||||
|
case 92: /* program-state */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetProgramState);
|
||||||
|
break;
|
||||||
|
case 90: /* program-change */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetProgramRequest);
|
||||||
|
break;
|
||||||
|
case 100: /* reason-for-halt */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetProgramError);
|
||||||
|
break;
|
||||||
|
case 160: /* mode */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetLifeSafetyMode);
|
||||||
|
break;
|
||||||
|
case 163: /* silenced */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetSilencedState);
|
||||||
|
break;
|
||||||
|
case 161: /* operation-expected */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetLifeSafetyOperation);
|
||||||
|
break;
|
||||||
|
case 164: /* tracking-value */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetLifeSafetyState);
|
||||||
|
break;
|
||||||
|
case 41: /* file-access-method */
|
||||||
|
offset = fApplicationTypesEnumerated(tvb, pinfo, tree, offset, ar, BACnetFileAccessMethod);
|
||||||
|
break;
|
||||||
|
case 185: /* prescale */
|
||||||
|
offset = fPrescale(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 187: /* scale */
|
||||||
|
offset = fScale(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 184: /* logging-record */
|
||||||
|
offset = fLoggingRecord(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 228: /* door-members */
|
||||||
|
offset = fDoorMembers(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 181: /* input-reference */
|
||||||
|
offset = fObjectPropertyReference(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 78: /* object-property-reference */
|
||||||
|
offset = fObjectPropertyReference(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
case 234: /* masked-alarm-values */
|
||||||
|
offset = fSequenceOfEnums(tvb, pinfo, tree, offset, "masked-alarm-value: ", BACnetDoorAlarmState);
|
||||||
|
break;
|
||||||
|
case 53: /* list-of-group-members */
|
||||||
|
save_object_type = object_type;
|
||||||
|
offset = fListOfGroupMembers(tvb, pinfo, tree, offset);
|
||||||
|
object_type = save_object_type;
|
||||||
|
break;
|
||||||
|
case 85: /* present-value */
|
||||||
|
if ( object_type == 11 ) /* group object handling of present-value */
|
||||||
|
{
|
||||||
|
offset = fReadAccessResult(tvb, pinfo, tree, offset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* intentially fall through here so don't reorder this case statement */
|
||||||
default:
|
default:
|
||||||
if (tag_info) {
|
if (tag_info) {
|
||||||
if (tag_is_opening(tag_info)) {
|
if (tag_is_opening(tag_info)) {
|
||||||
|
@ -6654,66 +7069,82 @@ fLifeSafetyOperationRequest(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _value_string_enum {
|
||||||
|
const value_string *valstr;
|
||||||
|
} value_string_enum;
|
||||||
|
|
||||||
|
static const value_string_enum
|
||||||
|
BACnetPropertyStatesEnums[] = {
|
||||||
|
{ NULL },
|
||||||
|
{BACnetBinaryPV },
|
||||||
|
{BACnetEventType },
|
||||||
|
{BACnetPolarity },
|
||||||
|
{BACnetProgramRequest },
|
||||||
|
{BACnetProgramState },
|
||||||
|
{BACnetProgramError },
|
||||||
|
{BACnetReliability },
|
||||||
|
{BACnetEventState },
|
||||||
|
{BACnetDeviceStatus },
|
||||||
|
{BACnetEngineeringUnits },
|
||||||
|
{ NULL },
|
||||||
|
{BACnetLifeSafetyMode },
|
||||||
|
{BACnetLifeSafetyState },
|
||||||
|
{BACnetRestartReason },
|
||||||
|
{BACnetDoorAlarmState },
|
||||||
|
{BACnetAction },
|
||||||
|
{BACnetDoorSecuredStatus },
|
||||||
|
{BACnetDoorStatus },
|
||||||
|
{ NULL }, /* {BACnetDoorValue }, */
|
||||||
|
{BACnetFileAccessMethod },
|
||||||
|
{BACnetLockStatus },
|
||||||
|
{BACnetLifeSafetyOperation },
|
||||||
|
{BACnetMaintenance },
|
||||||
|
{BACnetNodeType },
|
||||||
|
{BACnetNotifyType },
|
||||||
|
{ NULL }, /* {BACnetSecurityLevel }, */
|
||||||
|
{BACnetShedState },
|
||||||
|
{BACnetSilencedState },
|
||||||
|
{ NULL },
|
||||||
|
{ NULL }, /* {BACnetAccessEvent }, */
|
||||||
|
{ NULL }, /* {BACnetZoneOccupancyState }, */
|
||||||
|
{ NULL }, /* {BACnetAccessCredentialDisableReason }, */
|
||||||
|
{ NULL }, /* {BACnetAccessCredentialDisable }, */
|
||||||
|
{ NULL }, /* {BACnetAuthenticationStatus }, */
|
||||||
|
{ NULL },
|
||||||
|
{ NULL }, /* {BACnetBackupState }, */
|
||||||
|
};
|
||||||
|
#define BACnetPropertyStatesEnums_Size 36
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
fBACnetPropertyStates(tvbuff_t *tvb, proto_tree *tree, guint offset)
|
fBACnetPropertyStates(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
{
|
{
|
||||||
switch (fTagNo(tvb, offset))
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt;
|
||||||
|
const gchar* label = NULL;
|
||||||
|
|
||||||
|
fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
label = ep_strdup_printf( "%s: ", val_to_str_const( tag_no, VALS(BACnetPropertyStates), "unknown-"+tag_no ));
|
||||||
|
|
||||||
|
switch (tag_no)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
offset = fBooleanTag (tvb, tree, offset, "boolean-value: ");
|
offset = fBooleanTag (tvb, tree, offset, label);
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"binary-value: ", BACnetBinaryPV, 2);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"event-type: ", BACnetEventType, 12);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"polarity: ", BACnetPolarity, 2);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"program-change: ", BACnetProgramRequest, 5);
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"program-state: ", BACnetProgramState, 5);
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"reason-for-halt: ", BACnetProgramError, 5);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"reliability: ", BACnetReliability, 10);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"state: ", BACnetEventState, 64);
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"system-status: ", BACnetDeviceStatus, 64);
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"units: ", BACnetEngineeringUnits, 2);
|
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
offset = fUnsignedTag(tvb, tree, offset, "unsigned-value: ");
|
offset = fUnsignedTag(tvb, tree, offset, label);
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"life-safety-mode: ", BACnetLifeSafetyMode, 64);
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
offset = fEnumeratedTagSplit (tvb, tree, offset,
|
|
||||||
"life-safety-state: ", BACnetLifeSafetyState, 64);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if ( (tag_no > BACnetPropertyStatesEnums_Size) ||
|
||||||
|
VALS(BACnetPropertyStatesEnums[tag_no].valstr == NULL ))
|
||||||
|
{
|
||||||
|
offset = fEnumeratedTag(tvb, tree, offset, "Unknown State: ", NULL);
|
||||||
|
/* don't use Abstract type here because it is context tagged and therefore we don't know app type */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
offset = fEnumeratedTagSplit(tvb, tree, offset, label,
|
||||||
|
VALS(BACnetPropertyStatesEnums[tag_no].valstr), 64);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return offset;
|
return offset;
|
||||||
|
@ -6770,6 +7201,21 @@ fDeviceObjectPropertyValue (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
BACnetDeviceObjectPropertyReference ::= SEQUENCE {
|
||||||
|
objectIdentifier [0] BACnetObjectIdentifier,
|
||||||
|
propertyIdentifier [1] BACnetPropertyIdentifier,
|
||||||
|
propertyArrayIndex [2] Unsigned OPTIONAL, -- used only with array datatype
|
||||||
|
-- if omitted with an array then
|
||||||
|
-- the entire array is referenced
|
||||||
|
deviceIdentifier [3] BACnetObjectIdentifier OPTIONAL
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
fObjectPropertyReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
return fDeviceObjectPropertyReference(tvb, pinfo, tree, offset);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
BACnetDeviceObjectPropertyReference ::= SEQUENCE {
|
BACnetDeviceObjectPropertyReference ::= SEQUENCE {
|
||||||
|
@ -6859,7 +7305,7 @@ fNotificationParameters (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gu
|
||||||
switch (fTagNo(tvb, offset)) {
|
switch (fTagNo(tvb, offset)) {
|
||||||
case 0:
|
case 0:
|
||||||
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
offset = fBACnetPropertyStates(tvb, subtree, offset);
|
offset = fBACnetPropertyStates(tvb, pinfo, subtree, offset);
|
||||||
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -7113,7 +7559,9 @@ fNotificationParameters (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gu
|
||||||
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
/* todo: add new parameters here ... */
|
||||||
default:
|
default:
|
||||||
|
offset = fAbstractSyntaxNType(tvb, pinfo, subtree, offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7191,7 +7639,7 @@ fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offs
|
||||||
if (tag_is_closing(tag_info)) {
|
if (tag_is_closing(tag_info)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset = fBACnetPropertyStates(tvb, subtree, offset);
|
offset = fBACnetPropertyStates(tvb, pinfo, subtree, offset);
|
||||||
}
|
}
|
||||||
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
break;
|
break;
|
||||||
|
@ -7304,7 +7752,7 @@ fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offs
|
||||||
|
|
||||||
case 7: /* buffer-ready */
|
case 7: /* buffer-ready */
|
||||||
/* deprecated
|
/* deprecated
|
||||||
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) {
|
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) {
|
||||||
lastoffset = offset;
|
lastoffset = offset;
|
||||||
switch (fTagNo(tvb, offset)) {
|
switch (fTagNo(tvb, offset)) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -7424,15 +7872,63 @@ fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
/* todo: add new event-parameter cases here */
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Closing tag for parameter choice */
|
/* Closing tag for parameter choice */
|
||||||
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
fEventLogRecord(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint lastoffset = 0;
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt;
|
||||||
|
proto_tree *subtree = tree;
|
||||||
|
proto_item *tt;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
switch (fTagNo(tvb, offset)) {
|
||||||
|
case 0: /* timestamp */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fDate (tvb,tree,offset,"Date: ");
|
||||||
|
offset = fTime (tvb,tree,offset,"Time: ");
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 1: /* logDatum: don't loop, it's a CHOICE */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
switch (fTagNo(tvb, offset)) {
|
||||||
|
case 0: /* logStatus */ /* Changed this to BitString per BACnet Spec. */
|
||||||
|
offset = fBitStringTagVS(tvb, tree, offset, "log status:", BACnetLogStatus);
|
||||||
|
break;
|
||||||
|
case 1: /* todo: move this to new method fConfirmedEventNotificationRequestTag... */
|
||||||
|
tt = proto_tree_add_text(tree, tvb, offset, 1, "notification: ");
|
||||||
|
subtree = proto_item_add_subtree(tt, ett_bacapp_value);
|
||||||
|
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fConfirmedEventNotificationRequest(tvb, pinfo, subtree, offset);
|
||||||
|
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
offset = fRealTag (tvb, tree, offset, "time-change: ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
{
|
{
|
||||||
|
@ -7477,7 +7973,9 @@ fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
offset = fNullTag(tvb, tree, offset, "null value: ");
|
offset = fNullTag(tvb, tree, offset, "null value: ");
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
offset = fError (tvb, pinfo, tree, offset);
|
offset = fError (tvb, pinfo, tree, offset);
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
offset = fRealTag (tvb, tree, offset, "time change: ");
|
offset = fRealTag (tvb, tree, offset, "time change: ");
|
||||||
|
@ -7504,9 +8002,8 @@ fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
fConfirmedEventNotificationRequest (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
fLogMultipleRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
{
|
{
|
||||||
guint lastoffset = 0;
|
guint lastoffset = 0;
|
||||||
guint8 tag_no, tag_info;
|
guint8 tag_no, tag_info;
|
||||||
|
@ -7514,8 +8011,100 @@ fConfirmedEventNotificationRequest (tvbuff_t *tvb, packet_info *pinfo, proto_tre
|
||||||
|
|
||||||
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
lastoffset = offset;
|
lastoffset = offset;
|
||||||
|
switch (fTagNo(tvb, offset)) {
|
||||||
|
case 0: /* timestamp */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fDate (tvb,tree,offset,"Date: ");
|
||||||
|
offset = fTime (tvb,tree,offset,"Time: ");
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 1: /* logData: don't loop, it's a CHOICE */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
switch (fTagNo(tvb, offset)) {
|
||||||
|
case 0: /* logStatus */ /* Changed this to BitString per BACnet Spec. */
|
||||||
|
offset = fBitStringTagVS(tvb, tree, offset, "log status:", BACnetLogStatus);
|
||||||
|
break;
|
||||||
|
case 1: /* log-data: SEQUENCE OF CHOICE */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset) && (offset != lastoffset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info)) {
|
||||||
|
lastoffset = offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (tag_no) {
|
||||||
|
case 0:
|
||||||
|
offset = fBooleanTag (tvb, tree, offset, "boolean-value: ");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
offset = fRealTag (tvb, tree, offset, "real value: ");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
offset = fUnsignedTag (tvb, tree, offset, "enum value: ");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
offset = fUnsignedTag (tvb, tree, offset, "unsigned value: ");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
offset = fSignedTag (tvb, tree, offset, "signed value: ");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
offset = fBitStringTag (tvb, tree, offset, "bitstring value: ");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
offset = fNullTag(tvb, tree, offset, "null value: ");
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fError (tvb, pinfo, tree, offset);
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 8: /* any Value */
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
offset = fAbstractSyntaxNType (tvb, pinfo, tree, offset);
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
offset = fRealTag (tvb, tree, offset, "time-change: ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (offset == lastoffset) break; /* nothing happened, exit loop */
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
switch (fTagNo(tvb,offset)) {
|
|
||||||
|
static guint
|
||||||
|
fConfirmedEventNotificationRequest (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
|
||||||
|
{
|
||||||
|
guint lastoffset = 0;
|
||||||
|
guint8 tag_no, tag_info;
|
||||||
|
guint32 lvt;
|
||||||
|
proto_tree *subtree = tree;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset)) { /* exit loop if nothing happens inside */
|
||||||
|
lastoffset = offset;
|
||||||
|
fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
|
||||||
|
if (tag_is_closing(tag_info)) {
|
||||||
|
lastoffset = offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (tag_no) {
|
||||||
case 0: /* ProcessId */
|
case 0: /* ProcessId */
|
||||||
offset = fProcessId (tvb,tree,offset);
|
offset = fProcessId (tvb,tree,offset);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue