snmp: cleaned up mib_* structs: "base" class 'struct mib_node' only needs the type, get/set functions are not used on array/external nodes (only on scalar/listroot nodes)

This commit is contained in:
goldsimon 2015-10-02 12:33:45 +02:00
parent bf75ace695
commit fe33fd6d86
5 changed files with 223 additions and 398 deletions

View File

@ -279,9 +279,9 @@ HISTORY
++ Bugfixes: ++ Bugfixes:
2015-10-01: Dirk Ziegelmeier: 2015-10-02: Dirk Ziegelmeier/Simon Goldschmidt
* snmp: fixed bug #46089: snmp: race condition on length change between * snmp: cleaned up snmp structs API (fixed race conditions from bug #46089,
get_object_def() and get_value() reduce ram/rom usage of tables): incompatible change for private MIBs
2015-09-30: Simon Goldschmidt 2015-09-30: Simon Goldschmidt
* ip4_addr.c: fixed bug #46072: ip4addr_aton() does not check the number range * ip4_addr.c: fixed bug #46072: ip4addr_aton() does not check the number range

View File

@ -132,14 +132,11 @@ static void snmp_set_value(struct obj_def *od, u16_t len, void *value);
/* snmp .1.3.6.1.2.1.11 */ /* snmp .1.3.6.1.2.1.11 */
static const struct mib_scalar_node snmp_scalar = { static const struct mib_scalar_node snmp_scalar = {
{ { MIB_NODE_SC },
&snmp_get_object_def, &snmp_get_object_def,
&snmp_get_value, &snmp_get_value,
&snmp_set_test, &snmp_set_test,
&snmp_set_value, &snmp_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry snmp_nodes[] = { static const struct mib_array_node_entry snmp_nodes[] = {
{1, &snmp_scalar.node}, {2, &snmp_scalar.node}, {1, &snmp_scalar.node}, {2, &snmp_scalar.node},
@ -158,14 +155,8 @@ static const struct mib_array_node_entry snmp_nodes[] = {
{29, &snmp_scalar.node}, {30, &snmp_scalar.node} {29, &snmp_scalar.node}, {30, &snmp_scalar.node}
}; };
static const struct mib_array_node snmp = { static const struct mib_array_node snmp = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(snmp_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(snmp_nodes)
},
snmp_nodes snmp_nodes
}; };
@ -177,54 +168,38 @@ static const struct mib_array_node snmp = {
/** index root node for udpTable */ /** index root node for udpTable */
static struct mib_list_rootnode udp_root = { static struct mib_list_rootnode udp_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry udpentry_nodes[] = { static const struct mib_array_node_entry udpentry_nodes[] = {
{1, &udp_root.node}, {2, &udp_root.node} {1, &udp_root.scalar.node}, {2, &udp_root.scalar.node}
}; };
static struct mib_array_node udpentry = { static struct mib_array_node udpentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(udpentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(udpentry_nodes)
},
udpentry_nodes udpentry_nodes
}; };
static struct mib_array_node_entry udptable_node = {1, &udpentry.node}; static struct mib_array_node_entry udptable_node = {1, &udpentry.node};
static struct mib_ram_array_node udptable = { static struct mib_ram_array_node udptable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&udptable_node &udptable_node
}; };
static const struct mib_scalar_node udp_scalar = { static const struct mib_scalar_node udp_scalar = {
{ { MIB_NODE_SC },
&udp_get_object_def, &udp_get_object_def,
&udp_get_value, &udp_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry udp_nodes[] = { static const struct mib_array_node_entry udp_nodes[] = {
{1, &udp_scalar.node}, {2, &udp_scalar.node}, {1, &udp_scalar.node}, {2, &udp_scalar.node},
@ -232,14 +207,8 @@ static const struct mib_array_node_entry udp_nodes[] = {
{5, &udptable.node} {5, &udptable.node}
}; };
static const struct mib_array_node udp = { static const struct mib_array_node udp = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(udp_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(udp_nodes)
},
udp_nodes udp_nodes
}; };
@ -249,58 +218,42 @@ static const struct mib_array_node udp = {
/** index root node for tcpConnTable */ /** index root node for tcpConnTable */
static struct mib_list_rootnode tcpconntree_root = { static struct mib_list_rootnode tcpconntree_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry tcpconnentry_nodes[] = { static const struct mib_array_node_entry tcpconnentry_nodes[] = {
{1, &tcpconntree_root.node}, {2, &tcpconntree_root.node}, {1, &tcpconntree_root.scalar.node}, {2, &tcpconntree_root.scalar.node},
{3, &tcpconntree_root.node}, {4, &tcpconntree_root.node}, {3, &tcpconntree_root.scalar.node}, {4, &tcpconntree_root.scalar.node},
{5, &tcpconntree_root.node} {5, &tcpconntree_root.scalar.node}
}; };
static struct mib_array_node tcpconnentry = { static struct mib_array_node tcpconnentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(tcpconnentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(tcpconnentry_nodes)
},
tcpconnentry_nodes tcpconnentry_nodes
}; };
static struct mib_array_node_entry tcpconntable_node = {1, &tcpconnentry.node}; static struct mib_array_node_entry tcpconntable_node = {1, &tcpconnentry.node};
static struct mib_ram_array_node tcpconntable = { static struct mib_ram_array_node tcpconntable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
/** @todo update maxlength when inserting / deleting from table /** @todo update maxlength when inserting / deleting from table
0 when table is empty, 1 when more than one entry */ 0 when table is empty, 1 when more than one entry */
0 0,
},
&tcpconntable_node &tcpconntable_node
}; };
static const struct mib_scalar_node tcp_scalar = { static const struct mib_scalar_node tcp_scalar = {
{ { MIB_NODE_SC },
&tcp_get_object_def, &tcp_get_object_def,
&tcp_get_value, &tcp_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry tcp_nodes[] = { static const struct mib_array_node_entry tcp_nodes[] = {
{1, &tcp_scalar.node}, {2, &tcp_scalar.node}, {1, &tcp_scalar.node}, {2, &tcp_scalar.node},
@ -313,28 +266,19 @@ static const struct mib_array_node_entry tcp_nodes[] = {
{15, &tcp_scalar.node} {15, &tcp_scalar.node}
}; };
static const struct mib_array_node tcp = { static const struct mib_array_node tcp = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(tcp_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(tcp_nodes)
},
tcp_nodes tcp_nodes
}; };
#endif #endif
/* icmp .1.3.6.1.2.1.5 */ /* icmp .1.3.6.1.2.1.5 */
static const struct mib_scalar_node icmp_scalar = { static const struct mib_scalar_node icmp_scalar = {
{ { MIB_NODE_SC },
&icmp_get_object_def, &icmp_get_object_def,
&icmp_get_value, &icmp_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry icmp_nodes[] = { static const struct mib_array_node_entry icmp_nodes[] = {
{1, &icmp_scalar.node}, {2, &icmp_scalar.node}, {1, &icmp_scalar.node}, {2, &icmp_scalar.node},
@ -352,164 +296,116 @@ static const struct mib_array_node_entry icmp_nodes[] = {
{25, &icmp_scalar.node}, {26, &icmp_scalar.node} {25, &icmp_scalar.node}, {26, &icmp_scalar.node}
}; };
static const struct mib_array_node icmp = { static const struct mib_array_node icmp = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(icmp_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(icmp_nodes)
},
icmp_nodes icmp_nodes
}; };
/** index root node for ipNetToMediaTable */ /** index root node for ipNetToMediaTable */
static struct mib_list_rootnode ipntomtree_root = { static struct mib_list_rootnode ipntomtree_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry ipntomentry_nodes[] = { static const struct mib_array_node_entry ipntomentry_nodes[] = {
{1, &ipntomtree_root.node}, {2, &ipntomtree_root.node}, {1, &ipntomtree_root.scalar.node}, {2, &ipntomtree_root.scalar.node},
{3, &ipntomtree_root.node}, {4, &ipntomtree_root.node} {3, &ipntomtree_root.scalar.node}, {4, &ipntomtree_root.scalar.node}
}; };
static struct mib_array_node ipntomentry = { static struct mib_array_node ipntomentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(ipntomentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(ipntomentry_nodes)
},
ipntomentry_nodes ipntomentry_nodes
}; };
static struct mib_array_node_entry ipntomtable_node = {1, &ipntomentry.node}; static struct mib_array_node_entry ipntomtable_node = {1, &ipntomentry.node};
static struct mib_ram_array_node ipntomtable = { static struct mib_ram_array_node ipntomtable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&ipntomtable_node &ipntomtable_node
}; };
/** index root node for ipRouteTable */ /** index root node for ipRouteTable */
static struct mib_list_rootnode iprtetree_root = { static struct mib_list_rootnode iprtetree_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry iprteentry_nodes[] = { static const struct mib_array_node_entry iprteentry_nodes[] = {
{1, &iprtetree_root.node}, {2, &iprtetree_root.node}, {1, &iprtetree_root.scalar.node}, {2, &iprtetree_root.scalar.node},
{3, &iprtetree_root.node}, {4, &iprtetree_root.node}, {3, &iprtetree_root.scalar.node}, {4, &iprtetree_root.scalar.node},
{5, &iprtetree_root.node}, {6, &iprtetree_root.node}, {5, &iprtetree_root.scalar.node}, {6, &iprtetree_root.scalar.node},
{7, &iprtetree_root.node}, {8, &iprtetree_root.node}, {7, &iprtetree_root.scalar.node}, {8, &iprtetree_root.scalar.node},
{9, &iprtetree_root.node}, {10, &iprtetree_root.node}, {9, &iprtetree_root.scalar.node}, {10, &iprtetree_root.scalar.node},
{11, &iprtetree_root.node}, {12, &iprtetree_root.node}, {11, &iprtetree_root.scalar.node}, {12, &iprtetree_root.scalar.node},
{13, &iprtetree_root.node} {13, &iprtetree_root.scalar.node}
}; };
static struct mib_array_node iprteentry = { static struct mib_array_node iprteentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(iprteentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(iprteentry_nodes)
},
iprteentry_nodes iprteentry_nodes
}; };
static struct mib_array_node_entry iprtetable_node = {1, &iprteentry.node}; static struct mib_array_node_entry iprtetable_node = {1, &iprteentry.node};
static struct mib_ram_array_node iprtetable = { static struct mib_ram_array_node iprtetable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&iprtetable_node &iprtetable_node
}; };
/** index root node for ipAddrTable */ /** index root node for ipAddrTable */
static struct mib_list_rootnode ipaddrtree_root = { static struct mib_list_rootnode ipaddrtree_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry ipaddrentry_nodes[] = { static const struct mib_array_node_entry ipaddrentry_nodes[] = {
{1, &ipaddrtree_root.node}, {1, &ipaddrtree_root.scalar.node},
{2, &ipaddrtree_root.node}, {2, &ipaddrtree_root.scalar.node},
{3, &ipaddrtree_root.node}, {3, &ipaddrtree_root.scalar.node},
{4, &ipaddrtree_root.node}, {4, &ipaddrtree_root.scalar.node},
{5, &ipaddrtree_root.node} {5, &ipaddrtree_root.scalar.node}
}; };
static struct mib_array_node ipaddrentry = { static struct mib_array_node ipaddrentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(ipaddrentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(ipaddrentry_nodes)
},
ipaddrentry_nodes ipaddrentry_nodes
}; };
static struct mib_array_node_entry ipaddrtable_node = {1, &ipaddrentry.node}; static struct mib_array_node_entry ipaddrtable_node = {1, &ipaddrentry.node};
static struct mib_ram_array_node ipaddrtable = { static struct mib_ram_array_node ipaddrtable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&ipaddrtable_node &ipaddrtable_node
}; };
/* ip .1.3.6.1.2.1.4 */ /* ip .1.3.6.1.2.1.4 */
static const struct mib_scalar_node ip_scalar = { static const struct mib_scalar_node ip_scalar = {
{ { MIB_NODE_SC, },
&ip_get_object_def, &ip_get_object_def,
&ip_get_value, &ip_get_value,
&ip_set_test, &ip_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry ip_nodes[] = { static const struct mib_array_node_entry ip_nodes[] = {
{1, &ip_scalar.node}, {2, &ip_scalar.node}, {1, &ip_scalar.node}, {2, &ip_scalar.node},
@ -526,78 +422,54 @@ static const struct mib_array_node_entry ip_nodes[] = {
{23, &ip_scalar.node} {23, &ip_scalar.node}
}; };
static const struct mib_array_node mib2_ip = { static const struct mib_array_node mib2_ip = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(ip_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(ip_nodes)
},
ip_nodes ip_nodes
}; };
/** index root node for atTable */ /** index root node for atTable */
static struct mib_list_rootnode arptree_root = { static struct mib_list_rootnode arptree_root = {
{ {
{ MIB_NODE_LR },
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry atentry_nodes[] = { static const struct mib_array_node_entry atentry_nodes[] = {
{1, &arptree_root.node}, {1, &arptree_root.scalar.node},
{2, &arptree_root.node}, {2, &arptree_root.scalar.node},
{3, &arptree_root.node} {3, &arptree_root.scalar.node}
}; };
static const struct mib_array_node atentry = { static const struct mib_array_node atentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(atentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(atentry_nodes)
},
atentry_nodes atentry_nodes
}; };
static const struct mib_array_node_entry attable_node = {1, &atentry.node}; static const struct mib_array_node_entry attable_node = {1, &atentry.node};
static struct mib_array_node attable = { static struct mib_array_node attable = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, 1,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
1
},
&attable_node &attable_node
}; };
/* at .1.3.6.1.2.1.3 */ /* at .1.3.6.1.2.1.3 */
static struct mib_array_node_entry mib2_at_node = {1, &attable.node}; static struct mib_array_node_entry mib2_at_node = {1, &attable.node};
static struct mib_ram_array_node at = { static struct mib_ram_array_node at = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&mib2_at_node &mib2_at_node
}; };
/** index root node for ifTable */ /** index root node for ifTable */
static struct mib_list_rootnode iflist_root = { static struct mib_list_rootnode iflist_root = {
{ {
{ MIB_NODE_LR },
&ifentry_get_object_def, &ifentry_get_object_def,
&ifentry_get_value, &ifentry_get_value,
#if SNMP_SAFE_REQUESTS #if SNMP_SAFE_REQUESTS
@ -607,74 +479,51 @@ static struct mib_list_rootnode iflist_root = {
&ifentry_set_test, &ifentry_set_test,
&ifentry_set_value, &ifentry_set_value,
#endif /* SNMP_SAFE_REQUESTS */ #endif /* SNMP_SAFE_REQUESTS */
MIB_NODE_LR,
0
}, },
NULL, NULL,
NULL, NULL,
0 0
}; };
static const struct mib_array_node_entry ifentry_nodes[] = { static const struct mib_array_node_entry ifentry_nodes[] = {
{1, &iflist_root.node}, {2, &iflist_root.node}, {1, &iflist_root.scalar.node}, {2, &iflist_root.scalar.node},
{3, &iflist_root.node}, {4, &iflist_root.node}, {3, &iflist_root.scalar.node}, {4, &iflist_root.scalar.node},
{5, &iflist_root.node}, {6, &iflist_root.node}, {5, &iflist_root.scalar.node}, {6, &iflist_root.scalar.node},
{7, &iflist_root.node}, {8, &iflist_root.node}, {7, &iflist_root.scalar.node}, {8, &iflist_root.scalar.node},
{9, &iflist_root.node}, {10, &iflist_root.node}, {9, &iflist_root.scalar.node}, {10, &iflist_root.scalar.node},
{11, &iflist_root.node}, {12, &iflist_root.node}, {11, &iflist_root.scalar.node}, {12, &iflist_root.scalar.node},
{13, &iflist_root.node}, {14, &iflist_root.node}, {13, &iflist_root.scalar.node}, {14, &iflist_root.scalar.node},
{15, &iflist_root.node}, {16, &iflist_root.node}, {15, &iflist_root.scalar.node}, {16, &iflist_root.scalar.node},
{17, &iflist_root.node}, {18, &iflist_root.node}, {17, &iflist_root.scalar.node}, {18, &iflist_root.scalar.node},
{19, &iflist_root.node}, {20, &iflist_root.node}, {19, &iflist_root.scalar.node}, {20, &iflist_root.scalar.node},
{21, &iflist_root.node}, {22, &iflist_root.node} {21, &iflist_root.scalar.node}, {22, &iflist_root.scalar.node}
}; };
static struct mib_array_node ifentry = { static struct mib_array_node ifentry = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(ifentry_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(ifentry_nodes)
},
ifentry_nodes ifentry_nodes
}; };
static struct mib_array_node_entry iftable_node = {1, &ifentry.node}; static struct mib_array_node_entry iftable_node = {1, &ifentry.node};
static struct mib_ram_array_node iftable = { static struct mib_ram_array_node iftable = {
{ { MIB_NODE_RA },
&noleafs_get_object_def, 0,
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA,
0
},
&iftable_node &iftable_node
}; };
/* interfaces .1.3.6.1.2.1.2 */ /* interfaces .1.3.6.1.2.1.2 */
static const struct mib_scalar_node interfaces_scalar = { static const struct mib_scalar_node interfaces_scalar = {
{ { MIB_NODE_SC },
&interfaces_get_object_def, &interfaces_get_object_def,
&interfaces_get_value, &interfaces_get_value,
&noleafs_set_test, &noleafs_set_test,
&noleafs_set_value, &noleafs_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry interfaces_nodes[] = { static const struct mib_array_node_entry interfaces_nodes[] = {
{1, &interfaces_scalar.node}, {2, &iftable.node} {1, &interfaces_scalar.node}, {2, &iftable.node}
}; };
static const struct mib_array_node interfaces = { static const struct mib_array_node interfaces = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(interfaces_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(interfaces_nodes)
},
interfaces_nodes interfaces_nodes
}; };
@ -682,14 +531,11 @@ static const struct mib_array_node interfaces = {
/* 0 1 2 3 4 5 6 */ /* 0 1 2 3 4 5 6 */
/* system .1.3.6.1.2.1.1 */ /* system .1.3.6.1.2.1.1 */
static const struct mib_scalar_node system_scalar = { static const struct mib_scalar_node system_scalar = {
{ { MIB_NODE_SC },
&system_get_object_def, &system_get_object_def,
&system_get_value, &system_get_value,
&system_set_test, &system_set_test,
&system_set_value, &system_set_value,
MIB_NODE_SC,
0
}
}; };
static const struct mib_array_node_entry system_nodes[] = { static const struct mib_array_node_entry system_nodes[] = {
{1, &system_scalar.node}, {2, &system_scalar.node}, {1, &system_scalar.node}, {2, &system_scalar.node},
@ -699,14 +545,8 @@ static const struct mib_array_node_entry system_nodes[] = {
}; };
/* work around name issue with 'sys_tem', some compiler(s?) seem to reserve 'system' */ /* work around name issue with 'sys_tem', some compiler(s?) seem to reserve 'system' */
static const struct mib_array_node sys_tem = { static const struct mib_array_node sys_tem = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(system_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(system_nodes)
},
system_nodes system_nodes
}; };
@ -725,28 +565,16 @@ static const struct mib_array_node_entry mib2_nodes[] = {
}; };
static const struct mib_array_node mib2 = { static const struct mib_array_node mib2 = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(mib2_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(mib2_nodes)
},
mib2_nodes mib2_nodes
}; };
/* mgmt .1.3.6.1.2 */ /* mgmt .1.3.6.1.2 */
const struct mib_array_node_entry mgmt_nodes[] = { {1, &mib2.node} }; const struct mib_array_node_entry mgmt_nodes[] = { {1, &mib2.node} };
const struct mib_array_node mgmt = { const struct mib_array_node mgmt = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(mgmt_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(mgmt_nodes)
},
mgmt_nodes mgmt_nodes
}; };
@ -760,14 +588,8 @@ const struct mib_array_node_entry internet_nodes[] = {
#endif /* SNMP_PRIVATE_MIB */ #endif /* SNMP_PRIVATE_MIB */
}; };
const struct mib_array_node internet = { const struct mib_array_node internet = {
{ { MIB_NODE_AR },
&noleafs_get_object_def, LWIP_ARRAYSIZE(internet_nodes),
&noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR,
LWIP_ARRAYSIZE(internet_nodes)
},
internet_nodes internet_nodes
}; };
@ -937,7 +759,7 @@ void mib2_netif_added(struct netif *ni)
snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node); snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
/* enable getnext traversal on filled table */ /* enable getnext traversal on filled table */
iftable.node.maxlength = 1; iftable.maxlength = 1;
} }
void mib2_netif_removed(struct netif *ni) void mib2_netif_removed(struct netif *ni)
@ -946,7 +768,7 @@ void mib2_netif_removed(struct netif *ni)
snmp_mib_node_delete(&iflist_root, iflist_root.tail); snmp_mib_node_delete(&iflist_root, iflist_root.tail);
/* disable getnext traversal on empty table */ /* disable getnext traversal on empty table */
if(iflist_root.count == 0) iftable.node.maxlength = 0; if(iflist_root.count == 0) iftable.maxlength = 0;
} }
/** /**
@ -983,23 +805,23 @@ void mib2_add_arp_entry(struct netif *ni, ip4_addr_t *ip)
if (at_node->nptr == NULL) if (at_node->nptr == NULL)
{ {
at_rn = snmp_mib_lrn_alloc(); at_rn = snmp_mib_lrn_alloc();
at_node->nptr = &at_rn->node; at_node->nptr = &at_rn->scalar.node;
if (at_rn != NULL) if (at_rn != NULL)
{ {
if (level == 3) if (level == 3)
{ {
if (tree == 0) if (tree == 0)
{ {
at_rn->node.get_object_def = atentry_get_object_def; at_rn->scalar.get_object_def = atentry_get_object_def;
at_rn->node.get_value = atentry_get_value; at_rn->scalar.get_value = atentry_get_value;
} }
else else
{ {
at_rn->node.get_object_def = ip_ntomentry_get_object_def; at_rn->scalar.get_object_def = ip_ntomentry_get_object_def;
at_rn->node.get_value = ip_ntomentry_get_value; at_rn->scalar.get_value = ip_ntomentry_get_value;
} }
at_rn->node.set_test = noleafs_set_test; at_rn->scalar.set_test = noleafs_set_test;
at_rn->node.set_value = noleafs_set_value; at_rn->scalar.set_value = noleafs_set_value;
} }
} }
else else
@ -1017,8 +839,8 @@ void mib2_add_arp_entry(struct netif *ni, ip4_addr_t *ip)
} }
} }
/* enable getnext traversal on filled tables */ /* enable getnext traversal on filled tables */
at.node.maxlength = 1; at.maxlength = 1;
ipntomtable.node.maxlength = 1; ipntomtable.maxlength = 1;
} }
/** /**
@ -1089,8 +911,8 @@ void mib2_remove_arp_entry(struct netif *ni, ip4_addr_t *ip)
} }
} }
/* disable getnext traversal on empty tables */ /* disable getnext traversal on empty tables */
if(arptree_root.count == 0) at.node.maxlength = 0; if(arptree_root.count == 0) at.maxlength = 0;
if(ipntomtree_root.count == 0) ipntomtable.node.maxlength = 0; if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
} }
/** /**
@ -1118,15 +940,15 @@ void mib2_add_ip4(struct netif *ni)
if (ipa_node->nptr == NULL) if (ipa_node->nptr == NULL)
{ {
ipa_rn = snmp_mib_lrn_alloc(); ipa_rn = snmp_mib_lrn_alloc();
ipa_node->nptr = &ipa_rn->node; ipa_node->nptr = &ipa_rn->scalar.node;
if (ipa_rn != NULL) if (ipa_rn != NULL)
{ {
if (level == 2) if (level == 2)
{ {
ipa_rn->node.get_object_def = ip_addrentry_get_object_def; ipa_rn->scalar.get_object_def = ip_addrentry_get_object_def;
ipa_rn->node.get_value = ip_addrentry_get_value; ipa_rn->scalar.get_value = ip_addrentry_get_value;
ipa_rn->node.set_test = noleafs_set_test; ipa_rn->scalar.set_test = noleafs_set_test;
ipa_rn->node.set_value = noleafs_set_value; ipa_rn->scalar.set_value = noleafs_set_value;
} }
} }
else else
@ -1144,7 +966,7 @@ void mib2_add_ip4(struct netif *ni)
level++; level++;
} }
/* enable getnext traversal on filled table */ /* enable getnext traversal on filled table */
ipaddrtable.node.maxlength = 1; ipaddrtable.maxlength = 1;
} }
/** /**
@ -1205,7 +1027,7 @@ void mib2_remove_ip4(struct netif *ni)
} }
} }
/* disable getnext traversal on empty table */ /* disable getnext traversal on empty table */
if (ipaddrtree_root.count == 0) ipaddrtable.node.maxlength = 0; if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
} }
/** /**
@ -1257,15 +1079,15 @@ void mib2_add_route_ip4(u8_t dflt, struct netif *ni)
if (iprte_node->nptr == NULL) if (iprte_node->nptr == NULL)
{ {
iprte_rn = snmp_mib_lrn_alloc(); iprte_rn = snmp_mib_lrn_alloc();
iprte_node->nptr = &iprte_rn->node; iprte_node->nptr = &iprte_rn->scalar.node;
if (iprte_rn != NULL) if (iprte_rn != NULL)
{ {
if (level == 2) if (level == 2)
{ {
iprte_rn->node.get_object_def = ip_rteentry_get_object_def; iprte_rn->scalar.get_object_def = ip_rteentry_get_object_def;
iprte_rn->node.get_value = ip_rteentry_get_value; iprte_rn->scalar.get_value = ip_rteentry_get_value;
iprte_rn->node.set_test = noleafs_set_test; iprte_rn->scalar.set_test = noleafs_set_test;
iprte_rn->node.set_value = noleafs_set_value; iprte_rn->scalar.set_value = noleafs_set_value;
} }
} }
else else
@ -1284,7 +1106,7 @@ void mib2_add_route_ip4(u8_t dflt, struct netif *ni)
} }
} }
/* enable getnext traversal on filled table */ /* enable getnext traversal on filled table */
iprtetable.node.maxlength = 1; iprtetable.maxlength = 1;
} }
/** /**
@ -1368,7 +1190,7 @@ void mib2_remove_route_ip4(u8_t dflt, struct netif *ni)
} }
} }
/* disable getnext traversal on empty table */ /* disable getnext traversal on empty table */
if (iprtetree_root.count == 0) iprtetable.node.maxlength = 0; if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
} }
@ -1401,15 +1223,15 @@ void mib2_udp_bind(struct udp_pcb *pcb)
if (udp_node->nptr == NULL) if (udp_node->nptr == NULL)
{ {
udp_rn = snmp_mib_lrn_alloc(); udp_rn = snmp_mib_lrn_alloc();
udp_node->nptr = &udp_rn->node; udp_node->nptr = &udp_rn->scalar.node;
if (udp_rn != NULL) if (udp_rn != NULL)
{ {
if (level == 3) if (level == 3)
{ {
udp_rn->node.get_object_def = udpentry_get_object_def; udp_rn->scalar.get_object_def = udpentry_get_object_def;
udp_rn->node.get_value = udpentry_get_value; udp_rn->scalar.get_value = udpentry_get_value;
udp_rn->node.set_test = noleafs_set_test; udp_rn->scalar.set_test = noleafs_set_test;
udp_rn->node.set_value = noleafs_set_value; udp_rn->scalar.set_value = noleafs_set_value;
} }
} }
else else
@ -1425,7 +1247,7 @@ void mib2_udp_bind(struct udp_pcb *pcb)
} }
} }
} }
udptable.node.maxlength = 1; udptable.maxlength = 1;
} }
/** /**
@ -1509,7 +1331,7 @@ void mib2_udp_unbind(struct udp_pcb *pcb)
} }
} }
/* disable getnext traversal on empty table */ /* disable getnext traversal on empty table */
if (udp_root.count == 0) udptable.node.maxlength = 0; if (udp_root.count == 0) udptable.maxlength = 0;
} }

