📄 mib2.c
字号:
sysname_ptr = ocstr;
sysname_len_ptr = ocstrlen;
}
}
/**
* Initializes sysLocation pointers,
* e.g. ptrs to non-volatile memory external to lwIP.
*
* @param ocstr if non-NULL then copy str pointer
* @param ocstrlen points to string length, excluding zero terminator
*/
void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
{
if (ocstr != NULL)
{
syslocation_ptr = ocstr;
syslocation_len_ptr = ocstrlen;
}
}
void snmp_add_ifinoctets(struct netif *ni, u32_t value)
{
ni->ifinoctets += value;
}
void snmp_inc_ifinucastpkts(struct netif *ni)
{
(ni->ifinucastpkts)++;
}
void snmp_inc_ifinnucastpkts(struct netif *ni)
{
(ni->ifinnucastpkts)++;
}
void snmp_inc_ifindiscards(struct netif *ni)
{
(ni->ifindiscards)++;
}
void snmp_add_ifoutoctets(struct netif *ni, u32_t value)
{
ni->ifoutoctets += value;
}
void snmp_inc_ifoutucastpkts(struct netif *ni)
{
(ni->ifoutucastpkts)++;
}
void snmp_inc_ifoutnucastpkts(struct netif *ni)
{
(ni->ifoutnucastpkts)++;
}
void snmp_inc_ifoutdiscards(struct netif *ni)
{
(ni->ifoutdiscards)++;
}
void snmp_inc_iflist(void)
{
struct mib_list_node *if_node = NULL;
snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
/* enable getnext traversal on filled table */
iftable.maxlength = 1;
}
void snmp_dec_iflist(void)
{
snmp_mib_node_delete(&iflist_root, iflist_root.tail);
/* disable getnext traversal on empty table */
if(iflist_root.count == 0) iftable.maxlength = 0;
}
/**
* Inserts ARP table indexes (.xIfIndex.xNetAddress)
* into arp table index trees (both atTable and ipNetToMediaTable).
*/
void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip)
{
struct mib_list_rootnode *at_rn;
struct mib_list_node *at_node;
struct ip_addr hip;
s32_t arpidx[5];
u8_t level, tree;
LWIP_ASSERT("ni != NULL", ni != NULL);
snmp_netiftoifindex(ni, &arpidx[0]);
hip.addr = ntohl(ip->addr);
snmp_iptooid(&hip, &arpidx[1]);
for (tree = 0; tree < 2; tree++)
{
if (tree == 0)
{
at_rn = &arptree_root;
}
else
{
at_rn = &ipntomtree_root;
}
for (level = 0; level < 5; level++)
{
at_node = NULL;
snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
if ((level != 4) && (at_node != NULL))
{
if (at_node->nptr == NULL)
{
at_rn = snmp_mib_lrn_alloc();
at_node->nptr = (struct mib_node*)at_rn;
if (at_rn != NULL)
{
if (level == 3)
{
if (tree == 0)
{
at_rn->get_object_def = atentry_get_object_def;
at_rn->get_value = atentry_get_value;
}
else
{
at_rn->get_object_def = ip_ntomentry_get_object_def;
at_rn->get_value = ip_ntomentry_get_value;
}
at_rn->set_test = noleafs_set_test;
at_rn->set_value = noleafs_set_value;
}
}
else
{
/* at_rn == NULL, malloc failure */
LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_arpidx_tree() insert failed, mem full"));
break;
}
}
else
{
at_rn = (struct mib_list_rootnode*)at_node->nptr;
}
}
}
}
/* enable getnext traversal on filled tables */
at.maxlength = 1;
ipntomtable.maxlength = 1;
}
/**
* Removes ARP table indexes (.xIfIndex.xNetAddress)
* from arp table index trees.
*/
void snmp_delete_arpidx_tree(struct netif *ni, struct ip_addr *ip)
{
struct mib_list_rootnode *at_rn, *next, *del_rn[5];
struct mib_list_node *at_n, *del_n[5];
struct ip_addr hip;
s32_t arpidx[5];
u8_t fc, tree, level, del_cnt;
snmp_netiftoifindex(ni, &arpidx[0]);
hip.addr = ntohl(ip->addr);
snmp_iptooid(&hip, &arpidx[1]);
for (tree = 0; tree < 2; tree++)
{
/* mark nodes for deletion */
if (tree == 0)
{
at_rn = &arptree_root;
}
else
{
at_rn = &ipntomtree_root;
}
level = 0;
del_cnt = 0;
while ((level < 5) && (at_rn != NULL))
{
fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
if (fc == 0)
{
/* arpidx[level] does not exist */
del_cnt = 0;
at_rn = NULL;
}
else if (fc == 1)
{
del_rn[del_cnt] = at_rn;
del_n[del_cnt] = at_n;
del_cnt++;
at_rn = (struct mib_list_rootnode*)(at_n->nptr);
}
else if (fc == 2)
{
/* reset delete (2 or more childs) */
del_cnt = 0;
at_rn = (struct mib_list_rootnode*)(at_n->nptr);
}
level++;
}
/* delete marked index nodes */
while (del_cnt > 0)
{
del_cnt--;
at_rn = del_rn[del_cnt];
at_n = del_n[del_cnt];
next = snmp_mib_node_delete(at_rn, at_n);
if (next != NULL)
{
LWIP_ASSERT("next_count == 0",next->count == 0);
snmp_mib_lrn_free(next);
}
}
}
/* disable getnext traversal on empty tables */
if(arptree_root.count == 0) at.maxlength = 0;
if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
}
void snmp_inc_ipinreceives(void)
{
ipinreceives++;
}
void snmp_inc_ipinhdrerrors(void)
{
ipinhdrerrors++;
}
void snmp_inc_ipinaddrerrors(void)
{
ipinaddrerrors++;
}
void snmp_inc_ipforwdatagrams(void)
{
ipforwdatagrams++;
}
void snmp_inc_ipinunknownprotos(void)
{
ipinunknownprotos++;
}
void snmp_inc_ipindiscards(void)
{
ipindiscards++;
}
void snmp_inc_ipindelivers(void)
{
ipindelivers++;
}
void snmp_inc_ipoutrequests(void)
{
ipoutrequests++;
}
void snmp_inc_ipoutdiscards(void)
{
ipoutdiscards++;
}
void snmp_inc_ipoutnoroutes(void)
{
ipoutnoroutes++;
}
void snmp_inc_ipreasmreqds(void)
{
ipreasmreqds++;
}
void snmp_inc_ipreasmoks(void)
{
ipreasmoks++;
}
void snmp_inc_ipreasmfails(void)
{
ipreasmfails++;
}
void snmp_inc_ipfragoks(void)
{
ipfragoks++;
}
void snmp_inc_ipfragfails(void)
{
ipfragfails++;
}
void snmp_inc_ipfragcreates(void)
{
ipfragcreates++;
}
void snmp_inc_iproutingdiscards(void)
{
iproutingdiscards++;
}
/**
* Inserts ipAddrTable indexes (.ipAdEntAddr)
* into index tree.
*/
void snmp_insert_ipaddridx_tree(struct netif *ni)
{
struct mib_list_rootnode *ipa_rn;
struct mib_list_node *ipa_node;
struct ip_addr ip;
s32_t ipaddridx[4];
u8_t level;
LWIP_ASSERT("ni != NULL", ni != NULL);
ip.addr = ntohl(ni->ip_addr.addr);
snmp_iptooid(&ip, &ipaddridx[0]);
level = 0;
ipa_rn = &ipaddrtree_root;
while (level < 4)
{
ipa_node = NULL;
snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
if ((level != 3) && (ipa_node != NULL))
{
if (ipa_node->nptr == NULL)
{
ipa_rn = snmp_mib_lrn_alloc();
ipa_node->nptr = (struct mib_node*)ipa_rn;
if (ipa_rn != NULL)
{
if (level == 2)
{
ipa_rn->get_object_def = ip_addrentry_get_object_def;
ipa_rn->get_value = ip_addrentry_get_value;
ipa_rn->set_test = noleafs_set_test;
ipa_rn->set_value = noleafs_set_value;
}
}
else
{
/* ipa_rn == NULL, malloc failure */
LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_ipaddridx_tree() insert failed, mem full"));
break;
}
}
else
{
ipa_rn = (struct mib_list_rootnode*)ipa_node->nptr;
}
}
level++;
}
/* enable getnext traversal on filled table */
ipaddrtable.maxlength = 1;
}
/**
* Removes ipAddrTable indexes (.ipAdEntAddr)
* from index tree.
*/
void snmp_delete_ipaddridx_tree(struct netif *ni)
{
struct mib_list_rootnode *ipa_rn, *next, *del_rn[4];
struct mib_list_node *ipa_n, *del_n[4];
struct ip_addr ip;
s32_t ipaddridx[4];
u8_t fc, level, del_cnt;
LWIP_ASSERT("ni != NULL", ni != NULL);
ip.addr = ntohl(ni->ip_addr.addr);
snmp_iptooid(&ip, &ipaddridx[0]);
/* mark nodes for deletion */
level = 0;
del_cnt = 0;
ipa_rn = &ipaddrtree_root;
while ((level < 4) && (ipa_rn != NULL))
{
fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
if (fc == 0)
{
/* ipaddridx[level] does not exist */
del_cnt = 0;
ipa_rn = NULL;
}
else if (fc == 1)
{
del_rn[del_cnt] = ipa_rn;
del_n[del_cnt] = ipa_n;
del_cnt++;
ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
}
else if (fc == 2)
{
/* reset delete (2 or more childs) */
del_cnt = 0;
ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
}
level++;
}
/* delete marked index nodes */
while (del_cnt > 0)
{
del_cnt--;
ipa_rn = del_rn[del_cnt];
ipa_n = del_n[del_cnt];
next = snmp_mib_node_delete(ipa_rn, ipa_n);
if (next != NULL)
{
LWIP_ASSERT("next_count == 0",next->count == 0);
snmp_mib_lrn_free(next);
}
}
/* disable getnext traversal on empty table */
if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
}
/**
* Inserts ipRouteTable indexes (.ipRouteDest)
* into index tree.
*
* @param dflt non-zero for the default rte, zero for network rte
* @param ni points to network interface for this rte
*
* @todo record sysuptime for _this_ route when it is installed
* (needed for ipRouteAge) in the netif.
*/
void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
{
u8_t insert = 0;
struct ip_addr dst;
if (dflt != 0)
{
/* the default route 0.0.0.0 */
dst.addr = 0;
insert = 1;
}
else
{
/* route to the network address */
dst.addr = ntohl(ni->ip_addr.addr & ni->netmask.addr);
/* exclude 0.0.0.0 network (reserved for default rte) */
if (dst.addr != 0) insert = 1;
}
if (insert)
{
struct mib_list_rootnode *iprte_rn;
struct mib_list_node *iprte_node;
s32_t iprteidx[4];
u8_t level;
snmp_iptooid(&dst, &iprteidx[0]);
level = 0;
iprte_rn = &iprtetree_root;
while (level < 4)
{
iprte_node = NULL;
snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
if ((level != 3) && (iprte_node != NULL))
{
if (iprte_node->nptr == NULL)
{
iprte_rn = snmp_mib_lrn_alloc();
iprte_node->nptr = (struct mib_node*)iprte_rn;
if (iprte_rn != NULL)
{
if (level == 2)
{
iprte_rn->get_object_def = ip_rteentry_get_object_def;
iprte_rn->get_value = ip_rteentry_get_value;
iprte_rn->set_test = noleafs_set_test;
iprte_rn->set_value = noleafs_set_value;
}
}
else
{
/* iprte_rn == NULL, malloc failure */
LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_iprteidx_tree() insert failed, mem full"));
break;
}
}
else
{
iprte_rn = (struct mib_list_rootnode*)iprte_node->nptr;
}
}
level++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -