Added some lines for SET command.

This commit is contained in:
christiaans 2006-09-12 10:03:46 +00:00
parent c5e99ada63
commit 320ea29861
4 changed files with 359 additions and 25 deletions

View File

@ -72,6 +72,8 @@
static void system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
static void system_get_value(struct obj_def *od, u16_t len, void *value); static void system_get_value(struct obj_def *od, u16_t len, void *value);
static u8_t system_set_test(struct obj_def *od, u16_t len, void *value);
static void system_set_value(struct obj_def *od, u16_t len, void *value);
static void interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
static void interfaces_get_value(struct obj_def *od, u16_t len, void *value); static void interfaces_get_value(struct obj_def *od, u16_t len, void *value);
static void ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
@ -80,6 +82,7 @@ static void atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def
static void atentry_get_value(struct obj_def *od, u16_t len, void *value); static void atentry_get_value(struct obj_def *od, u16_t len, void *value);
static void ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
static void ip_get_value(struct obj_def *od, u16_t len, void *value); static void ip_get_value(struct obj_def *od, u16_t len, void *value);
static u8_t ip_set_test(struct obj_def *od, u16_t len, void *value);
static void ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
static void ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value); static void ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value);
static void ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
@ -100,12 +103,16 @@ static void udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def
static void udpentry_get_value(struct obj_def *od, u16_t len, void *value); static void udpentry_get_value(struct obj_def *od, u16_t len, void *value);
static void snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); static void snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
static void snmp_get_value(struct obj_def *od, u16_t len, void *value); static void snmp_get_value(struct obj_def *od, u16_t len, void *value);
static u8_t snmp_set_test(struct obj_def *od, u16_t len, void *value);
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 */
const mib_scalar_node snmp_scalar = { const mib_scalar_node snmp_scalar = {
&snmp_get_object_def, &snmp_get_object_def,
&snmp_get_value, &snmp_get_value,
&snmp_set_test,
&snmp_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -132,6 +139,8 @@ struct mib_node* const snmp_nodes[28] = {
const struct mib_array_node snmp = { const struct mib_array_node snmp = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
28, 28,
snmp_ids, snmp_ids,
@ -147,6 +156,8 @@ const struct mib_array_node snmp = {
struct mib_list_rootnode udp_root = { struct mib_list_rootnode udp_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -160,6 +171,8 @@ struct mib_node* const udpentry_nodes[2] = {
const struct mib_array_node udpentry = { const struct mib_array_node udpentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
2, 2,
udpentry_ids, udpentry_ids,
@ -171,6 +184,8 @@ struct mib_node* udptable_node = (struct mib_node* const)&udpentry;
struct mib_ram_array_node udptable = { struct mib_ram_array_node udptable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&udptable_id, &udptable_id,
@ -180,6 +195,8 @@ struct mib_ram_array_node udptable = {
const mib_scalar_node udp_scalar = { const mib_scalar_node udp_scalar = {
&udp_get_object_def, &udp_get_object_def,
&udp_get_value, &udp_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -192,6 +209,8 @@ struct mib_node* const udp_nodes[5] = {
const struct mib_array_node udp = { const struct mib_array_node udp = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
5, 5,
udp_ids, udp_ids,
@ -205,6 +224,8 @@ const struct mib_array_node udp = {
struct mib_list_rootnode tcpconntree_root = { struct mib_list_rootnode tcpconntree_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -220,6 +241,8 @@ struct mib_node* const tcpconnentry_nodes[5] = {
const struct mib_array_node tcpconnentry = { const struct mib_array_node tcpconnentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
5, 5,
tcpconnentry_ids, tcpconnentry_ids,
@ -231,6 +254,8 @@ struct mib_node* tcpconntable_node = (struct mib_node* const)&tcpconnentry;
struct mib_ram_array_node tcpconntable = { struct mib_ram_array_node tcpconntable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, 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 */
@ -259,6 +284,8 @@ struct mib_node* const tcp_nodes[15] = {
const struct mib_array_node tcp = { const struct mib_array_node tcp = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
15, 15,
tcp_ids, tcp_ids,
@ -270,6 +297,8 @@ const struct mib_array_node tcp = {
const mib_scalar_node icmp_scalar = { const mib_scalar_node icmp_scalar = {
&icmp_get_object_def, &icmp_get_object_def,
&icmp_get_value, &icmp_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -292,6 +321,8 @@ struct mib_node* const icmp_nodes[26] = {
const struct mib_array_node icmp = { const struct mib_array_node icmp = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
26, 26,
icmp_ids, icmp_ids,
@ -302,6 +333,8 @@ const struct mib_array_node icmp = {
struct mib_list_rootnode ipntomtree_root = { struct mib_list_rootnode ipntomtree_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -316,6 +349,8 @@ struct mib_node* const ipntomentry_nodes[4] = {
const struct mib_array_node ipntomentry = { const struct mib_array_node ipntomentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
4, 4,
ipntomentry_ids, ipntomentry_ids,
@ -327,6 +362,8 @@ struct mib_node* ipntomtable_node = (struct mib_node* const)&ipntomentry;
struct mib_ram_array_node ipntomtable = { struct mib_ram_array_node ipntomtable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&ipntomtable_id, &ipntomtable_id,
@ -337,6 +374,8 @@ struct mib_ram_array_node ipntomtable = {
struct mib_list_rootnode iprtetree_root = { struct mib_list_rootnode iprtetree_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -356,6 +395,8 @@ struct mib_node* const iprteentry_nodes[13] = {
const struct mib_array_node iprteentry = { const struct mib_array_node iprteentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
13, 13,
iprteentry_ids, iprteentry_ids,
@ -367,6 +408,8 @@ struct mib_node* iprtetable_node = (struct mib_node* const)&iprteentry;
struct mib_ram_array_node iprtetable = { struct mib_ram_array_node iprtetable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&iprtetable_id, &iprtetable_id,
@ -377,6 +420,8 @@ struct mib_ram_array_node iprtetable = {
struct mib_list_rootnode ipaddrtree_root = { struct mib_list_rootnode ipaddrtree_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -394,6 +439,8 @@ struct mib_node* const ipaddrentry_nodes[5] = {
const struct mib_array_node ipaddrentry = { const struct mib_array_node ipaddrentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
5, 5,
ipaddrentry_ids, ipaddrentry_ids,
@ -405,6 +452,8 @@ struct mib_node* ipaddrtable_node = (struct mib_node* const)&ipaddrentry;
struct mib_ram_array_node ipaddrtable = { struct mib_ram_array_node ipaddrtable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&ipaddrtable_id, &ipaddrtable_id,
@ -415,6 +464,8 @@ struct mib_ram_array_node ipaddrtable = {
const mib_scalar_node ip_scalar = { const mib_scalar_node ip_scalar = {
&ip_get_object_def, &ip_get_object_def,
&ip_get_value, &ip_get_value,
&ip_set_test,
&noleafs_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -436,6 +487,8 @@ struct mib_node* const ip_nodes[23] = {
const struct mib_array_node ip = { const struct mib_array_node ip = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
23, 23,
ip_ids, ip_ids,
@ -446,6 +499,8 @@ const struct mib_array_node ip = {
struct mib_list_rootnode arptree_root = { struct mib_list_rootnode arptree_root = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -461,6 +516,8 @@ struct mib_node* const atentry_nodes[3] = {
const struct mib_array_node atentry = { const struct mib_array_node atentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
3, 3,
atentry_ids, atentry_ids,
@ -472,6 +529,8 @@ struct mib_node* const attable_node = (struct mib_node* const)&atentry;
const struct mib_array_node attable = { const struct mib_array_node attable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
1, 1,
&attable_id, &attable_id,
@ -484,6 +543,8 @@ struct mib_node* at_node = (struct mib_node* const)&attable;
struct mib_ram_array_node at = { struct mib_ram_array_node at = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&at_id, &at_id,
@ -494,6 +555,8 @@ struct mib_ram_array_node at = {
struct mib_list_rootnode iflist_root = { struct mib_list_rootnode iflist_root = {
&ifentry_get_object_def, &ifentry_get_object_def,
&ifentry_get_value, &ifentry_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_LR, MIB_NODE_LR,
0, 0,
NULL, NULL,
@ -517,6 +580,8 @@ struct mib_node* const ifentry_nodes[22] = {
const struct mib_array_node ifentry = { const struct mib_array_node ifentry = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
22, 22,
ifentry_ids, ifentry_ids,
@ -528,6 +593,8 @@ struct mib_node* iftable_node = (struct mib_node* const)&ifentry;
struct mib_ram_array_node iftable = { struct mib_ram_array_node iftable = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_RA, MIB_NODE_RA,
0, 0,
&iftable_id, &iftable_id,
@ -538,6 +605,8 @@ struct mib_ram_array_node iftable = {
const mib_scalar_node interfaces_scalar = { const mib_scalar_node interfaces_scalar = {
&interfaces_get_object_def, &interfaces_get_object_def,
&interfaces_get_value, &interfaces_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -548,6 +617,8 @@ struct mib_node* const interfaces_nodes[2] = {
const struct mib_array_node interfaces = { const struct mib_array_node interfaces = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
2, 2,
interfaces_ids, interfaces_ids,
@ -560,6 +631,8 @@ const struct mib_array_node interfaces = {
const mib_scalar_node sys_tem_scalar = { const mib_scalar_node sys_tem_scalar = {
&system_get_object_def, &system_get_object_def,
&system_get_value, &system_get_value,
&system_set_test,
&system_set_value,
MIB_NODE_SC, MIB_NODE_SC,
0 0
}; };
@ -574,6 +647,8 @@ struct mib_node* const sys_tem_nodes[7] = {
const struct mib_array_node sys_tem = { const struct mib_array_node sys_tem = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
7, 7,
sys_tem_ids, sys_tem_ids,
@ -615,6 +690,8 @@ struct mib_node* const mib2_nodes[MIB2_GROUPS] = {
const struct mib_array_node mib2 = { const struct mib_array_node mib2 = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
MIB2_GROUPS, MIB2_GROUPS,
mib2_ids, mib2_ids,
@ -627,6 +704,8 @@ struct mib_node* const mgmt_nodes[1] = { (struct mib_node* const)&mib2 };
const struct mib_array_node mgmt = { const struct mib_array_node mgmt = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
1, 1,
mgmt_ids, mgmt_ids,
@ -640,6 +719,8 @@ struct mib_node* const internet_nodes[2] = { (struct mib_node* const)&mgmt, (str
const struct mib_array_node internet = { const struct mib_array_node internet = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
2, 2,
internet_ids, internet_ids,
@ -651,6 +732,8 @@ struct mib_node* const internet_nodes[1] = { (struct mib_node* const)&mgmt };
const struct mib_array_node internet = { const struct mib_array_node internet = {
&noleafs_get_object_def, &noleafs_get_object_def,
&noleafs_get_value, &noleafs_get_value,
&noleafs_set_test,
&noleafs_set_value,
MIB_NODE_AR, MIB_NODE_AR,
1, 1,
internet_ids, internet_ids,
@ -1021,6 +1104,8 @@ void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip)
at_rn->get_object_def = ip_ntomentry_get_object_def; at_rn->get_object_def = ip_ntomentry_get_object_def;
at_rn->get_value = ip_ntomentry_get_value; at_rn->get_value = ip_ntomentry_get_value;
} }
at_rn->set_test = noleafs_set_test;
at_rn->set_value = noleafs_set_value;
} }
} }
else else
@ -1226,6 +1311,8 @@ void snmp_insert_ipaddridx_tree(struct netif *ni)
{ {
ipa_rn->get_object_def = ip_addrentry_get_object_def; ipa_rn->get_object_def = ip_addrentry_get_object_def;
ipa_rn->get_value = ip_addrentry_get_value; ipa_rn->get_value = ip_addrentry_get_value;
ipa_rn->set_test = noleafs_set_test;
ipa_rn->set_value = noleafs_set_value;
} }
} }
else else
@ -1354,6 +1441,8 @@ void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
{ {
iprte_rn->get_object_def = ip_rteentry_get_object_def; iprte_rn->get_object_def = ip_rteentry_get_object_def;
iprte_rn->get_value = ip_rteentry_get_value; iprte_rn->get_value = ip_rteentry_get_value;
iprte_rn->set_test = noleafs_set_test;
iprte_rn->set_value = noleafs_set_value;
} }
} }
else else
@ -1678,6 +1767,8 @@ void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
{ {
udp_rn->get_object_def = udpentry_get_object_def; udp_rn->get_object_def = udpentry_get_object_def;
udp_rn->get_value = udpentry_get_value; udp_rn->get_value = udpentry_get_value;
udp_rn->set_test = noleafs_set_test;
udp_rn->set_value = noleafs_set_value;
} }
} }
else else
@ -1940,6 +2031,25 @@ noleafs_get_value(struct obj_def *od, u16_t len, void *value)
if (value){} if (value){}
} }
u8_t
noleafs_set_test(struct obj_def *od, u16_t len, void *value)
{
if (od){}
if (len){}
if (value){}
/* can't set */
return 0;
}
void
noleafs_set_value(struct obj_def *od, u16_t len, void *value)
{
if (od){}
if (len){}
if (value){}
}
/** /**
* Returns systems object definitions. * Returns systems object definitions.
* *
@ -2065,6 +2175,63 @@ system_get_value(struct obj_def *od, u16_t len, void *value)
}; };
} }
static u8_t
system_set_test(struct obj_def *od, u16_t len, void *value)
{
u8_t id, set_ok;
if (value) {}
set_ok = 0;
id = od->id_inst_ptr[0];
switch (id)
{
case 4: /* sysContact */
if ((syscontact_ptr != syscontact_default) &&
(len <= 255))
{
set_ok = 1;
}
break;
case 5: /* sysName */
if ((sysname_ptr != sysname_default) &&
(len <= 255))
{
set_ok = 1;
}
break;
case 6: /* sysLocation */
if ((syslocation_ptr != syslocation_default) &&
(len <= 255))
{
set_ok = 1;
}
break;
};
return set_ok;
}
static void
system_set_value(struct obj_def *od, u16_t len, void *value)
{
u8_t id;
id = od->id_inst_ptr[0];
switch (id)
{
case 4: /* sysContact */
ocstrncpy(syscontact_ptr,value,len);
*syscontact_len_ptr = len;
break;
case 5: /* sysName */
ocstrncpy(sysname_ptr,value,len);
*sysname_len_ptr = len;
break;
case 6: /* sysLocation */
ocstrncpy(syslocation_ptr,value,len);
*syslocation_len_ptr = len;
break;
};
}
/** /**
* Returns interfaces.ifnumber object definition. * Returns interfaces.ifnumber object definition.
@ -2530,10 +2697,6 @@ ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
} }
} }
/** @todo ipForwarding is writeable, but we may return badValue,
in lwIP this is a compile-time switch
we will also return a badvalue for wring a default TTL
which differs from our compile time default */
static void static void
ip_get_value(struct obj_def *od, u16_t len, void *value) ip_get_value(struct obj_def *od, u16_t len, void *value)
{ {
@ -2677,6 +2840,49 @@ ip_get_value(struct obj_def *od, u16_t len, void *value)
}; };
} }
/**
* Test ip object value before setting.
*
* @param od is the object definition
* @param len return value space (in bytes)
* @param value points to (varbind) space to copy value from.
*
* @note we allow set if the value matches the hardwired value,
* otherwise return badvalue.
*/
static u8_t
ip_set_test(struct obj_def *od, u16_t len, void *value)
{
u8_t id, set_ok;
s32_t *sint_ptr = value;
if (len) {}
set_ok = 0;
id = od->id_inst_ptr[0];
switch (id)
{
case 1: /* ipForwarding */
#if IP_FORWARD
/* forwarding */
if (*sint_ptr == 1)
#else
/* not-forwarding */
if (*sint_ptr == 2)
#endif
{
set_ok = 1;
}
break;
case 2: /* ipDefaultTTL */
if (*sint_ptr == IP_DEFAULT_TTL)
{
set_ok = 1;
}
break;
};
return set_ok;
}
static void static void
ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
{ {
@ -3723,4 +3929,59 @@ snmp_get_value(struct obj_def *od, u16_t len, void *value)
}; };
} }
/**
* Test snmp object value before setting.
*
* @param od is the object definition
* @param len return value space (in bytes)
* @param value points to (varbind) space to copy value from.
*/
static u8_t
snmp_set_test(struct obj_def *od, u16_t len, void *value)
{
u8_t id, set_ok;
if (len) {}
set_ok = 0;
id = od->id_inst_ptr[0];
if (id == 30)
{
/* snmpEnableAuthenTraps */
s32_t *sint_ptr = value;
if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
{
/* we should have writable non-volatile mem here */
if ((*sint_ptr == 1) || (*sint_ptr == 2))
{
set_ok = 1;
}
}
else
{
/* const or hardwired value */
if (*sint_ptr == snmpenableauthentraps_default)
{
set_ok = 1;
}
}
}
return set_ok;
}
static void
snmp_set_value(struct obj_def *od, u16_t len, void *value)
{
u8_t id;
if (len) {}
id = od->id_inst_ptr[0];
if (id == 30)
{
/* snmpEnableAuthenTraps */
s32_t *sint_ptr = value;
*snmpenableauthentraps_ptr = *sint_ptr;
}
}
#endif /* LWIP_SNMP */ #endif /* LWIP_SNMP */

View File

@ -190,6 +190,8 @@ snmp_mib_lrn_alloc(void)
{ {
lrn->get_object_def = noleafs_get_object_def; lrn->get_object_def = noleafs_get_object_def;
lrn->get_value = noleafs_get_value; lrn->get_value = noleafs_get_value;
lrn->set_test = noleafs_set_test;
lrn->set_value = noleafs_set_value;
lrn->node_type = MIB_NODE_LR; lrn->node_type = MIB_NODE_LR;
lrn->maxlength = 0; lrn->maxlength = 0;
lrn->head = NULL; lrn->head = NULL;

View File

@ -89,7 +89,7 @@ snmp_init(void)
{ {
msg_ps->state = SNMP_MSG_EMPTY; msg_ps->state = SNMP_MSG_EMPTY;
msg_ps->error_index = 0; msg_ps->error_index = 0;
msg_ps->error_status = 0; msg_ps->error_status = SNMP_ES_NOERROR;
msg_ps++; msg_ps++;
} }
trap_msg.pcb = snmp1_pcb; trap_msg.pcb = snmp1_pcb;
@ -164,10 +164,6 @@ snmp_msg_event(struct snmp_msg_pstat *msg_ps)
else if (msg_ps->rt == SNMP_ASN1_PDU_SET_REQ) else if (msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
{ {
} }
else
{
/** @todo not a request, return generror?? */
}
} }
else if (msg_ps->state == SNMP_MSG_INTERNAL) else if (msg_ps->state == SNMP_MSG_INTERNAL)
{ {
@ -213,16 +209,12 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
/* accepting request */ /* accepting request */
snmp_inc_snmpinpkts(); snmp_inc_snmpinpkts();
/* register 'protocol control block' used */ /* record used 'protocol control block' */
msg_ps->pcb = pcb; msg_ps->pcb = pcb;
/* source address (network order) */ /* source address (network order) */
msg_ps->sip = *addr; msg_ps->sip = *addr;
/* source port (host order (lwIP oddity)) */ /* source port (host order (lwIP oddity)) */
msg_ps->sp = port; msg_ps->sp = port;
/* demultiplex variable bindings */
msg_ps->state = SNMP_MSG_DEMUX;
/* first variable binding from list to inspect */
msg_ps->vb_idx = 0;
/* read UDP payload length from UDP header */ /* read UDP payload length from UDP header */
payload_len = ntohs(udphdr->len) - UDP_HLEN; payload_len = ntohs(udphdr->len) - UDP_HLEN;
@ -231,12 +223,24 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
/* check total length, version, community, pdu type */ /* check total length, version, community, pdu type */
err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps); err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
if ((msg_ps->rt == SNMP_ASN1_PDU_GET_REQ) ||
(msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ) ||
(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ))
{
/* Only accept requests. (be robust) */
err_ret = err_ret;
}
else
{
/* Reject response and trap headers as input! */
err_ret = ERR_ARG;
}
if (err_ret == ERR_OK) if (err_ret == ERR_OK)
{ {
LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community)); LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community));
/* Builds a list of variable bindings. Copy the varbinds from the pbuf /* Builds a list of variable bindings. Copy the varbinds from the pbuf
chain to glue them when these are divided over two or more pbuf's. */ chain to glue them when these are divided over two or more pbuf's. */
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) && (msg_ps->invb.count > 0)) if ((err_ret == ERR_OK) && (msg_ps->invb.count > 0))
{ {
@ -245,6 +249,13 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
/* 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);
msg_ps->error_status = SNMP_ES_NOERROR;
msg_ps->error_index = 0;
/* demultiplex variable bindings */
msg_ps->state = SNMP_MSG_DEMUX;
/* first variable binding from list to inspect */
msg_ps->vb_idx = 0;
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));
@ -361,14 +372,61 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
msg_ps->error_index = 1 + msg_ps->vb_idx; msg_ps->error_index = 1 + msg_ps->vb_idx;
} }
} }
else else if (msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
{ {
/* request != GET */ /** test object identifier for .iso.org.dod.internet prefix */
/** @todo EXPERIMENTAL dumb echo, this is not how the agent should respond. if (snmp_iso_prefix_tst(msg_ps->invb.head->ident_len, msg_ps->invb.head->ident))
This is for test purposes only, do not use this in real world!! */ {
msg_ps->outvb = msg_ps->invb; mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->invb.head->ident_len - 4,
msg_ps->error_status = SNMP_ES_NOERROR; msg_ps->invb.head->ident + 4, &object_def);
msg_ps->error_index = 0; }
else
{
mn = NULL;
}
if (mn != NULL)
{
struct snmp_varbind *vb;
vb = msg_ps->invb.head;
if ((object_def.access == MIB_OBJECT_READ_WRITE) &&
(object_def.asn_type == vb->value_type) &&
(mn->set_test(&object_def,vb->value_len,vb->value) != 0))
{
/** @todo change this if we support vb-lists,
first test all vbs, then either set all or give badvalue */
mn->set_value(&object_def,vb->value_len,vb->value);
/** simply echo the input if we can set it */
msg_ps->outvb = msg_ps->invb;
msg_ps->invb.head = NULL;
msg_ps->invb.tail = NULL;
msg_ps->invb.count = 0;
}
else
{
/* bad value */
/* @todo move used names back from outvb to invb */
snmp_varbind_list_free(&msg_ps->outvb);
msg_ps->outvb = msg_ps->invb;
msg_ps->invb.head = NULL;
msg_ps->invb.tail = NULL;
msg_ps->invb.count = 0;
msg_ps->error_status = SNMP_ES_BADVALUE;
msg_ps->error_index = 1 + msg_ps->vb_idx;
}
}
else
{
/* mn == NULL, noSuchName */
/* @todo move used names back from outvb to invb */
snmp_varbind_list_free(&msg_ps->outvb);
msg_ps->outvb = msg_ps->invb;
msg_ps->invb.head = NULL;
msg_ps->invb.tail = NULL;
msg_ps->invb.count = 0;
msg_ps->error_status = SNMP_ES_NOSUCHNAME;
msg_ps->error_index = 1 + msg_ps->vb_idx;
}
} }
/* when more variable bindings left msg_ps->state = SNMP_MSG_DEMUX */ /* when more variable bindings left msg_ps->state = SNMP_MSG_DEMUX */

View File

@ -94,7 +94,10 @@ struct mib_node
/** returns object value for the given object identifier, /** returns object value for the given object identifier,
@note the caller must allocate at least len bytes for the value */ @note the caller must allocate at least len bytes for the value */
void (*get_value)(struct obj_def *od, u16_t len, void *value); void (*get_value)(struct obj_def *od, u16_t len, void *value);
/** @todo set_value() */ /** tests length and/or range BEFORE setting */
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
/** sets object value, only to be called when set_test() */
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 */ /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
const u8_t node_type; const u8_t node_type;
/* array or max list length */ /* array or max list length */
@ -111,6 +114,8 @@ struct mib_array_node
/* inherited "base class" members */ /* inherited "base class" members */
void (* const get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); void (* const get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
void (* const get_value)(struct obj_def *od, u16_t len, void *value); void (* const get_value)(struct obj_def *od, u16_t len, void *value);
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
void (*set_value)(struct obj_def *od, u16_t len, void *value);
const u8_t node_type; const u8_t node_type;
const u16_t maxlength; const u16_t maxlength;
@ -127,6 +132,8 @@ struct mib_ram_array_node
/* inherited "base class" members */ /* inherited "base class" members */
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);
void (*get_value)(struct obj_def *od, u16_t len, void *value); void (*get_value)(struct obj_def *od, u16_t len, void *value);
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
void (*set_value)(struct obj_def *od, u16_t len, void *value);
u8_t node_type; u8_t node_type;
u16_t maxlength; u16_t maxlength;
@ -151,6 +158,8 @@ struct mib_list_rootnode
/* inherited "base class" members */ /* inherited "base class" members */
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);
void (*get_value)(struct obj_def *od, u16_t len, void *value); void (*get_value)(struct obj_def *od, u16_t len, void *value);
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
void (*set_value)(struct obj_def *od, u16_t len, void *value);
u8_t node_type; u8_t node_type;
u16_t maxlength; u16_t maxlength;
@ -169,6 +178,8 @@ struct mib_external_node
/* inherited "base class" members */ /* inherited "base class" members */
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);
void (*get_value)(struct obj_def *od, u16_t len, void *value); void (*get_value)(struct obj_def *od, u16_t len, void *value);
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
void (*set_value)(struct obj_def *od, u16_t len, void *value);
u8_t node_type; u8_t node_type;
u16_t maxlength; u16_t maxlength;
@ -192,6 +203,8 @@ extern const struct mib_array_node internet;
/** dummy function pointers for non-leaf MIB nodes from mib2.c */ /** dummy function pointers for non-leaf MIB nodes from mib2.c */
void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
void noleafs_get_value(struct obj_def *od, u16_t len, void *value); void noleafs_get_value(struct obj_def *od, u16_t len, void *value);
u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
void snmp_oidtoip(s32_t *ident, struct ip_addr *ip); void snmp_oidtoip(s32_t *ident, struct ip_addr *ip);
void snmp_iptooid(struct ip_addr *ip, s32_t *ident); void snmp_iptooid(struct ip_addr *ip, s32_t *ident);