vxlan: vxlan/vxlan.api API cleanup
[vpp.git] / extras / vom / vom / gbp_endpoint_group.hpp
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef __VOM_GBP_ENDPOINT_GROUP_H__
17 #define __VOM_GBP_ENDPOINT_GROUP_H__
18
19 #include "vom/interface.hpp"
20 #include "vom/singular_db.hpp"
21 #include "vom/types.hpp"
22
23 #include "vom/gbp_bridge_domain.hpp"
24 #include "vom/gbp_route_domain.hpp"
25 #include "vom/gbp_types.hpp"
26
27 namespace VOM {
28
29 /**
30  * A entry in the ARP termination table of a Bridge Domain
31  */
32 class gbp_endpoint_group : public object_base
33 {
34 public:
35   /**
36    * Endpoint Retention Policy Settings
37    */
38   struct retention_t
39   {
40     retention_t();
41     retention_t(uint32_t remote_ep_timeout);
42
43     retention_t(const retention_t&) = default;
44     retention_t& operator=(const retention_t&) = default;
45
46     bool operator==(const retention_t& o) const;
47     std::string to_string() const;
48
49     /**
50      * Remote Endpoint timeout/ageing
51      */
52     uint32_t remote_ep_timeout;
53   };
54
55   /**
56    * The key for a GBP endpoint group is its ID
57    */
58   typedef sclass_t key_t;
59
60   /**
61    * Construct a GBP endpoint_group
62    */
63   gbp_endpoint_group(vnid_t vnid,
64                      sclass_t sclass,
65                      const interface& itf,
66                      const gbp_route_domain& rd,
67                      const gbp_bridge_domain& bd);
68   gbp_endpoint_group(vnid_t vnid,
69                      sclass_t sclass,
70                      const gbp_route_domain& rd,
71                      const gbp_bridge_domain& bd);
72   gbp_endpoint_group(sclass_t sclass,
73                      const gbp_route_domain& rd,
74                      const gbp_bridge_domain& bd);
75
76   /**
77    * Copy Construct
78    */
79   gbp_endpoint_group(const gbp_endpoint_group& r);
80
81   /**
82    * Destructor
83    */
84   ~gbp_endpoint_group();
85
86   /**
87    * Return the object's key
88    */
89   const key_t key() const;
90
91   /**
92    * comparison operator
93    */
94   bool operator==(const gbp_endpoint_group& bdae) const;
95
96   /**
97    * Return the matching 'singular instance'
98    */
99   std::shared_ptr<gbp_endpoint_group> singular() const;
100
101   /**
102    * Find the instnace of the bridge_domain domain in the OM
103    */
104   static std::shared_ptr<gbp_endpoint_group> find(const key_t& k);
105
106   /**
107    * Dump all bridge_domain-doamin into the stream provided
108    */
109   static void dump(std::ostream& os);
110
111   /**
112    * replay the object to create it in hardware
113    */
114   void replay(void);
115
116   /**
117    * Convert to string for debugging
118    */
119   std::string to_string() const;
120
121   /**
122    * Get the ID of the EPG
123    */
124   vnid_t vnid() const;
125   sclass_t sclass() const;
126
127   const std::shared_ptr<gbp_route_domain> get_route_domain() const;
128   const std::shared_ptr<gbp_bridge_domain> get_bridge_domain() const;
129
130   void set(const retention_t& retention);
131
132 private:
133   /**
134    * Class definition for listeners to OM events
135    */
136   class event_handler : public OM::listener, public inspect::command_handler
137   {
138   public:
139     event_handler();
140     virtual ~event_handler() = default;
141
142     /**
143      * Handle a populate event
144      */
145     void handle_populate(const client_db::key_t& key);
146
147     /**
148      * Handle a replay event
149      */
150     void handle_replay();
151
152     /**
153      * Show the object in the Singular DB
154      */
155     void show(std::ostream& os);
156
157     /**
158      * Get the sortable Id of the listener
159      */
160     dependency_t order() const;
161   };
162
163   /**
164    * event_handler to register with OM
165    */
166   static event_handler m_evh;
167
168   /**
169    * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
170    */
171   void update(const gbp_endpoint_group& obj);
172
173   /**
174    * Find or add the instnace of the bridge_domain domain in the OM
175    */
176   static std::shared_ptr<gbp_endpoint_group> find_or_add(
177     const gbp_endpoint_group& temp);
178
179   /*
180    * It's the VPPHW class that updates the objects in HW
181    */
182   friend class OM;
183
184   /**
185    * It's the singular_db class that calls replay()
186    */
187   friend class singular_db<key_t, gbp_endpoint_group>;
188
189   /**
190    * Sweep/reap the object if still stale
191    */
192   void sweep(void);
193
194   /**
195    * HW configuration for the result of creating the endpoint_group
196    */
197   HW::item<bool> m_hw;
198
199   /**
200    * The EPG ID
201    */
202   vnid_t m_vnid;
203
204   /**
205    * The SClass on the wire
206    */
207   uint16_t m_sclass;
208
209   /**
210    * The uplink interface for the endpoint group
211    */
212   std::shared_ptr<interface> m_itf;
213
214   /**
215    * The route-domain the EPG uses
216    */
217   std::shared_ptr<gbp_route_domain> m_rd;
218
219   /**
220    * The bridge-domain the EPG uses
221    */
222   std::shared_ptr<gbp_bridge_domain> m_bd;
223
224   /**
225    * The Group's EP retention Policy
226    */
227   retention_t m_retention;
228
229   /**
230    * A map of all bridge_domains
231    */
232   static singular_db<key_t, gbp_endpoint_group> m_db;
233 };
234
235 }; // namespace
236
237 /*
238  * fd.io coding-style-patch-verification: ON
239  *
240  * Local Variables:
241  * eval: (c-set-style "mozilla")
242  * End:
243  */
244
245 #endif