mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
SNMP: Programmer documentation
This commit is contained in:
parent
305f873c6e
commit
764a912548
@ -27,7 +27,7 @@ mib_mb_realloc(pool *p, void *ptr, unsigned size)
|
|||||||
return mb_realloc(ptr, size);
|
return mb_realloc(ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* mib_tree_init - Initialize a MIB tree
|
* mib_tree_init - Initialize a MIB tree
|
||||||
* @p: allocation source pool
|
* @p: allocation source pool
|
||||||
* @t: pointer to a tree being initialized
|
* @t: pointer to a tree being initialized
|
||||||
@ -57,6 +57,13 @@ mib_tree_init(pool *p, struct mib_tree *t)
|
|||||||
(void) mib_tree_add(p, t, oid, 0);
|
(void) mib_tree_add(p, t, oid, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mib_tree_hint - preallocate child array for given OID
|
||||||
|
* @p: memory pool to allocated from
|
||||||
|
* @t: MIB tree to hint
|
||||||
|
* @oid: MIB subtree root with upto @size children
|
||||||
|
* @size: number of children in @oid subtree
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
mib_tree_hint(pool *p, struct mib_tree *t, const struct oid *oid, uint size)
|
mib_tree_hint(pool *p, struct mib_tree *t, const struct oid *oid, uint size)
|
||||||
{
|
{
|
||||||
@ -78,12 +85,7 @@ mib_tree_hint(pool *p, struct mib_tree *t, const struct oid *oid, uint size)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
// TODO: This function does not work with leaf nodes inside the snmp_internet prefix
|
|
||||||
// area
|
|
||||||
// Return NULL of failure, valid mib_node_u pointer otherwise
|
|
||||||
|
|
||||||
/*
|
|
||||||
* mib_tree_add - Insert a new node to the tree
|
* mib_tree_add - Insert a new node to the tree
|
||||||
* @p: allocation source pool
|
* @p: allocation source pool
|
||||||
* @t: MIB tree to insert to
|
* @t: MIB tree to insert to
|
||||||
@ -99,6 +101,7 @@ mib_tree_hint(pool *p, struct mib_tree *t, const struct oid *oid, uint size)
|
|||||||
mib_node_u *
|
mib_node_u *
|
||||||
mib_tree_add(pool *p, struct mib_tree *t, const struct oid *oid, int is_leaf)
|
mib_tree_add(pool *p, struct mib_tree *t, const struct oid *oid, int is_leaf)
|
||||||
{
|
{
|
||||||
|
// TODO may not function properly in snmp_internet prefix region
|
||||||
struct mib_walk_state walk;
|
struct mib_walk_state walk;
|
||||||
mib_node_u *node;
|
mib_node_u *node;
|
||||||
|
|
||||||
@ -248,7 +251,7 @@ mib_tree_add(pool *p, struct mib_tree *t, const struct oid *oid, int is_leaf)
|
|||||||
return last;
|
return last;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* mib_tree_delete - delete a MIB subtree
|
* mib_tree_delete - delete a MIB subtree
|
||||||
* @t: MIB tree
|
* @t: MIB tree
|
||||||
* @walk: MIB tree walk state that specify the subtree
|
* @walk: MIB tree walk state that specify the subtree
|
||||||
@ -370,7 +373,7 @@ continue_while: /* like outer continue, but skip always true condition */
|
|||||||
return deleted;
|
return deleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* mib_tree_remove - delete a MIB subtree
|
* mib_tree_remove - delete a MIB subtree
|
||||||
* @t: MIB tree
|
* @t: MIB tree
|
||||||
* @oid: object identifier specifying the subtree
|
* @oid: object identifier specifying the subtree
|
||||||
@ -392,7 +395,7 @@ mib_tree_remove(struct mib_tree *t, const struct oid *oid)
|
|||||||
return mib_tree_delete(t, &walk);
|
return mib_tree_delete(t, &walk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* mib_tree_find - Find a OID node in MIB tree
|
* mib_tree_find - Find a OID node in MIB tree
|
||||||
* @t: searched tree
|
* @t: searched tree
|
||||||
* @walk: output search state
|
* @walk: output search state
|
||||||
@ -549,6 +552,11 @@ mib_tree_find(const struct mib_tree *t, struct mib_walk_state *walk, const struc
|
|||||||
return walk->stack[walk->stack_pos++] = node;
|
return walk->stack[walk->stack_pos++] = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mib_tree_walk_init - Initialize MIB tree walk state
|
||||||
|
* @walk: MIB tree walk state to init
|
||||||
|
* @t: optional MIB tree
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
mib_tree_walk_init(struct mib_walk_state *walk, const struct mib_tree *t)
|
mib_tree_walk_init(struct mib_walk_state *walk, const struct mib_tree *t)
|
||||||
{
|
{
|
||||||
@ -560,6 +568,12 @@ mib_tree_walk_init(struct mib_walk_state *walk, const struct mib_tree *t)
|
|||||||
walk->stack[0] = (mib_node_u *) &t->root;
|
walk->stack[0] = (mib_node_u *) &t->root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* walk_is_prefixable - test prefixability of MIB walk state
|
||||||
|
* @walk: MIB tree walk state to use
|
||||||
|
*
|
||||||
|
* This function is functionally equivalent to snmp_oid_is_prefixable().
|
||||||
|
*/
|
||||||
static inline int
|
static inline int
|
||||||
walk_is_prefixable(const struct mib_walk_state *walk)
|
walk_is_prefixable(const struct mib_walk_state *walk)
|
||||||
{
|
{
|
||||||
@ -577,6 +591,14 @@ walk_is_prefixable(const struct mib_walk_state *walk)
|
|||||||
return id > 0 && id <= UINT8_MAX;
|
return id > 0 && id <= UINT8_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mib_tree_walk_to_oid - retrieve OID from MIB tree walk state
|
||||||
|
* @walk: MIB tree walk state to transform
|
||||||
|
* @result: destination OID
|
||||||
|
* @subids: Maximal number of subids in available space
|
||||||
|
*
|
||||||
|
* Return 1 if the space is insufficient, 0 otherwise.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
mib_tree_walk_to_oid(const struct mib_walk_state *walk, struct oid *result, u32 subids)
|
mib_tree_walk_to_oid(const struct mib_walk_state *walk, struct oid *result, u32 subids)
|
||||||
{
|
{
|
||||||
@ -625,12 +647,12 @@ mib_tree_walk_to_oid(const struct mib_walk_state *walk, struct oid *result, u32
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return -1 if walk_oid < oid
|
* mib_tree_walk_oid_compare - compare MIB tree walk state and OID
|
||||||
* return 0 if walk_oid == oid
|
* @walk: left relation operand
|
||||||
* return +1 if walk_oid > oid
|
* @oid: Object Identifier in cpu native byte order
|
||||||
*
|
*
|
||||||
|
* Return value semantics is the same as snmp_oid_compare().
|
||||||
*/
|
*/
|
||||||
// TODO tests, doc string
|
|
||||||
int
|
int
|
||||||
mib_tree_walk_oid_compare(const struct mib_walk_state *walk, const struct oid *oid)
|
mib_tree_walk_oid_compare(const struct mib_walk_state *walk, const struct oid *oid)
|
||||||
{
|
{
|
||||||
@ -741,6 +763,11 @@ mib_tree_walk_is_oid_descendant(const struct mib_walk_state *walk, const struct
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mib_tree_walk_next - find MIB tree node successor in lexicagraphically ordered MIB tree
|
||||||
|
* @t: MIB tree to use
|
||||||
|
* @walk: MIB tree walk state to use
|
||||||
|
*/
|
||||||
mib_node_u *
|
mib_node_u *
|
||||||
mib_tree_walk_next(const struct mib_tree *t, struct mib_walk_state *walk)
|
mib_tree_walk_next(const struct mib_tree *t, struct mib_walk_state *walk)
|
||||||
{
|
{
|
||||||
@ -789,6 +816,12 @@ mib_tree_walk_next(const struct mib_tree *t, struct mib_walk_state *walk)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mib_tree_walk_next_leaf - wrapper around mib_tree_walk_next returning only leafs
|
||||||
|
* @t: MIB tree to use
|
||||||
|
* @walk: MIB tree walk state
|
||||||
|
* @skip: lower value bound for next OID id
|
||||||
|
*/
|
||||||
struct mib_leaf *
|
struct mib_leaf *
|
||||||
mib_tree_walk_next_leaf(const struct mib_tree *t, struct mib_walk_state *walk, u32 skip)
|
mib_tree_walk_next_leaf(const struct mib_tree *t, struct mib_walk_state *walk, u32 skip)
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@ snmp_pdu_context(struct snmp_pdu *pdu, struct snmp_proto *p, sock *sk)
|
|||||||
pdu->sr_o_end = NULL;
|
pdu->sr_o_end = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_session - store packet ids from protocol to header
|
* snmp_session - store packet ids from protocol to header
|
||||||
* @p: source SNMP protocol instance
|
* @p: source SNMP protocol instance
|
||||||
* @h: dest PDU header
|
* @h: dest PDU header
|
||||||
@ -43,7 +43,7 @@ snmp_varbind_data(const struct agentx_varbind *vb)
|
|||||||
return (void *) &vb->name + name_size;
|
return (void *) &vb->name + name_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_is_oid_empty - check if oid is null-valued
|
* snmp_is_oid_empty - check if oid is null-valued
|
||||||
* @oid: object identifier to check
|
* @oid: object identifier to check
|
||||||
*
|
*
|
||||||
@ -133,7 +133,7 @@ snmp_oid_to_buf(struct oid *dst, const struct oid *src)
|
|||||||
STORE_U32(dst->ids[i], src->ids[i]);
|
STORE_U32(dst->ids[i], src->ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_str_size_from_len - return in-buffer octet string size
|
* snmp_str_size_from_len - return in-buffer octet string size
|
||||||
* @len: length of C-string, returned from strlen()
|
* @len: length of C-string, returned from strlen()
|
||||||
*/
|
*/
|
||||||
@ -143,7 +143,7 @@ snmp_str_size_from_len(uint len)
|
|||||||
return 4 + BIRD_ALIGN(len, 4);
|
return 4 + BIRD_ALIGN(len, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_str_size - return in packet size of supplied string
|
* snmp_str_size - return in packet size of supplied string
|
||||||
* @str: measured string
|
* @str: measured string
|
||||||
*
|
*
|
||||||
@ -156,7 +156,7 @@ snmp_str_size(const char *str)
|
|||||||
return snmp_str_size_from_len(strlen(str));
|
return snmp_str_size_from_len(strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_oid_size - measure size of OID in bytes
|
* snmp_oid_size - measure size of OID in bytes
|
||||||
* @o: object identifier to use
|
* @o: object identifier to use
|
||||||
*
|
*
|
||||||
@ -185,7 +185,7 @@ snmp_get_octet_size(const struct agentx_octet_str *str)
|
|||||||
return str->length;
|
return str->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_varbind_header_size - measure size of VarBind without data in bytes
|
* snmp_varbind_header_size - measure size of VarBind without data in bytes
|
||||||
* @vb_name: VarBind OID name
|
* @vb_name: VarBind OID name
|
||||||
*
|
*
|
||||||
@ -230,7 +230,7 @@ snmp_varbind_size_unsafe(const struct agentx_varbind *vb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_varbind_size_from_len - get size in-buffer VarBind for known OID and data
|
* snmp_varbind_size_from_len - get size in-buffer VarBind for known OID and data
|
||||||
* @n_subid: number of subidentifiers of the VarBind's OID name
|
* @n_subid: number of subidentifiers of the VarBind's OID name
|
||||||
* @type: type of VarBind
|
* @type: type of VarBind
|
||||||
@ -282,7 +282,7 @@ snmp_test_varbind_type(u16 type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_valid_ip4_index - check IPv4 address validity in oid
|
* snmp_valid_ip4_index - check IPv4 address validity in oid
|
||||||
* @o: object identifier holding ip address
|
* @o: object identifier holding ip address
|
||||||
* @start: index of first address id
|
* @start: index of first address id
|
||||||
@ -296,7 +296,7 @@ snmp_valid_ip4_index(const struct oid *o, uint start)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_valid_ip4_index_unsafe - check validity of IPv4 address in oid
|
* snmp_valid_ip4_index_unsafe - check validity of IPv4 address in oid
|
||||||
* @o: object identifier holding ip address
|
* @o: object identifier holding ip address
|
||||||
* @start: index of first address id
|
* @start: index of first address id
|
||||||
@ -337,7 +337,7 @@ snmp_put_nstr(byte *buf, const char *str, uint len)
|
|||||||
return buf + (alen - len);
|
return buf + (alen - len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_put_str - put string into SNMP PDU transcieve buffer
|
* snmp_put_str - put string into SNMP PDU transcieve buffer
|
||||||
* @buf: pointer to first unoccupied buffer byte
|
* @buf: pointer to first unoccupied buffer byte
|
||||||
* @str: string to place
|
* @str: string to place
|
||||||
@ -373,7 +373,7 @@ snmp_put_blank(byte *buf)
|
|||||||
return buf + 4;
|
return buf + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* snmp_put_fbyte - put one padded byte to SNMP PDU transcieve buffer
|
* snmp_put_fbyte - put one padded byte to SNMP PDU transcieve buffer
|
||||||
* @buf: pointer to free buffer byte
|
* @buf: pointer to free buffer byte
|
||||||
* @data: byte to use
|
* @data: byte to use
|
||||||
@ -709,7 +709,7 @@ snmp_oid_log(const struct oid *oid)
|
|||||||
* viewed as longest common prefix. Note that if both @left and @right are
|
* viewed as longest common prefix. Note that if both @left and @right are
|
||||||
* prefixable but not prefixed the result in @out will also not be prefixed.
|
* prefixable but not prefixed the result in @out will also not be prefixed.
|
||||||
*
|
*
|
||||||
* This function is used intensively by snmp_test.c.
|
* This function is used intensively by |snmp_test.c|.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
snmp_oid_common_ancestor(const struct oid *left, const struct oid *right, struct oid *out)
|
snmp_oid_common_ancestor(const struct oid *left, const struct oid *right, struct oid *out)
|
||||||
@ -801,6 +801,18 @@ snmp_oid_common_ancestor(const struct oid *left, const struct oid *right, struct
|
|||||||
/*
|
/*
|
||||||
* SNMP MIB tree walking
|
* SNMP MIB tree walking
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snmp_walk_init - Try to find exactly matching OID packat VarBind in MIB tree
|
||||||
|
* @tree: MIB tree to use
|
||||||
|
* @walk: MIB tree walk state storage
|
||||||
|
* @c: AgentX PDU creation context
|
||||||
|
*
|
||||||
|
* Populate the @walk state and try to find MIB tree leaf equivalent to
|
||||||
|
* c->sr_vb_start which is requested VarBind to fill based on it's OID name.
|
||||||
|
* Return value is either pointer to valid MIB tree leaf or NULL if no leaf
|
||||||
|
* matched.
|
||||||
|
*/
|
||||||
struct mib_leaf *
|
struct mib_leaf *
|
||||||
snmp_walk_init(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_pdu *c)
|
snmp_walk_init(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_pdu *c)
|
||||||
{
|
{
|
||||||
@ -816,6 +828,15 @@ snmp_walk_init(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_p
|
|||||||
return (!node || !mib_node_is_leaf(node)) ? NULL : &node->leaf;
|
return (!node || !mib_node_is_leaf(node)) ? NULL : &node->leaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snmp_walk_next - wrapper around MIB tree mib_walk_next() for single call
|
||||||
|
* @tree: MIB tree to use
|
||||||
|
* @walk: MIB tree walk state storage
|
||||||
|
* @c: AgentX PDU creation context
|
||||||
|
*
|
||||||
|
* The snmp_walk_next() function searches MIB tree with updates of the VarBind
|
||||||
|
* OID name with.
|
||||||
|
*/
|
||||||
struct mib_leaf *
|
struct mib_leaf *
|
||||||
snmp_walk_next(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_pdu *c)
|
snmp_walk_next(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_pdu *c)
|
||||||
{
|
{
|
||||||
@ -881,6 +902,18 @@ snmp_walk_next(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_p
|
|||||||
return leaf;
|
return leaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snmp_walk_fill - fill current VarBind by filler hook invocation
|
||||||
|
* @leaf: MIB tree leaf with filler hook
|
||||||
|
* @walk: MIB tree walk state
|
||||||
|
* @c: AgentX PDU creation context
|
||||||
|
*
|
||||||
|
* The function takes responsibility for VarBind type setting (for known VB
|
||||||
|
* types) and for buffer space allocated for VarBind data (based on type or
|
||||||
|
* configured size). This simplifies code of filler hooks in most cases.
|
||||||
|
* We also allow the @leaf to be NULL, in which case we set the VarBind to
|
||||||
|
* error type noSuchObject.
|
||||||
|
*/
|
||||||
enum snmp_search_res
|
enum snmp_search_res
|
||||||
snmp_walk_fill(struct mib_leaf *leaf, struct mib_walk_state *walk, struct snmp_pdu *c)
|
snmp_walk_fill(struct mib_leaf *leaf, struct mib_walk_state *walk, struct snmp_pdu *c)
|
||||||
{
|
{
|
||||||
|
@ -932,8 +932,8 @@ snmp_get_bulk_pdu(struct snmp_proto *p, struct snmp_pdu *c, struct mib_walk_stat
|
|||||||
//bulk->has_any |= snmp_get_next_pdu(p, c, walk);
|
//bulk->has_any |= snmp_get_next_pdu(p, c, walk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* parse_gets_pdu - parse received gets PDUs
|
* parse_gets_pdu - common parsing of received gets PDUs
|
||||||
* @p: SNMP protocol instance
|
* @p: SNMP protocol instance
|
||||||
* @pkt_start: pointer to first byte of received PDU
|
* @pkt_start: pointer to first byte of received PDU
|
||||||
*
|
*
|
||||||
@ -1312,7 +1312,7 @@ snmp_register_ack(struct snmp_proto *p, struct agentx_response *res)
|
|||||||
snmp_up(p);
|
snmp_up(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* snmp_stop_subagent - close established session
|
* snmp_stop_subagent - close established session
|
||||||
* @p: SNMP protocol instance
|
* @p: SNMP protocol instance
|
||||||
*
|
*
|
||||||
@ -1326,7 +1326,7 @@ snmp_stop_subagent(struct snmp_proto *p)
|
|||||||
close_pdu(p, AGENTX_CLOSE_SHUTDOWN);
|
close_pdu(p, AGENTX_CLOSE_SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* snmp_register_mibs - register all MIB subtrees
|
* snmp_register_mibs - register all MIB subtrees
|
||||||
* @p: SNMP protocol instance
|
* @p: SNMP protocol instance
|
||||||
*/
|
*/
|
||||||
@ -1337,7 +1337,7 @@ snmp_register_mibs(struct snmp_proto *p)
|
|||||||
ASSUME(!EMPTY_LIST(p->registration_queue));
|
ASSUME(!EMPTY_LIST(p->registration_queue));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* snmp_start_subagent - send session open request
|
* snmp_start_subagent - send session open request
|
||||||
* @p: SNMP protocol instance
|
* @p: SNMP protocol instance
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user