d609b89fe2f9aa169d8c819ab8d2be007461fa51
[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
26 namespace VOM {
27
28 /**
29  * EPG IDs are 32 bit integers
30  */
31 typedef uint32_t epg_id_t;
32
33 /**
34  * A entry in the ARP termination table of a Bridge Domain
35  */
36 class gbp_endpoint_group : public object_base
37 {
38 public:
39   /**
40    * The key for a GBP endpoint group is its ID
41    */
42   typedef epg_id_t key_t;
43
44   /**
45    * Construct a GBP endpoint_group
46    */
47   gbp_endpoint_group(epg_id_t epg_id,
48                      const interface& itf,
49                      const gbp_route_domain& rd,
50                      const gbp_bridge_domain& bd);
51   gbp_endpoint_group(epg_id_t epg_id,
52                      const gbp_route_domain& rd,
53                      const gbp_bridge_domain& bd);
54
55   /**
56    * Copy Construct
57    */
58   gbp_endpoint_group(const gbp_endpoint_group& r);
59
60   /**
61    * Destructor
62    */
63   ~gbp_endpoint_group();
64
65   /**
66    * Return the object's key
67    */
68   const key_t key() const;
69
70   /**
71    * comparison operator
72    */
73   bool operator==(const gbp_endpoint_group& bdae) const;
74
75   /**
76    * Return the matching 'singular instance'
77    */
78   std::shared_ptr<gbp_endpoint_group> singular() const;
79
80   /**
81    * Find the instnace of the bridge_domain domain in the OM
82    */
83   static std::shared_ptr<gbp_endpoint_group> find(const key_t& k);
84
85   /**
86    * Dump all bridge_domain-doamin into the stream provided
87    */
88   static void dump(std::ostream& os);
89
90   /**
91    * replay the object to create it in hardware
92    */
93   void replay(void);
94
95   /**
96    * Convert to string for debugging
97    */
98   std::string to_string() const;
99
100   /**
101    * Get the ID of the EPG
102    */
103   epg_id_t id() const;
104
105 private:
106   /**
107    * Class definition for listeners to OM events
108    */
109   class event_handler : public OM::listener, public inspect::command_handler
110   {
111   public:
112     event_handler();
113     virtual ~event_handler() = default;
114
115     /**
116      * Handle a populate event
117      */
118     void handle_populate(const client_db::key_t& key);
119
120     /**
121      * Handle a replay event
122      */
123     void handle_replay();
124
125     /**
126      * Show the object in the Singular DB
127      */
128     void show(std::ostream& os);
129
130     /**
131      * Get the sortable Id of the listener
132      */
133     dependency_t order() const;
134   };
135
136   /**
137    * event_handler to register with OM
138    */
139   static event_handler m_evh;
140
141   /**
142    * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
143    */
144   void update(const gbp_endpoint_group& obj);
145
146   /**
147    * Find or add the instnace of the bridge_domain domain in the OM
148    */
149   static std::shared_ptr<gbp_endpoint_group> find_or_add(
150     const gbp_endpoint_group& temp);
151
152   /*
153    * It's the VPPHW class that updates the objects in HW
154    */
155   friend class OM;
156
157   /**
158    * It's the singular_db class that calls replay()
159    */
160   friend class singular_db<key_t, gbp_endpoint_group>;
161
162   /**
163    * Sweep/reap the object if still stale
164    */
165   void sweep(void);
166
167   /**
168    * HW configuration for the result of creating the endpoint_group
169    */
170   HW::item<bool> m_hw;
171
172   /**
173    * The EPG ID
174    */
175   epg_id_t m_epg_id;
176
177   /**
178    * The uplink interface for the endpoint group
179    */
180   std::shared_ptr<interface> m_itf;
181
182   /**
183    * The route-domain the EPG uses
184    */
185   std::shared_ptr<gbp_route_domain> m_rd;
186
187   /**
188    * The bridge-domain the EPG uses
189    */
190   std::shared_ptr<gbp_bridge_domain> m_bd;
191
192   /**
193    * A map of all bridge_domains
194    */
195   static singular_db<key_t, gbp_endpoint_group> m_db;
196 };
197
198 }; // namespace
199
200 /*
201  * fd.io coding-style-patch-verification: ON
202  *
203  * Local Variables:
204  * eval: (c-set-style "mozilla")
205  * End:
206  */
207
208 #endif