mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-02-06 18:41:30 +00:00
Added minimalistic SNMP GET functionality.
This commit is contained in:
parent
5c628d2a61
commit
d8922d0410
29
CHANGELOG
29
CHANGELOG
@ -25,6 +25,30 @@ HISTORY
|
|||||||
|
|
||||||
* [Enter new changes just after this line - do not remove this line]
|
* [Enter new changes just after this line - do not remove this line]
|
||||||
|
|
||||||
|
++ New features:
|
||||||
|
|
||||||
|
2006-07-14 Christiaan Simons
|
||||||
|
* mib_structs.c: added
|
||||||
|
* include/lwip/snmp_structs.h: added
|
||||||
|
* netif.{c,h}, netif/ethernetif.c: added SNMP statistics to netif struct
|
||||||
|
* mib2.c: changed, inserted object tree
|
||||||
|
* msg_{in,out}.c: changed, added minimalistic GET functionality (needs work)
|
||||||
|
|
||||||
|
2006-07-06 Christiaan Simons
|
||||||
|
* snmp/asn1_{enc,dec}.c added
|
||||||
|
* snmp/mib2.c added
|
||||||
|
* snmp/msg_{in,out}.c added
|
||||||
|
* include/lwip/snmp_asn1.h added
|
||||||
|
* include/lwip/snmp_msg.h added
|
||||||
|
* doc/snmp_agent.txt added
|
||||||
|
|
||||||
|
2006-03-29 Christiaan Simons
|
||||||
|
* inet.c, inet.h: Added platform byteswap support.
|
||||||
|
Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and
|
||||||
|
optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros.
|
||||||
|
|
||||||
|
++ Bug fixes:
|
||||||
|
|
||||||
2006-06-27 Christiaan Simons
|
2006-06-27 Christiaan Simons
|
||||||
* api_msg.c: Applied patch for cold case (bug #11135).
|
* api_msg.c: Applied patch for cold case (bug #11135).
|
||||||
In accept_function() ensure newconn->callback is always initialized.
|
In accept_function() ensure newconn->callback is always initialized.
|
||||||
@ -41,11 +65,6 @@ HISTORY
|
|||||||
* api_lib.c: Removed conn->sem creation and destruction
|
* api_lib.c: Removed conn->sem creation and destruction
|
||||||
from netconn_write() and added sys_sem_new to netconn_new_*.
|
from netconn_write() and added sys_sem_new to netconn_new_*.
|
||||||
|
|
||||||
2006-03-29 Christiaan Simons
|
|
||||||
* inet.c, inet.h: Added platform byteswap support.
|
|
||||||
Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and
|
|
||||||
optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros.
|
|
||||||
|
|
||||||
(STABLE-1_1_1)
|
(STABLE-1_1_1)
|
||||||
|
|
||||||
2006-03-03 Christiaan Simons
|
2006-03-03 Christiaan Simons
|
||||||
|
1038
src/core/snmp/mib2.c
1038
src/core/snmp/mib2.c
File diff suppressed because it is too large
Load Diff
224
src/core/snmp/mib_structs.c
Normal file
224
src/core/snmp/mib_structs.c
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* [EXPERIMENTAL] Generic MIB tree access/construction functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
|
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
* OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/snmp_structs.h"
|
||||||
|
|
||||||
|
#if LWIP_SNMP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches tree for the supplied (scalar?) object identifier.
|
||||||
|
*
|
||||||
|
* @param node points to the root of the tree ('.internet')
|
||||||
|
* @param ident_len the length of the supplied object identifier
|
||||||
|
* @param ident points to the array of sub identifiers
|
||||||
|
* @param object_def points to the object definition to return
|
||||||
|
* @return pointer to the requested parent (!) node if success, NULL otherwise
|
||||||
|
*/
|
||||||
|
struct mib_node *
|
||||||
|
snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj_def *object_def)
|
||||||
|
{
|
||||||
|
u8_t node_type;
|
||||||
|
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F,(void*)node,*ident));
|
||||||
|
while (node != NULL)
|
||||||
|
{
|
||||||
|
node_type = node->node_type;
|
||||||
|
if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
|
||||||
|
{
|
||||||
|
struct mib_array_node *an;
|
||||||
|
u16_t i;
|
||||||
|
|
||||||
|
/* array node (internal ROM or RAM, fixed length) */
|
||||||
|
an = (struct mib_array_node *)node;
|
||||||
|
i = 0;
|
||||||
|
while ((i < an->maxlength) && (an->objid[i] != *ident))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i < an->maxlength)
|
||||||
|
{
|
||||||
|
if (ident_len > 0)
|
||||||
|
{
|
||||||
|
/* found it, if available proceed to child, otherwise inspect leaf */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F,i,an->objid[i],*ident));
|
||||||
|
if (an->nptr[i] == NULL)
|
||||||
|
{
|
||||||
|
/* a scalar leaf OR table,
|
||||||
|
inspect remaining instance number / table index */
|
||||||
|
/* retrieve object definition with get_object_def()
|
||||||
|
is it scalar, or a valid table item, or non-existent? */
|
||||||
|
an->get_object_def(ident_len, ident, object_def);
|
||||||
|
if (object_def->instance != MIB_OBJECT_NONE)
|
||||||
|
{
|
||||||
|
/** @todo return something more usefull ?? */
|
||||||
|
return (struct mib_node*)an;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, object id points to unknown object (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, object not in this MIB"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* follow next child pointer */
|
||||||
|
ident++;
|
||||||
|
ident_len--;
|
||||||
|
node = an->nptr[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, short object identifier (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, identifier mismatch (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(node_type == MIB_NODE_LR)
|
||||||
|
{
|
||||||
|
struct mib_list_rootnode *lrn;
|
||||||
|
struct mib_list_node *ln;
|
||||||
|
|
||||||
|
/* list root node (internal 'RAM', variable length) */
|
||||||
|
lrn = (struct mib_list_rootnode *)node;
|
||||||
|
ln = lrn->head;
|
||||||
|
/* iterate over list, head to tail */
|
||||||
|
while ((ln != NULL) && (ln->objid != *ident))
|
||||||
|
{
|
||||||
|
ln = ln->next;
|
||||||
|
}
|
||||||
|
if (ln != NULL)
|
||||||
|
{
|
||||||
|
if (ident_len > 0)
|
||||||
|
{
|
||||||
|
/* found it, proceed to child */;
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F,ln->objid,*ident));
|
||||||
|
if (ln->nptr == NULL)
|
||||||
|
{
|
||||||
|
lrn->get_object_def(ident_len, ident, object_def);
|
||||||
|
if (object_def->instance != MIB_OBJECT_NONE)
|
||||||
|
{
|
||||||
|
/** @todo return something more usefull ?? */
|
||||||
|
return (struct mib_node*)lrn;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, object id points to unknown object (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, object not in this MIB"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* follow next child pointer */
|
||||||
|
ident_len--;
|
||||||
|
ident++;
|
||||||
|
node = ln->nptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, short object identifier (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(node_type == MIB_NODE_EX)
|
||||||
|
{
|
||||||
|
struct mib_external_node *en;
|
||||||
|
u16_t i;
|
||||||
|
|
||||||
|
/* external node (addressing and access via functions) */
|
||||||
|
en = (struct mib_external_node *)node;
|
||||||
|
i = 0;
|
||||||
|
while ((i < en->count) && en->ident_cmp(i,*ident))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i < en->count)
|
||||||
|
{
|
||||||
|
if (ident_len > 0)
|
||||||
|
{
|
||||||
|
if (en->get_nptr(i) == NULL)
|
||||||
|
{
|
||||||
|
/** @todo, this object is elsewhere, we can only start the request,
|
||||||
|
but can't return something usefull yet.*/
|
||||||
|
en->req_object_def(ident_len, ident);
|
||||||
|
return (struct mib_node*)en;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* found it, proceed to child */
|
||||||
|
ident_len--;
|
||||||
|
ident++;
|
||||||
|
node = (struct mib_node*)en->get_nptr(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed, short object identifier (nosuchname) */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search failed */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* done, found nothing */
|
||||||
|
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p",(void*)node));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_SNMP */
|
@ -47,9 +47,11 @@
|
|||||||
#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"
|
||||||
|
|
||||||
#if LWIP_SNMP
|
#if LWIP_SNMP
|
||||||
|
|
||||||
|
#define LWIP_SNMP_DBG_LOOPBACK_TST 0
|
||||||
#define SNMP_CONCURRENT_REQUESTS 2
|
#define SNMP_CONCURRENT_REQUESTS 2
|
||||||
|
|
||||||
/* public (non-static) constants */
|
/* public (non-static) constants */
|
||||||
@ -72,8 +74,16 @@ 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 */
|
||||||
|
|
||||||
void snmp_init(void)
|
/**
|
||||||
|
* Starts SNMP Agent.
|
||||||
|
* Allocates UDP pcb and binds it to IP_ADDR_ANY port 161.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
snmp_init(void)
|
||||||
{
|
{
|
||||||
struct snmp_msg_pstat *msg_ps;
|
struct snmp_msg_pstat *msg_ps;
|
||||||
u8_t i;
|
u8_t i;
|
||||||
@ -95,6 +105,14 @@ void snmp_init(void)
|
|||||||
trap_msg.pcb = snmp1_pcb;
|
trap_msg.pcb = snmp1_pcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
snmp_msg_event(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/* lwIP UDP receive callback function */
|
/* lwIP UDP receive callback function */
|
||||||
static void
|
static void
|
||||||
snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
|
snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
|
||||||
@ -155,14 +173,65 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
struct mib_node *mn;
|
||||||
|
struct obj_def object_def;
|
||||||
|
|
||||||
/* we've decoded the incoming message, release input msg now */
|
/* we've decoded the incoming message, release input msg now */
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
|
|
||||||
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
|
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
|
||||||
|
|
||||||
|
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 */
|
||||||
|
mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->invb.head->ident_len - 2 /* trim iso.dod.internet */,
|
||||||
|
msg_ps->invb.head->ident + 2, &object_def);
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv free value before vb recycle"));
|
||||||
|
mem_free(msg_ps->invb.head->value);
|
||||||
|
}
|
||||||
|
msg_ps->invb.head->value_type = object_def.asn_type;
|
||||||
|
msg_ps->invb.head->value_len = object_def.v_len;
|
||||||
|
msg_ps->invb.head->value = mem_malloc(object_def.v_len);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate variable space"));
|
||||||
|
}
|
||||||
|
msg_ps->outvb = msg_ps->invb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* mn == NULL, noSuchName */
|
||||||
|
msg_ps->error_status = SNMP_ES_NOSUCHNAME;
|
||||||
|
/** @todo current varbind index */
|
||||||
|
msg_ps->error_index = 1;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* request != GET */
|
||||||
/** @todo EXPERIMENTAL dumb echo, this is not how the agent should respond.
|
/** @todo EXPERIMENTAL dumb echo, this is not how the agent should respond.
|
||||||
This is for test purposes only, do not use this in real world!! */
|
This is for test purposes only, do not use this in real world!! */
|
||||||
msg_ps->outvb = msg_ps->invb;
|
msg_ps->outvb = msg_ps->invb;
|
||||||
|
msg_ps->error_status = SNMP_ES_NOERROR;
|
||||||
|
msg_ps->error_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
err_ret = snmp_send_response(msg_ps);
|
err_ret = snmp_send_response(msg_ps);
|
||||||
if (err_ret == ERR_MEM)
|
if (err_ret == ERR_MEM)
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ static u16_t snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *
|
|||||||
* @return ERR_OK when success, ERR_MEM if we're out of memory
|
* @return ERR_OK when success, ERR_MEM if we're out of memory
|
||||||
*
|
*
|
||||||
* @note the caller is responsible for filling in outvb in the m_stat
|
* @note the caller is responsible for filling in outvb in the m_stat
|
||||||
* @todo caller must provide error-status and index ...
|
* and provide error-status and index (except for tooBig errors) ...
|
||||||
*/
|
*/
|
||||||
err_t
|
err_t
|
||||||
snmp_send_response(struct snmp_msg_pstat *m_stat)
|
snmp_send_response(struct snmp_msg_pstat *m_stat)
|
||||||
@ -86,9 +86,6 @@ snmp_send_response(struct snmp_msg_pstat *m_stat)
|
|||||||
u16_t tot_len;
|
u16_t tot_len;
|
||||||
err_t err;
|
err_t err;
|
||||||
|
|
||||||
m_stat->error_status = SNMP_ES_NOERROR;
|
|
||||||
m_stat->error_index = 0;
|
|
||||||
|
|
||||||
/* pass 0, calculate length fields */
|
/* pass 0, calculate length fields */
|
||||||
tot_len = snmp_varbind_list_sum(&m_stat->outvb);
|
tot_len = snmp_varbind_list_sum(&m_stat->outvb);
|
||||||
tot_len = snmp_resp_header_sum(m_stat, tot_len);
|
tot_len = snmp_resp_header_sum(m_stat, tot_len);
|
||||||
@ -207,12 +204,12 @@ snmp_send_trap(struct ip_addr *dst, s8_t generic_trap, s32_t specific_trap)
|
|||||||
if (generic_trap == 6)
|
if (generic_trap == 6)
|
||||||
{
|
{
|
||||||
/* enterprise-Specific trap */
|
/* enterprise-Specific trap */
|
||||||
snmp_get_sysobjid(&trap_msg.enterprise);
|
snmp_get_sysobjid_ptr(&trap_msg.enterprise);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* generic (MIB-II) trap */
|
/* generic (MIB-II) trap */
|
||||||
snmp_get_snmpgrpid(&trap_msg.enterprise);
|
snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
|
||||||
}
|
}
|
||||||
snmp_get_sysuptime(&trap_msg.ts);
|
snmp_get_sysuptime(&trap_msg.ts);
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ struct snmp_obj_id
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* system */
|
/* system */
|
||||||
void snmp_set_sysdesr(char* 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);
|
||||||
|
179
src/include/lwip/snmp_structs.h
Normal file
179
src/include/lwip/snmp_structs.h
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* [EXPERIMENTAL] Generic MIB tree structures.
|
||||||
|
*
|
||||||
|
* @todo namespace prefixes
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
|
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
* OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_SNMP_STRUCTS_H__
|
||||||
|
#define __LWIP_SNMP_STRUCTS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "arch/cc.h"
|
||||||
|
|
||||||
|
#if SNMP_PRIVATE_MIB
|
||||||
|
#include "private_mib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MIB object instance */
|
||||||
|
#define MIB_OBJECT_NONE 0
|
||||||
|
#define MIB_OBJECT_SCALAR 1
|
||||||
|
#define MIB_OBJECT_TAB 2
|
||||||
|
|
||||||
|
/* MIB object access */
|
||||||
|
#define MIB_OBJECT_READ_ONLY 0
|
||||||
|
#define MIB_OBJECT_READ_WRITE 1
|
||||||
|
#define MIB_OBJECT_WRITE_ONLY 2
|
||||||
|
#define MIB_OBJECT_NOT_ACCESSIBLE 3
|
||||||
|
|
||||||
|
/** object definition returned by (get_object_def)() */
|
||||||
|
struct obj_def
|
||||||
|
{
|
||||||
|
/* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
|
||||||
|
u8_t instance;
|
||||||
|
/* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
|
||||||
|
u8_t access;
|
||||||
|
/* ASN type for this object */
|
||||||
|
u8_t asn_type;
|
||||||
|
/* value length (host length) */
|
||||||
|
u16_t v_len;
|
||||||
|
/* length of instance part of supplied object identifier */
|
||||||
|
u8_t id_inst_len;
|
||||||
|
/* instance part of supplied object identifier */
|
||||||
|
s32_t *id_inst_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** MIB const array node */
|
||||||
|
#define MIB_NODE_AR 0x01
|
||||||
|
/** MIB array node (mem_malloced from RAM) */
|
||||||
|
#define MIB_NODE_RA 0x02
|
||||||
|
/** MIB list root node (mem_malloced from RAM) */
|
||||||
|
#define MIB_NODE_LR 0x03
|
||||||
|
/** MIB node for external objects */
|
||||||
|
#define MIB_NODE_EX 0x04
|
||||||
|
|
||||||
|
/** node "base class" layout, the mandatory fields for a node */
|
||||||
|
struct mib_node
|
||||||
|
{
|
||||||
|
/** returns struct obj_def for the given object identifier */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
/** returns object value for the given object identifier,
|
||||||
|
@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);
|
||||||
|
/** @todo set_value() */
|
||||||
|
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
||||||
|
const u8_t node_type;
|
||||||
|
/* array or max list length */
|
||||||
|
const u16_t maxlength;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, points to a fixed size const array
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_array_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" */
|
||||||
|
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 u8_t node_type;
|
||||||
|
const u16_t maxlength;
|
||||||
|
|
||||||
|
/* aditional struct members */
|
||||||
|
const s32_t *objid;
|
||||||
|
struct mib_node* const *nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, points to a fixed size mem_malloced array
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_ram_array_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" */
|
||||||
|
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);
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* aditional struct members */
|
||||||
|
s32_t *objid;
|
||||||
|
struct mib_node **nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mib_list_node
|
||||||
|
{
|
||||||
|
struct mib_list_node *prev;
|
||||||
|
struct mib_list_node *next;
|
||||||
|
s32_t objid;
|
||||||
|
struct mib_node *nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, points to a doubly linked list
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_list_rootnode
|
||||||
|
{
|
||||||
|
/* inherited "base class" */
|
||||||
|
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);
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* aditional struct members */
|
||||||
|
struct mib_list_node *head;
|
||||||
|
struct mib_list_node *tail;
|
||||||
|
/* counts list nodes in list */
|
||||||
|
u16_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, has access functions for mib object in external memory or device
|
||||||
|
using index ('idx'), with a range 0 .. (count - 1) to address these objects */
|
||||||
|
struct mib_external_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" */
|
||||||
|
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);
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* aditional struct members */
|
||||||
|
void (*req_object_def)(u8_t ident_len, s32_t *ident);
|
||||||
|
void (*getreq_value)(u8_t ident_len, s32_t *ident);
|
||||||
|
|
||||||
|
/** compares object sub identifier with externally available id
|
||||||
|
return zero when equal, nonzero when unequal */
|
||||||
|
u16_t (*ident_cmp)(u16_t idx, s32_t sub_id);
|
||||||
|
/** returns next pointer for given index (NULL for scalar 'leaf') */
|
||||||
|
struct mib_extern_node* (*get_nptr)(u16_t idx);
|
||||||
|
/* counts actual number of external objects */
|
||||||
|
u16_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj_def *object_def);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user