CIP: Minor cleanup/refactoring

This commit is contained in:
Dylan Ulis 2022-10-19 15:23:32 +00:00 committed by AndersBroman
parent 7a4d05d63a
commit d2e5bd80cb
4 changed files with 36 additions and 36 deletions

View File

@ -4615,16 +4615,16 @@ static int dissect_segment_port(tvbuff_t* tvb, int offset, gboolean generate,
if (generate) if (generate)
{ {
/* Add size of extended link address */ /* Add size of extended link address */
proto_item* it = proto_tree_add_uint(path_seg_item, hf_cip_link_address_size, tvb, 0, 0, opt_link_size); proto_item* it = proto_tree_add_uint(path_seg_tree, hf_cip_link_address_size, tvb, 0, 0, opt_link_size);
proto_item_set_generated(it); proto_item_set_generated(it);
/* Add extended link address */ /* Add extended link address */
it = proto_tree_add_string(path_seg_item, hf_cip_link_address_string, tvb, 0, 0, tvb_format_text(wmem_packet_scope(), tvb, offset + offset_link_address, opt_link_size)); it = proto_tree_add_string(path_seg_tree, hf_cip_link_address_string, tvb, 0, 0, tvb_format_text(wmem_packet_scope(), tvb, offset + offset_link_address, opt_link_size));
proto_item_set_generated(it); proto_item_set_generated(it);
} }
else else
{ {
proto_tree_add_item(path_seg_item, hf_cip_link_address_size, tvb, offset + 1, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(path_seg_tree, hf_cip_link_address_size, tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(path_seg_item, hf_cip_link_address_string, tvb, offset + offset_link_address, opt_link_size, ENC_ASCII | ENC_NA); proto_tree_add_item(path_seg_tree, hf_cip_link_address_string, tvb, offset + offset_link_address, opt_link_size, ENC_ASCII | ENC_NA);
} }
proto_item_append_text(epath_item, ", Address: %s", tvb_format_text(wmem_packet_scope(), tvb, offset + offset_link_address, opt_link_size)); proto_item_append_text(epath_item, ", Address: %s", tvb_format_text(wmem_packet_scope(), tvb, offset + offset_link_address, opt_link_size));
@ -4656,12 +4656,12 @@ static int dissect_segment_port(tvbuff_t* tvb, int offset, gboolean generate,
if (generate) if (generate)
{ {
guint8 link_address_byte = tvb_get_guint8(tvb, offset + offset_link_address); guint8 link_address_byte = tvb_get_guint8(tvb, offset + offset_link_address);
proto_item* it = proto_tree_add_uint(path_seg_item, hf_cip_link_address_byte, tvb, 0, 0, link_address_byte); proto_item* it = proto_tree_add_uint(path_seg_tree, hf_cip_link_address_byte, tvb, 0, 0, link_address_byte);
proto_item_set_generated(it); proto_item_set_generated(it);
} }
else else
{ {
proto_tree_add_item(path_seg_item, hf_cip_link_address_byte, tvb, offset + offset_link_address, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(path_seg_tree, hf_cip_link_address_byte, tvb, offset + offset_link_address, 1, ENC_LITTLE_ENDIAN);
} }
proto_item_append_text(epath_item, ", Address: %d", tvb_get_guint8(tvb, offset + offset_link_address)); proto_item_append_text(epath_item, ", Address: %d", tvb_get_guint8(tvb, offset + offset_link_address));
@ -4672,12 +4672,12 @@ static int dissect_segment_port(tvbuff_t* tvb, int offset, gboolean generate,
if (generate) if (generate)
{ {
guint16 port_extended = tvb_get_letohs(tvb, extended_port_offset); guint16 port_extended = tvb_get_letohs(tvb, extended_port_offset);
proto_item* it = proto_tree_add_uint(path_seg_item, hf_cip_port_extended, tvb, 0, 0, port_extended); proto_item* it = proto_tree_add_uint(path_seg_tree, hf_cip_port_extended, tvb, 0, 0, port_extended);
proto_item_set_generated(it); proto_item_set_generated(it);
} }
else else
{ {
proto_tree_add_item(path_seg_item, hf_cip_port_extended, tvb, extended_port_offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(path_seg_tree, hf_cip_port_extended, tvb, extended_port_offset, 2, ENC_LITTLE_ENDIAN);
} }
} }
@ -6835,8 +6835,7 @@ dissect_cip_cm_fwd_open_req(cip_req_info_t *preq_info, proto_tree *cmd_tree, tvb
preq_info->connInfo->TransportClass_trigger = TransportClass_trigger; preq_info->connInfo->TransportClass_trigger = TransportClass_trigger;
preq_info->connInfo->timeout_multiplier = timeout_multiplier; preq_info->connInfo->timeout_multiplier = timeout_multiplier;
preq_info->connInfo->safety = safety_fwdopen; preq_info->connInfo->safety = safety_fwdopen;
preq_info->connInfo->ClassID = connection_path.iClass; preq_info->connInfo->connection_path = connection_path;
preq_info->connInfo->ConnPoint = connection_path.iConnPoint;
preq_info->connInfo->FwdOpenPathLenBytes = conn_path_size; preq_info->connInfo->FwdOpenPathLenBytes = conn_path_size;
preq_info->connInfo->pFwdOpenPathData = wmem_alloc(wmem_file_scope(), conn_path_size); preq_info->connInfo->pFwdOpenPathData = wmem_alloc(wmem_file_scope(), conn_path_size);
@ -6869,24 +6868,29 @@ static void display_previous_route_connection_path(cip_req_info_t *preq_info, pr
} }
} }
gboolean cip_connection_triad_match(const cip_connection_triad_t* left, const cip_connection_triad_t* right)
{
return (left->ConnSerialNumber == right->ConnSerialNumber) &&
(left->VendorID == right->VendorID) &&
(left->DeviceSerialNumber == right->DeviceSerialNumber);
}
static int static int
dissect_cip_cm_fwd_open_rsp_success(cip_req_info_t *preq_info, proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo) dissect_cip_cm_fwd_open_rsp_success(cip_req_info_t *preq_info, proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo)
{ {
int parsed_len = 26; int parsed_len = 26;
unsigned char app_rep_size;
guint32 O2TConnID, T2OConnID;
guint16 init_rollover_value = 0, init_timestamp_value = 0; guint16 init_rollover_value = 0, init_timestamp_value = 0;
proto_tree *pid_tree, *safety_tree; proto_tree *pid_tree, *safety_tree;
cip_connection_triad_t target_triad = {0}; cip_connection_triad_t target_triad = {0};
/* Display originator to target connection ID */ /* Display originator to target connection ID */
O2TConnID = tvb_get_letohl( tvb, offset ); guint32 O2TConnID;
proto_tree_add_item( tree, hf_cip_cm_ot_connid, tvb, offset, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item_ret_uint(tree, hf_cip_cm_ot_connid, tvb, offset, 4, ENC_LITTLE_ENDIAN, &O2TConnID);
/* Display target to originator connection ID */ /* Display target to originator connection ID */
T2OConnID = tvb_get_letohl( tvb, offset+4 ); guint32 T2OConnID;
proto_tree_add_item( tree, hf_cip_cm_to_connid, tvb, offset+4, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item_ret_uint(tree, hf_cip_cm_to_connid, tvb, offset+4, 4, ENC_LITTLE_ENDIAN, &T2OConnID);
// Add Connection IDs as hidden items so that it's easy to find all Connection IDs in different fields. // Add Connection IDs as hidden items so that it's easy to find all Connection IDs in different fields.
proto_item* pi = proto_tree_add_item(tree, hf_cip_connid, tvb, offset, 4, ENC_LITTLE_ENDIAN); proto_item* pi = proto_tree_add_item(tree, hf_cip_connid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@ -6900,15 +6904,15 @@ dissect_cip_cm_fwd_open_rsp_success(cip_req_info_t *preq_info, proto_tree *tree,
&conn_triad); &conn_triad);
/* Display originator to target actual packet interval */ /* Display originator to target actual packet interval */
guint32 O2TAPI = tvb_get_letohl( tvb, offset+16 ); guint32 O2TAPI;
proto_tree_add_item(tree, hf_cip_cm_ot_api, tvb, offset + 16, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item_ret_uint(tree, hf_cip_cm_ot_api, tvb, offset + 16, 4, ENC_LITTLE_ENDIAN, &O2TAPI);
/* Display originator to target actual packet interval */ /* Display originator to target actual packet interval */
guint32 T2OAPI = tvb_get_letohl( tvb, offset+20 ); guint32 T2OAPI;
proto_tree_add_item(tree, hf_cip_cm_to_api, tvb, offset + 20, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item_ret_uint(tree, hf_cip_cm_to_api, tvb, offset + 20, 4, ENC_LITTLE_ENDIAN, &T2OAPI);
/* Display the application reply size */ /* Display the application reply size */
app_rep_size = tvb_get_guint8( tvb, offset+24 ) * 2; guint16 app_rep_size = tvb_get_guint8( tvb, offset+24 ) * 2;
proto_tree_add_item(tree, hf_cip_cm_app_reply_size, tvb, offset+24, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_cip_cm_app_reply_size, tvb, offset+24, 1, ENC_LITTLE_ENDIAN);
/* Display the Reserved byte */ /* Display the Reserved byte */
@ -6976,9 +6980,7 @@ dissect_cip_cm_fwd_open_rsp_success(cip_req_info_t *preq_info, proto_tree *tree,
if ((preq_info != NULL) && (preq_info->connInfo != NULL)) if ((preq_info != NULL) && (preq_info->connInfo != NULL))
{ {
/* Ensure the connection triad matches before updating the connection IDs */ /* Ensure the connection triad matches before updating the connection IDs */
if ((preq_info->connInfo->triad.ConnSerialNumber == conn_triad.ConnSerialNumber) && if (cip_connection_triad_match(&(preq_info->connInfo->triad), &conn_triad))
(preq_info->connInfo->triad.VendorID == conn_triad.VendorID) &&
(preq_info->connInfo->triad.DeviceSerialNumber == conn_triad.DeviceSerialNumber))
{ {
/* Update the connection IDs as ForwardOpen reply is allowed to update them from /* Update the connection IDs as ForwardOpen reply is allowed to update them from
the ForwardOpen request */ the ForwardOpen request */
@ -6992,6 +6994,7 @@ dissect_cip_cm_fwd_open_rsp_success(cip_req_info_t *preq_info, proto_tree *tree,
preq_info->connInfo->safety.running_rollover_value = init_rollover_value; preq_info->connInfo->safety.running_rollover_value = init_rollover_value;
preq_info->connInfo->safety.running_timestamp_value = init_timestamp_value; preq_info->connInfo->safety.running_timestamp_value = init_timestamp_value;
preq_info->connInfo->safety.target_triad = target_triad; preq_info->connInfo->safety.target_triad = target_triad;
preq_info->connInfo->safety.seen_non_zero_timestamp = FALSE;
} }
} }
} }

View File

@ -530,10 +530,9 @@ typedef struct cip_conn_info {
guint8 TransportClass_trigger; guint8 TransportClass_trigger;
guint32 timeout_multiplier; guint32 timeout_multiplier;
cip_safety_epath_info_t safety; cip_safety_epath_info_t safety;
guint32 ClassID;
guint32 ConnPoint;
guint32 FwdOpenPathLenBytes; guint32 FwdOpenPathLenBytes;
void* pFwdOpenPathData; void* pFwdOpenPathData;
cip_simple_request_info_t connection_path;
// Information about specific packet numbers. // Information about specific packet numbers.
guint32 open_req_frame; guint32 open_req_frame;
@ -632,7 +631,7 @@ extern int dissect_padded_epath_len_uint(packet_info *pinfo, proto_tree *tree,
extern void load_cip_request_data(packet_info *pinfo, cip_simple_request_info_t *req_data); extern void load_cip_request_data(packet_info *pinfo, cip_simple_request_info_t *req_data);
extern void reset_cip_request_info(cip_simple_request_info_t* req_data); extern void reset_cip_request_info(cip_simple_request_info_t* req_data);
extern gboolean should_dissect_cip_response(tvbuff_t *tvb, int offset, guint8 gen_status); extern gboolean should_dissect_cip_response(tvbuff_t *tvb, int offset, guint8 gen_status);
extern gboolean cip_connection_triad_match(const cip_connection_triad_t* left, const cip_connection_triad_t* right);
/* /*
** Exported variables ** Exported variables

View File

@ -2073,7 +2073,7 @@ dissect_cipmotion(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* dat
guint8 ConnPoint = 2; guint8 ConnPoint = 2;
if (io_data_input && io_data_input->conn_info) if (io_data_input && io_data_input->conn_info)
{ {
ConnPoint = io_data_input->conn_info->ConnPoint; ConnPoint = io_data_input->conn_info->connection_path.iConnPoint;
} }
/* Create display subtree for the protocol by creating an item and then /* Create display subtree for the protocol by creating an item and then
@ -2188,7 +2188,7 @@ static int dissect_cipmotion3(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tre
{ {
cip_conn_info_t conn_info; cip_conn_info_t conn_info;
memset(&conn_info, 0, sizeof(conn_info)); memset(&conn_info, 0, sizeof(conn_info));
conn_info.ConnPoint = 3; conn_info.connection_path.iConnPoint = 3;
cip_io_data_input io_data_input; cip_io_data_input io_data_input;
io_data_input.conn_info = &conn_info; io_data_input.conn_info = &conn_info;

View File

@ -1108,9 +1108,7 @@ enip_conn_equal(gconstpointer v, gconstpointer w)
const enip_conn_key_t *v1 = (const enip_conn_key_t *)v; const enip_conn_key_t *v1 = (const enip_conn_key_t *)v;
const enip_conn_key_t *v2 = (const enip_conn_key_t *)w; const enip_conn_key_t *v2 = (const enip_conn_key_t *)w;
if ((v1->triad.ConnSerialNumber == v2->triad.ConnSerialNumber) && if (cip_connection_triad_match(&v1->triad, &v2->triad) &&
(v1->triad.VendorID == v2->triad.VendorID) &&
(v1->triad.DeviceSerialNumber == v2->triad.DeviceSerialNumber) &&
((v1->O2TConnID == 0) || (v2->O2TConnID == 0) || (v1->O2TConnID == v2->O2TConnID)) && ((v1->O2TConnID == 0) || (v2->O2TConnID == 0) || (v1->O2TConnID == v2->O2TConnID)) &&
((v1->T2OConnID == 0) || (v2->T2OConnID == 0) || (v1->T2OConnID == v2->T2OConnID))) ((v1->T2OConnID == 0) || (v2->T2OConnID == 0) || (v1->T2OConnID == v2->T2OConnID)))
return TRUE; return TRUE;
@ -2614,7 +2612,7 @@ static void dissect_cip_class01_io(packet_info* pinfo, tvbuff_t* tvb, int offset
} }
else else
{ {
dissector_handle_t dissector = dissector_get_uint_handle(subdissector_io_table, conn_info->ClassID); dissector_handle_t dissector = dissector_get_uint_handle(subdissector_io_table, conn_info->connection_path.iClass);
if (dissector) if (dissector)
{ {
call_dissector_with_data(dissector, next_tvb, pinfo, dissector_tree, &io_data_input); call_dissector_with_data(dissector, next_tvb, pinfo, dissector_tree, &io_data_input);
@ -2660,14 +2658,14 @@ static void dissect_cip_class23_data(packet_info* pinfo, tvbuff_t* tvb, int offs
if (conn_info != NULL) if (conn_info != NULL)
{ {
dissector_handle_t dissector = dissector_get_uint_handle(subdissector_cip_connection_table, conn_info->ClassID); dissector_handle_t dissector = dissector_get_uint_handle(subdissector_cip_connection_table, conn_info->connection_path.iClass);
if (dissector) if (dissector)
{ {
call_dissector_with_data(dissector, next_tvb, pinfo, dissector_tree, GUINT_TO_POINTER(conn_info->ClassID)); call_dissector_with_data(dissector, next_tvb, pinfo, dissector_tree, GUINT_TO_POINTER(conn_info->connection_path.iClass));
} }
else else
{ {
call_dissector_with_data(cip_implicit_handle, next_tvb, pinfo, dissector_tree, GUINT_TO_POINTER(conn_info->ClassID)); call_dissector_with_data(cip_implicit_handle, next_tvb, pinfo, dissector_tree, GUINT_TO_POINTER(conn_info->connection_path.iClass));
} }
} }
else else