aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bacapp.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2011-09-07 10:35:44 +0000
committerAnders Broman <anders.broman@ericsson.com>2011-09-07 10:35:44 +0000
commit966c4e2697e81a95bd23bd3e4c18c539cf02eb6f (patch)
tree812583445f3b65a02ba72c3aee3c01e4d5c8aa14 /epan/dissectors/packet-bacapp.c
parent0d89708ab259acbc13c5a1a4f3fb30f1c348f9ba (diff)
From Lori Tribble:
Fixes log-status and status-flags plus other BACnet decoding bugs This patch fixes the log-status and status-flag decoding issues described in this bug report. This patch also fixes the following items: 1) date-list decoding 2) time-synchronization-recipients decoding 3) decoding of UTF-8 character strings (when using character set 0) 4) event-parameter decoding https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5120 svn path=/trunk/; revision=38914
Diffstat (limited to 'epan/dissectors/packet-bacapp.c')
-rw-r--r--epan/dissectors/packet-bacapp.c268
1 files changed, 204 insertions, 64 deletions
diff --git a/epan/dissectors/packet-bacapp.c b/epan/dissectors/packet-bacapp.c
index e176eb6f99..84a273de13 100644
--- a/epan/dissectors/packet-bacapp.c
+++ b/epan/dissectors/packet-bacapp.c
@@ -1423,7 +1423,7 @@ static guint
fAddressBinding (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
/**
- * BACnetCalendaryEntry ::= CHOICE {
+ * BACnetCalendarEntry ::= CHOICE {
* date [0] Date,
* dateRange [1] BACnetDateRange,
* weekNDay [2] BacnetWeekNday
@@ -1434,7 +1434,7 @@ fAddressBinding (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offs
* @return modified offset
*/
static guint
-fCalendaryEntry (tvbuff_t *tvb, proto_tree *tree, guint offset);
+fCalendarEntry (tvbuff_t *tvb, proto_tree *tree, guint offset);
/**
* BACnetClientCOV ::= CHOICE {
@@ -1552,7 +1552,6 @@ fDeviceObjectPropertyReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
static guint
fDeviceObjectReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
-#if 0
/**
* BACnetEventParameter ::= CHOICE {
* change-of-bitstring [0] SEQUENCE {
@@ -1605,8 +1604,7 @@ fDeviceObjectReference (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gui
* @return modified offset
*/
static guint
-fEventParameter (tvbuff_t *tvb, proto_tree *tree, guint offset);
-#endif
+fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
@@ -3539,6 +3537,7 @@ static const value_string
BACnetLogStatus [] = {
{0,"log-disabled" },
{1,"buffer-purged" },
+ {2,"log-interrupted"},
{0,NULL }
};
@@ -5193,7 +5192,7 @@ fTimeValue (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
}
static guint
-fCalendaryEntry (tvbuff_t *tvb, proto_tree *tree, guint offset)
+fCalendarEntry (tvbuff_t *tvb, proto_tree *tree, guint offset)
{
guint8 tag_no, tag_info;
guint32 lvt;
@@ -5760,8 +5759,8 @@ fCharacterString (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *la
/** this decoding may be not correct for multi-byte characters, Lka */
switch (character_set) {
case ANSI_X34:
- fConvertXXXtoUTF8(str_val, &inbytesleft, out, &outbytesleft, "ANSI_X3.4");
- coding = "ANSI X3.4";
+ fConvertXXXtoUTF8(str_val, &inbytesleft, out, &outbytesleft, "UTF-8");
+ coding = "UTF-8";
break;
case IBM_MS_DBCS:
out = str_val;
@@ -6143,6 +6142,15 @@ fAbstractSyntaxNType (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
case 152: /* active-cov-subscriptions */
offset = fCOVSubscription (tvb, pinfo, tree, offset);
break;
+ case 23: /* date-list */
+ offset = fCalendarEntry(tvb, tree, offset);
+ break;
+ case 116: /* time-sychronization-recipients */
+ offset = fRecipient(tvb, pinfo, tree, offset);
+ break;
+ case 83: /* event-parameters */
+ offset = fEventParameter(tvb, pinfo, tree, offset);
+ break;
default:
if (tag_info) {
if (tag_is_opening(tag_info)) {
@@ -7115,47 +7123,80 @@ fNotificationParameters (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gu
return offset;
}
-#if 0
static guint
-fEventParameter (tvbuff_t *tvb, proto_tree *tree, guint offset)
+fEventParameter (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
{
- guint lastoffset = 0;
+ guint lastoffset = offset;
+ guint8 tag_no, tag_info;
+ guint32 lvt;
+ proto_tree *subtree = tree;
+ proto_item *tt;
- while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
- lastoffset = offset;
- switch (fTagNo(tvb, offset)) {
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ tt = proto_tree_add_text(subtree, tvb, offset, 0, "event parameters (%d) %s",
+ tag_no, val_to_str(tag_no, BACnetEventType, "invalid type"));
+ subtree = proto_item_add_subtree(tt, ett_bacapp_value);
+ /* Opening tag for parameter choice */
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+
+ switch (tag_no) {
case 0: /* change-of-bitstring */
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
- switch (fTagNo(tvb, offset)) {
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ switch (tag_no) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1:
- offset = fBitStringTag (tvb, tree, offset, "bitmask: ");
+ offset = fBitStringTag (tvb, subtree, offset, "bitmask: ");
break;
case 2: /* SEQUENCE OF BIT STRING */
- offset = fBitStringTagVS (tvb, tree, offset,
- "bitstring value: ", BACnetEventTransitionBits);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ offset = fBitStringTag(tvb, subtree, offset,
+ "bitstring value: ");
+ }
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
default:
- return offset;
+ break;
}
}
break;
case 1: /* change-of-state */
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
- switch (fTagNo(tvb, offset)) {
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ switch (tag_no) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1: /* SEQUENCE OF BACnetPropertyStates */
- offset = fEnumeratedTagSplit (tvb, tree, offset,
- "value: ", BACnetPropertyStates, 64);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ offset = fBACnetPropertyStates(tvb, subtree, offset);
+ }
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
default:
- return offset;
+ break;
}
}
break;
@@ -7164,60 +7205,73 @@ fEventParameter (tvbuff_t *tvb, proto_tree *tree, guint offset)
lastoffset = offset;
switch (fTagNo(tvb, offset)) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1: /* don't loop it, it's a CHOICE */
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
switch (fTagNo(tvb, offset)) {
case 0:
- offset = fBitStringTag (tvb, tree, offset, "bitmask: ");
+ offset = fBitStringTag (tvb, subtree, offset, "bitmask: ");
break;
case 1:
- offset = fRealTag (tvb, tree, offset,
+ offset = fRealTag (tvb, subtree, offset,
"referenced Property Increment: ");
break;
default:
- return offset;
+ break;
}
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ break;
default:
- return offset;
+ break;
}
}
break;
case 3: /* command-failure */
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
- switch (fTagNo(tvb, offset)) {
+ tag_no = fTagNo(tvb, offset);
+ switch (tag_no) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1:
- offset = fDeviceObjectPropertyReference (tvb,pinfo,tree,offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ offset = fDeviceObjectPropertyReference (tvb,pinfo,subtree,offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ break;
default:
- return offset;
+ break;
}
}
break;
case 4: /* floating-limit */
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
- switch (fTagNo(tvb, offset)) {
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ switch (tag_no) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1:
- offset = fDeviceObjectPropertyReference (tvb,pinfo,tree,offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ offset = fDeviceObjectPropertyReference (tvb,pinfo,subtree,offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
case 2:
- offset = fRealTag (tvb, tree, offset, "low diff limit: ");
+ offset = fRealTag (tvb, subtree, offset, "low diff limit: ");
break;
case 3:
- offset = fRealTag (tvb, tree, offset, "high diff limit: ");
+ offset = fRealTag (tvb, subtree, offset, "high diff limit: ");
break;
case 4:
- offset = fRealTag (tvb, tree, offset, "deadband: ");
+ offset = fRealTag (tvb, subtree, offset, "deadband: ");
break;
default:
- return offset;
+ break;
}
}
break;
@@ -7226,27 +7280,31 @@ fEventParameter (tvbuff_t *tvb, proto_tree *tree, guint offset)
lastoffset = offset;
switch (fTagNo(tvb, offset)) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1:
- offset = fRealTag (tvb, tree, offset, "low limit: ");
+ offset = fRealTag (tvb, subtree, offset, "low limit: ");
break;
case 2:
- offset = fRealTag (tvb, tree, offset, "high limit: ");
+ offset = fRealTag (tvb, subtree, offset, "high limit: ");
break;
case 3:
- offset = fRealTag (tvb, tree, offset, "deadband: ");
+ offset = fRealTag (tvb, subtree, offset, "deadband: ");
break;
default:
- return offset;
+ break;
}
}
break;
+ /* deprectated
case 6:
offset = fBACnetPropertyValue (tvb,pinfo,tree,offset);
break;
+ */
+
case 7: /* buffer-ready */
- while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ /* deprecated
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) {
lastoffset = offset;
switch (fTagNo(tvb, offset)) {
case 0:
@@ -7260,37 +7318,120 @@ fEventParameter (tvbuff_t *tvb, proto_tree *tree, guint offset)
return offset;
}
}
+ */
break;
case 8: /* change-of-life-safety */
while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
switch (fTagNo(tvb, offset)) {
case 0:
- offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ offset = fTimeSpan (tvb, subtree, offset, "Time Delay");
break;
case 1:
- offset = fEnumeratedTagSplit (tvb, tree, offset,
- "life safety alarm value: ", BACnetLifeSafetyState, 256);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ offset = fEnumeratedTagSplit (tvb, subtree, offset,
+ "life safety alarm value: ", BACnetLifeSafetyState, 256);
+ }
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
case 2:
- offset = fEnumeratedTagSplit (tvb, tree, offset,
- "alarm value: ", BACnetLifeSafetyState, 256);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_closing(tag_info)) {
+ break;
+ }
+ offset = fEnumeratedTagSplit (tvb, subtree, offset,
+ "alarm value: ", BACnetLifeSafetyState, 256);
+ }
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
case 3:
- offset = fDeviceObjectPropertyReference (tvb, pinfo, tree, offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ offset = fDeviceObjectPropertyReference (tvb, pinfo, subtree, offset);
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
default:
- return offset;
+ break;
+ }
+ }
+ break;
+ case 9: /* extended */
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ switch (fTagNo(tvb, offset)) {
+ case 0:
+ offset = fVendorIdentifier (tvb, pinfo, tree, offset);
+ break;
+ case 1:
+ offset = fUnsignedTag (tvb, tree, offset,
+ "extended-event-type: ");
+ break;
+ case 2: /* parameters */
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ offset = fApplicationTypes(tvb, pinfo, tree, offset, "parameters: ");
+ offset = fDeviceObjectPropertyValue(tvb, pinfo, tree, offset);
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ lastoffset = offset;
+ break;
+ default:
+ break;
+ }
+ if (offset == lastoffset) break; /* nothing happened, exit loop */
+ }
+ break;
+ case 10: /* buffer-ready */
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ switch (fTagNo(tvb, offset)) {
+ case 0:
+ offset = fUnsignedTag (tvb, subtree, offset,
+ "notification-threshold: ");
+ break;
+ case 1:
+ offset = fUnsignedTag (tvb, subtree, offset,
+ "previous-notification-count: ");
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case 11: /* unsigned-range */
+ while ((tvb_reported_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
+ lastoffset = offset;
+ switch (fTagNo(tvb, offset)) {
+ case 0:
+ offset = fTimeSpan (tvb, tree, offset, "Time Delay");
+ break;
+ case 1:
+ offset = fUnsignedTag (tvb, tree, offset,
+ "low-limit: ");
+ break;
+ case 2:
+ offset = fUnsignedTag (tvb, tree, offset,
+ "high-limit: ");
+ break;
+ default:
+ break;
}
}
break;
default:
- return offset;
+ break;
}
- }
+
+ /* Closing tag for parameter choice */
+ offset += fTagHeaderTree(tvb, subtree, offset, &tag_no, &tag_info, &lvt);
return offset;
}
-#endif
static guint
fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
@@ -7311,9 +7452,8 @@ fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
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 */
- offset = fEnumeratedTag (tvb, tree, offset,
- "log status: ", BACnetLogStatus);
+ case 0: /* logStatus */ /* Changed this to BitString per BACnet Spec. */
+ offset = fBitStringTagVS(tvb, tree, offset, "log status:", BACnetLogStatus);
break;
case 1:
offset = fBooleanTag (tvb, tree, offset, "boolean-value: ");
@@ -7353,8 +7493,8 @@ fLogRecord (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
offset += fTagHeaderTree (tvb, tree, offset, &tag_no, &tag_info, &lvt);
break;
case 2:
- offset = fEnumeratedTag (tvb, tree, offset,
- "Status Flags: ", BACnetStatusFlags);
+ /* Changed this to BitString per BACnet Spec. */
+ offset = fBitStringTagVS(tvb, tree, offset, "Status Flags:", BACnetStatusFlags);
break;
default:
return offset;
@@ -8267,10 +8407,10 @@ fSpecialEvent (tvbuff_t *tvb, packet_info *pinfo, proto_tree *subtree, guint off
}
switch (tag_no) {
- case 0: /* calendaryEntry */
+ case 0: /* calendarEntry */
if (tag_is_opening(tag_info)) {
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
- offset = fCalendaryEntry (tvb, subtree, offset);
+ offset = fCalendarEntry (tvb, subtree, offset);
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
}
break;