00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef agentx_subagent_h_
00023 #define agentx_subagent_h_
00024
00025
00026 #include <agent_pp/mib.h>
00027 #include <agentx_pp/agentx.h>
00028 #include <agentx_pp/agentx_request.h>
00029
00030 #ifdef AGENTPP_NAMESPACE
00031 namespace Agentpp {
00032 #endif
00033
00034
00035 typedef enum {
00036 AGENTX_STATUS_ERROR = 0,
00037 AGENTX_STATUS_CONNECT = 1,
00038 AGENTX_STATUS_OPEN = 2,
00039 AGENTX_STATUS_REGISTER = 3,
00040 AGENTX_STATUS_RUN = 4,
00041 AGENTX_STATUS_CLOSED = 5
00042 } agentx_run_status_t;
00043
00044
00045
00046
00047 class SubAgentXMib;
00048
00049
00050
00072 class AGENTXPP_DECL AgentXSharedTable: public MibTable {
00073 public:
00077 AgentXSharedTable(const AgentXSharedTable&);
00078
00105 AgentXSharedTable(const Oidx&, const index_info*, unsigned int,
00106 const Oidx*, SubAgentXMib*, const NS_SNMP OctetStr&);
00107
00111 virtual ~AgentXSharedTable();
00112
00127 MibTableRow* add_row(const Oidx&);
00128
00137 void remove_row(const Oidx&);
00138
00154 virtual MibTableRow* init_row(const Oidx&, Vbx*);
00155
00164 virtual void new_index();
00165
00173 virtual void any_index();
00174
00175
00192 virtual boolean allocate_index(const Oidx&);
00193
00208 virtual void index_allocated(const Oidx&, int, int);
00209
00225 Oidx get_index_from_vbs(Vbx*, u_int);
00226
00233 SubAgentXMib* get_subagent_mib() { return backReference; }
00234
00248 void set_timeout(unsigned int t) { timeout = t; }
00249
00258 unsigned int get_timeout() { return timeout; }
00259
00263 virtual void clear();
00264
00268 virtual void reinit();
00269
00270 protected:
00271
00272 void get_index_value(NS_SNMP SmiUINT32, const Oidx&, Vbx& vb);
00273 Vbx* create_index_vbs(const Oidx&);
00274
00275 NS_SNMP OctetStr myContext;
00276 Oidx* indexOIDs;
00277 SubAgentXMib* backReference;
00278 unsigned int timeout;
00279 };
00280
00281
00282
00283
00292 class AGENTXPP_DECL AgentXPendingMessage {
00293 public:
00294
00295 AgentXPendingMessage(u_int pid, AgentXSharedTable* o):
00296 packet_id(pid) { receiver = o; }
00297
00298 u_int packet_id;
00299 AgentXSharedTable* receiver;
00300 };
00301
00302
00303
00304
00311 #if !defined (AGENTXPP_DECL_TEMPL_LIST_AGENTXPENDINGMESSAGE)
00312 #define AGENTXPP_DECL_TEMPL_LIST_AGENTXPENDINGMESSAGE
00313 AGENTXPP_DECL_TEMPL template class AGENTXPP_DECL List<AgentXPendingMessage>;
00314 #endif
00315
00316 class AGENTXPP_DECL SubAgentXMib: public Mib {
00317
00318 friend class AgentXResponse;
00319
00320 public:
00321
00325 SubAgentXMib();
00326
00334 SubAgentXMib(const NS_SNMP OctetStr&);
00335
00339 virtual ~SubAgentXMib();
00340
00350 virtual boolean init();
00351
00363 virtual MibEntryPtr add(MibEntryPtr);
00364
00378 virtual MibEntryPtr add_no_reg(MibEntryPtr);
00379
00398 virtual MibEntry* add(const NS_SNMP OctetStr&, MibEntry*);
00399
00421 virtual MibEntry* register_entry(const NS_SNMP OctetStr&,
00422 MibEntry*,
00423 u_int);
00424
00444 virtual MibEntry* add_no_reg(const NS_SNMP OctetStr&, MibEntry*);
00445
00472 virtual boolean remove(const Oidx&);
00473
00485 virtual boolean remove_no_unreg(const Oidx&);
00486
00515 virtual boolean remove(const NS_SNMP OctetStr&, const Oidx&);
00516
00517
00531 virtual boolean remove_no_unreg(const NS_SNMP OctetStr&, const Oidx&);
00532
00533
00537 virtual int open_session();
00538
00544 virtual void reconnect();
00545
00552 void set_default_priority(const u_char p)
00553 { priority = p; }
00554
00565 #ifndef STATIC_REQUEST_LIST
00566 void set_request_list(AgentXRequestList*);
00567 #else
00568 static void set_request_list(AgentXRequestList*);
00569 #endif
00570
00587 virtual int notify(const NS_SNMP OctetStr&, const Oidx&,
00588 Vbx*, int, unsigned int=0);
00589
00596 static AgentXSlave* get_agentx() { return agentx; }
00597
00606 virtual unsigned long ping_master();
00607
00615 virtual void ping_received(const AgentXPdu&);
00616
00639 virtual boolean register_region(const NS_SNMP OctetStr&,
00640 const AgentXRegion&,
00641 u_int timeout,
00642 boolean,
00643 AgentXSharedTable* t=0);
00644
00657 virtual void registration_failed(const AgentXRegion&, int,
00658 AgentXSharedTable*){}
00659
00670 virtual void registration_success(const AgentXRegion&,
00671 AgentXSharedTable*);
00672
00693 virtual void allocate_index(const NS_SNMP OctetStr&,
00694 Vbx*, int,
00695 AgentXSharedTable* t=0,
00696 u_char indexType=0);
00697
00713 virtual void deallocate_index(const NS_SNMP OctetStr&,
00714 Vbx*, int,
00715 AgentXSharedTable* table=0);
00716
00738 virtual void index_allocated(u_int, u_int,
00739 Vbx*, int, AgentXSharedTable*);
00740
00762 virtual void index_deallocated(u_int, u_int,
00763 Vbx*, int,
00764 AgentXSharedTable*) {}
00765
00782 virtual boolean add_agent_caps(const NS_SNMP OctetStr&,
00783 const Oidx&,
00784 const NS_SNMP OctetStr&);
00785
00795 virtual void remove_agent_caps(const NS_SNMP OctetStr&,
00796 const Oidx&);
00797
00808 AgentXSession* get_session() { return session; }
00809
00810 protected:
00811
00821 virtual AgentXSession* create_session();
00822
00828 virtual void not_connected();
00829
00849 virtual int find_next(MibContext*, const Oidx&, MibEntryPtr&,
00850 Request* req, const int);
00851
00858 virtual void do_process_request(Request*);
00859
00866 virtual void process_response(AgentXRequest*);
00867
00874 virtual void synchronize_uptime(u_int);
00875
00876
00883 void remove_pending_messages(MibEntry*);
00884
00885
00886 AgentXPendingMessage* get_pending_message(u_int);
00887
00891 virtual void init_response_pool();
00892
00893
00901 virtual void delete_request(Request* req);
00902
00903 static AgentXSlave* agentx;
00904 AgentXSession* session;
00905 agentx_run_status_t status;
00906 u_char priority;
00907
00908 List<AgentXPendingMessage> pendingMessages;
00909 Synchronized pendingMessagesLock;
00910 #ifdef _THREADS
00911 QueuedThreadPool* responsePool;
00912 #endif
00913 };
00914
00915 #ifdef AGENTPP_NAMESPACE
00916 }
00917 #endif
00918
00919
00920 #endif