28#ifndef PROTOCORE_IEC60870_H
29#define PROTOCORE_IEC60870_H
33#if PROTOCORE_ENABLE_IEC60870
37#define IEC_START_104 0x68u
38#define IEC_START_FIXED 0x10u
40#define IEC104_APCI_LEN 6u
43#define IEC104_STARTDT_ACT 0x07u
44#define IEC104_STARTDT_CON 0x0Bu
45#define IEC104_STOPDT_ACT 0x13u
46#define IEC104_STOPDT_CON 0x23u
47#define IEC104_TESTFR_ACT 0x43u
48#define IEC104_TESTFR_CON 0x83u
51#define IEC_TYPE_M_SP_NA_1 1
52#define IEC_TYPE_M_DP_NA_1 3
53#define IEC_TYPE_M_ME_NA_1 9
54#define IEC_TYPE_M_ME_NB_1 11
55#define IEC_TYPE_M_ME_NC_1 13
56#define IEC_TYPE_M_IT_NA_1 15
57#define IEC_TYPE_C_SC_NA_1 45
58#define IEC_TYPE_C_DC_NA_1 46
59#define IEC_TYPE_M_EI_NA_1 70
60#define IEC_TYPE_C_IC_NA_1 100
61#define IEC_TYPE_C_CS_NA_1 103
64#define IEC_COT_PERIODIC 1
65#define IEC_COT_SPONTANEOUS 3
66#define IEC_COT_REQUEST 5
67#define IEC_COT_ACTIVATION 6
68#define IEC_COT_ACT_CON 7
69#define IEC_COT_DEACTIVATION 8
70#define IEC_COT_ACT_TERM 10
71#define IEC_COT_INTERROGATED 20
74#define IEC_FC_RESET_LINK 0x00
75#define IEC_FC_TEST_LINK 0x02
76#define IEC_FC_USER_DATA_CONFIRM 0x03
77#define IEC_FC_USER_DATA_NOREPLY 0x04
78#define IEC_FC_REQUEST_CLASS1 0x0A
79#define IEC_FC_REQUEST_CLASS2 0x0B
110 uint16_t common_addr;
116size_t protocore_iec104_build_i(uint8_t *buf,
size_t cap, uint16_t ns, uint16_t nr,
const uint8_t *asdu,
120size_t protocore_iec104_build_s(uint8_t *buf,
size_t cap, uint16_t nr);
123size_t protocore_iec104_build_u(uint8_t *buf,
size_t cap, uint8_t u_cmd);
126proto_bool protocore_iec104_parse(
const uint8_t *buf,
size_t len, Iec104Apci *out,
size_t *consumed);
131size_t protocore_iec_asdu_build_header(uint8_t *buf,
size_t cap,
const IecAsduHeader *h);
134proto_bool protocore_iec_asdu_parse_header(
const uint8_t *buf,
size_t len, IecAsduHeader *out,
size_t *consumed);
137size_t protocore_iec_put_ioa(uint8_t *buf,
size_t cap, uint32_t ioa);
140uint32_t protocore_iec_get_ioa(
const uint8_t *p);
148#define IEC_QUAL_OV 0x01u
149#define IEC_QUAL_BL 0x10u
150#define IEC_QUAL_SB 0x20u
151#define IEC_QUAL_NT 0x40u
152#define IEC_QUAL_IV 0x80u
153#define IEC_SCO_ON 0x01u
154#define IEC_SCO_SE 0x80u
157#define IEC_DP_INDETERMINATE 0u
160#define IEC_DP_INDETERMINATE_3 3u
161#define IEC_DP_MASK 0x03u
162#define IEC_DCO_SE 0x80u
163#define IEC_DCO_QU_SHIFT 2u
164#define IEC_DCO_QU_MASK 0x1Fu
167#define IEC_BCR_SQ_MASK 0x1Fu
168#define IEC_BCR_CY 0x20u
169#define IEC_BCR_CA 0x40u
170#define IEC_BCR_IV 0x80u
178size_t protocore_iec_io_build_sp(uint8_t *buf,
size_t cap, uint32_t ioa,
proto_bool on, uint8_t quality);
181proto_bool protocore_iec_io_parse_sp(
const uint8_t *buf,
size_t len, uint32_t *ioa,
proto_bool *on, uint8_t *quality);
187size_t protocore_iec_io_build_float(uint8_t *buf,
size_t cap, uint32_t ioa,
float value, uint8_t qds);
190proto_bool protocore_iec_io_parse_float(
const uint8_t *buf,
size_t len, uint32_t *ioa,
float *value, uint8_t *qds);
197size_t protocore_iec_io_build_scaled(uint8_t *buf,
size_t cap, uint32_t ioa, int16_t value, uint8_t qds);
200proto_bool protocore_iec_io_parse_scaled(
const uint8_t *buf,
size_t len, uint32_t *ioa, int16_t *value, uint8_t *qds);
208size_t protocore_iec_io_build_normalized(uint8_t *buf,
size_t cap, uint32_t ioa,
float value, uint8_t qds);
212proto_bool protocore_iec_io_parse_normalized(
const uint8_t *buf,
size_t len, uint32_t *ioa,
float *value, uint8_t *qds);
221size_t protocore_iec_io_build_counter(uint8_t *buf,
size_t cap, uint32_t ioa, int32_t value, uint8_t seq);
225proto_bool protocore_iec_io_parse_counter(
const uint8_t *buf,
size_t len, uint32_t *ioa, int32_t *value, uint8_t *seq);
233size_t protocore_iec_io_build_sc(uint8_t *buf,
size_t cap, uint32_t ioa,
proto_bool on,
proto_bool select);
244size_t protocore_iec_io_build_dp(uint8_t *buf,
size_t cap, uint32_t ioa, uint8_t dpi, uint8_t quality);
247proto_bool protocore_iec_io_parse_dp(
const uint8_t *buf,
size_t len, uint32_t *ioa, uint8_t *dpi, uint8_t *quality);
256size_t protocore_iec_io_build_dc(uint8_t *buf,
size_t cap, uint32_t ioa, uint8_t dcs, uint8_t qu,
proto_bool select);
259proto_bool protocore_iec_io_parse_dc(
const uint8_t *buf,
size_t len, uint32_t *ioa, uint8_t *dcs, uint8_t *qu,
265size_t protocore_iec101_build_fixed(uint8_t *buf,
size_t cap, uint8_t control, uint8_t addr);
268size_t protocore_iec101_build_variable(uint8_t *buf,
size_t cap, uint8_t control, uint8_t addr,
const uint8_t *asdu,
282proto_bool protocore_iec101_parse(
const uint8_t *buf,
size_t len, Iec101Frame *out,
size_t *consumed);
PROTO_ENUM_PACKED
Application protocol spoken on a listener port or connection slot.
#define PROTOCORE_BEGIN_DECLS
Give a header's declarations C linkage, so their symbol names carry no parameter types.
_Bool proto_bool
The truth value.
#define PROTOCORE_END_DECLS