diff options
Diffstat (limited to 'plugins/profinet')
-rw-r--r-- | plugins/profinet/packet-dcerpc-pn-io.c | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/plugins/profinet/packet-dcerpc-pn-io.c b/plugins/profinet/packet-dcerpc-pn-io.c index 3128cfcec8..859c381ab9 100644 --- a/plugins/profinet/packet-dcerpc-pn-io.c +++ b/plugins/profinet/packet-dcerpc-pn-io.c @@ -101,6 +101,7 @@ static int proto_pn_io_device = -1; static int proto_pn_io_controller = -1; static int proto_pn_io_supervisor = -1; static int proto_pn_io_parameterserver = -1; +static int proto_pn_io_implicitar = -1; static int hf_pn_io_opnum = -1; static int hf_pn_io_reserved16 = -1; @@ -805,6 +806,13 @@ static guint16 ver_pn_io_supervisor = 1; static e_guid_t uuid_pn_io_parameterserver = { 0xDEA00004, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } }; static guint16 ver_pn_io_parameterserver = 1; +/* According to specification: + * Value(UUID): 00000000-0000-0000-0000-000000000000 + * Meaning: Reserved + * Use: The value NIL indicates the usage of the implicit AR. + */ +static e_guid_t uuid_pn_io_implicitar = { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; +static guint16 ver_pn_io_implicitar = 1; /* PNIO Preference Variables */ gboolean pnio_ps_selection = TRUE; @@ -4571,10 +4579,8 @@ dissect_IODWriteReqHeader_block(tvbuff_t *tvb, int offset, offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "IODWriteReq: AR information not found!"); - } offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, hf_pn_io_record_data_length, u32RecDataLen); @@ -4614,10 +4620,8 @@ dissect_IODReadReqHeader_block(tvbuff_t *tvb, int offset, offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "IODReadReq: AR information not found!"); - } offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, hf_pn_io_record_data_length, u32RecDataLen); @@ -4661,10 +4665,8 @@ dissect_IODWriteResHeader_block(tvbuff_t *tvb, int offset, offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "IODWriteRes: AR information not found!"); - } offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, hf_pn_io_record_data_length, u32RecDataLen); @@ -4713,10 +4715,8 @@ dissect_IODReadResHeader_block(tvbuff_t *tvb, int offset, offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "IODReadRes: AR information not found!"); - } offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, hf_pn_io_record_data_length, u32RecDataLen); @@ -4766,10 +4766,8 @@ dissect_ControlConnect_block(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep, hf_pn_io_ar_uuid, &ar_uuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &ar_uuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "ControlConnect: AR information not found!"); - } offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_sessionkey, &u16SessionKey); @@ -4862,10 +4860,9 @@ dissect_ControlBlockPrmBegin(tvbuff_t *tvb, int offset, /* ARUUID */ offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep, hf_pn_io_ar_uuid, &ar_uuid); + /* The value NIL indicates the usage of the implicit AR*/ *ar = pnio_ar_find_by_aruuid(pinfo, &ar_uuid); - if (*ar == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "ControlBlockPrmBegin: AR information not found! (partial capture?)"); - } + /* SessionKey */ offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_sessionkey, &u16SessionKey); @@ -7738,10 +7735,9 @@ dissect_ARBlockRes_block(tvbuff_t *tvb, int offset, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], u16UDPRTPort); + /* The value NIL indicates the usage of the implicit AR*/ par = pnio_ar_find_by_aruuid(pinfo, &uuid); - if (par == NULL) { - expert_add_info_format(pinfo, item, &ei_pn_io_ar_info_not_found, "ARBlockRes: AR information not found!"); - } else { + if (par != NULL) { memcpy( (void *) (&par->devicemac), mac, sizeof(par->controllermac)); } *ar = par; @@ -13914,6 +13910,7 @@ proto_register_pn_io (void) proto_pn_io_controller = proto_register_protocol ("PROFINET IO (Controller)", "PNIO (Controller Interface)", "pn_io_controller"); proto_pn_io_supervisor = proto_register_protocol ("PROFINET IO (Supervisor)", "PNIO (Supervisor Interface)", "pn_io_supervisor"); proto_pn_io_parameterserver = proto_register_protocol ("PROFINET IO (Parameter Server)", "PNIO (Parameter Server Interface)", "pn_io_parameterserver"); + proto_pn_io_implicitar = proto_register_protocol("PROFINET IO (Implicit Ar)", "PNIO (Implicit Ar)", "pn_io_implicitar"); proto_register_field_array (proto_pn_io, hf, array_length (hf)); proto_register_subtree_array (ett, array_length (ett)); @@ -13954,6 +13951,7 @@ proto_reg_handoff_pn_io (void) dcerpc_init_uuid (proto_pn_io_controller, ett_pn_io, &uuid_pn_io_controller, ver_pn_io_controller, pn_io_dissectors, hf_pn_io_opnum); dcerpc_init_uuid (proto_pn_io_supervisor, ett_pn_io, &uuid_pn_io_supervisor, ver_pn_io_supervisor, pn_io_dissectors, hf_pn_io_opnum); dcerpc_init_uuid (proto_pn_io_parameterserver, ett_pn_io, &uuid_pn_io_parameterserver, ver_pn_io_parameterserver, pn_io_dissectors, hf_pn_io_opnum); + dcerpc_init_uuid (proto_pn_io_implicitar, ett_pn_io, &uuid_pn_io_implicitar, ver_pn_io_implicitar, pn_io_dissectors, hf_pn_io_opnum); heur_dissector_add("pn_rt", dissect_PNIO_heur, "PROFINET IO", "pn_io_pn_rt", proto_pn_io, HEURISTIC_ENABLE); } |