From cfb082a20bc397af37ed8478d15cd004edb7fe1f Mon Sep 17 00:00:00 2001 From: christiaans Date: Mon, 2 Oct 2006 10:13:04 +0000 Subject: [PATCH] Added external mibnode panic closure functions, tobe called for error responses. --- src/core/snmp/msg_in.c | 26 +++++++++++++++----------- src/include/lwip/snmp_structs.h | 6 ++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/core/snmp/msg_in.c b/src/core/snmp/msg_in.c index 25d65fb4..30bca46d 100644 --- a/src/core/snmp/msg_in.c +++ b/src/core/snmp/msg_in.c @@ -160,7 +160,6 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) /* translate answer into a known lifeform */ en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); - if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) { msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE; @@ -168,6 +167,7 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_object_def_pc(request_id, np.ident_len, np.ident); /* search failed, object id points to unknown object (nosuchname) */ snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); } @@ -211,6 +211,7 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_value_pc(request_id, &msg_ps->ext_object_def); LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n")); msg_ps->vb_ptr->ident = vb->ident; msg_ps->vb_ptr->ident_len = vb->ident_len; @@ -220,9 +221,8 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { - /* get_value_a() called to close external transaction */ - en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL); /* vb->value_len == 0, empty value (e.g. empty string) */ + en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL); vb->value = NULL; snmp_varbind_tail_add(&msg_ps->outvb, vb); /* search again (if vb_idx < msg_ps->invb.count) */ @@ -232,6 +232,7 @@ snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_value_pc(request_id, &msg_ps->ext_object_def); LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n")); snmp_error_response(msg_ps,SNMP_ES_TOOBIG); } @@ -383,7 +384,6 @@ snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) /* translate answer into a known lifeform */ en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def); - if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) { msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE; @@ -391,6 +391,7 @@ snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]); /* search failed, object id points to unknown object (nosuchname) */ snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); } @@ -415,6 +416,7 @@ snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_value_pc(request_id, &msg_ps->ext_object_def); LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n")); snmp_error_response(msg_ps,SNMP_ES_TOOBIG); } @@ -527,7 +529,6 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) /* translate answer into a known lifeform */ en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); - if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) { msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST; @@ -535,6 +536,7 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { + en->get_object_def_pc(request_id, np.ident_len, np.ident); /* search failed, object id points to unknown object (nosuchname) */ snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); } @@ -551,16 +553,17 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) if ((msg_ps->ext_object_def.access == MIB_OBJECT_READ_WRITE) && (msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) && (en->set_test_a(request_id,&msg_ps->ext_object_def, - msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0)) + msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0)) { msg_ps->state = SNMP_MSG_SEARCH_OBJ; msg_ps->vb_idx += 1; } else { + en->set_test_pc(request_id,&msg_ps->ext_object_def); /* bad value */ snmp_error_response(msg_ps,SNMP_ES_BADVALUE); - } + } } else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S) { @@ -573,7 +576,6 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) /* translate answer into a known lifeform */ en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); - if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) { msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE; @@ -582,9 +584,10 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) } else { - /* search failed, object id points to unknown object (nosuchname) */ - snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); - } + en->get_object_def_pc(request_id, np.ident_len, np.ident); + /* set_value failed, object has disappeared for some odd reason?? */ + snmp_error_response(msg_ps,SNMP_ES_GENERROR); + } } else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE) { @@ -594,6 +597,7 @@ snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) en = msg_ps->ext_mib_node; en->set_value_a(request_id, &msg_ps->ext_object_def, 0, NULL); + /** @todo use set_value_pc() if toobig */ msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE; msg_ps->vb_idx += 1; } diff --git a/src/include/lwip/snmp_structs.h b/src/include/lwip/snmp_structs.h index 1c7fd8a2..42a63a18 100644 --- a/src/include/lwip/snmp_structs.h +++ b/src/include/lwip/snmp_structs.h @@ -213,6 +213,12 @@ struct mib_external_node void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + /** async Panic Close (agent returns error reply, + e.g. used for external transaction cleanup) */ + void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); + void (*get_value_pc)(u8_t rid, struct obj_def *od); + void (*set_test_pc)(u8_t rid, struct obj_def *od); + void (*set_value_pc)(u8_t rid, struct obj_def *od); }; /** export MIB tree from mib2.c */