summaryrefslogtreecommitdiff
path: root/ASNMP
diff options
context:
space:
mode:
Diffstat (limited to 'ASNMP')
-rw-r--r--ASNMP/asnmp/sagent.cpp93
-rw-r--r--ASNMP/asnmp/sagent.h77
2 files changed, 170 insertions, 0 deletions
diff --git a/ASNMP/asnmp/sagent.cpp b/ASNMP/asnmp/sagent.cpp
new file mode 100644
index 00000000000..d7330815aa0
--- /dev/null
+++ b/ASNMP/asnmp/sagent.cpp
@@ -0,0 +1,93 @@
+/* -*-C++-*- */
+// ============================================================================
+//
+// = LIBRARY
+// asnmp
+//
+// = FILENAME
+// sagent.cpp
+//
+// = DESCRIPTION
+// SNMP agent class defintion. The sagent class provides an object oriented
+// approach for creating SNMP Agents. The sagent class is an encapsulation of SNMP
+// sessions, gets, sets, etc.
+//
+// = AUTHOR
+// Michael R. MacFaden
+//
+// ============================================================================
+#include "ace/Reactor.h"
+#include "ace/SOCK_Dgram.h"
+
+#include "asnmp/oid.h" // snmp++ oid class
+#include "asnmp/vb.h" // snbmp++ vb class
+#include "asnmp/target.h" // snmp++ target class
+#include "asnmp/pdu.h" // snmp++ pdu class
+#include "asnmp/snmperrs.h" // error macros and strings
+#include "asnmp/address.h" // snmp++ address class defs
+#include "asnmp/snmp.h" // manager snmp interface
+#include "asnmp/sagent.h" // agent interface
+#include "asnmp/transaction.h" // convert from wire to API
+
+sagent::sagent(unsigned short port): Snmp(port)
+{
+ ACE_TRACE("sagent::sagent(short)");
+}
+
+sagent::~sagent()
+{
+ ACE_TRACE("sagent::~sagent");
+}
+
+int sagent::handle_input(ACE_HANDLE fd)
+{
+ ACE_TRACE("sagent::handle_input");
+
+ transaction tr(iv_snmp_session_); // this section needs a better design
+ tr.handle_input(fd);
+ char rcv_com_str[MAX_COMM_STR_LEN];
+ tr.result(pdu_, rcv_com_str);
+ OctetStr community(rcv_com_str);
+ const ACE_INET_Addr &ta = tr.get_from_addr();
+ char buf_tmp[MAXHOSTNAMELEN + 1];
+ ta.addr_to_string (buf_tmp, MAXHOSTNAMELEN);
+ UdpAddress ra(buf_tmp);
+ tgt_.set_address(ra);
+
+
+ // process msg here by calling subclass's implementation
+ switch (pdu_.get_type()){
+ case sNMP_PDU_GET:
+ tgt_.set_read_community(community);
+ this->handle_get(pdu_, tgt_);
+ break;
+
+ case sNMP_PDU_GETNEXT:
+ tgt_.set_read_community(community);
+ this->handle_get_next(pdu_, tgt_);
+ break;
+
+ case sNMP_PDU_SET:
+ tgt_.set_write_community(community);
+ this->handle_set(pdu_, tgt_);
+ break;
+
+ default:
+ ACE_ASSERT(0);
+ }
+ return 0;
+}
+
+ACE_HANDLE sagent::get_handle() const
+{
+ ACE_TRACE("sagent::get_handle");
+ return iv_snmp_session_.get_handle();
+}
+
+int sagent::respond(Pdu& pdu,UdpTarget& tgt)
+{
+ transaction tr(pdu, tgt, iv_snmp_session_);
+ tr.send();
+ return 0;
+}
+
diff --git a/ASNMP/asnmp/sagent.h b/ASNMP/asnmp/sagent.h
new file mode 100644
index 00000000000..4dbfcc2586a
--- /dev/null
+++ b/ASNMP/asnmp/sagent.h
@@ -0,0 +1,77 @@
+/* -*-C++-*- */
+#ifndef SAGENT_CLS_
+#define SAGENT_CLS_
+// ============================================================================
+//
+// = LIBRARY
+// asnmp
+//
+// = FILENAME
+// sagent.h
+//
+// = DESCRIPTION
+// SNMP agent class defintion. The sagent class provides an object oriented
+// approach for creating SNMP Agents. The sagent class is an encapsulation of SNMP
+// sessions, gets, sets, etc.
+//
+// = AUTHOR
+// Michael R. MacFaden
+//
+// ============================================================================
+#include "ace/Reactor.h"
+#include "ace/SOCK_Dgram.h"
+
+#include "asnmp/oid.h" // snmp++ oid class
+#include "asnmp/vb.h" // snbmp++ vb class
+#include "asnmp/target.h" // snmp++ target class
+#include "asnmp/pdu.h" // snmp++ pdu class
+#include "asnmp/snmperrs.h" // error macros and strings
+#include "asnmp/address.h" // snmp++ address class defs
+#include "asnmp/snmp.h" // snmp interface
+
+// sagent - supports Version 1 operations in blocking mode
+
+#define DEF_AGENT_PORT (161)
+
+class ACE_Export sagent : public ACE_Event_Handler, Snmp
+ // = TITLE
+ // Concrete class sagent defines the session and interface to
+ // communicate with another SNMP Version 1 manager
+{
+ public:
+
+
+ // override the next three methods (callbacks) to implment your agent
+ //
+
+ virtual int handle_get( Pdu &pdu, UdpTarget &target) = 0;
+ // retrieve data from a peer agent for a given list of oid values
+
+ virtual int handle_get_next( Pdu &pdu, UdpTarget &target) = 0;
+ // retrieve data lexically adjacent to the oids specified in the pdu
+ // from the peer agent
+
+ virtual int handle_set( Pdu &pdu, UdpTarget &target) = 0;
+ // set data in the agent from the list of oids in the pdu
+
+ virtual int handle_input(ACE_HANDLE);
+ // new pdu received from mgr (reactor calls this)
+
+ virtual ACE_HANDLE get_handle() const;
+ // retrieve io descriptor (reactor uses this)
+
+ int respond(Pdu& pdu, UdpTarget& tgt);
+ // send a response pdu to the mgr
+
+ protected:
+ sagent(unsigned short port = DEF_AGENT_PORT);
+ virtual ~sagent();
+
+private:
+ sagent(const sagent&);
+ Pdu pdu_; // current input pdu
+ UdpTarget tgt_; // addr & com strs
+};
+
+#endif //SAGENT_CLS_
+