mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-08-23 14:46:01 +00:00
MIB-2 object values near to completion, just committing for keeping the flame alive.
This commit is contained in:
parent
d0b81d3b20
commit
8559f3e583
|
@ -50,6 +50,20 @@ Running the agent
|
||||||
The following function calls must be made in your program to
|
The following function calls must be made in your program to
|
||||||
actually get the SNMP agent running.
|
actually get the SNMP agent running.
|
||||||
|
|
||||||
|
Before starting the agent you should supply pointers
|
||||||
|
to non-volatile memory for sysContact, sysLocation,
|
||||||
|
and snmpEnableAuthenTraps. You can do this by calling
|
||||||
|
|
||||||
|
snmp_set_syscontact()
|
||||||
|
snmp_set_syslocation()
|
||||||
|
snmp_set_snmpenableauthentraps()
|
||||||
|
|
||||||
|
Additionally you may want to set
|
||||||
|
|
||||||
|
snmp_set_sysdescr()
|
||||||
|
snmp_set_sysobjid() (if you have a private MIB)
|
||||||
|
snmp_set_sysname()
|
||||||
|
|
||||||
In the lwIP initialisation sequence call snmp_init() just after
|
In the lwIP initialisation sequence call snmp_init() just after
|
||||||
the call to udp_init().
|
the call to udp_init().
|
||||||
|
|
||||||
|
@ -57,14 +71,6 @@ Exactly every 10 msec the SNMP uptime timestamp must be updated with
|
||||||
snmp_inc_sysuptime(). You should call this from a timer interrupt
|
snmp_inc_sysuptime(). You should call this from a timer interrupt
|
||||||
or a timer signal handler depending on your runtime environment.
|
or a timer signal handler depending on your runtime environment.
|
||||||
|
|
||||||
You _must_ create the following support functions for non-volatile storage
|
|
||||||
since lwIP does not have notion of files or other non-volatile memories.
|
|
||||||
|
|
||||||
void snmp_store_syscontact(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
void snmp_store_sysname(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
void snmp_store_syslocation(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Private MIBs
|
Private MIBs
|
||||||
============
|
============
|
||||||
|
|
1812
src/core/snmp/mib2.c
1812
src/core/snmp/mib2.c
File diff suppressed because it is too large
Load Diff
|
@ -221,4 +221,26 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test object identifier for the iso.org.dod.internet prefix.
|
||||||
|
*
|
||||||
|
* @param ident_len the length of the supplied object identifier
|
||||||
|
* @param ident points to the array of sub identifiers
|
||||||
|
* @return 1 if it matches, 0 otherwise
|
||||||
|
*/
|
||||||
|
u8_t
|
||||||
|
snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
|
||||||
|
{
|
||||||
|
if ((ident_len > 3) &&
|
||||||
|
(ident[0] == 1) && (ident[1] == 3) &&
|
||||||
|
(ident[2] == 6) && (ident[3] == 1))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* LWIP_SNMP */
|
#endif /* LWIP_SNMP */
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
#include "lwip/snmp.h"
|
#include "lwip/snmp.h"
|
||||||
#include "lwip/snmp_asn1.h"
|
#include "lwip/snmp_asn1.h"
|
||||||
#include "lwip/snmp_msg.h"
|
#include "lwip/snmp_msg.h"
|
||||||
|
|
||||||
#include "lwip/snmp_structs.h"
|
#include "lwip/snmp_structs.h"
|
||||||
|
|
||||||
#if LWIP_SNMP
|
#if LWIP_SNMP
|
||||||
|
@ -74,9 +73,7 @@ static void snmp_varbind_list_free(struct snmp_varbind_root *root);
|
||||||
static void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
|
static void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
|
||||||
static struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
|
static struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
|
||||||
|
|
||||||
/** @todo: move this to header */
|
|
||||||
extern const struct mib_array_node internet;
|
|
||||||
extern const struct mib_array_node sys_tem; /* test only */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts SNMP Agent.
|
* Starts SNMP Agent.
|
||||||
|
@ -106,11 +103,81 @@ snmp_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* called for each variable binding (also for the fist one)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
snmp_msg_event(void)
|
snmp_msg_event(struct snmp_msg_pstat *msg_ps)
|
||||||
{
|
{
|
||||||
|
struct mib_node *mn;
|
||||||
|
struct obj_def object_def;
|
||||||
|
|
||||||
|
if (msg_ps->state == SNMP_MSG_DEMUX)
|
||||||
|
{
|
||||||
|
if (msg_ps->vb_idx == 0)
|
||||||
|
{
|
||||||
|
msg_ps->vb_ptr = msg_ps->invb.head;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg_ps->vb_ptr = msg_ps->vb_ptr->next;
|
||||||
|
msg_ps->vb_idx += 1;
|
||||||
|
}
|
||||||
|
if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
|
||||||
|
{
|
||||||
|
/** test object identifier for .iso.org.dod.internet prefix */
|
||||||
|
if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
|
||||||
|
{
|
||||||
|
mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
|
||||||
|
msg_ps->vb_ptr->ident + 4, &object_def);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mn = NULL;
|
||||||
|
}
|
||||||
|
if (mn != NULL)
|
||||||
|
{
|
||||||
|
if (mn->node_type == MIB_NODE_EX)
|
||||||
|
{
|
||||||
|
/* external object */
|
||||||
|
msg_ps->state = SNMP_MSG_EXTERNAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* internal object */
|
||||||
|
msg_ps->state = SNMP_MSG_INTERNAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* mn == NULL, noSuchName */
|
||||||
|
msg_ps->error_status = SNMP_ES_NOSUCHNAME;
|
||||||
|
msg_ps->error_index = 1 + msg_ps->vb_idx;
|
||||||
|
msg_ps->outvb.head = NULL;
|
||||||
|
msg_ps->outvb.tail = NULL;
|
||||||
|
msg_ps->outvb.count = 0;
|
||||||
|
msg_ps->outvb.seqlen = 0;
|
||||||
|
msg_ps->outvb.seqlenlen = 1;
|
||||||
|
snmp_send_response(msg_ps);
|
||||||
|
msg_ps->state = SNMP_MSG_EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/** @todo not a request, return generror?? */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (msg_ps->state == SNMP_MSG_INTERNAL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (msg_ps->state == SNMP_MSG_EXTERNAL)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lwIP UDP receive callback function */
|
/* lwIP UDP receive callback function */
|
||||||
|
@ -156,6 +223,8 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
msg_ps->sp = port;
|
msg_ps->sp = port;
|
||||||
/* demultiplex variable bindings */
|
/* demultiplex variable bindings */
|
||||||
msg_ps->state = SNMP_MSG_DEMUX;
|
msg_ps->state = SNMP_MSG_DEMUX;
|
||||||
|
/* first variable binding from list to inspect */
|
||||||
|
msg_ps->vb_idx = 0;
|
||||||
/* read UDP payload length from UDP header */
|
/* read UDP payload length from UDP header */
|
||||||
payload_len = ntohs(udphdr->len) - UDP_HLEN;
|
payload_len = ntohs(udphdr->len) - UDP_HLEN;
|
||||||
|
|
||||||
|
@ -171,7 +240,7 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
/* Builds a list of variable bindings. Copy the varbinds from the pbuf
|
/* Builds a list of variable bindings. Copy the varbinds from the pbuf
|
||||||
chain to glue them when these are divided over two or more pbuf's. */
|
chain to glue them when these are divided over two or more pbuf's. */
|
||||||
err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
|
err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
|
||||||
if (err_ret == ERR_OK)
|
if ((err_ret == ERR_OK) && (msg_ps->invb.count > 0))
|
||||||
{
|
{
|
||||||
struct mib_node *mn;
|
struct mib_node *mn;
|
||||||
struct obj_def object_def;
|
struct obj_def object_def;
|
||||||
|
@ -183,14 +252,18 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
|
|
||||||
if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
|
if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
|
||||||
{
|
{
|
||||||
/** @todo check if count > 0 and if we got .iso.dod.internet and iterate from vb 0 .. count-1 */
|
/** test object identifier for .iso.org.dod.internet prefix */
|
||||||
mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->invb.head->ident_len - 2 /* trim iso.dod.internet */,
|
if (snmp_iso_prefix_tst(msg_ps->invb.head->ident_len, msg_ps->invb.head->ident))
|
||||||
msg_ps->invb.head->ident + 2, &object_def);
|
{
|
||||||
|
mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->invb.head->ident_len - 4,
|
||||||
|
msg_ps->invb.head->ident + 4, &object_def);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mn = NULL;
|
||||||
|
}
|
||||||
if (mn != NULL)
|
if (mn != NULL)
|
||||||
{
|
{
|
||||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv mn=%p sys_tem=%p node_typ=%"U16_F,
|
|
||||||
(void*)mn,(void*)&sys_tem,(u16_t)mn->node_type));
|
|
||||||
|
|
||||||
if (msg_ps->invb.head->value != NULL)
|
if (msg_ps->invb.head->value != NULL)
|
||||||
{
|
{
|
||||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv free value before vb recycle"));
|
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv free value before vb recycle"));
|
||||||
|
@ -201,7 +274,7 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
msg_ps->invb.head->value = mem_malloc(object_def.v_len);
|
msg_ps->invb.head->value = mem_malloc(object_def.v_len);
|
||||||
if (msg_ps->invb.head->value != NULL)
|
if (msg_ps->invb.head->value != NULL)
|
||||||
{
|
{
|
||||||
mn->get_value(object_def.id_inst_len, object_def.id_inst_ptr, object_def.v_len, msg_ps->invb.head->value);
|
mn->get_value(&object_def, object_def.v_len, msg_ps->invb.head->value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -213,8 +286,7 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
{
|
{
|
||||||
/* mn == NULL, noSuchName */
|
/* mn == NULL, noSuchName */
|
||||||
msg_ps->error_status = SNMP_ES_NOSUCHNAME;
|
msg_ps->error_status = SNMP_ES_NOSUCHNAME;
|
||||||
/** @todo current varbind index */
|
msg_ps->error_index = 1 + msg_ps->vb_idx;
|
||||||
msg_ps->error_index = 1;
|
|
||||||
msg_ps->outvb.head = NULL;
|
msg_ps->outvb.head = NULL;
|
||||||
msg_ps->outvb.tail = NULL;
|
msg_ps->outvb.tail = NULL;
|
||||||
msg_ps->outvb.count = 0;
|
msg_ps->outvb.count = 0;
|
||||||
|
@ -232,6 +304,10 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
msg_ps->error_index = 0;
|
msg_ps->error_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* when more variable bindings left msg_ps->state = SNMP_MSG_DEMUX */
|
||||||
|
|
||||||
|
|
||||||
|
/* when completed transaction */
|
||||||
err_ret = snmp_send_response(msg_ps);
|
err_ret = snmp_send_response(msg_ps);
|
||||||
if (err_ret == ERR_MEM)
|
if (err_ret == ERR_MEM)
|
||||||
{
|
{
|
||||||
|
@ -247,13 +323,21 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
||||||
/* free varbinds (if available) */
|
/* free varbinds (if available) */
|
||||||
snmp_varbind_list_free(&msg_ps->invb);
|
snmp_varbind_list_free(&msg_ps->invb);
|
||||||
msg_ps->state = SNMP_MSG_EMPTY;
|
msg_ps->state = SNMP_MSG_EMPTY;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* varbind-list decode failed! */
|
/* varbind-list decode failed, or varbind list empty (silly cmd for agent) */
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
/** @todo should we return SNMP_ES_GENERROR here ? */
|
|
||||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed"));
|
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed"));
|
||||||
|
msg_ps->error_status = SNMP_ES_GENERROR;
|
||||||
|
msg_ps->error_index = 0;
|
||||||
|
msg_ps->outvb.head = NULL;
|
||||||
|
msg_ps->outvb.tail = NULL;
|
||||||
|
msg_ps->outvb.count = 0;
|
||||||
|
msg_ps->outvb.seqlen = 0;
|
||||||
|
msg_ps->outvb.seqlenlen = 1;
|
||||||
|
snmp_send_response(msg_ps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -306,14 +390,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
snmp_inc_snmpinasnparseerrs();
|
snmp_inc_snmpinasnparseerrs();
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
ofs += (1 + len_octets);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||||
|
@ -335,14 +412,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
snmp_inc_snmpinbadversions();
|
snmp_inc_snmpinbadversions();
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
ofs += (1 + len_octets + len);
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
|
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
|
||||||
|
@ -369,14 +439,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
/** @todo: send authentication failure trap, if we have a trap destination */
|
/** @todo: send authentication failure trap, if we have a trap destination */
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
ofs += (1 + len_octets + len);
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if (derr != ERR_OK)
|
if (derr != ERR_OK)
|
||||||
|
@ -422,14 +485,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
m_stat->rt = type & 0x1F;
|
m_stat->rt = type & 0x1F;
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
ofs += (1 + len_octets);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||||
|
@ -445,14 +501,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
snmp_inc_snmpinasnparseerrs();
|
snmp_inc_snmpinasnparseerrs();
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
ofs += (1 + len_octets + len);
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||||
|
@ -488,14 +537,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
snmp_inc_snmpingenerrs();
|
snmp_inc_snmpingenerrs();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
ofs += (1 + len_octets + len);
|
||||||
}
|
|
||||||
snmp_asn1_dec_type(p, ofs, &type);
|
snmp_asn1_dec_type(p, ofs, &type);
|
||||||
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
|
||||||
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
|
||||||
|
@ -505,14 +547,7 @@ snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret,
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
}
|
}
|
||||||
/* skip 'error-index', usually 0 for incoming requests */
|
/* skip 'error-index', usually 0 for incoming requests */
|
||||||
if (type & SNMP_ASN1_CONSTR)
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ofs += (1 + len_octets + len);
|
ofs += (1 + len_octets + len);
|
||||||
}
|
|
||||||
*ofs_ret = ofs;
|
*ofs_ret = ofs;
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,19 +49,14 @@ struct snmp_obj_id
|
||||||
};
|
};
|
||||||
|
|
||||||
/* system */
|
/* system */
|
||||||
void snmp_set_sysdesr(u8_t* str, u8_t strlen);
|
void snmp_set_sysdesr(u8_t* str, u8_t* strlen);
|
||||||
void snmp_set_sysobjid(struct snmp_obj_id *oid);
|
void snmp_set_sysobjid(struct snmp_obj_id *oid);
|
||||||
void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid);
|
void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid);
|
||||||
void snmp_inc_sysuptime(void);
|
void snmp_inc_sysuptime(void);
|
||||||
void snmp_get_sysuptime(u32_t *value);
|
void snmp_get_sysuptime(u32_t *value);
|
||||||
void snmp_set_syscontact(u8_t *ocstr, u8_t ocstrlen);
|
void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
void snmp_set_sysname(u8_t *ocstr, u8_t ocstrlen);
|
void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
void snmp_set_syslocation(u8_t *ocstr, u8_t ocstrlen);
|
void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
/** externally supplied system functions
|
|
||||||
@see lwip/doc/snmp_agent.txt */
|
|
||||||
void snmp_store_syscontact(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
void snmp_store_sysname(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
void snmp_store_syslocation(u8_t* ocstr, u8_t ocstrlen);
|
|
||||||
|
|
||||||
/* network interface */
|
/* network interface */
|
||||||
void snmp_add_ifinoctets(struct netif *ni, u32_t value);
|
void snmp_add_ifinoctets(struct netif *ni, u32_t value);
|
||||||
|
@ -75,13 +70,22 @@ void snmp_inc_ifoutdiscards(struct netif *ni);
|
||||||
|
|
||||||
/* IP */
|
/* IP */
|
||||||
void snmp_inc_ipinreceives(void);
|
void snmp_inc_ipinreceives(void);
|
||||||
void snmp_inc_ipindelivers(void);
|
void snmp_inc_ipinhdrerrors(void);
|
||||||
void snmp_inc_ipindiscards(void);
|
void snmp_inc_ipinaddrerrors(void);
|
||||||
void snmp_inc_ipoutdiscards(void);
|
|
||||||
void snmp_inc_ipoutrequests(void);
|
|
||||||
void snmp_inc_ipunknownprotos(void);
|
|
||||||
void snmp_inc_ipnoroutes(void);
|
|
||||||
void snmp_inc_ipforwdatagrams(void);
|
void snmp_inc_ipforwdatagrams(void);
|
||||||
|
void snmp_inc_ipinunknownprotos(void);
|
||||||
|
void snmp_inc_ipindiscards(void);
|
||||||
|
void snmp_inc_ipindelivers(void);
|
||||||
|
void snmp_inc_ipoutrequests(void);
|
||||||
|
void snmp_inc_ipoutdiscards(void);
|
||||||
|
void snmp_inc_ipoutnoroutes(void);
|
||||||
|
void snmp_inc_ipreasmreqds(void);
|
||||||
|
void snmp_inc_ipreasmoks(void);
|
||||||
|
void snmp_inc_ipreasmfails(void);
|
||||||
|
void snmp_inc_ipfragoks(void);
|
||||||
|
void snmp_inc_ipfragfails(void);
|
||||||
|
void snmp_inc_ipfragcreates(void);
|
||||||
|
void snmp_inc_iproutingdiscards(void);
|
||||||
|
|
||||||
/* ICMP */
|
/* ICMP */
|
||||||
void snmp_inc_icmpinmsgs(void);
|
void snmp_inc_icmpinmsgs(void);
|
||||||
|
@ -158,15 +162,18 @@ void snmp_inc_snmpoutsetrequests(void);
|
||||||
void snmp_inc_snmpoutgetresponses(void);
|
void snmp_inc_snmpoutgetresponses(void);
|
||||||
void snmp_inc_snmpouttraps(void);
|
void snmp_inc_snmpouttraps(void);
|
||||||
void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
||||||
|
void snmp_set_snmpenableauthentraps(u8_t *value);
|
||||||
|
|
||||||
/* LWIP_SNMP support not available */
|
/* LWIP_SNMP support not available */
|
||||||
/* define everything to be empty */
|
/* define everything to be empty */
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* system */
|
/* system */
|
||||||
|
#define snmp_set_sysdesr(str, strlen)
|
||||||
|
#define snmp_get_sysobjid_ptr(oid)
|
||||||
#define snmp_inc_sysuptime()
|
#define snmp_inc_sysuptime()
|
||||||
#define snmp_get_sysuptime(value)
|
#define snmp_get_sysuptime(value)
|
||||||
#define snmp_get_sysobjid_ptr(oid)
|
|
||||||
|
|
||||||
/* network interface */
|
/* network interface */
|
||||||
#define snmp_add_ifinoctets(ni,value)
|
#define snmp_add_ifinoctets(ni,value)
|
||||||
|
@ -180,13 +187,22 @@ void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
||||||
|
|
||||||
/* IP */
|
/* IP */
|
||||||
#define snmp_inc_ipinreceives()
|
#define snmp_inc_ipinreceives()
|
||||||
#define snmp_inc_ipindelivers()
|
#define snmp_inc_ipinhdrerrors()
|
||||||
#define snmp_inc_ipindiscards()
|
#define snmp_inc_ipinaddrerrors()
|
||||||
#define snmp_inc_ipoutdiscards()
|
|
||||||
#define snmp_inc_ipoutrequests()
|
|
||||||
#define snmp_inc_ipunknownprotos()
|
|
||||||
#define snmp_inc_ipnoroutes()
|
|
||||||
#define snmp_inc_ipforwdatagrams()
|
#define snmp_inc_ipforwdatagrams()
|
||||||
|
#define snmp_inc_ipinunknownprotos()
|
||||||
|
#define snmp_inc_ipindiscards()
|
||||||
|
#define snmp_inc_ipindelivers()
|
||||||
|
#define snmp_inc_ipoutrequests()
|
||||||
|
#define snmp_inc_ipoutdiscards()
|
||||||
|
#define snmp_inc_ipoutnoroutes()
|
||||||
|
#define snmp_inc_ipreasmreqds()
|
||||||
|
#define snmp_inc_ipreasmoks()
|
||||||
|
#define snmp_inc_ipreasmfails()
|
||||||
|
#define snmp_inc_ipfragoks()
|
||||||
|
#define snmp_inc_ipfragfails()
|
||||||
|
#define snmp_inc_ipfragcreates()
|
||||||
|
#define snmp_inc_iproutingdiscards()
|
||||||
|
|
||||||
/* ICMP */
|
/* ICMP */
|
||||||
#define snmp_inc_icmpinmsgs()
|
#define snmp_inc_icmpinmsgs()
|
||||||
|
@ -262,6 +278,7 @@ void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
||||||
#define snmp_inc_snmpoutgetresponses()
|
#define snmp_inc_snmpoutgetresponses()
|
||||||
#define snmp_inc_snmpouttraps()
|
#define snmp_inc_snmpouttraps()
|
||||||
#define snmp_get_snmpgrpid_ptr(oid)
|
#define snmp_get_snmpgrpid_ptr(oid)
|
||||||
|
#define snmp_set_snmpenableauthentraps(value)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -208,8 +208,12 @@ struct snmp_msg_pstat
|
||||||
u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
|
u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
|
||||||
/* community string length (exclusive zero term) */
|
/* community string length (exclusive zero term) */
|
||||||
u8_t com_strlen;
|
u8_t com_strlen;
|
||||||
/* one out of MSG_EMPTY, MSG_DEMUX, MSG_MGMT, MSG_PRIVATE */
|
/* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL */
|
||||||
u8_t state;
|
u8_t state;
|
||||||
|
/* index into input variable binding list */
|
||||||
|
u8_t vb_idx;
|
||||||
|
/* ptr into input variable binding list */
|
||||||
|
struct snmp_varbind *vb_ptr;
|
||||||
/* list of variable bindings from input */
|
/* list of variable bindings from input */
|
||||||
struct snmp_varbind_root invb;
|
struct snmp_varbind_root invb;
|
||||||
/* list of variable bindings to output */
|
/* list of variable bindings to output */
|
||||||
|
@ -260,7 +264,8 @@ extern struct snmp_msg_trap trap_msg;
|
||||||
|
|
||||||
/** Agent setup, start listening to port 161. */
|
/** Agent setup, start listening to port 161. */
|
||||||
void snmp_init(void);
|
void snmp_init(void);
|
||||||
|
/** Handles internal/external events. */
|
||||||
|
void snmp_msg_event(struct snmp_msg_pstat *msg_ps);
|
||||||
err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
|
err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
|
||||||
err_t snmp_send_trap(struct ip_addr *dst, s8_t generic_trap, s32_t specific_trap);
|
err_t snmp_send_trap(struct ip_addr *dst, s8_t generic_trap, s32_t specific_trap);
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,8 @@ struct obj_def
|
||||||
u8_t id_inst_len;
|
u8_t id_inst_len;
|
||||||
/* instance part of supplied object identifier */
|
/* instance part of supplied object identifier */
|
||||||
s32_t *id_inst_ptr;
|
s32_t *id_inst_ptr;
|
||||||
|
/* optional value address hint */
|
||||||
|
void *addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** MIB const array node */
|
/** MIB const array node */
|
||||||
|
@ -88,7 +90,7 @@ struct mib_node
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
/** returns object value for the given object identifier,
|
/** returns object value for the given object identifier,
|
||||||
@note the caller must allocate at least len bytes for the value */
|
@note the caller must allocate at least len bytes for the value */
|
||||||
void (*get_value)(u8_t ident_len, s32_t *ident, u16_t len, void *value);
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
/** @todo set_value() */
|
/** @todo set_value() */
|
||||||
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
||||||
const u8_t node_type;
|
const u8_t node_type;
|
||||||
|
@ -102,7 +104,7 @@ struct mib_array_node
|
||||||
{
|
{
|
||||||
/* inherited "base class" */
|
/* inherited "base class" */
|
||||||
const void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
const void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
const void (*get_value)(u8_t ident_len, s32_t *ident, u16_t len, void *value);
|
const void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
const u8_t node_type;
|
const u8_t node_type;
|
||||||
const u16_t maxlength;
|
const u16_t maxlength;
|
||||||
|
|
||||||
|
@ -117,7 +119,7 @@ struct mib_ram_array_node
|
||||||
{
|
{
|
||||||
/* inherited "base class" */
|
/* inherited "base class" */
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
void (*get_value)(u8_t ident_len, s32_t *ident, u16_t len, void *value);
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
u8_t node_type;
|
u8_t node_type;
|
||||||
u16_t maxlength;
|
u16_t maxlength;
|
||||||
|
|
||||||
|
@ -140,7 +142,7 @@ struct mib_list_rootnode
|
||||||
{
|
{
|
||||||
/* inherited "base class" */
|
/* inherited "base class" */
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
void (*get_value)(u8_t ident_len, s32_t *ident, u16_t len, void *value);
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
u8_t node_type;
|
u8_t node_type;
|
||||||
u16_t maxlength;
|
u16_t maxlength;
|
||||||
|
|
||||||
|
@ -157,13 +159,13 @@ struct mib_external_node
|
||||||
{
|
{
|
||||||
/* inherited "base class" */
|
/* inherited "base class" */
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
void (*get_value)(u8_t ident_len, s32_t *ident, u16_t len, void *value);
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
u8_t node_type;
|
u8_t node_type;
|
||||||
u16_t maxlength;
|
u16_t maxlength;
|
||||||
|
|
||||||
/* aditional struct members */
|
/* aditional struct members */
|
||||||
void (*req_object_def)(u8_t ident_len, s32_t *ident);
|
void (*req_object_def)(u8_t ident_len, s32_t *ident);
|
||||||
void (*getreq_value)(u8_t ident_len, s32_t *ident);
|
void (*getreq_value)(struct obj_def *od);
|
||||||
|
|
||||||
/** compares object sub identifier with externally available id
|
/** compares object sub identifier with externally available id
|
||||||
return zero when equal, nonzero when unequal */
|
return zero when equal, nonzero when unequal */
|
||||||
|
@ -174,6 +176,10 @@ struct mib_external_node
|
||||||
u16_t count;
|
u16_t count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** export MIB tree from mib2.c */
|
||||||
|
extern const struct mib_array_node internet;
|
||||||
|
|
||||||
struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj_def *object_def);
|
struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj_def *object_def);
|
||||||
|
u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user