65struct snmp_msg_trap trap_msg;
67static u16_t snmp_resp_header_sum(
struct snmp_msg_pstat *m_stat,
u16_t vb_len);
68static u16_t snmp_trap_header_sum(
struct snmp_msg_trap *m_trap,
u16_t vb_len);
69static u16_t snmp_varbind_list_sum(
struct snmp_varbind_root *
root);
71static u16_t snmp_resp_header_enc(
struct snmp_msg_pstat *m_stat,
struct pbuf *
p);
72static u16_t snmp_trap_header_enc(
struct snmp_msg_trap *m_trap,
struct pbuf *
p);
73static u16_t snmp_varbind_list_enc(
struct snmp_varbind_root *
root,
struct pbuf *
p,
u16_t ofs);
85 trap_dst[dst_idx].enable =
enable;
113snmp_send_response(
struct snmp_msg_pstat *m_stat)
115 struct snmp_varbind_root emptyvb = {
NULL,
NULL, 0, 0, 0};
121 tot_len = snmp_varbind_list_sum(&m_stat->outvb);
131 m_stat->error_status = SNMP_ES_TOOBIG;
132 m_stat->error_index = 0;
134 tot_len = snmp_varbind_list_sum(&emptyvb);
147 ofs = snmp_resp_header_enc(m_stat,
p);
148 snmp_varbind_list_enc(&m_stat->outvb,
p, ofs);
150 switch (m_stat->error_status)
155 case SNMP_ES_NOSUCHNAME:
158 case SNMP_ES_BADVALUE:
161 case SNMP_ES_GENERROR:
170 udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp);
171 err = udp_send(m_stat->pcb,
p);
182 udp_disconnect(m_stat->pcb);
213snmp_send_trap(
s8_t generic_trap,
struct snmp_obj_id *eoid,
s32_t specific_trap)
215 struct snmp_trap_dst *td;
216 struct netif *dst_if;
231 trap_msg.sip_raw[0] =
ip4_addr1(&dst_ip);
232 trap_msg.sip_raw[1] =
ip4_addr2(&dst_ip);
233 trap_msg.sip_raw[2] =
ip4_addr3(&dst_ip);
234 trap_msg.sip_raw[3] =
ip4_addr4(&dst_ip);
235 trap_msg.gen_trap = generic_trap;
236 trap_msg.spc_trap = specific_trap;
237 if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
240 trap_msg.enterprise = eoid;
250 tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
260 ofs = snmp_trap_header_enc(&trap_msg,
p);
261 snmp_varbind_list_enc(&trap_msg.outvb,
p, ofs);
267 udp_sendto(trap_msg.pcb,
p, &trap_msg.dip, SNMP_TRAP_PORT);
281snmp_coldstart_trap(
void)
283 trap_msg.outvb.head =
NULL;
284 trap_msg.outvb.tail =
NULL;
285 trap_msg.outvb.count = 0;
286 snmp_send_trap(SNMP_GENTRAP_COLDSTART,
NULL, 0);
290snmp_authfail_trap(
void)
296 trap_msg.outvb.head =
NULL;
297 trap_msg.outvb.tail =
NULL;
298 trap_msg.outvb.count = 0;
299 snmp_send_trap(SNMP_GENTRAP_AUTHFAIL,
NULL, 0);
312snmp_resp_header_sum(
struct snmp_msg_pstat *m_stat,
u16_t vb_len)
315 struct snmp_resp_header_lengths *rhl;
319 snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
320 snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
321 tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
323 snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
324 snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
325 tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
327 snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
328 snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
329 tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
331 rhl->pdulen = tot_len;
332 snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
333 tot_len += 1 + rhl->pdulenlen;
335 rhl->comlen = m_stat->com_strlen;
336 snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
337 tot_len += 1 + rhl->comlenlen + rhl->comlen;
339 snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
340 snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
341 tot_len += 1 + rhl->verlen + rhl->verlenlen;
343 rhl->seqlen = tot_len;
344 snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
345 tot_len += 1 + rhl->seqlenlen;
359snmp_trap_header_sum(
struct snmp_msg_trap *m_trap,
u16_t vb_len)
362 struct snmp_trap_header_lengths *thl;
367 snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
368 snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
369 tot_len += 1 + thl->tslen + thl->tslenlen;
371 snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
372 snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
373 tot_len += 1 + thl->strplen + thl->strplenlen;
375 snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
376 snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
377 tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
380 snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
381 tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
383 snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
384 snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
385 tot_len += 1 + thl->eidlen + thl->eidlenlen;
387 thl->pdulen = tot_len;
388 snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
389 tot_len += 1 + thl->pdulenlen;
391 thl->comlen =
sizeof(snmp_publiccommunity) - 1;
392 snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
393 tot_len += 1 + thl->comlenlen + thl->comlen;
395 snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
396 snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
397 tot_len += 1 + thl->verlen + thl->verlenlen;
399 thl->seqlen = tot_len;
400 snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
401 tot_len += 1 + thl->seqlenlen;
414snmp_varbind_list_sum(
struct snmp_varbind_root *
root)
416 struct snmp_varbind *vb;
426 switch (vb->value_type)
428 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
429 sint_ptr = (
s32_t*)vb->value;
430 snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);
432 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
433 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
434 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
435 uint_ptr = (
u32_t*)vb->value;
436 snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);
438 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
439 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
440 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
441 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
442 vb->vlen = vb->value_len;
444 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
445 sint_ptr = (
s32_t*)vb->value;
446 snmp_asn1_enc_oid_cnt(vb->value_len /
sizeof(
s32_t), sint_ptr, &vb->vlen);
454 snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);
455 snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);
456 snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);
458 vb->seqlen = 1 + vb->vlenlen + vb->vlen;
459 vb->seqlen += 1 + vb->olenlen + vb->olen;
460 snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
463 tot_len += 1 + vb->seqlenlen + vb->seqlen;
469 root->seqlen = tot_len;
470 snmp_asn1_enc_length_cnt(
root->seqlen, &
root->seqlenlen);
471 tot_len += 1 +
root->seqlenlen;
480snmp_resp_header_enc(
struct snmp_msg_pstat *m_stat,
struct pbuf *
p)
485 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
487 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.seqlen);
488 ofs += m_stat->rhl.seqlenlen;
490 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
492 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.verlen);
493 ofs += m_stat->rhl.verlenlen;
494 snmp_asn1_enc_s32t(
p, ofs, m_stat->rhl.verlen, snmp_version);
495 ofs += m_stat->rhl.verlen;
497 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
499 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.comlen);
500 ofs += m_stat->rhl.comlenlen;
501 snmp_asn1_enc_raw(
p, ofs, m_stat->rhl.comlen, m_stat->community);
502 ofs += m_stat->rhl.comlen;
504 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
506 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.pdulen);
507 ofs += m_stat->rhl.pdulenlen;
509 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
511 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.ridlen);
512 ofs += m_stat->rhl.ridlenlen;
513 snmp_asn1_enc_s32t(
p, ofs, m_stat->rhl.ridlen, m_stat->rid);
514 ofs += m_stat->rhl.ridlen;
516 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
518 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.errstatlen);
519 ofs += m_stat->rhl.errstatlenlen;
520 snmp_asn1_enc_s32t(
p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
521 ofs += m_stat->rhl.errstatlen;
523 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
525 snmp_asn1_enc_length(
p, ofs, m_stat->rhl.erridxlen);
526 ofs += m_stat->rhl.erridxlenlen;
527 snmp_asn1_enc_s32t(
p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
528 ofs += m_stat->rhl.erridxlen;
537snmp_trap_header_enc(
struct snmp_msg_trap *m_trap,
struct pbuf *
p)
542 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
544 snmp_asn1_enc_length(
p, ofs, m_trap->thl.seqlen);
545 ofs += m_trap->thl.seqlenlen;
547 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
549 snmp_asn1_enc_length(
p, ofs, m_trap->thl.verlen);
550 ofs += m_trap->thl.verlenlen;
551 snmp_asn1_enc_s32t(
p, ofs, m_trap->thl.verlen, snmp_version);
552 ofs += m_trap->thl.verlen;
554 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
556 snmp_asn1_enc_length(
p, ofs, m_trap->thl.comlen);
557 ofs += m_trap->thl.comlenlen;
558 snmp_asn1_enc_raw(
p, ofs, m_trap->thl.comlen, (
u8_t *)&snmp_publiccommunity[0]);
559 ofs += m_trap->thl.comlen;
561 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
563 snmp_asn1_enc_length(
p, ofs, m_trap->thl.pdulen);
564 ofs += m_trap->thl.pdulenlen;
566 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
568 snmp_asn1_enc_length(
p, ofs, m_trap->thl.eidlen);
569 ofs += m_trap->thl.eidlenlen;
570 snmp_asn1_enc_oid(
p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
571 ofs += m_trap->thl.eidlen;
573 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
575 snmp_asn1_enc_length(
p, ofs, m_trap->thl.aaddrlen);
576 ofs += m_trap->thl.aaddrlenlen;
577 snmp_asn1_enc_raw(
p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
578 ofs += m_trap->thl.aaddrlen;
580 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
582 snmp_asn1_enc_length(
p, ofs, m_trap->thl.gtrplen);
583 ofs += m_trap->thl.gtrplenlen;
584 snmp_asn1_enc_u32t(
p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
585 ofs += m_trap->thl.gtrplen;
587 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
589 snmp_asn1_enc_length(
p, ofs, m_trap->thl.strplen);
590 ofs += m_trap->thl.strplenlen;
591 snmp_asn1_enc_u32t(
p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
592 ofs += m_trap->thl.strplen;
594 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
596 snmp_asn1_enc_length(
p, ofs, m_trap->thl.tslen);
597 ofs += m_trap->thl.tslenlen;
598 snmp_asn1_enc_u32t(
p, ofs, m_trap->thl.tslen, m_trap->ts);
599 ofs += m_trap->thl.tslen;
608snmp_varbind_list_enc(
struct snmp_varbind_root *
root,
struct pbuf *
p,
u16_t ofs)
610 struct snmp_varbind *vb;
615 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
617 snmp_asn1_enc_length(
p, ofs,
root->seqlen);
618 ofs +=
root->seqlenlen;
623 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
625 snmp_asn1_enc_length(
p, ofs, vb->seqlen);
626 ofs += vb->seqlenlen;
628 snmp_asn1_enc_type(
p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
630 snmp_asn1_enc_length(
p, ofs, vb->olen);
632 snmp_asn1_enc_oid(
p, ofs, vb->ident_len, &vb->ident[0]);
635 snmp_asn1_enc_type(
p, ofs, vb->value_type);
637 snmp_asn1_enc_length(
p, ofs, vb->vlen);
640 switch (vb->value_type)
642 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
643 sint_ptr = (
s32_t*)vb->value;
644 snmp_asn1_enc_s32t(
p, ofs, vb->vlen, *sint_ptr);
646 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
647 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
648 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
649 uint_ptr = (
u32_t*)vb->value;
650 snmp_asn1_enc_u32t(
p, ofs, vb->vlen, *uint_ptr);
652 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
653 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
654 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
655 raw_ptr = (
u8_t*)vb->value;
656 snmp_asn1_enc_raw(
p, ofs, vb->vlen, raw_ptr);
658 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
660 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
661 sint_ptr = (
s32_t*)vb->value;
662 snmp_asn1_enc_oid(
p, ofs, vb->value_len /
sizeof(
s32_t), sint_ptr);
#define LWIP_DEBUGF(debug, message)
#define snmp_inc_snmpouttoobigs()
#define snmp_inc_snmpoutpkts()
#define snmp_get_sysuptime(value)
#define snmp_get_snmpenableauthentraps(value)
#define snmp_inc_snmpouttraps()
#define snmp_inc_snmpoutbadvalues()
#define snmp_inc_snmpoutgetresponses()
#define snmp_inc_snmpoutgenerrs()
#define snmp_get_snmpgrpid_ptr(oid)
#define snmp_inc_snmpoutnosuchnames()
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define ip_addr_isany(addr1)
#define ip4_addr1(ipaddr)
#define ip_addr_set(dest, src)
#define ip_addr_copy(dest, src)
#define ip4_addr4(ipaddr)
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
#define ip4_addr3(ipaddr)
#define ip4_addr2(ipaddr)
struct netif * ip_route(ip_addr_t *dest)
#define SNMP_TRAP_DESTINATIONS
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)