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