void dnp3_p_init_counter(void) { H_RULE (bit, h_bits(1,false)); H_RULE (ignore, h_ignore(bit)); H_RULE (reserved, dnp3_p_reserved(1)); H_ARULE(flags, h_sequence(bit, // ONLINE bit, // RESTART bit, // COMM_LOST bit, // REMOTE_FORCED bit, // LOCAL_FORCED ignore, // (ROLLOVER - obsolete) bit, // DISCONTINUITY reserved, NULL)); H_RULE (val32, h_uint32()); H_RULE (val16, h_uint16()); H_ARULE(ctr32, val32); H_ARULE(ctr16, val16); H_ARULE(ctr32_flag, h_sequence(flags, val32, NULL)); H_ARULE(ctr16_flag, h_sequence(flags, val16, NULL)); H_ARULE(ctr32_flag_t, h_sequence(flags, val32, dnp3_p_dnp3time, NULL)); H_ARULE(ctr16_flag_t, h_sequence(flags, val16, dnp3_p_dnp3time, NULL)); // group 20: counters... H_RULE(oblock_32bit_flag, dnp3_p_oblock(G_V(CTR, 32BIT), ctr32_flag)); H_RULE(oblock_16bit_flag, dnp3_p_oblock(G_V(CTR, 16BIT), ctr16_flag)); H_RULE(oblock_32bit_noflag, dnp3_p_oblock(G_V(CTR, 32BIT_NOFLAG), ctr32)); H_RULE(oblock_16bit_noflag, dnp3_p_oblock(G_V(CTR, 16BIT_NOFLAG), ctr16)); dnp3_p_ctr_rblock = dnp3_p_rblock(G(CTR), V(CTR, 32BIT), V(CTR, 16BIT), V(CTR, 32BIT_NOFLAG), V(CTR, 32BIT_NOFLAG), 0); dnp3_p_ctr_fblock = dnp3_p_specific_rblock(G(CTR), DNP3_VARIATION_ANY); dnp3_p_ctr_oblock = h_choice(oblock_32bit_flag, oblock_16bit_flag, oblock_32bit_noflag, oblock_16bit_noflag, NULL); // group 21: frozen counters... H_RULE(oblock_frz32bit_flag, dnp3_p_oblock(G_V(FROZENCTR, 32BIT), ctr32_flag)); H_RULE(oblock_frz16bit_flag, dnp3_p_oblock(G_V(FROZENCTR, 16BIT), ctr16_flag)); H_RULE(oblock_frz32bit_flag_t, dnp3_p_oblock(G_V(FROZENCTR, 32BIT_TIME), ctr32_flag_t)); H_RULE(oblock_frz16bit_flag_t, dnp3_p_oblock(G_V(FROZENCTR, 16BIT_TIME), ctr16_flag_t)); H_RULE(oblock_frz32bit_noflag, dnp3_p_oblock(G_V(FROZENCTR, 32BIT_NOFLAG), ctr32)); H_RULE(oblock_frz16bit_noflag, dnp3_p_oblock(G_V(FROZENCTR, 16BIT_NOFLAG), ctr16)); dnp3_p_frozenctr_rblock = dnp3_p_rblock(G(FROZENCTR), V(FROZENCTR, 32BIT), V(FROZENCTR, 16BIT), V(FROZENCTR, 32BIT_TIME), V(FROZENCTR, 16BIT_TIME), V(FROZENCTR, 32BIT_NOFLAG), V(FROZENCTR, 32BIT_NOFLAG), 0); dnp3_p_frozenctr_oblock = h_choice(oblock_frz32bit_flag, oblock_frz16bit_flag, oblock_frz32bit_flag_t, oblock_frz16bit_flag_t, oblock_frz32bit_noflag, oblock_frz16bit_noflag, NULL); // group 22: counter events... H_RULE(oblock_ev32bit_flag, dnp3_p_oblock(G_V(CTREV, 32BIT), ctr32_flag)); H_RULE(oblock_ev16bit_flag, dnp3_p_oblock(G_V(CTREV, 16BIT), ctr16_flag)); H_RULE(oblock_ev32bit_flag_t, dnp3_p_oblock(G_V(CTREV, 32BIT_TIME), ctr32_flag_t)); H_RULE(oblock_ev16bit_flag_t, dnp3_p_oblock(G_V(CTREV, 16BIT_TIME), ctr16_flag_t)); dnp3_p_ctrev_rblock = dnp3_p_rblock(G(CTREV), V(CTREV, 32BIT), V(CTREV, 16BIT), V(CTREV, 32BIT_TIME), V(CTREV, 16BIT_TIME), 0); dnp3_p_ctrev_oblock = h_choice(oblock_ev32bit_flag, oblock_ev16bit_flag, oblock_ev32bit_flag_t, oblock_ev16bit_flag_t, NULL); // group 21: frozen counter events... H_RULE(oblock_frzev32bit_flag, dnp3_p_oblock(G_V(FROZENCTREV, 32BIT), ctr32_flag)); H_RULE(oblock_frzev16bit_flag, dnp3_p_oblock(G_V(FROZENCTREV, 16BIT), ctr16_flag)); H_RULE(oblock_frzev32bit_flag_t, dnp3_p_oblock(G_V(FROZENCTREV, 32BIT_TIME), ctr32_flag_t)); H_RULE(oblock_frzev16bit_flag_t, dnp3_p_oblock(G_V(FROZENCTREV, 16BIT_TIME), ctr16_flag_t)); dnp3_p_frozenctrev_rblock = dnp3_p_rblock(G(FROZENCTREV), V(FROZENCTREV, 32BIT), V(FROZENCTREV, 16BIT), V(FROZENCTREV, 32BIT_TIME), V(FROZENCTREV, 16BIT_TIME), 0); dnp3_p_frozenctrev_oblock = h_choice(oblock_frzev32bit_flag, oblock_frzev16bit_flag, oblock_frzev32bit_flag_t, oblock_frzev16bit_flag_t, NULL); }
const HParser* init_rdata(uint16_t type) { static const HParser *parsers[RDATA_TYPE_MAX+1]; static int inited = 0; if (type >= sizeof(parsers)) return NULL; if (inited) return parsers[type]; H_RULE (domain, init_domain()); H_ARULE(cstr, init_character_string()); H_RULE (a, h_uint32()); H_RULE (ns, domain); H_RULE (md, domain); H_RULE (mf, domain); H_RULE (cname, domain); H_ARULE(soa, h_sequence(domain, // MNAME domain, // RNAME h_uint32(), // SERIAL h_uint32(), // REFRESH h_uint32(), // RETRY h_uint32(), // EXPIRE h_uint32(), // MINIMUM NULL)); H_RULE (mb, domain); H_RULE (mg, domain); H_RULE (mr, domain); H_VRULE(null, h_many(h_uint8())); H_RULE (wks, h_sequence(h_uint32(), h_uint8(), h_many(h_uint8()), NULL)); H_RULE (ptr, domain); H_RULE (hinfo, h_sequence(cstr, cstr, NULL)); H_RULE (minfo, h_sequence(domain, domain, NULL)); H_RULE (mx, h_sequence(h_uint16(), domain, NULL)); H_ARULE(txt, h_many1(cstr)); parsers[ 0] = NULL; // there is no type 0 parsers[ 1] = a; parsers[ 2] = ns; parsers[ 3] = md; parsers[ 4] = mf; parsers[ 5] = cname; parsers[ 6] = soa; parsers[ 7] = mb; parsers[ 8] = mg; parsers[ 9] = mr; parsers[10] = null; parsers[11] = wks; parsers[12] = ptr; parsers[13] = hinfo; parsers[14] = minfo; parsers[15] = mx; parsers[16] = txt; // All parsers must consume their input exactly. for(uint16_t i; i<sizeof(parsers); i++) { if(parsers[i]) { parsers[i] = h_action(h_sequence(parsers[i], h_end_p(), NULL), act_index0); } } inited = 1; return parsers[type]; }