/rf-controller/src/nox/netapps/data/datacache.hh

https://github.com/apontes/RouteFlow · C++ Header · 215 lines · 171 code · 27 blank · 17 comment · 0 complexity · c345225f6d363aef513bb3aabbeb8b6e MD5 · raw file

  1. /* Copyright 2009 (C) Nicira, Inc.
  2. *
  3. * This file is part of NOX.
  4. *
  5. * NOX is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * NOX is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with NOX. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef DATA_CACHE_HH
  19. #define DATA_CACHE_HH 1
  20. #include "component.hh"
  21. #include "data/datatypes.hh"
  22. #include "netinet++/datapathid.hh"
  23. #include "netinet++/ethernetaddr.hh"
  24. #include "netinet++/ipaddr.hh"
  25. #include "netinet++/cidr.hh"
  26. namespace vigil {
  27. namespace applications {
  28. class Data_cache
  29. : public container::Component {
  30. public:
  31. Data_cache(const container::Context*, const json_object*);
  32. Data_cache() : Component(0) { }
  33. static void getInstance(const container::Context*, Data_cache*&);
  34. void configure(const container::Configuration*);
  35. void install();
  36. int64_t get_authenticated_id(PrincipalType ptype) const;
  37. int64_t get_unauthenticated_id(PrincipalType ptype) const;
  38. int64_t get_unknown_id(PrincipalType ptype) const;
  39. const std::string& get_authenticated_name() const { return authenticated; };
  40. const std::string& get_unauthenticated_name() const { return unauthenticated; };
  41. const std::string& get_unknown_name() const { return unknown; };
  42. bool is_reserved_name(const std::string& name);
  43. bool get_name(const Principal& principal, std::string& name) const;
  44. const std::string& get_name_ref(const Principal& principal) const;
  45. bool get_address(int64_t id, AddressType& type,
  46. std::string& name, bool expect_addr=true) const;
  47. void get_groups(const Principal& principal, GroupList& group_list) const;
  48. void get_groups(const ethernetaddr& dladdr, GroupList& group_list) const;
  49. void get_groups(const ipaddr& nwaddr, GroupList& group_list) const;
  50. void get_all_group_members(const std::list<int64_t>& group_list,
  51. PrincipalSet& principals) const;
  52. typedef boost::function<void(int64_t)> PrincipalUpdatedFn;
  53. typedef boost::function<void(int64_t, int64_t,
  54. const datapathid& dp)> SwitchUpdatedFn;
  55. typedef boost::function<void(int64_t, int64_t,
  56. int64_t, uint16_t,
  57. const std::string&)> LocationUpdatedFn;
  58. typedef PrincipalUpdatedFn HostUpdatedFn;
  59. typedef boost::function<void(int64_t, int64_t,
  60. bool, bool)> NetidUpdatedFn;
  61. typedef boost::function<void(int64_t, int64_t,
  62. int64_t,
  63. const std::string&,
  64. AddressType, bool)> NetidBindingUpdatedFn;
  65. typedef PrincipalUpdatedFn UserUpdatedFn;
  66. typedef PrincipalUpdatedFn GroupUpdatedFn;
  67. typedef PrincipalUpdatedFn AddressUpdatedFn;
  68. typedef boost::function<void(const Principal&)> PrincipalDeletedFn;
  69. typedef boost::function<void(const
  70. hash_set<int64_t>&)> MembersUpdatedFn;
  71. typedef boost::function<void(const PrincipalSet&)> GroupsUpdatedFn;
  72. typedef boost::function<void(AddressType,
  73. const std::string&)> AddrGroupsUpdatedFn;
  74. void add_switch_updated(const SwitchUpdatedFn& fn)
  75. { switch_updated_fns.push_back(fn); }
  76. void add_location_updated(const LocationUpdatedFn& fn)
  77. { location_updated_fns.push_back(fn); }
  78. void add_host_updated(const HostUpdatedFn& fn)
  79. { host_updated_fns.push_back(fn); }
  80. void add_netid_updated(const NetidUpdatedFn& fn)
  81. { netid_updated_fns.push_back(fn); }
  82. void add_netid_binding_updated(const NetidBindingUpdatedFn& fn)
  83. { netid_binding_updated_fns.push_back(fn); }
  84. void add_user_updated(const UserUpdatedFn& fn)
  85. { user_updated_fns.push_back(fn); }
  86. void add_group_updated(const GroupUpdatedFn& fn)
  87. { group_updated_fns.push_back(fn); }
  88. void add_address_updated(const AddressUpdatedFn& fn)
  89. { address_updated_fns.push_back(fn); }
  90. void add_principal_deleted(const PrincipalDeletedFn& fn)
  91. { principal_deleted_fns.push_back(fn); }
  92. void add_members_updated(const MembersUpdatedFn& fn)
  93. { members_updated_fns.push_back(fn); }
  94. void add_groups_updated(const GroupsUpdatedFn& fn)
  95. { groups_updated_fns.push_back(fn); }
  96. void add_addr_groups_updated(const AddrGroupsUpdatedFn& fn)
  97. { addr_groups_updated_fns.push_back(fn); }
  98. struct ModifiedState {
  99. PrincipalSet principals;
  100. hash_set<int64_t> groups;
  101. hash_set<int64_t> processed;
  102. };
  103. void delete_principal(const Principal& principal);
  104. void update_reserved_id(PrincipalType ptype, int64_t id,
  105. const std::string& name);
  106. void update_switch(int64_t id, const std::string& name,
  107. int64_t dp_priority, const datapathid& dp);
  108. void update_location(int64_t id, const std::string& name,
  109. int64_t port_priority, int64_t switch_id,
  110. int64_t port, const std::string& portname);
  111. void update_host(int64_t id, const std::string& name);
  112. void update_host_netid(int64_t id, const std::string& name,
  113. int64_t host_id, bool is_router, bool is_gateway);
  114. void update_netid_binding(int64_t addr_id, int64_t host_netid,
  115. int64_t priority, const std::string& addr,
  116. AddressType type, bool deleted);
  117. void update_user(int64_t id, const std::string& name);
  118. void update_group(int64_t id, const std::string& name);
  119. void update_address(int64_t id, const std::string& name,
  120. AddressType type);
  121. void update_group_member(int64_t id, int64_t group,
  122. const Principal& principal,
  123. ModifiedState& mod_state);
  124. void delete_group_member(int64_t id, ModifiedState& mod_state);
  125. void process_modified_state(const ModifiedState& mod_state) const;
  126. private:
  127. struct Membership {
  128. int64_t group;
  129. Principal principal;
  130. };
  131. typedef std::list<int64_t> Parents;
  132. typedef std::list<Principal> Members;
  133. typedef hash_map<Principal, Parents, PrincipalHash, PrincipalEq> ParentMap;
  134. typedef hash_map<Principal, std::string, PrincipalHash, PrincipalEq> IDMap;
  135. Datatypes *datatypes;
  136. std::list<SwitchUpdatedFn> switch_updated_fns;
  137. std::list<LocationUpdatedFn> location_updated_fns;
  138. std::list<HostUpdatedFn> host_updated_fns;
  139. std::list<NetidUpdatedFn> netid_updated_fns;
  140. std::list<NetidBindingUpdatedFn> netid_binding_updated_fns;
  141. std::list<UserUpdatedFn> user_updated_fns;
  142. std::list<GroupUpdatedFn> group_updated_fns;
  143. std::list<AddressUpdatedFn> address_updated_fns;
  144. std::list<PrincipalDeletedFn> principal_deleted_fns;
  145. std::list<MembersUpdatedFn> members_updated_fns;
  146. std::list<GroupsUpdatedFn> groups_updated_fns;
  147. std::list<AddrGroupsUpdatedFn> addr_groups_updated_fns;
  148. hash_map<int64_t, Membership> memberships; // key is ID
  149. hash_map<int64_t, Members> members; // key is GROUP_ID
  150. ParentMap parents;
  151. IDMap id_to_name;
  152. hash_map<int64_t, AddressType> address_types;
  153. hash_map<uint64_t, std::list<int64_t> > dladdr_to_id;
  154. hash_map<uint32_t, std::list<int64_t> > nwaddr_to_id;
  155. hash_map<int64_t, cidr_ipaddr> id_to_cidr;
  156. struct ReservedNames {
  157. ReservedNames() : unauth(0), auth(-1), unknown(-2) { }
  158. int64_t unauth;
  159. int64_t auth;
  160. int64_t unknown;
  161. };
  162. std::vector<ReservedNames> reserved;
  163. const std::string unauthenticated;
  164. const std::string authenticated;
  165. const std::string unknown;
  166. int64_t get_reserved_index(PrincipalType ptype) const;
  167. bool remove_group_member(int64_t id, int64_t group,
  168. const Principal& principal, bool deleted,
  169. ModifiedState& mod_state);
  170. void add_members(const Principal& principal,
  171. ModifiedState& mod_state) const;
  172. void add_id_mapping(Principal& principal, const std::string& name);
  173. void delete_id_mapping(const Principal& principal);
  174. void add_dladdr_id(int64_t id, const std::string& name);
  175. void add_cidr_id(int64_t id, const std::string& name);
  176. void remove_addr_binding(int64_t id, AddressType type,
  177. const std::string name);
  178. void remove_dladdr_id(int64_t id, const std::string& name);
  179. void remove_cidr_id(int64_t id, const std::string& name);
  180. bool add_group(int64_t group, std::list<int64_t>& parent_list) const;
  181. void add_parents(const Principal& principal,
  182. std::list<int64_t>& parent_list) const;
  183. void set_group_list(const std::list<int64_t>& parent_list,
  184. GroupList& group_list) const;
  185. };
  186. }
  187. }
  188. #endif