50 const struct snmp_obj_id *enterprise;
71 static u16_t snmp_trap_header_sum(
struct snmp_msg_trap *trap);
72 static void snmp_trap_header_enc(
struct snmp_msg_trap *trap,
struct snmp_pbuf_stream *pbuf_stream);
75 extern const char *snmp_community_trap;
77 void* snmp_traps_handle;
88 static u8_t snmp_auth_traps_enabled = 0;
96 snmp_trap_dst_enable(
u8_t dst_idx,
u8_t enable)
99 trap_dst[dst_idx].enable = enable;
117 snmp_set_auth_traps_enabled(
u8_t enable)
119 snmp_auth_traps_enabled = enable;
123 snmp_get_auth_traps_enabled(
void)
125 return snmp_auth_traps_enabled;
144 snmp_send_trap(
const struct snmp_obj_id *device_enterprise_oid,
s32_t generic_trap,
s32_t specific_trap)
146 struct snmp_msg_trap trap_msg;
147 struct snmp_trap_dst *td;
152 trap_msg.snmp_version = 0;
157 if (snmp_get_local_ip_for_dst(snmp_traps_handle, &td->dip, &trap_msg.sip)) {
158 if (device_enterprise_oid ==
NULL) {
159 trap_msg.enterprise = snmp_get_device_enterprise_oid();
161 trap_msg.enterprise = device_enterprise_oid;
164 trap_msg.gen_trap = generic_trap;
165 if (generic_trap == SNMP_GENTRAP_ENTERPRISE_SPECIFIC) {
166 trap_msg.spc_trap = specific_trap;
168 trap_msg.spc_trap = 0;
174 tot_len = snmp_trap_header_sum(&trap_msg);
179 struct snmp_pbuf_stream pbuf_stream;
180 snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len);
183 snmp_trap_header_enc(&trap_msg, &pbuf_stream);
185 snmp_stats.outtraps++;
186 snmp_stats.outpkts++;
189 snmp_sendto(snmp_traps_handle, p, &td->dip, SNMP_TRAP_PORT);
203 snmp_send_trap_generic(
s32_t generic_trap)
205 return snmp_send_trap(
NULL, generic_trap, 0);
209 snmp_send_trap_specific(
s32_t specific_trap)
211 return snmp_send_trap(
NULL, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, specific_trap);
215 snmp_coldstart_trap(
void)
217 snmp_send_trap_generic(SNMP_GENTRAP_COLDSTART);
221 snmp_authfail_trap(
void)
223 if (snmp_auth_traps_enabled != 0) {
224 snmp_send_trap_generic(SNMP_GENTRAP_AUTH_FAILURE);
237 snmp_trap_header_sum(
struct snmp_msg_trap *trap)
245 snmp_asn1_enc_u32t_cnt(trap->ts, &len);
246 snmp_asn1_enc_length_cnt(len, &lenlen);
247 tot_len += 1 + len + lenlen;
249 snmp_asn1_enc_s32t_cnt(trap->spc_trap, &len);
250 snmp_asn1_enc_length_cnt(len, &lenlen);
251 tot_len += 1 + len + lenlen;
253 snmp_asn1_enc_s32t_cnt(trap->gen_trap, &len);
254 snmp_asn1_enc_length_cnt(len, &lenlen);
255 tot_len += 1 + len + lenlen;
259 len =
sizeof(
ip_2_ip6(&trap->sip)->addr);
263 len =
sizeof(ip_2_ip4(&trap->sip)->addr);
266 snmp_asn1_enc_length_cnt(len, &lenlen);
267 tot_len += 1 + len + lenlen;
269 snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &len);
270 snmp_asn1_enc_length_cnt(len, &lenlen);
271 tot_len += 1 + len + lenlen;
273 trap->pdulen = tot_len;
274 snmp_asn1_enc_length_cnt(trap->pdulen, &lenlen);
275 tot_len += 1 + lenlen;
277 trap->comlen = (
u16_t)strlen(snmp_community_trap);
278 snmp_asn1_enc_length_cnt(trap->comlen, &lenlen);
279 tot_len += 1 + lenlen + trap->comlen;
281 snmp_asn1_enc_s32t_cnt(trap->snmp_version, &len);
282 snmp_asn1_enc_length_cnt(len, &lenlen);
283 tot_len += 1 + len + lenlen;
285 trap->seqlen = tot_len;
286 snmp_asn1_enc_length_cnt(trap->seqlen, &lenlen);
287 tot_len += 1 + lenlen;
296 snmp_trap_header_enc(
struct snmp_msg_trap *trap,
struct snmp_pbuf_stream *pbuf_stream)
298 struct snmp_asn1_tlv tlv;
301 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->seqlen);
302 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
305 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
306 snmp_asn1_enc_s32t_cnt(trap->snmp_version, &tlv.value_len);
307 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
308 snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version);
311 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, trap->comlen);
312 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
313 snmp_asn1_enc_raw(pbuf_stream, (
const u8_t *)snmp_community_trap, trap->comlen);
316 SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_TRAP), 0, trap->pdulen);
317 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
320 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID, 0, 0);
321 snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &tlv.value_len);
322 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
323 snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len);
328 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0,
sizeof(
ip_2_ip6(&trap->sip)->addr));
329 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
330 snmp_asn1_enc_raw(pbuf_stream, (
const u8_t *)&
ip_2_ip6(&trap->sip)->addr,
sizeof(
ip_2_ip6(&trap->sip)->addr));
334 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0,
sizeof(ip_2_ip4(&trap->sip)->addr));
335 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
336 snmp_asn1_enc_raw(pbuf_stream, (
const u8_t *)&ip_2_ip4(&trap->sip)->addr,
sizeof(ip_2_ip4(&trap->sip)->addr));
341 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
342 snmp_asn1_enc_s32t_cnt(trap->gen_trap, &tlv.value_len);
343 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
344 snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap);
347 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
348 snmp_asn1_enc_s32t_cnt(trap->spc_trap, &tlv.value_len);
349 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
350 snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap);
353 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_TIMETICKS, 0, 0);
354 snmp_asn1_enc_s32t_cnt(trap->ts, &tlv.value_len);
355 snmp_ans1_enc_tlv(pbuf_stream, &tlv);
356 snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts);
#define ip_addr_isany(ipaddr)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
#define MIB2_COPY_SYSUPTIME_TO(ptrToVal)
#define IP_IS_V6_VAL(ipaddr)
#define ip_addr_set(dest, src)
#define SNMP_TRAP_DESTINATIONS