fib: fib api updates
[vpp.git] / extras / vom / vom / route_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_ROUTE_DOMAIN_H__
17 #define __VOM_ROUTE_DOMAIN_H__
18
19 #include "vom/inspect.hpp"
20 #include "vom/object_base.hpp"
21 #include "vom/om.hpp"
22 #include "vom/prefix.hpp"
23 #include "vom/singular_db.hpp"
24
25 namespace VOM {
26 /**
27  * A route-domain is a VRF.
28  *  creating a route-domain object will construct both an IPv4
29  *  and IPv6 table.
30  */
31 class route_domain : public object_base
32 {
33 public:
34   /**
35    * The Key for a route-domain
36    */
37   typedef route::table_id_t key_t;
38
39   /**
40    * The iterator type
41    */
42   typedef singular_db<const key_t, route_domain>::const_iterator
43     const_iterator_t;
44
45   static const_iterator_t cbegin();
46   static const_iterator_t cend();
47
48   /**
49    * Construct a new object matching the desried state
50    */
51   route_domain(route::table_id_t id);
52
53   /**
54    * Copy Constructor
55    */
56   route_domain(const route_domain& o);
57
58   /**
59    * Destructor
60    */
61   ~route_domain();
62
63   /**
64    * comparison operator - for UT
65    */
66   bool operator==(const route_domain& r) const;
67
68   /**
69    * Return the matching 'singular instance'
70    */
71   std::shared_ptr<route_domain> singular() const;
72
73   /**
74    * Debug print function
75    */
76   std::string to_string() const;
77
78   /**
79    * Get the table ID
80    */
81   route::table_id_t table_id() const;
82
83   /**
84    * Get the route-domain's key
85    */
86   key_t key() const;
87
88   /**
89    * Find the instnace of the route domain in the OM
90    */
91   static std::shared_ptr<route_domain> find(const key_t& temp);
92
93   /**
94    * Dump all route-doamin into the stream provided
95    */
96   static void dump(std::ostream& os);
97
98   /**
99    * Return the sigular instance for the default table
100    */
101   static std::shared_ptr<route_domain> get_default();
102
103   /**
104    * replay the object to create it in hardware
105    */
106   void replay(void);
107
108 private:
109   /**
110    * Class definition for listeners to OM events
111    */
112   class event_handler : public OM::listener, public inspect::command_handler
113   {
114   public:
115     event_handler();
116     virtual ~event_handler() = default;
117
118     /**
119      * Handle a populate event
120      */
121     void handle_populate(const client_db::key_t& key);
122
123     /**
124      * Handle a replay event
125      */
126     void handle_replay();
127
128     /**
129      * Show the object in the Singular DB
130      */
131     void show(std::ostream& os);
132
133     /**
134      * Get the sortable Id of the listener
135      */
136     dependency_t order() const;
137   };
138
139   /**
140    * Instance of the event handler to register with OM
141    */
142   static event_handler m_evh;
143
144   /**
145    * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
146    */
147   void update(const route_domain& obj);
148
149   /**
150    * Find or add the instnace of the route domain in the OM
151    */
152   static std::shared_ptr<route_domain> find_or_add(const route_domain& temp);
153
154   /*
155    * It's the OM class that updates the objects in HW
156    */
157   friend class OM;
158
159   /**
160    * It's the singular_db class that calls replay()
161    */
162   friend class singular_db<route::table_id_t, route_domain>;
163
164   /**
165    * Sweep/reap the object if still stale
166    */
167   void sweep(void);
168
169   /**
170    * HW configuration for the result of creating the v4 table
171    */
172   HW::item<bool> m_hw_v4;
173
174   /**
175    * HW configuration for the result of creating the v6 table
176    */
177   HW::item<bool> m_hw_v6;
178
179   /**
180    * VPP understands Table-IDs not table names.
181    *  The table IDs for V4 and V6 are the same.
182    */
183   route::table_id_t m_table_id;
184
185   /**
186    * A map of all interfaces key against the interface's name
187    */
188   static singular_db<route::table_id_t, route_domain> m_db;
189 };
190 }; // namespace VOM
191
192 /*
193  * fd.io coding-style-patch-verification: ON
194  *
195  * Local Variables:
196  * eval: (c-set-style "mozilla")
197  * End:
198  */
199
200 #endif