AgentX++  2.0.5
agentx_master.h
Go to the documentation of this file.
1 /*_############################################################################
2  _##
3  _## agentx_master.h
4  _##
5  _##
6  _## AgentX++ 2
7  _## -------------------------------------
8  _## Copyright (C) 2000-2013 - Frank Fock
9  _##
10  _## Use of this software is subject to the license agreement you received
11  _## with this software and which can be downloaded from
12  _## http://www.agentpp.com
13  _##
14  _## This is licensed software and may not be used in a commercial
15  _## environment, except for evaluation purposes, unless a valid
16  _## license has been purchased.
17  _##
18  _##########################################################################*/
19 
20 
21 #ifndef agentx_master_h_
22 #define agentx_master_h_
23 
24 #include <agentx_pp/agentx.h>
25 #include <agentx_pp/agentx_reg.h>
28 #include <agentx_pp/agentx_node.h>
29 #include <agentx_pp/agentx_index.h>
30 #include <agent_pp/mib.h>
31 #include <agent_pp/notification_originator.h>
32 
33 #ifndef _WIN32THREADS
34 #include <pthread.h>
35 #endif
36 
37 #ifdef AGENTPP_NAMESPACE
38 namespace Agentpp {
39 #endif
40 
41 class MasterAgentXMib;
42 
50 class AGENTXPP_DECL AgentXResponseTask: public Runnable {
51  public:
53  { mib = m; task = t; timely = ti; }
54  virtual ~AgentXResponseTask() { delete task; }
55 
56  virtual void run();
57  protected:
60  bool timely;
61 };
62 
70 class AGENTXPP_DECL AgentXCloseTask: public Runnable {
71  public:
73  { mib = m; peer = p; closePdu = c; }
74  virtual ~AgentXCloseTask();
75 
76  virtual void run();
77  protected:
81 };
82 
90 class AGENTXPP_DECL AgentXTask: public Runnable {
91  public:
93  { mib = m; task = t; }
94  virtual ~AgentXTask() { delete task; }
95 
96  virtual void run();
97  protected:
100 };
101 
102 /*----------------------- class MasterAgentXMib -----------------------*/
103 
104 /*
105  * The thread that receives AgentX requests
106  */
107 #ifdef _WIN32THREADS
108 void master_daemon(void*);
109 #else
110 void* master_daemon(void*);
111 #endif
112 
124 #if !defined (AGENTXPP_DECL_TEMPL_LIST_THREAD)
125 #define AGENTXPP_DECL_TEMPL_LIST_THREAD
127 #endif
128 #if !defined (AGENTXPP_DECL_TEMPL_LIST_AGENTXREGENTRY)
129 #define AGENTXPP_DECL_TEMPL_LIST_AGENTXREGENTRY
131 #endif
132 #if !defined (AGENTXPP_DECL_TEMPL_LIST_AGENTXINDEXDB)
133 #define AGENTXPP_DECL_TEMPL_LIST_AGENTXINDEXDB
135 #endif
136 
137 class AGENTXPP_DECL MasterAgentXMib: public Mib {
138 
139  friend class AgentXResponseTask;
140  friend class AgentXCloseTask;
141  friend class AgentXTask;
142 
143  public:
144 
148  MasterAgentXMib();
149 
157  MasterAgentXMib(const NS_SNMP OctetStr&);
158 
162  virtual ~MasterAgentXMib();
163 
170  virtual void set_agentx(AgentXMaster*);
171 
179  AgentXMaster* get_agentx();
180 
190  void set_session_admin_status_writable(bool);
191 
200  virtual MibEntry* add(MibEntry*);
201 
218  virtual MibEntry* add(const NS_SNMP OctetStr&, MibEntry*);
219 
226  virtual bool init();
227 
231  virtual void process_agentx();
232 
239  virtual void answer(AgentXPdu&);
240 
253  virtual bool is_dupl_reg(const AgentXRegEntry&);
254 
266  virtual void add_get_subrequest(u_int, unsigned long,
267  const AgentXSearchRange&,
268  u_char,
269  u_char, const NS_SNMP OctetStr&,
270  int=0, int=0);
281  virtual void add_set_subrequest(u_int, unsigned long,
282  const AgentXSearchRange&,
283  const Vbx&, u_char,
284  u_char, const NS_SNMP OctetStr&);
285 
294  virtual void close_session(u_int, u_char);
295 
305  virtual void set_auto_context(bool enabled)
306  { autoContext = enabled; }
307 
327  virtual Oidx get_upper_session_boundary(const NS_SNMP OctetStr&,
328  AgentXNode*);
329 
330  protected:
331 
341  virtual void add_new_context(const NS_SNMP OctetStr&);
342 
352  AgentXIndexDB* get_index_database(const NS_SNMP OctetStr&);
353 
364  virtual time_t timeout_requests(time_t);
365 
372  virtual void process_set_request(Request*);
373 
374  virtual void do_process_request(Request*);
375 
383  virtual void finalize(Request*);
384 
392  virtual void delete_request(Request* req)
393  { if (req->trylock() != Synchronized::BUSY) { req->notify();
394  req->unlock(); } Mib::delete_request(req); }
395 
405  virtual bool send_pending_ax(unsigned long);
406 
416  virtual bool cancel_pending_ax(unsigned long);
417 
424  virtual void process_ax_request(AgentXPdu&);
425  virtual void process_ax_response(AgentXPdu&, bool);
426  virtual bool process_ax_search_response(AgentXPdu&,
427  const AgentXPdu&,
428  int*,
429  Request*);
430 
431  virtual void process_ax_set_response(AgentXPdu&,
432  const AgentXPdu&,
433  int*,
434  Request*);
435 
436  virtual bool process_ax_getbulk_response(AgentXPdu&,
437  const AgentXPdu&,
438  int*,
439  Request*);
440 
441 
442  virtual void process_ax_open(AgentXPdu&);
443  virtual void process_ax_registration(AgentXPdu&);
444  virtual void process_ax_unregistration(AgentXPdu&);
445  virtual void process_ax_notify(AgentXPdu&);
446  virtual void process_ax_master_request(fd_set*, int*);
447  virtual void process_ax_addagentcaps(AgentXPdu&);
448  virtual void process_ax_removeagentcaps(AgentXPdu&);
449  virtual void process_ax_indexallocate(AgentXPdu&);
450  virtual void process_ax_indexdeallocate(AgentXPdu&);
451 
467  virtual AgentXPdu* create_response(AgentXPdu&, AgentXSession&);
468 
483  virtual bool get_affected_regs(const AgentXRegEntry&,
484  const AgentXRegion&,
485  List<AgentXNode>&);
496  virtual bool has_conflict(const AgentXRegEntry&);
497 
505  virtual void add_entry(AgentXRegEntry*);
506 
519  virtual bool remove_entry(u_int, const AgentXRegEntry&);
520 
530  virtual void remove_entries(u_int, u_int);
531 
551  virtual bool add_ax_agent_caps(const NS_SNMP OctetStr&,
552  const Oidx&,
553  const NS_SNMP OctetStr&,
554  AgentXSession&);
555 
569  virtual void remove_ax_agent_caps(const NS_SNMP OctetStr&,
570  const Oidx&,
571  AgentXSession&);
572 
573  private:
574 
581  void remove_indexes(u_int);
582 
583  void remove_agent_caps_by_session(AgentXSession*);
584 
595  void add_entry(AgentXRegEntry*,
596  const AgentXRegion&);
597 
601  void close_all_sessions();
602 
606  void remove_peer(const AgentXPeer&);
607 
608  void lock_reg();
609  void unlock_reg();
610 
611  void dispatch_ax_close(AgentXPeer*, AgentXPdu*);
612  void dispatch_ax_response(AgentXPdu&, bool);
613  void dispatch_ax_unregistration(AgentXPdu&);
614  void dispatch_ax_registration(AgentXPdu&);
615 
616  AgentXSessions openSessions;
617 
618  List<AgentXRegEntry> registrations;
619  Synchronized registrationLock;
620 
621  OidList<AgentXIndexDB> indexDatabase;
622  Synchronized indexLock;
623 
624  ThreadPool* axThread;
625  QueuedThreadPool* axRegThread;
626  QueuedThreadPool* axBulkThread;
627  QueuedThreadPool* axSetThread;
628  AgentXMaster* agentx;
629 
630  bool autoContext;
631 };
632 
633 /*----------------------- class AgentXThread -----------------------*/
634 
643 class AGENTXPP_DECL AgentXThread: public Runnable {
644  public:
653  AgentXThread(MasterAgentXMib* m) { master = m; }
654 
658  virtual ~AgentXThread() { }
659 
663  virtual void run();
664 
665  protected:
667 };
668 
669 #ifdef AGENTPP_NAMESPACE
670 }
671 #endif
672 
673 #endif