View File

@ -183,12 +183,11 @@ snmp_mib_lrn_alloc(void)
lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE); lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE);
if (lrn != NULL) if (lrn != NULL)
{ {
lrn->node.get_object_def = noleafs_get_object_def; lrn->scalar.get_object_def = noleafs_get_object_def;
lrn->node.get_value = noleafs_get_value; lrn->scalar.get_value = noleafs_get_value;
lrn->node.set_test = noleafs_set_test; lrn->scalar.set_test = noleafs_set_test;
lrn->node.set_value = noleafs_set_value; lrn->scalar.set_value = noleafs_set_value;
lrn->node.node_type = MIB_NODE_LR; lrn->scalar.node.node_type = MIB_NODE_LR;
lrn->node.maxlength = 0;
lrn->head = NULL; lrn->head = NULL;
lrn->tail = NULL; lrn->tail = NULL;
lrn->count = 0; lrn->count = 0;
@ -469,11 +468,11 @@ snmp_search_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
/* array node (internal ROM or RAM, fixed length) */ /* array node (internal ROM or RAM, fixed length) */
an = (const struct mib_array_node *)node; an = (const struct mib_array_node *)node;
i = 0; i = 0;
while ((i < an->node.maxlength) && (an->entries[i].objid != *ident)) while ((i < an->maxlength) && (an->entries[i].objid != *ident))
{ {
i++; i++;
} }
if (i < an->node.maxlength) if (i < an->maxlength)
{ {
/* found it, if available proceed to child, otherwise inspect leaf */ /* found it, if available proceed to child, otherwise inspect leaf */
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->entries[i].objid,*ident)); LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->entries[i].objid,*ident));
@ -530,7 +529,7 @@ snmp_search_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
{ {
np->ident_len = ident_len; np->ident_len = ident_len;
np->ident = ident; np->ident = ident;
return &lrn->node; return &lrn->scalar.node;
} }
else else
{ {
@ -657,7 +656,7 @@ empty_table(const struct mib_node *node)
{ {
const struct mib_array_node *an; const struct mib_array_node *an;
an = (const struct mib_array_node *)node; an = (const struct mib_array_node *)node;
if ((an->node.maxlength == 0) || (an->entries == NULL)) if ((an->maxlength == 0) || (an->entries == NULL))
{ {
empty = 1; empty = 1;
} }
@ -700,11 +699,11 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
if (ident_len > 0) if (ident_len > 0)
{ {
i = 0; i = 0;
while ((i < an->node.maxlength) && (an->entries[i].objid < *ident)) while ((i < an->maxlength) && (an->entries[i].objid < *ident))
{ {
i++; i++;
} }
if (i < an->node.maxlength) if (i < an->maxlength)
{ {
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->entries[i].objid,*ident)); LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->entries[i].objid,*ident));
/* add identifier to oidret */ /* add identifier to oidret */
@ -719,7 +718,7 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
{ {
return &an->node; return &an->node;
} }
else if ((i + 1) < an->node.maxlength) else if ((i + 1) < an->maxlength)
{ {
/* an->entries[i].objid == *ident */ /* an->entries[i].objid == *ident */
(oidret->len)--; (oidret->len)--;
@ -742,11 +741,11 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
/* non-leaf, store right child ptr and id */ /* non-leaf, store right child ptr and id */
LWIP_ASSERT("i < 0xff", i < 0xff); LWIP_ASSERT("i < 0xff", i < 0xff);
j = i + 1; j = i + 1;
while ((j < an->node.maxlength) && (empty_table(an->entries[j].nptr))) while ((j < an->maxlength) && (empty_table(an->entries[j].nptr)))
{ {
j++; j++;
} }
if (j < an->node.maxlength) if (j < an->maxlength)
{ {
struct nse cur_node; struct nse cur_node;
cur_node.r_ptr = an->entries[j].nptr; cur_node.r_ptr = an->entries[j].nptr;
@ -783,11 +782,11 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
u16_t j; u16_t j;
/* ident_len == 0, complete with leftmost '.thing' */ /* ident_len == 0, complete with leftmost '.thing' */
j = 0; j = 0;
while ((j < an->node.maxlength) && empty_table(an->entries[j].nptr)) while ((j < an->maxlength) && empty_table(an->entries[j].nptr))
{ {
j++; j++;
} }
if (j < an->node.maxlength) if (j < an->maxlength)
{ {
LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->entries[j].objid==%"S32_F"\n",an->entries[j].objid)); LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->entries[j].objid==%"S32_F"\n",an->entries[j].objid));
oidret->id[oidret->len] = an->entries[j].objid; oidret->id[oidret->len] = an->entries[j].objid;
@ -835,7 +834,7 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
/* leaf node */ /* leaf node */
if (ln->objid > *ident) if (ln->objid > *ident)
{ {
return &lrn->node; return &lrn->scalar.node;
} }
else if (ln->next != NULL) else if (ln->next != NULL)
{ {
@ -843,7 +842,7 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
(oidret->len)--; (oidret->len)--;
oidret->id[oidret->len] = ln->next->objid; oidret->id[oidret->len] = ln->next->objid;
(oidret->len)++; (oidret->len)++;
return &lrn->node; return &lrn->scalar.node;
} }
else else
{ {
@ -913,7 +912,7 @@ snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, stru
{ {
/* leaf node */ /* leaf node */
LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n")); LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n"));
return &lrn->node; return &lrn->scalar.node;
} }
else else
{ {

View File

@ -344,7 +344,7 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
/** test object identifier for .iso.org.dod.internet prefix */ /** 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)) if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
{ {
mn = snmp_search_tree((const struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4, mn = snmp_search_tree(&internet.node, msg_ps->vb_ptr->ident_len - 4,
msg_ps->vb_ptr->ident + 4, &np); msg_ps->vb_ptr->ident + 4, &np);
if (mn != NULL) if (mn != NULL)
{ {
@ -360,23 +360,20 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
} }
else else if((mn->node_type == MIB_NODE_SC) || (mn->node_type == MIB_NODE_LR))
{ {
/* internal object */ /* internal object */
struct obj_def object_def; struct obj_def object_def;
const struct mib_scalar_node *msn = (const struct mib_scalar_node*)mn;
msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
mn->get_object_def(np.ident_len, np.ident, &object_def); msn->get_object_def(np.ident_len, np.ident, &object_def);
if (object_def.instance != MIB_OBJECT_NONE) if (object_def.instance == MIB_OBJECT_NONE)
{
mn = mn;
}
else
{ {
/* search failed, object id points to unknown object (nosuchname) */ /* search failed, object id points to unknown object (nosuchname) */
mn = NULL; mn = NULL;
} }
if (mn != NULL) else
{ {
struct snmp_varbind *vb; struct snmp_varbind *vb;
@ -400,7 +397,7 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
vb->value = memp_malloc(MEMP_SNMP_VALUE); vb->value = memp_malloc(MEMP_SNMP_VALUE);
if (vb->value != NULL) if (vb->value != NULL)
{ {
vb->value_len = mn->get_value(&object_def, vb->value); vb->value_len = msn->get_value(&object_def, vb->value);
LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE); LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
if(vb->value_len == 0) if(vb->value_len == 0)
{ {
@ -553,20 +550,21 @@ snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]); en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
} }
else else if((mn->node_type == MIB_NODE_SC) || (mn->node_type == MIB_NODE_LR))
{ {
/* internal object */ /* internal object */
struct obj_def object_def; struct obj_def object_def;
struct snmp_varbind *vb; struct snmp_varbind *vb;
const struct mib_scalar_node *msn = (const struct mib_scalar_node*)mn;
msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
mn->get_object_def(1, &oid.id[oid.len - 1], &object_def); msn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
vb = snmp_varbind_alloc(&oid, object_def.asn_type, SNMP_MAX_VALUE_SIZE); vb = snmp_varbind_alloc(&oid, object_def.asn_type, SNMP_MAX_VALUE_SIZE);
if (vb != NULL) if (vb != NULL)
{ {
msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE; msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
vb->value_len = mn->get_value(&object_def, vb->value); vb->value_len = msn->get_value(&object_def, vb->value);
snmp_varbind_tail_add(&msg_ps->outvb, vb); snmp_varbind_tail_add(&msg_ps->outvb, vb);
msg_ps->state = SNMP_MSG_SEARCH_OBJ; msg_ps->state = SNMP_MSG_SEARCH_OBJ;
msg_ps->vb_idx += 1; msg_ps->vb_idx += 1;
@ -577,6 +575,10 @@ snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
snmp_error_response(msg_ps,SNMP_ES_TOOBIG); snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
} }
} }
else
{
mn = NULL;
}
} }
if (mn == NULL) if (mn == NULL)
{ {
@ -727,30 +729,27 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
} }
else else if((mn->node_type == MIB_NODE_SC) || (mn->node_type == MIB_NODE_LR))
{ {
/* internal object */ /* internal object */
struct obj_def object_def; struct obj_def object_def;
const struct mib_scalar_node *msn = (const struct mib_scalar_node*)mn;
msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
mn->get_object_def(np.ident_len, np.ident, &object_def); msn->get_object_def(np.ident_len, np.ident, &object_def);
if (object_def.instance != MIB_OBJECT_NONE) if (object_def.instance == MIB_OBJECT_NONE)
{
mn = mn;
}
else
{ {
/* search failed, object id points to unknown object (nosuchname) */ /* search failed, object id points to unknown object (nosuchname) */
mn = NULL; mn = NULL;
} }
if (mn != NULL) else
{ {
msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST; msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
if (object_def.access & MIB_ACCESS_WRITE) if (object_def.access & MIB_ACCESS_WRITE)
{ {
if ((object_def.asn_type == msg_ps->vb_ptr->value_type) && if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
(mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0)) (msn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
{ {
msg_ps->state = SNMP_MSG_SEARCH_OBJ; msg_ps->state = SNMP_MSG_SEARCH_OBJ;
msg_ps->vb_idx += 1; msg_ps->vb_idx += 1;
@ -768,6 +767,10 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
} }
} }
} }
else
{
mn = NULL;
}
} }
} }
else else
@ -822,15 +825,16 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
} }
else else if((mn->node_type == MIB_NODE_SC) || (mn->node_type == MIB_NODE_LR))
{ {
/* internal object */ /* internal object */
struct obj_def object_def; struct obj_def object_def;
const struct mib_scalar_node *msn = (const struct mib_scalar_node*)mn;
msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S; msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
mn->get_object_def(np.ident_len, np.ident, &object_def); msn->get_object_def(np.ident_len, np.ident, &object_def);
msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE; msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value); msn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
msg_ps->vb_idx += 1; msg_ps->vb_idx += 1;
} }
} }

View File

@ -103,6 +103,15 @@ struct snmp_name_ptr
/** node "base class" layout, the mandatory fields for a node */ /** node "base class" layout, the mandatory fields for a node */
struct mib_node struct mib_node
{ {
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
u8_t node_type;
};
/** derived node for scalars .0 index */
struct mib_scalar_node
{
/* inherited "base class" members */
struct mib_node node;
/** returns struct obj_def for the given object identifier */ /** returns struct obj_def for the given object identifier */
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 */
@ -111,17 +120,6 @@ struct mib_node
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
/** sets object value, only to be called when set_test() */ /** sets object value, only to be called when set_test() */
void (*set_value)(struct obj_def *od, u16_t len, void *value); void (*set_value)(struct obj_def *od, u16_t len, void *value);
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
u8_t node_type;
/* array or max list length */
u16_t maxlength;
};
/** derived node for scalars .0 index */
struct mib_scalar_node
{
/* inherited "base class" members */
struct mib_node node;
}; };
/** describes an array entry (objid/node pair) */ /** describes an array entry (objid/node pair) */
@ -139,7 +137,8 @@ struct mib_array_node
struct mib_node node; struct mib_node node;
/* additional struct members */ /* additional struct members */
const struct mib_array_node_entry * const entries; u16_t maxlength;
const struct mib_array_node_entry *entries;
}; };
/** derived node, points to a fixed size mem_malloced array /** derived node, points to a fixed size mem_malloced array
@ -149,7 +148,8 @@ struct mib_ram_array_node
/* inherited "base class" members */ /* inherited "base class" members */
struct mib_node node; struct mib_node node;
/* aditional struct members */ /* additional struct members */
u16_t maxlength;
struct mib_array_node_entry *entries; struct mib_array_node_entry *entries;
}; };
@ -166,7 +166,7 @@ struct mib_list_node
struct mib_list_rootnode struct mib_list_rootnode
{ {
/* inherited "base class" members */ /* inherited "base class" members */
struct mib_node node; struct mib_scalar_node scalar;
/* additional struct members */ /* additional struct members */
struct mib_list_node *head; struct mib_list_node *head;