aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bacnet.c
diff options
context:
space:
mode:
authorjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>2007-08-23 06:56:04 +0000
committerjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>2007-08-23 06:56:04 +0000
commitf341a794a1b4dfa2ddf50976d4efee7f515da758 (patch)
treed96925a2067e57c04bf6accbbfeb2067306c1ecf /epan/dissectors/packet-bacnet.c
parent28f47dc45a1bce0f203afba12e0c1145925e87a7 (diff)
From Steve Karg
1. Moved all the network layer message type decodings under the network layer control bit check to prevent malformed packets. 2. Added the decoding of the optional network number for the Who-Is-Router-To-Network message type. 3. Added the decoding for the Establish-Connection-To-Network and Disconnect-Connection-To-Network network layer messages. 4. Corrected Initialize-Routing-Table and Initialize-Routing-Table-Ack decoding. 5. Added Network layer info under Column Info. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@22597 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-bacnet.c')
-rw-r--r--epan/dissectors/packet-bacnet.c198
1 files changed, 109 insertions, 89 deletions
diff --git a/epan/dissectors/packet-bacnet.c b/epan/dissectors/packet-bacnet.c
index 5ea466b530..6a9b021c54 100644
--- a/epan/dissectors/packet-bacnet.c
+++ b/epan/dissectors/packet-bacnet.c
@@ -164,7 +164,7 @@ static int hf_bacnet_rejectreason = -1;
static int hf_bacnet_rportnum = -1;
static int hf_bacnet_portid = -1;
static int hf_bacnet_pinfolen = -1;
-static int hf_bacnet_pinfo = -1;
+static int hf_bacnet_term_time_value = -1;
static gint ett_bacnet = -1;
static gint ett_bacnet_control = -1;
@@ -346,99 +346,119 @@ dissect_bacnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
bacnet_mesgtyp = tvb_get_guint8(tvb, offset);
proto_tree_add_uint_format_value(bacnet_tree,
hf_bacnet_mesgtyp, tvb, offset, 1, bacnet_mesgtyp,
- "%02x (%s)", bacnet_mesgtyp,
- bacnet_mesgtyp_name(bacnet_mesgtyp));
- offset ++;
- }
- /* Vendor ID
- * The standard says: "If Bit 7 of the control octet is 1 and
- * the Message Type field contains a value in the range
- * X'80' - X'FF', then a Vendor ID field shall be present (...)."
- * We should not go any further in dissecting the packet if it's
- * not present, but we don't know about that: No length field...
- */
- if ((bacnet_mesgtyp > 0x7f) && (bacnet_control == BAC_CONTROL_NET)) {
- proto_tree_add_item(bacnet_tree, hf_bacnet_vendor,
- tvb, offset, 2, FALSE);
- offset += 2;
- /* attention: doesnt work here because of if(tree) */
- call_dissector(data_handle,
- tvb_new_subset(tvb, offset, -1, -1), pinfo, tree);
- }
- /* Performance Index (in I-Could-Be-Router-To-Network) */
- if (bacnet_mesgtyp == BAC_NET_ICB_R) {
- proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
- tvb, offset, 2, FALSE);
- offset += 2;
- proto_tree_add_item(bacnet_tree, hf_bacnet_perf,
- tvb, offset, 1, FALSE);
- offset ++;
- }
- /* Reason, DNET (in Reject-Message-To-Network) */
- if (bacnet_mesgtyp == BAC_NET_REJ) {
- bacnet_rejectreason = tvb_get_guint8(tvb, offset);
- proto_tree_add_uint_format_value(bacnet_tree,
- hf_bacnet_rejectreason,
- tvb, offset, 1,
- bacnet_rejectreason, "%d (%s)",
- bacnet_rejectreason,
- bacnet_rejectreason_name(bacnet_rejectreason));
+ "%02x (%s)", bacnet_mesgtyp,
+ bacnet_mesgtyp_name(bacnet_mesgtyp));
+ /* Put the NPDU Type in the info column */
+ if (check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_clear(pinfo->cinfo, COL_INFO);
+ col_add_str(pinfo->cinfo, COL_INFO,
+ bacnet_mesgtyp_name(bacnet_mesgtyp));
+ }
offset ++;
- proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
- tvb, offset, 2, FALSE);
- offset += 2;
- }
- /* N*DNET (in Router-Busy-To-Network,Router-Available-To-Network) */
- if ((bacnet_mesgtyp == BAC_NET_R_BUSY) ||
- (bacnet_mesgtyp == BAC_NET_R_AVA) || (bacnet_mesgtyp == BAC_NET_IAM_R) ) {
- while(tvb_reported_length_remaining(tvb, offset) > 1 ) {
- proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ /* Vendor ID
+ * The standard says: "If Bit 7 of the control octet is 1 and
+ * the Message Type field contains a value in the range
+ * X'80' - X'FF', then a Vendor ID field shall be present (...)."
+ * We should not go any further in dissecting the packet if it's
+ * not present, but we don't know about that: No length field...
+ */
+ if (bacnet_mesgtyp > 0x7f) {
+ proto_tree_add_item(bacnet_tree, hf_bacnet_vendor,
tvb, offset, 2, FALSE);
offset += 2;
+ /* attention: doesnt work here because of if(tree) */
+ call_dissector(data_handle,
+ tvb_new_subset(tvb, offset, -1, -1), pinfo, tree);
}
- }
- /* Initialize-Routing-Table */
- if ( (bacnet_mesgtyp == BAC_NET_INIT_RTAB) ||
- (bacnet_mesgtyp == BAC_NET_INIT_RTAB_ACK) ) {
- bacnet_rportnum = tvb_get_guint8(tvb, offset);
- /* number of ports */
- proto_tree_add_uint(bacnet_tree, hf_bacnet_rportnum,
- tvb, offset, 1, bacnet_rportnum);
- offset ++;
- for(i=0; i>bacnet_rportnum; i++) {
- /* Connected DNET */
- proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ /* Performance Index (in I-Could-Be-Router-To-Network) */
+ if (bacnet_mesgtyp == BAC_NET_ICB_R) {
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
tvb, offset, 2, FALSE);
- offset += 2;
- /* Port ID */
- proto_tree_add_item(bacnet_tree, hf_bacnet_portid,
+ offset += 2;
+ proto_tree_add_item(bacnet_tree, hf_bacnet_perf,
tvb, offset, 1, FALSE);
offset ++;
- /* Port Info Length */
- bacnet_pinfolen = tvb_get_guint8(tvb, offset);
- proto_tree_add_uint(bacnet_tree, hf_bacnet_pinfolen,
- tvb, offset, 1, bacnet_pinfolen);
- offset ++;
- for(j=0; j>bacnet_pinfolen; j++){
- /* Port Info */
- proto_tree_add_item(bacnet_tree, hf_bacnet_pinfo,
- tvb, offset, 1, FALSE);
- offset ++;
+ }
+ /* Reason, DNET (in Reject-Message-To-Network) */
+ if (bacnet_mesgtyp == BAC_NET_REJ) {
+ bacnet_rejectreason = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint_format_value(bacnet_tree,
+ hf_bacnet_rejectreason,
+ tvb, offset, 1,
+ bacnet_rejectreason, "%d (%s)",
+ bacnet_rejectreason,
+ bacnet_rejectreason_name(bacnet_rejectreason));
+ offset ++;
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ tvb, offset, 2, FALSE);
+ offset += 2;
+ }
+ /* N*DNET (in Router-Busy-To-Network,Router-Available-To-Network) */
+ if ((bacnet_mesgtyp == BAC_NET_R_BUSY) ||
+ (bacnet_mesgtyp == BAC_NET_WHO_R) ||
+ (bacnet_mesgtyp == BAC_NET_R_AVA) ||
+ (bacnet_mesgtyp == BAC_NET_IAM_R) ) {
+ while(tvb_reported_length_remaining(tvb, offset) > 1 ) {
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ tvb, offset, 2, FALSE);
+ offset += 2;
+ }
+ }
+ /* Initialize-Routing-Table */
+ if ( (bacnet_mesgtyp == BAC_NET_INIT_RTAB) ||
+ (bacnet_mesgtyp == BAC_NET_INIT_RTAB_ACK) ) {
+ bacnet_rportnum = tvb_get_guint8(tvb, offset);
+ /* number of ports */
+ proto_tree_add_uint(bacnet_tree, hf_bacnet_rportnum,
+ tvb, offset, 1, bacnet_rportnum);
+ offset ++;
+ for(i=0; i<bacnet_rportnum; i++) {
+ /* Connected DNET */
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ tvb, offset, 2, FALSE);
+ offset += 2;
+ /* Port ID */
+ proto_tree_add_item(bacnet_tree, hf_bacnet_portid,
+ tvb, offset, 1, FALSE);
+ offset ++;
+ /* Port Info Length */
+ bacnet_pinfolen = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint(bacnet_tree, hf_bacnet_pinfolen,
+ tvb, offset, 1, bacnet_pinfolen);
+ offset ++;
+ proto_tree_add_text(bacnet_tree, tvb, offset,
+ bacnet_pinfolen, "Port Info: %s",
+ tvb_bytes_to_str(tvb, offset, bacnet_pinfolen));
+ offset += bacnet_pinfolen;
}
}
+ /* Establish-Connection-To-Network */
+ if (bacnet_mesgtyp == BAC_NET_EST_CON) {
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ tvb, offset, 2, FALSE);
+ offset += 2;
+ proto_tree_add_item(bacnet_tree, hf_bacnet_term_time_value,
+ tvb, offset, 1, FALSE);
+ offset ++;
+ }
+ /* Disconnect-Connection-To-Network */
+ if (bacnet_mesgtyp == BAC_NET_DISC_CON) {
+ proto_tree_add_item(bacnet_tree, hf_bacnet_dnet,
+ tvb, offset, 2, FALSE);
+ offset += 2;
+ }
+ proto_item_set_len(ti, offset);
+ }
+ /* dissect BACnet APDU */
+ next_tvb = tvb_new_subset(tvb,offset,-1,-1);
+ if (bacnet_control & BAC_CONTROL_NET) {
+ /* Unknown function - dissect the payload as data */
+ call_dissector(data_handle, next_tvb, pinfo, tree);
+ } else {
+ /* APDU - call the APDU dissector */
+ call_dissector(bacapp_handle, next_tvb, pinfo, tree);
}
- proto_item_set_len(ti, offset);
-
-/* dissect BACnet APDU
- */
- next_tvb = tvb_new_subset(tvb,offset,-1,-1);
- if (bacnet_control & BAC_CONTROL_NET) {
- /* Unknown function - dissect the payload as data */
- call_dissector(data_handle, next_tvb, pinfo, tree);
- } else {
- /* APDU - call the APDU dissector */
- call_dissector(bacapp_handle, next_tvb, pinfo, tree);
- }
}
void
@@ -593,11 +613,11 @@ proto_register_bacnet(void)
FT_UINT8, BASE_HEX, NULL, 0,
"Port ID", HFILL }
},
- { &hf_bacnet_pinfo,
- { "Port Info", "bacnet.pinfo",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Port Info", HFILL }
- },
+ { &hf_bacnet_term_time_value,
+ { "Termination Time Value (seconds)", "bacnet.term_time_value",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Termination Time Value", HFILL }
+ }
};
static gint *ett[] = {