00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef agentx_master_h_
00024 #define agentx_master_h_
00025
00026 #include <agentx_pp/agentx.h>
00027 #include <agentx_pp/agentx_reg.h>
00028 #include <agentx_pp/agentx_session.h>
00029 #include <agentx_pp/agentx_request.h>
00030 #include <agentx_pp/agentx_node.h>
00031 #include <agentx_pp/agentx_index.h>
00032 #include <agent_pp/mib.h>
00033 #include <agent_pp/notification_originator.h>
00034
00035 #ifndef _WIN32THREADS
00036 #include <pthread.h>
00037 #endif
00038
00039 #ifdef AGENTPP_NAMESPACE
00040 namespace Agentpp {
00041 #endif
00042
00043 class MasterAgentXMib;
00044
00052 class AGENTXPP_DECL AgentXResponseTask: public Runnable {
00053 public:
00054 AgentXResponseTask(MasterAgentXMib* m, AgentXPdu* t, boolean ti)
00055 { mib = m; task = t; timely = ti; }
00056 virtual ~AgentXResponseTask() { delete task; }
00057
00058 virtual void run();
00059 protected:
00060 MasterAgentXMib* mib;
00061 AgentXPdu* task;
00062 boolean timely;
00063 };
00064
00072 class AGENTXPP_DECL AgentXCloseTask: public Runnable {
00073 public:
00074 AgentXCloseTask(MasterAgentXMib* m, AgentXPeer* p, AgentXPdu* c)
00075 { mib = m; peer = p; closePdu = c; }
00076 virtual ~AgentXCloseTask();
00077
00078 virtual void run();
00079 protected:
00080 MasterAgentXMib* mib;
00081 AgentXPeer* peer;
00082 AgentXPdu* closePdu;
00083 };
00084
00092 class AGENTXPP_DECL AgentXTask: public Runnable {
00093 public:
00094 AgentXTask(MasterAgentXMib* m, AgentXPdu* t)
00095 { mib = m; task = t; }
00096 virtual ~AgentXTask() { delete task; }
00097
00098 virtual void run();
00099 protected:
00100 MasterAgentXMib* mib;
00101 AgentXPdu* task;
00102 };
00103
00104
00105
00106
00107
00108
00109 #ifdef _WIN32THREADS
00110 void master_daemon(void*);
00111 #else
00112 void* master_daemon(void*);
00113 #endif
00114
00126 #if !defined (AGENTXPP_DECL_TEMPL_LIST_THREAD)
00127 #define AGENTXPP_DECL_TEMPL_LIST_THREAD
00128 AGENTXPP_DECL_TEMPL template class AGENTXPP_DECL List<Thread>;
00129 #endif
00130 #if !defined (AGENTXPP_DECL_TEMPL_LIST_AGENTXREGENTRY)
00131 #define AGENTXPP_DECL_TEMPL_LIST_AGENTXREGENTRY
00132 AGENTXPP_DECL_TEMPL template class AGENTXPP_DECL List<AgentXRegEntry>;
00133 #endif
00134 #if !defined (AGENTXPP_DECL_TEMPL_LIST_AGENTXINDEXDB)
00135 #define AGENTXPP_DECL_TEMPL_LIST_AGENTXINDEXDB
00136 AGENTXPP_DECL_TEMPL template class AGENTXPP_DECL OidList<AgentXIndexDB>;
00137 #endif
00138
00139 class AGENTXPP_DECL MasterAgentXMib: public Mib {
00140
00141 friend class AgentXResponseTask;
00142 friend class AgentXCloseTask;
00143 friend class AgentXTask;
00144
00145 public:
00146
00150 MasterAgentXMib();
00151
00159 MasterAgentXMib(const NS_SNMP OctetStr&);
00160
00164 virtual ~MasterAgentXMib();
00165
00172 virtual void set_agentx(AgentXMaster*);
00173
00181 AgentXMaster* get_agentx();
00182
00192 void set_session_admin_status_writable(boolean);
00193
00202 virtual MibEntry* add(MibEntry*);
00203
00220 virtual MibEntry* add(const NS_SNMP OctetStr&, MibEntry*);
00221
00228 virtual boolean init();
00229
00233 virtual void process_agentx();
00234
00241 virtual void answer(AgentXPdu&);
00242
00255 virtual boolean is_dupl_reg(const AgentXRegEntry&);
00256
00268 virtual void add_get_subrequest(u_int, unsigned long,
00269 const AgentXSearchRange&,
00270 u_char,
00271 u_char, const NS_SNMP OctetStr&,
00272 int=0, int=0);
00283 virtual void add_set_subrequest(u_int, unsigned long,
00284 const AgentXSearchRange&,
00285 const Vbx&, u_char,
00286 u_char, const NS_SNMP OctetStr&);
00287
00296 virtual void close_session(u_int, u_char);
00297
00307 virtual void set_auto_context(boolean enabled)
00308 { autoContext = enabled; }
00309
00329 virtual Oidx get_upper_session_boundary(const NS_SNMP OctetStr&,
00330 AgentXNode*);
00331
00332 protected:
00333
00343 virtual void add_new_context(const NS_SNMP OctetStr&);
00344
00354 AgentXIndexDB* get_index_database(const NS_SNMP OctetStr&);
00355
00366 virtual time_t timeout_requests(time_t);
00367
00374 virtual void process_set_request(Request*);
00375
00376 virtual void do_process_request(Request*);
00377
00385 virtual void finalize(Request*);
00386
00394 virtual void delete_request(Request* req)
00395 { req->trylock(); req->notify();
00396 req->unlock(); Mib::delete_request(req); }
00397
00407 virtual boolean send_pending_ax(unsigned long);
00408
00418 virtual boolean cancel_pending_ax(unsigned long);
00419
00426 virtual void process_ax_request(AgentXPdu&);
00427 virtual void process_ax_response(AgentXPdu&, boolean);
00428 virtual boolean process_ax_search_response(AgentXPdu&,
00429 const AgentXPdu&,
00430 int*,
00431 Request*);
00432
00433 virtual void process_ax_set_response(AgentXPdu&,
00434 const AgentXPdu&,
00435 int*,
00436 Request*);
00437
00438 virtual boolean process_ax_getbulk_response(AgentXPdu&,
00439 const AgentXPdu&,
00440 int*,
00441 Request*);
00442
00443
00444 virtual void process_ax_open(AgentXPdu&);
00445 virtual void process_ax_registration(AgentXPdu&);
00446 virtual void process_ax_unregistration(AgentXPdu&);
00447 virtual void process_ax_notify(AgentXPdu&);
00448 virtual void process_ax_master_request(fd_set*, int*);
00449 virtual void process_ax_addagentcaps(AgentXPdu&);
00450 virtual void process_ax_removeagentcaps(AgentXPdu&);
00451 virtual void process_ax_indexallocate(AgentXPdu&);
00452 virtual void process_ax_indexdeallocate(AgentXPdu&);
00453
00469 virtual AgentXPdu* create_response(AgentXPdu&, AgentXSession&);
00470
00485 virtual boolean get_affected_regs(const AgentXRegEntry&,
00486 const AgentXRegion&,
00487 List<AgentXNode>&);
00498 virtual boolean has_conflict(const AgentXRegEntry&);
00499
00507 virtual void add_entry(AgentXRegEntry*);
00508
00521 virtual boolean remove_entry(u_int, const AgentXRegEntry&);
00522
00532 virtual void remove_entries(u_int, u_int);
00533
00553 virtual boolean add_ax_agent_caps(const NS_SNMP OctetStr&,
00554 const Oidx&,
00555 const NS_SNMP OctetStr&,
00556 AgentXSession&);
00557
00571 virtual void remove_ax_agent_caps(const NS_SNMP OctetStr&,
00572 const Oidx&,
00573 AgentXSession&);
00574
00575 private:
00576
00583 void remove_indexes(u_int);
00584
00585 void remove_agent_caps_by_session(AgentXSession*);
00586
00597 void add_entry(AgentXRegEntry*,
00598 const AgentXRegion&);
00599
00603 void close_all_sessions();
00604
00608 void remove_peer(const AgentXPeer&);
00609
00610 void lock_reg();
00611 void unlock_reg();
00612
00613 void dispatch_ax_close(AgentXPeer*, AgentXPdu*);
00614 void dispatch_ax_response(AgentXPdu&, boolean);
00615 void dispatch_ax_unregistration(AgentXPdu&);
00616 void dispatch_ax_registration(AgentXPdu&);
00617
00618 AgentXSessions openSessions;
00619
00620 List<AgentXRegEntry> registrations;
00621 Synchronized registrationLock;
00622
00623 OidList<AgentXIndexDB> indexDatabase;
00624 Synchronized indexLock;
00625
00626 ThreadPool* axThread;
00627 QueuedThreadPool* axRegThread;
00628 QueuedThreadPool* axBulkThread;
00629 QueuedThreadPool* axSetThread;
00630 AgentXMaster* agentx;
00631
00632 boolean autoContext;
00633 };
00634
00635
00636
00645 class AGENTXPP_DECL AgentXThread: public Runnable {
00646 public:
00655 AgentXThread(MasterAgentXMib* m) { master = m; }
00656
00660 virtual ~AgentXThread() { }
00661
00665 virtual void run();
00666
00667 protected:
00668 MasterAgentXMib* master;
00669 };
00670
00671 #ifdef AGENTPP_NAMESPACE
00672 }
00673 #endif
00674
00675 #endif