Ethereal-dev: [Ethereal-dev] Patch for packet-bacapp.c for bug 793 and a few as yet unlogged p
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: David Richards <d_m_richards@xxxxxxxxxxx>
Date: Sat, 18 Mar 2006 00:15:58 -0600
Patch that fixes bug 793 and a few other things mostly revolving around
BACnet schedules. Could someone please take care of this?
1) fDate - correctly handle wild card year 2) fTime - rename local variables cut-and-pasted from fDate3) fCalendarEntry - do single-pass decoding rather than while loop since the structure cannot be repeated.
4) fDailySchedule - correctly handle enclosing context tags. 5) fWeeklySchedule - correctly handle enclosing context tags6) fAcknowledgeAlarmRequest - fix function name spelling and tags 3 and 5 are timeStamp, not time.
7) fSpecialEvent - handle context tags correctly. 8) fReadRangeRequest - Add cases from 2004 spec Dave Richards
Index: packet-bacapp.c
===================================================================
--- packet-bacapp.c (revision 17561)
+++ packet-bacapp.c (working copy)
@@ -1716,14 +1716,18 @@
proto_tree *subtree;
tag_len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
- year = tvb_get_guint8(tvb, offset+tag_len) + 1900;
+ year = tvb_get_guint8(tvb, offset+tag_len);
month = tvb_get_guint8(tvb, offset+tag_len+1);
day = tvb_get_guint8(tvb, offset+tag_len+2);
weekday = tvb_get_guint8(tvb, offset+tag_len+3);
if ((year == 255) && (day == 255) && (month == 255) && (weekday == 255))
+ {
ti = proto_tree_add_text(tree, tvb, offset, lvt+tag_len,
"%sany", label);
- else
+ }
+ else if (year != 255)
+ {
+ year += 1900;
ti = proto_tree_add_text(tree, tvb, offset, lvt+tag_len,
"%s%s %d, %d, (Day of Week = %s)",
label, val_to_str(month,
@@ -1732,6 +1736,14 @@
day, year, val_to_str(weekday,
days,
"(%d) not found"));
+ }
+ else
+ {
+ ti = proto_tree_add_text(tree, tvb, offset, lvt+tag_len,
+ "%s%s %d, any year, (Day of Week = %s)",
+ label, val_to_str(month, months, "month (%d) not found"),
+ day, val_to_str(weekday, days, "(%d) not found"));
+ }
subtree = proto_item_add_subtree(ti, ett_bacapp_tag);
fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
@@ -1741,28 +1753,28 @@
static guint
fTime (tvbuff_t *tvb, proto_tree *tree, guint offset, const gchar *label)
{
- guint32 year, month, day, weekday, lvt;
+ guint32 hour, minute, second, msec, lvt;
guint8 tag_no, tag_info;
guint tag_len;
proto_item *ti;
proto_tree *subtree;
tag_len = fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
- year = tvb_get_guint8(tvb, offset+tag_len);
- month = tvb_get_guint8(tvb, offset+tag_len+1);
- day = tvb_get_guint8(tvb, offset+tag_len+2);
- weekday = tvb_get_guint8(tvb, offset+tag_len+3);
- if ((year == 255) && (day == 255) && (month == 255) && (weekday == 255))
+ hour = tvb_get_guint8(tvb, offset+tag_len);
+ minute = tvb_get_guint8(tvb, offset+tag_len+1);
+ second = tvb_get_guint8(tvb, offset+tag_len+2);
+ msec = tvb_get_guint8(tvb, offset+tag_len+3);
+ if ((hour == 255) && (minute == 255) && (second == 255) && (msec == 255))
ti = proto_tree_add_text(tree, tvb, offset,
lvt+tag_len, "%sany", label);
else
ti = proto_tree_add_text(tree, tvb, offset, lvt+tag_len,
"%s%d:%02d:%02d.%d %s = %02d:%02d:%02d.%d",
label,
- year > 12 ? year -12 : year,
- month, day, weekday,
- year > 12 ? "P.M." : "A.M.",
- year, month, day, weekday);
+ hour > 12 ? hour - 12 : hour,
+ minute, second, msec,
+ hour > 12 ? "P.M." : "A.M.",
+ hour, minute, second, msec);
subtree = proto_item_add_subtree(ti, ett_bacapp_tag);
fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
@@ -1805,26 +1817,26 @@
static guint
fCalendaryEntry (tvbuff_t *tvb, proto_tree *tree, guint offset)
{
- guint lastoffset = 0;
+ guint8 tag_no, tag_info;
+ guint32 lvt;
- while ((tvb_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
- lastoffset = offset;
-
- switch (fTagNo(tvb, offset)) {
- case 0: /* Date */
- offset = fDate (tvb, tree, offset, "Date: ");
- break;
- case 1: /* dateRange */
- offset = fDateRange (tvb, tree, offset);
- break;
- case 2: /* BACnetWeekNDay */
- offset = fWeekNDay (tvb, tree, offset);
- break;
- default:
- return offset;
- break;
- }
+ switch (fTagNo(tvb, offset)) {
+ case 0: /* Date */
+ offset = fDate (tvb, tree, offset, "Date: ");
+ break;
+ case 1: /* dateRange */
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ offset = fDateRange (tvb, tree, offset);
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ break;
+ case 2: /* BACnetWeekNDay */
+ offset = fWeekNDay (tvb, tree, offset);
+ break;
+ default:
+ return offset;
+ break;
}
+
return offset;
}
@@ -2623,28 +2635,27 @@
guint8 tag_no, tag_info;
guint32 lvt;
- while ((tvb_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)) {
- offset += fTagHeaderTree (tvb, subtree, offset,
- &tag_no, &tag_info, &lvt);
- return offset;
- }
-
- switch (tag_no) {
- case 0: /* day-schedule */
- if (tag_is_opening(tag_info)) {
- offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
- offset = fTimeValue (tvb, subtree, offset);
- break;
+ fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
+ if (tag_is_opening(tag_info) && tag_no == 0)
+ {
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt); /* opening context tag 0 */
+ while ((tvb_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)) {
+ /* should be closing context tag 0 */
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ return offset;
}
- FAULT;
- break;
- default:
- return offset;
+
+ offset = fTimeValue (tvb, subtree, offset);
}
}
+ else if (tag_no == 0 && lvt == 0)
+ {
+ /* not sure null (empty array element) is legal */
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ }
return offset;
}
@@ -2662,9 +2673,7 @@
lastoffset = offset;
fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
if (tag_is_closing(tag_info)) {
- offset += fTagHeaderTree (tvb, tree, offset,
- &tag_no, &tag_info, &lvt);
- return offset;
+ return offset; /* outer encoding will print out closing tag */
}
tt = proto_tree_add_text(tree, tvb, offset, 0, val_to_str(i++, days, "day of week (%d) not found"));
subtree = proto_item_add_subtree(tt, ett_bacapp_value);
@@ -3484,9 +3493,11 @@
}
static guint
-fAcknowlegdeAlarmRequest (tvbuff_t *tvb, proto_tree *tree, guint offset)
+fAcknowledgeAlarmRequest (tvbuff_t *tvb, proto_tree *tree, guint offset)
{
guint lastoffset = 0;
+ guint8 tag_no = 0, tag_info = 0;
+ guint32 lvt = 0;
while ((tvb_length_remaining(tvb, offset) > 0)&&(offset>lastoffset)) { /* exit loop if nothing happens inside */
lastoffset = offset;
@@ -3502,13 +3513,17 @@
"event State Acknowledged: ", BACnetEventState, 64);
break;
case 3: /* timeStamp */
- offset = fTime (tvb, tree, offset, "time Stamp: ");
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ offset = fTimeStamp(tvb, tree, offset, "time Stamp: ");
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
break;
case 4: /* acknowledgementSource */
offset = fCharacterString (tvb, tree, offset, "acknowledgement Source: ");
break;
case 5: /* timeOfAcknowledgement */
- offset = fTime (tvb, tree, offset, "time Of Acknowledgement: ");
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
+ offset = fTimeStamp(tvb, tree, offset, "time Of Acknowledgement: ");
+ offset += fTagHeaderTree(tvb, tree, offset, &tag_no, &tag_info, &lvt);
break;
default:
return offset;
@@ -4220,21 +4235,26 @@
lastoffset = offset;
fTagHeader (tvb, offset, &tag_no, &tag_info, &lvt);
if (tag_is_closing(tag_info)) {
- offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
continue;
}
- switch (fTagNo(tvb,offset)) {
+ switch (tag_no) {
case 0: /* calendaryEntry */
- offset = fCalendaryEntry (tvb, subtree, offset);
+ if (tag_is_opening(tag_info))
+ {
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ offset = fCalendaryEntry (tvb, subtree, offset);
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ }
break;
case 1: /* calendarReference */
offset = fObjectIdentifier (tvb, subtree, offset);
break;
- case 2: /* calendarReference */
+ case 2: /* list of BACnetTimeValue */
if (tag_is_opening(tag_info)) {
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
offset = fTimeValue (tvb, subtree, offset);
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
break;
}
FAULT;
@@ -4550,11 +4570,12 @@
FAULT;
break;
case 4: /* range byTime */
+ case 7: /* 2004 spec */
if (tag_is_opening(tag_info)) {
tt = proto_tree_add_text(subtree, tvb, offset, 1, "range byTime");
subtree = proto_item_add_subtree(tt, ett_bacapp_value);
offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
- offset = fApplicationTypes (tvb, subtree, offset, "reference Time: ");
+ offset = fDateTime(tvb, subtree, offset, "reference Date/Time: ");
offset = fApplicationTypes (tvb, subtree, offset, "reference Count: ");
break;
}
@@ -4571,6 +4592,17 @@
}
FAULT;
break;
+ case 6: /* range bySequenceNumber, 2004 spec */
+ if (tag_is_opening(tag_info)) {
+ tt = proto_tree_add_text(subtree, tvb, offset, 1, "range bySequenceNumber");
+ subtree = proto_item_add_subtree(tt, ett_bacapp_value);
+ offset += fTagHeaderTree (tvb, subtree, offset, &tag_no, &tag_info, &lvt);
+ offset = fApplicationTypes (tvb, subtree, offset, "referenceIndex: ");
+ offset = fApplicationTypes (tvb, subtree, offset, "reference Count: ");
+ break;
+ }
+ FAULT;
+ break;
default:
return offset;
}
@@ -4794,7 +4826,7 @@
switch (service_choice) {
case 0: /* acknowledgeAlarm */
- offset = fAcknowlegdeAlarmRequest (tvb, tree, offset);
+ offset = fAcknowledgeAlarmRequest (tvb, tree, offset);
break;
case 1: /* confirmedCOVNotification */
offset = fConfirmedCOVNotificationRequest (tvb, tree, offset);
- Follow-Ups:
- Prev by Date: Re: [Ethereal-dev] Assistance with BACNet bugs?
- Next by Date: [Ethereal-dev] buildbot failure in Windows-2003-IA32
- Previous by thread: [Ethereal-dev] how can we let ethereal analyse the ftp data stream while ftp port <>21
- Next by thread: Re: [Ethereal-dev] Patch for packet-bacapp.c for bug 793 and a few as yet unlogged problems
- Index(es):





