7 changed files with 1431 additions and 127 deletions
@ -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 */ |
||||
@ -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…
Reference in new issue