summaryrefslogtreecommitdiff
path: root/daemon/snmp-engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/snmp-engine.c')
-rw-r--r--daemon/snmp-engine.c62
1 files changed, 53 insertions, 9 deletions
diff --git a/daemon/snmp-engine.c b/daemon/snmp-engine.c
index 0c7edf6..8b72c67 100644
--- a/daemon/snmp-engine.c
+++ b/daemon/snmp-engine.c
@@ -48,13 +48,44 @@
#include "server-mainloop.h"
/* The socket to use */
-int snmp_socket = -1;
+static int snmp_socket = -1;
/* The last request: start at a strange number */
-uint32_t snmp_request = 0x0A0A0A0A;
+static uint32_t snmp_request = 0x0A0A0A0A;
/* Since we only deal with one packet at a time, global buffer */
-unsigned char snmp_buffer[0x1000];
+static unsigned char snmp_buffer[0x1000];
+
+/* -----------------------------------------------------------------------------
+ * CONSTANTS
+ */
+
+/* All SNMP error messages */
+static struct
+{
+ int code;
+ const char* msg;
+} snmp_errmsgs[] = {
+ { SNMP_ERR_NOERROR, "Success" },
+ { SNMP_ERR_TOOBIG, "SNMP packet or response too big" },
+ { SNMP_ERR_NOSUCHNAME, "Unknown variable name" },
+ { SNMP_ERR_BADVALUE, "Incorrect syntax or value when modifing a variable" },
+ { SNMP_ERR_READONLY, "Value is readonly" },
+ { SNMP_ERR_GENERR, "Unspecified general error" },
+ { SNMP_ERR_NO_ACCESS, "Access was denied to the object" },
+ { SNMP_ERR_WRONG_TYPE, "The object type is incorrect for the object" },
+ { SNMP_ERR_WRONG_LENGTH, "Incorrect specified for the object." },
+ { SNMP_ERR_WRONG_ENCODING, "Incorrect encoding specified for the object." },
+ { SNMP_ERR_WRONG_VALUE, "Not possible to set this value for the object." },
+ { SNMP_ERR_NO_CREATION, "The value cannot be created." },
+ { SNMP_ERR_INCONS_VALUE, "Not possible to set the value at this time." },
+ { SNMP_ERR_RES_UNAVAIL, "The resource is not availeble" },
+ { SNMP_ERR_COMMIT_FAILED, "Commit failed" },
+ { SNMP_ERR_UNDO_FAILED, "Undo failed" },
+ { SNMP_ERR_AUTH_ERR, "A problem occured during authentication" },
+ { SNMP_ERR_NOT_WRITEABLE, "The variable cannot be written or created." },
+ { SNMP_ERR_INCONS_NAME, "The variable does not exist." }
+};
/* -----------------------------------------------------------------------------
* REQUESTS
@@ -345,7 +376,7 @@ respond_req(rb_request* req, struct snmp_pdu* pdu, mstime when)
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
- msg = "value not available on snmp server for field: %s";
+ msg = "field not available on snmp server: %s";
break;
default:
msg = "snmp server returned invalid or unsupported value for field: %s";
@@ -480,7 +511,8 @@ receive_resp(int fd, int type, void* arg)
struct snmp_pdu pdu;
struct asn_buf b;
rb_request* req;
- int len, ret;
+ const char* msg;
+ int len, ret, i;
int32_t ip;
ASSERT(snmp_socket == fd);
@@ -515,22 +547,34 @@ receive_resp(int fd, int type, void* arg)
return;
}
- /* Lookup and check the request properly */
-
+ /* It needs to match something we're waiting for */
req = find_req(pdu.request_id);
if(!req)
return;
+ /* Check for errors */
if(pdu.error_status != SNMP_ERR_NOERROR)
{
- /* TODO: Textual errors */
- rb_message(LOG_ERR, "snmp error '%d' from host: %s", pdu.error_status, hostname);
+ msg = NULL;
+ for(i = 0; i < countof(snmp_errmsgs); i++)
+ {
+ if(pdu.error_status == snmp_errmsgs[i].code)
+ {
+ rb_message(LOG_ERR, "snmp error from host '%s': %s",
+ hostname, snmp_errmsgs[i].msg);
+ return;
+ }
+ }
+
+ rb_message(LOG_ERR, "unknown snmp error from host '%s': %d",
+ hostname, pdu.error_status);
return;
}
if(pdu.version != req->pdu.version)
rb_message(LOG_WARNING, "wrong version snmp packet from: %s", hostname);
+ /* Dispatch the packet */
rb_messagex(LOG_DEBUG, "response to request '%d' from: %s", req->id, hostname);
respond_req(req, &pdu, server_get_time());
}