#include "iec104_module.h"
#include "iec104_parse_information_object_elements.h"
+#ifdef UNIT_TEST
+void (*genericGroupPtr)(const void* genericIOGroup) = nullptr;
+#endif
+
using namespace snort;
// perform some checks on the ASDU
-static bool checkIec104Asdu(Iec104AsduCheck curAsduCheck)
+static bool checkIec104Asdu(const Iec104AsduCheck& curAsduCheck)
{
// keep a flag to indicate whether we should exit after executing
// taking this approach instead of returning directly as multiple of these
// This should not be called directly by anything other than parseGenericAsdu
static void parseIec104GenericIOGroup(const GenericIec104AsduIOGroup* genericIOGroup)
{
+#ifdef UNIT_TEST
+ if (genericGroupPtr)
+ {
+ genericGroupPtr(genericIOGroup->m_sp_na_1IOSubgroup);
+ }
+#endif
+ if (!genericIOGroup->m_sp_na_1IOSubgroup)
+ {
+ // invalid subgroup pointers
+ if (genericIOGroup->asduType == IEC104_ASDU_F_SG_NA_1)
+ DetectionEngine::queue_event(GID_IEC104, IEC104_NULL_LOS_VALUE);
+ return;
+ }
// determine which ASDU parsing logic to run based off of the passed type
switch (genericIOGroup->asduType)
{
}
}
-static void parseIec104GenericAsdu(uint32_t asduType, const Iec104ApciI* apci)
+#define ASDU_MAP_SIZE_ITEM 0
+#define ASDU_MAP_OFFSET_ITEM 1
+
+const std::unordered_map<uint32_t, std::tuple<int,int> > asdu_size_map =
+{
+{ IEC104_ASDU_M_SP_NA_1 , { sizeof(Iec104M_SP_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_sp_na_1.subgroup) } },
+{ IEC104_ASDU_M_DP_NA_1 , { sizeof(Iec104M_DP_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_dp_na_1.subgroup) } },
+{ IEC104_ASDU_M_ST_NA_1 , { sizeof(Iec104M_ST_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_st_na_1.subgroup) } },
+{ IEC104_ASDU_M_BO_NA_1 , { sizeof(Iec104M_BO_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_bo_na_1.subgroup) } },
+{ IEC104_ASDU_M_ME_NA_1 , { sizeof(Iec104M_ME_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_me_na_1.subgroup) } },
+{ IEC104_ASDU_M_ME_NB_1 , { sizeof(Iec104M_ME_NB_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_me_nb_1.subgroup) } },
+{ IEC104_ASDU_M_ME_NC_1 , { sizeof(Iec104M_ME_NC_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_me_nc_1.subgroup) } },
+{ IEC104_ASDU_M_IT_NA_1 , { sizeof(Iec104M_IT_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_it_na_1.subgroup) } },
+{ IEC104_ASDU_M_PS_NA_1 , { sizeof(Iec104M_PS_NA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_ps_na_1.subgroup) } },
+{ IEC104_ASDU_M_ME_ND_1 , { sizeof(Iec104M_ME_ND_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.m_me_nd_1.subgroup) } },
+{ IEC104_ASDU_F_DR_TA_1 , { sizeof(Iec104F_DR_TA_1_IO_Subgroup) , offsetof(Iec104ApciI, asdu.f_dr_ta_1.subgroup) } },
+{ IEC104_ASDU_M_SP_NA_1 , { sizeof(Iec104M_SP_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_sp_na_1) } },
+{ IEC104_ASDU_M_SP_TA_1 , { sizeof(Iec104M_SP_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_sp_ta_1) } },
+{ IEC104_ASDU_M_DP_NA_1 , { sizeof(Iec104M_DP_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_dp_na_1) } },
+{ IEC104_ASDU_M_DP_TA_1 , { sizeof(Iec104M_DP_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_dp_ta_1) } },
+{ IEC104_ASDU_M_ST_NA_1 , { sizeof(Iec104M_ST_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_st_na_1) } },
+{ IEC104_ASDU_M_ST_TA_1 , { sizeof(Iec104M_ST_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_st_ta_1) } },
+{ IEC104_ASDU_M_BO_NA_1 , { sizeof(Iec104M_BO_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_bo_na_1) } },
+{ IEC104_ASDU_M_BO_TA_1 , { sizeof(Iec104M_BO_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_bo_ta_1) } },
+{ IEC104_ASDU_M_ME_NA_1 , { sizeof(Iec104M_ME_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_na_1) } },
+{ IEC104_ASDU_M_ME_TA_1 , { sizeof(Iec104M_ME_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_ta_1) } },
+{ IEC104_ASDU_M_ME_NB_1 , { sizeof(Iec104M_ME_NB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_nb_1) } },
+{ IEC104_ASDU_M_ME_TB_1 , { sizeof(Iec104M_ME_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_tb_1) } },
+{ IEC104_ASDU_M_ME_NC_1 , { sizeof(Iec104M_ME_NC_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_nc_1) } },
+{ IEC104_ASDU_M_ME_TC_1 , { sizeof(Iec104M_ME_TC_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_tc_1) } },
+{ IEC104_ASDU_M_IT_NA_1 , { sizeof(Iec104M_IT_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_it_na_1) } },
+{ IEC104_ASDU_M_IT_TA_1 , { sizeof(Iec104M_IT_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_it_ta_1) } },
+{ IEC104_ASDU_M_EP_TA_1 , { sizeof(Iec104M_EP_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_ta_1) } },
+{ IEC104_ASDU_M_EP_TB_1 , { sizeof(Iec104M_EP_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_tb_1) } },
+{ IEC104_ASDU_M_EP_TC_1 , { sizeof(Iec104M_EP_TC_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_tc_1) } },
+{ IEC104_ASDU_M_PS_NA_1 , { sizeof(Iec104M_PS_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ps_na_1) } },
+{ IEC104_ASDU_M_ME_ND_1 , { sizeof(Iec104M_ME_ND_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_nd_1) } },
+{ IEC104_ASDU_M_SP_TB_1 , { sizeof(Iec104M_SP_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_sp_tb_1) } },
+{ IEC104_ASDU_M_DP_TB_1 , { sizeof(Iec104M_DP_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_dp_tb_1) } },
+{ IEC104_ASDU_M_ST_TB_1 , { sizeof(Iec104M_ST_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_st_tb_1) } },
+{ IEC104_ASDU_M_BO_TB_1 , { sizeof(Iec104M_BO_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_bo_tb_1) } },
+{ IEC104_ASDU_M_ME_TD_1 , { sizeof(Iec104M_ME_TD_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_td_1) } },
+{ IEC104_ASDU_M_ME_TE_1 , { sizeof(Iec104M_ME_TE_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_te_1) } },
+{ IEC104_ASDU_M_ME_TF_1 , { sizeof(Iec104M_ME_TF_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_me_tf_1) } },
+{ IEC104_ASDU_M_IT_TB_1 , { sizeof(Iec104M_IT_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_it_tb_1) } },
+{ IEC104_ASDU_M_EP_TD_1 , { sizeof(Iec104M_EP_TD_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_td_1) } },
+{ IEC104_ASDU_M_EP_TE_1 , { sizeof(Iec104M_EP_TE_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_te_1) } },
+{ IEC104_ASDU_M_EP_TF_1 , { sizeof(Iec104M_EP_TF_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ep_tf_1) } },
+{ IEC104_ASDU_C_SC_NA_1 , { sizeof(Iec104C_SC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_sc_na_1) } },
+{ IEC104_ASDU_C_DC_NA_1 , { sizeof(Iec104C_DC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_dc_na_1) } },
+{ IEC104_ASDU_C_RC_NA_1 , { sizeof(Iec104C_RC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_rc_na_1) } },
+{ IEC104_ASDU_C_SE_NA_1 , { sizeof(Iec104C_SE_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_na_1) } },
+{ IEC104_ASDU_C_SE_NB_1 , { sizeof(Iec104C_SE_NB_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_nb_1) } },
+{ IEC104_ASDU_C_SE_NC_1 , { sizeof(Iec104C_SE_NC_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_nc_1) } },
+{ IEC104_ASDU_C_BO_NA_1 , { sizeof(Iec104C_BO_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_bo_na_1) } },
+{ IEC104_ASDU_C_SC_TA_1 , { sizeof(Iec104C_SC_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_sc_ta_1) } },
+{ IEC104_ASDU_C_DC_TA_1 , { sizeof(Iec104C_DC_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_dc_ta_1) } },
+{ IEC104_ASDU_C_RC_TA_1 , { sizeof(Iec104C_RC_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_rc_ta_1) } },
+{ IEC104_ASDU_C_SE_TA_1 , { sizeof(Iec104C_SE_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_ta_1) } },
+{ IEC104_ASDU_C_SE_TB_1 , { sizeof(Iec104C_SE_TB_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_tb_1) } },
+{ IEC104_ASDU_C_SE_TC_1 , { sizeof(Iec104C_SE_TC_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_se_tc_1) } },
+{ IEC104_ASDU_C_BO_TA_1 , { sizeof(Iec104C_BO_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_bo_ta_1) } },
+{ IEC104_ASDU_M_EI_NA_1 , { sizeof(Iec104M_EI_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.m_ei_na_1) } },
+{ IEC104_ASDU_C_IC_NA_1 , { sizeof(Iec104C_IC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_ic_na_1) } },
+{ IEC104_ASDU_C_CI_NA_1 , { sizeof(Iec104C_CI_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_ci_na_1) } },
+{ IEC104_ASDU_C_RD_NA_1 , { sizeof(Iec104C_RD_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_rd_na_1) } },
+{ IEC104_ASDU_C_CS_NA_1 , { sizeof(Iec104C_CS_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_cs_na_1) } },
+{ IEC104_ASDU_C_TS_NA_1 , { sizeof(Iec104C_TS_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_ts_na_1) } },
+{ IEC104_ASDU_C_RP_NA_1 , { sizeof(Iec104C_RP_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_rp_na_1) } },
+{ IEC104_ASDU_C_CD_NA_1 , { sizeof(Iec104C_CD_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_cd_na_1) } },
+{ IEC104_ASDU_C_TS_TA_1 , { sizeof(Iec104C_TS_TA_1_IO_Group) , offsetof(Iec104ApciI, asdu.c_ts_ta_1) } },
+{ IEC104_ASDU_P_ME_NA_1 , { sizeof(Iec104P_ME_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.p_me_na_1) } },
+{ IEC104_ASDU_P_ME_NB_1 , { sizeof(Iec104P_ME_NB_1_IO_Group) , offsetof(Iec104ApciI, asdu.p_me_nb_1) } },
+{ IEC104_ASDU_P_ME_NC_1 , { sizeof(Iec104P_ME_NC_1_IO_Group) , offsetof(Iec104ApciI, asdu.p_me_nc_1) } },
+{ IEC104_ASDU_P_AC_NA_1 , { sizeof(Iec104P_AC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.p_ac_na_1) } },
+{ IEC104_ASDU_F_FR_NA_1 , { sizeof(Iec104F_FR_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_fr_na_1) } },
+{ IEC104_ASDU_F_SR_NA_1 , { sizeof(Iec104F_SR_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_sr_na_1) } },
+{ IEC104_ASDU_F_SC_NA_1 , { sizeof(Iec104F_SC_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_sc_na_1) } },
+{ IEC104_ASDU_F_LS_NA_1 , { sizeof(Iec104F_LS_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_ls_na_1) } },
+{ IEC104_ASDU_F_AF_NA_1 , { sizeof(Iec104F_AF_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_af_na_1) } },
+{ IEC104_ASDU_F_SG_NA_1 , { sizeof(Iec104F_SG_NA_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_sg_na_1) } },
+{ IEC104_ASDU_F_SC_NB_1 , { sizeof(Iec104F_SC_NB_1_IO_Group) , offsetof(Iec104ApciI, asdu.f_sc_nb_1) } }
+};
+
+static void parseIec104GenericAsdu(uint32_t asduType, const Iec104ApciI* apci, const uint16_t& data_size)
{
- uint32_t verifiedNumberOfElements = parseIec104Vsq(apci);
+ if (asdu_size_map.find(asduType) == asdu_size_map.end())
+ {
+ // ASDU parsing not implemented for this type
+ return;
+ }
+
+ uint32_t verifiedNumberOfElements = parseIec104Vsq(apci, data_size);
parseIec104CauseOfTx(apci);
parseIec104TwoOctetCommonAddress(apci);
// Set up the generic group structure
GenericIec104AsduIOGroup genericIOGroup;
+ memset(&genericIOGroup, 0, sizeof(GenericIec104AsduIOGroup));
genericIOGroup.asduType = asduType;
genericIOGroup.apduSize = apci->header.length;
// make sure the number of elements value is acceptable
if (verifiedNumberOfElements > 0 && verifiedNumberOfElements <= 255) {
+
+ if ((const uint8_t*)apci + std::get<ASDU_MAP_OFFSET_ITEM>(asdu_size_map.at(asduType)) + (verifiedNumberOfElements * std::get<ASDU_MAP_SIZE_ITEM>(asdu_size_map.at(asduType))) > (const uint8_t*)apci + data_size)
+ {
+ // number of elements exceeds the bounds of the data size, lowering to fit
+ if (std::get<ASDU_MAP_OFFSET_ITEM>(asdu_size_map.at(asduType)) > data_size)
+ {
+ // If the offset is already greater than the data size, we can't fit any elements
+ verifiedNumberOfElements = 0;
+ }
+ else
+ {
+ verifiedNumberOfElements = (data_size - std::get<ASDU_MAP_OFFSET_ITEM>(asdu_size_map.at(asduType))) / std::get<ASDU_MAP_SIZE_ITEM>(asdu_size_map.at(asduType));
+ }
+
+ if (verifiedNumberOfElements == 0)
+ {
+ // shortcut to parse call for DetectionEngine checks
+ parseIec104GenericIOGroup(&genericIOGroup);
+ return;
+ }
+ }
+
// iterate over the reported number of elements overlaying the structures
for (uint32_t i = 0; i < verifiedNumberOfElements; i++)
{
}
}
-void parseIec104ApciI(const Iec104ApciI* apci)
+void parseIec104ApciI(const Iec104ApciI* apci, const uint16_t& data_size)
{
// throw an alert if the start value is not 0x68
if (apci->header.start != IEC104_START_BYTE)
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_SP_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_SP_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_SP_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_SP_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_DP_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_DP_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_DP_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_DP_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ST_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ST_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ST_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ST_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_BO_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_BO_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_BO_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_BO_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_NB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_NB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_NC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_NC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_IT_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_IT_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_IT_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_IT_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_PS_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_PS_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_ND_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_ND_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_SP_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_SP_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_DP_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_DP_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ST_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ST_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_BO_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_BO_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TD_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TD_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TE_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TE_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_ME_TF_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_ME_TF_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_IT_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_IT_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TD_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TD_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TE_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TE_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EP_TF_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EP_TF_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_DC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_DC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_RC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_RC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_NB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_NB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_NC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_NC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_BO_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_BO_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SC_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SC_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_DC_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_DC_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_RC_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_RC_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_TB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_TB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_SE_TC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_SE_TC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_BO_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_BO_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_M_EI_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_M_EI_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_IC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_IC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_CI_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_CI_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_RD_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_RD_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_CS_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_CS_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_TS_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_TS_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_RP_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_RP_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_CD_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_CD_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_C_TS_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_C_TS_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_P_ME_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_P_ME_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_P_ME_NB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_P_ME_NB_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_P_ME_NC_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_P_ME_NC_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_P_AC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_P_AC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_FR_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_FR_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_SR_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_SR_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_SC_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_SC_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_LS_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_LS_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_AF_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_AF_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_SG_NA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_SG_NA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_DR_TA_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_DR_TA_1, apci, data_size);
}
break;
}
if (checkIec104Asdu(curAsduCheck))
{
// parse the asdu if checks pass
- parseIec104GenericAsdu(IEC104_ASDU_F_SC_NB_1, apci);
+ parseIec104GenericAsdu(IEC104_ASDU_F_SC_NB_1, apci, data_size);
}
break;
}
}
}
}
-