mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-08-12 10:33:37 +08:00
Separate mib2 counter/table callbacks from snmp agent. This both cleans up the code and should allow integration of a 3rd party agent/mib2.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -925,7 +925,7 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr,
|
||||
}
|
||||
|
||||
/* accepting request */
|
||||
snmp_inc_snmpinpkts();
|
||||
mib2_inc_snmpinpkts();
|
||||
/* record used 'protocol control block' */
|
||||
msg_ps->pcb = pcb;
|
||||
/* source address (network order) */
|
||||
@@ -1006,7 +1006,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
(pdu_len != (1 + len_octets + len)) ||
|
||||
(type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
ofs += (1 + len_octets);
|
||||
@@ -1015,20 +1015,20 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||
{
|
||||
/* can't decode or no integer (version) */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version);
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
if (version != 0)
|
||||
{
|
||||
/* not version 1 */
|
||||
snmp_inc_snmpinbadversions();
|
||||
mib2_inc_snmpinbadversions();
|
||||
return ERR_ARG;
|
||||
}
|
||||
m_stat->version = (u8_t)version;
|
||||
@@ -1038,13 +1038,13 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
|
||||
{
|
||||
/* can't decode or no octet string (community) */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
/* add zero terminator */
|
||||
@@ -1060,7 +1060,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ))
|
||||
{
|
||||
/* wrong community for SetRequest PDU */
|
||||
snmp_inc_snmpinbadcommunitynames();
|
||||
mib2_inc_snmpinbadcommunitynames();
|
||||
snmp_authfail_trap();
|
||||
return ERR_ARG;
|
||||
}
|
||||
@@ -1069,7 +1069,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
#endif /* SNMP_COMMUNITY_EXT */
|
||||
if (strncmp(snmp_community, (const char*)m_stat->community, SNMP_COMMUNITY_STR_LEN) != 0)
|
||||
{
|
||||
snmp_inc_snmpinbadcommunitynames();
|
||||
mib2_inc_snmpinbadcommunitynames();
|
||||
snmp_authfail_trap();
|
||||
return ERR_ARG;
|
||||
}
|
||||
@@ -1077,38 +1077,38 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
switch(type)
|
||||
{
|
||||
case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
|
||||
/* GetRequest PDU */
|
||||
snmp_inc_snmpingetrequests();
|
||||
mib2_inc_snmpingetrequests();
|
||||
derr = ERR_OK;
|
||||
break;
|
||||
case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
|
||||
/* GetNextRequest PDU */
|
||||
snmp_inc_snmpingetnexts();
|
||||
mib2_inc_snmpingetnexts();
|
||||
derr = ERR_OK;
|
||||
break;
|
||||
case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
|
||||
/* GetResponse PDU */
|
||||
snmp_inc_snmpingetresponses();
|
||||
mib2_inc_snmpingetresponses();
|
||||
derr = ERR_ARG;
|
||||
break;
|
||||
case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
|
||||
/* SetRequest PDU */
|
||||
snmp_inc_snmpinsetrequests();
|
||||
mib2_inc_snmpinsetrequests();
|
||||
derr = ERR_OK;
|
||||
break;
|
||||
case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
|
||||
/* Trap PDU */
|
||||
snmp_inc_snmpintraps();
|
||||
mib2_inc_snmpintraps();
|
||||
derr = ERR_ARG;
|
||||
break;
|
||||
default:
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
derr = ERR_ARG;
|
||||
break;
|
||||
}
|
||||
@@ -1122,7 +1122,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if (len != (pdu_len - (ofs - ofs_base)))
|
||||
{
|
||||
/* decoded PDU length does not equal actual payload length */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
snmp_asn1_dec_type(p, ofs, &type);
|
||||
@@ -1130,14 +1130,14 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||
{
|
||||
/* can't decode or no integer (request ID) */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
ofs += (1 + len_octets + len);
|
||||
@@ -1146,7 +1146,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||
{
|
||||
/* can't decode or no integer (error-status) */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
/* must be noError (0) for incoming requests.
|
||||
@@ -1155,7 +1155,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
switch (m_stat->error_status)
|
||||
@@ -1164,19 +1164,19 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
/* nothing to do */
|
||||
break;
|
||||
case SNMP_ES_TOOBIG:
|
||||
snmp_inc_snmpintoobigs();
|
||||
mib2_inc_snmpintoobigs();
|
||||
break;
|
||||
case SNMP_ES_NOSUCHNAME:
|
||||
snmp_inc_snmpinnosuchnames();
|
||||
mib2_inc_snmpinnosuchnames();
|
||||
break;
|
||||
case SNMP_ES_BADVALUE:
|
||||
snmp_inc_snmpinbadvalues();
|
||||
mib2_inc_snmpinbadvalues();
|
||||
break;
|
||||
case SNMP_ES_READONLY:
|
||||
snmp_inc_snmpinreadonlys();
|
||||
mib2_inc_snmpinreadonlys();
|
||||
break;
|
||||
case SNMP_ES_GENERROR:
|
||||
snmp_inc_snmpingenerrs();
|
||||
mib2_inc_snmpingenerrs();
|
||||
break;
|
||||
default:
|
||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_header_check(): unknown error_status: %d\n", (int)m_stat->error_status));
|
||||
@@ -1188,7 +1188,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||
{
|
||||
/* can't decode or no integer (error-index) */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
/* must be 0 for incoming requests.
|
||||
@@ -1197,7 +1197,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
ofs += (1 + len_octets + len);
|
||||
@@ -1219,7 +1219,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
if ((derr != ERR_OK) ||
|
||||
(type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
return ERR_ARG;
|
||||
}
|
||||
ofs += (1 + len_octets);
|
||||
@@ -1240,7 +1240,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
(type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
|
||||
(len == 0) || (len > vb_len))
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
/* free varbinds (if available) */
|
||||
snmp_varbind_list_free(&m_stat->invb);
|
||||
return ERR_ARG;
|
||||
@@ -1253,7 +1253,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
|
||||
{
|
||||
/* can't decode object name length */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
/* free varbinds (if available) */
|
||||
snmp_varbind_list_free(&m_stat->invb);
|
||||
return ERR_ARG;
|
||||
@@ -1262,7 +1262,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode object name */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
/* free varbinds (if available) */
|
||||
snmp_varbind_list_free(&m_stat->invb);
|
||||
return ERR_ARG;
|
||||
@@ -1275,7 +1275,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
/* can't decode object value length */
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
/* free varbinds (if available) */
|
||||
snmp_varbind_list_free(&m_stat->invb);
|
||||
return ERR_ARG;
|
||||
@@ -1388,7 +1388,7 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
}
|
||||
if (derr != ERR_OK)
|
||||
{
|
||||
snmp_inc_snmpinasnparseerrs();
|
||||
mib2_inc_snmpinasnparseerrs();
|
||||
/* free varbinds (if available) */
|
||||
snmp_varbind_list_free(&m_stat->invb);
|
||||
return ERR_ARG;
|
||||
@@ -1399,11 +1399,11 @@ snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_
|
||||
|
||||
if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
|
||||
{
|
||||
snmp_add_snmpintotalsetvars(m_stat->invb.count);
|
||||
mib2_add_snmpintotalsetvars(m_stat->invb.count);
|
||||
}
|
||||
else
|
||||
{
|
||||
snmp_add_snmpintotalreqvars(m_stat->invb.count);
|
||||
mib2_add_snmpintotalreqvars(m_stat->invb.count);
|
||||
}
|
||||
|
||||
*ofs_ret = ofs;
|
||||
|
||||
@@ -49,8 +49,10 @@
|
||||
#include "lwip/udp.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/snmp.h"
|
||||
#include "lwip/snmp_mib2.h"
|
||||
#include "lwip/snmp_asn1.h"
|
||||
#include "lwip/snmp_msg.h"
|
||||
#include "lwip/sys.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
@@ -159,23 +161,23 @@ snmp_send_response(struct snmp_msg_pstat *m_stat)
|
||||
/* nothing to do */
|
||||
break;
|
||||
case SNMP_ES_TOOBIG:
|
||||
snmp_inc_snmpouttoobigs();
|
||||
mib2_inc_snmpouttoobigs();
|
||||
break;
|
||||
case SNMP_ES_NOSUCHNAME:
|
||||
snmp_inc_snmpoutnosuchnames();
|
||||
mib2_inc_snmpoutnosuchnames();
|
||||
break;
|
||||
case SNMP_ES_BADVALUE:
|
||||
snmp_inc_snmpoutbadvalues();
|
||||
mib2_inc_snmpoutbadvalues();
|
||||
break;
|
||||
case SNMP_ES_GENERROR:
|
||||
snmp_inc_snmpoutgenerrs();
|
||||
mib2_inc_snmpoutgenerrs();
|
||||
break;
|
||||
default:
|
||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_send_response(): unknown error_status: %d\n", (int)m_stat->error_status));
|
||||
break;
|
||||
}
|
||||
snmp_inc_snmpoutgetresponses();
|
||||
snmp_inc_snmpoutpkts();
|
||||
mib2_inc_snmpoutgetresponses();
|
||||
mib2_inc_snmpoutpkts();
|
||||
|
||||
/** @todo do we need separate rx and tx pcbs for threaded case? */
|
||||
/** connect to the originating source */
|
||||
@@ -256,9 +258,10 @@ snmp_send_trap(s8_t generic_trap, const struct snmp_obj_id *eoid, s32_t specific
|
||||
else
|
||||
{
|
||||
/* generic (MIB-II) trap */
|
||||
snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
|
||||
mib2_get_snmpgrpid_ptr(&trap_msg.enterprise);
|
||||
}
|
||||
snmp_get_sysuptime(&trap_msg.ts);
|
||||
|
||||
MIB2_COPY_SYSUPTIME_TO(&trap_msg.ts);
|
||||
|
||||
/* pass 0, calculate length fields */
|
||||
tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
|
||||
@@ -274,8 +277,8 @@ snmp_send_trap(s8_t generic_trap, const struct snmp_obj_id *eoid, s32_t specific
|
||||
ofs = snmp_trap_header_enc(&trap_msg, p);
|
||||
snmp_varbind_list_enc(&trap_msg.outvb, p, ofs);
|
||||
|
||||
snmp_inc_snmpouttraps();
|
||||
snmp_inc_snmpoutpkts();
|
||||
mib2_inc_snmpouttraps();
|
||||
mib2_inc_snmpoutpkts();
|
||||
|
||||
/** send to the TRAP destination */
|
||||
udp_sendto(trap_msg.pcb, p, &trap_msg.dip, SNMP_TRAP_PORT);
|
||||
@@ -306,7 +309,7 @@ void
|
||||
snmp_authfail_trap(void)
|
||||
{
|
||||
u8_t enable;
|
||||
snmp_get_snmpenableauthentraps(&enable);
|
||||
mib2_get_snmpenableauthentraps(&enable);
|
||||
if (enable == 1)
|
||||
{
|
||||
trap_msg.outvb.head = NULL;
|
||||
|
||||
Reference in New Issue
Block a user