12#if DETWS_ENABLE_SNMP_TRAP
18static const uint32_t OID_SYSUPTIME_0[] = {1, 3, 6, 1, 2, 1, 1, 3, 0};
19static const uint32_t OID_SNMPTRAPOID_0[] = {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0};
22static void put_varbind(BerEnc *e,
const SnmpVarbind *vb)
24 size_t t = ber_seq_begin(e, (uint8_t)SnmpTag::BER_SEQUENCE);
25 ber_put_oid(e, vb->oid, vb->oid_len);
28 case (uint8_t)SnmpVbType::SNMP_VB_INT:
29 ber_put_integer(e, vb->ival);
31 case (uint8_t)SnmpVbType::SNMP_VB_STRING:
32 ber_put_octet_string(e, (uint8_t)SnmpTag::BER_OCTET_STRING, vb->bytes, vb->blen);
34 case (uint8_t)SnmpVbType::SNMP_VB_OID:
35 ber_put_oid(e, vb->oid_val, vb->oid_val_len);
37 case (uint8_t)SnmpVbType::SNMP_VB_COUNTER32:
38 ber_put_uint(e, (uint8_t)SnmpTag::SNMP_COUNTER32, (uint32_t)vb->ival);
40 case (uint8_t)SnmpVbType::SNMP_VB_GAUGE32:
41 ber_put_uint(e, (uint8_t)SnmpTag::SNMP_GAUGE32, (uint32_t)vb->ival);
43 case (uint8_t)SnmpVbType::SNMP_VB_TIMETICKS:
44 ber_put_uint(e, (uint8_t)SnmpTag::SNMP_TIMETICKS, (uint32_t)vb->ival);
46 case (uint8_t)SnmpVbType::SNMP_VB_IPADDR:
47 ber_put_octet_string(e, (uint8_t)SnmpTag::SNMP_IPADDRESS, vb->bytes, vb->blen);
59size_t snmp_notify_build_pdu(BerEnc *e, uint8_t pdu_tag, uint32_t request_id,
const uint32_t *trap_oid,
60 size_t trap_oid_len, uint32_t uptime_ticks,
const SnmpVarbind *vbs,
size_t n)
62 size_t pdu = ber_seq_begin(e, pdu_tag);
63 ber_put_integer(e, (
long)request_id);
64 ber_put_integer(e, 0);
65 ber_put_integer(e, 0);
66 size_t vbl = ber_seq_begin(e, (uint8_t)SnmpTag::BER_SEQUENCE);
69 size_t t = ber_seq_begin(e, (uint8_t)SnmpTag::BER_SEQUENCE);
70 ber_put_oid(e, OID_SYSUPTIME_0,
sizeof(OID_SYSUPTIME_0) /
sizeof(uint32_t));
71 ber_put_uint(e, (uint8_t)SnmpTag::SNMP_TIMETICKS, uptime_ticks);
76 size_t t = ber_seq_begin(e, (uint8_t)SnmpTag::BER_SEQUENCE);
77 ber_put_oid(e, OID_SNMPTRAPOID_0,
sizeof(OID_SNMPTRAPOID_0) /
sizeof(uint32_t));
78 ber_put_oid(e, trap_oid, trap_oid_len);
81 for (
size_t i = 0; i < n; i++)
82 put_varbind(e, &vbs[i]);
88size_t snmp_notify_build_v2c(uint8_t *out,
size_t cap,
const char *community, uint8_t pdu_tag, uint32_t request_id,
89 const uint32_t *trap_oid,
size_t trap_oid_len, uint32_t uptime_ticks,
90 const SnmpVarbind *vbs,
size_t n)
92 if (!out || !community || !trap_oid)
95 ber_enc_init(&e, out, cap);
96 size_t msg = ber_seq_begin(&e, (uint8_t)SnmpTag::BER_SEQUENCE);
97 ber_put_integer(&e, 1);
98 ber_put_octet_string(&e, (uint8_t)SnmpTag::BER_OCTET_STRING, (
const uint8_t *)community,
100 snmp_notify_build_pdu(&e, pdu_tag, request_id, trap_oid, trap_oid_len, uptime_ticks, vbs, n);
101 ber_seq_end(&e, msg);
102 return e.ok ? e.len : 0;
119 uint32_t trap_reqid = 1;
121SnmpNotifyCtx s_notify;
124bool snmp_trap_v2c(
const char *dst_ip, uint16_t port,
const char *community,
const uint32_t *trap_oid,
125 size_t trap_oid_len,
const SnmpVarbind *vbs,
size_t n)
128 uint32_t up = (uint32_t)(millis() / 10);
129 size_t len = snmp_notify_build_v2c(buf,
sizeof(buf), community, (uint8_t)SnmpTag::SNMP_PDU_TRAPV2,
130 s_notify.trap_reqid++, trap_oid, trap_oid_len, up, vbs, n);
134bool snmp_inform_v2c(
const char *dst_ip, uint16_t port,
const char *community, uint32_t request_id,
135 const uint32_t *trap_oid,
size_t trap_oid_len,
const SnmpVarbind *vbs,
size_t n)
138 uint32_t up = (uint32_t)(millis() / 10);
139 size_t len = snmp_notify_build_v2c(buf,
sizeof(buf), community, 0xA6 , request_id, trap_oid,
140 trap_oid_len, up, vbs, n);
146bool snmp_trap_v2c(
const char *, uint16_t,
const char *,
const uint32_t *,
size_t,
const SnmpVarbind *,
size_t)
150bool snmp_inform_v2c(
const char *, uint16_t,
const char *, uint32_t,
const uint32_t *,
size_t,
const SnmpVarbind *,
#define SNMP_COMMUNITY_MAX
Maximum SNMP community-string length (including null terminator).
#define DETWS_SNMP_TRAP_BUF_SIZE
Static datagram buffer for an outbound SNMP notification, bytes.
Zero-heap ASN.1 BER encoder/decoder for the SNMP agent (DETWS_ENABLE_SNMP).
Outbound SNMP notifications - Trap and InformRequest (DETWS_ENABLE_SNMP_TRAP).
bool det_udp_sendto(const char *dst_ip, uint16_t dst_port, const uint8_t *data, size_t len)
Send a UDP datagram to an arbitrary destination (outbound client).
Layer 4 (Transport) - connectionless UDP datagram service.