a0b3e9afa3ea22c6b3d839df27a112048b2a3be5
[vpp.git] / extras / vom / vom / vxlan_tunnel.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_VXLAN_TUNNEL_H__
17 #define __VOM_VXLAN_TUNNEL_H__
18
19 #include "vom/hw.hpp"
20 #include "vom/inspect.hpp"
21 #include "vom/interface.hpp"
22 #include "vom/object_base.hpp"
23 #include "vom/om.hpp"
24 #include "vom/prefix.hpp"
25 #include "vom/route_domain.hpp"
26 #include "vom/singular_db.hpp"
27
28 namespace VOM {
29 /**
30  * A representation of a VXLAN Tunnel in VPP
31  */
32 class vxlan_tunnel : public interface
33 {
34 public:
35   /**
36    * Combaintion of attributes that are a unique key
37    * for a VXLAN tunnel
38    */
39   struct endpoint_t
40   {
41     /**
42      * Default constructor
43      */
44     endpoint_t();
45     /**
46      * Constructor taking endpoint values
47      */
48     endpoint_t(const boost::asio::ip::address& src,
49                const boost::asio::ip::address& dst,
50                uint32_t vni);
51
52     /**
53      * less-than operator for map storage
54      */
55     bool operator<(const endpoint_t& o) const;
56
57     /**
58      * Comparison operator
59      */
60     bool operator==(const endpoint_t& o) const;
61
62     /**
63      * Debug print function
64      */
65     std::string to_string() const;
66
67     /**
68      * The src IP address of the endpoint
69      */
70     boost::asio::ip::address src;
71
72     /**
73      * The destination IP address of the endpoint
74      */
75     boost::asio::ip::address dst;
76
77     /**
78      * The VNI of the endpoint
79      */
80     uint32_t vni;
81   };
82
83   /**
84    * Construct a new object matching the desried state
85    */
86   vxlan_tunnel(const boost::asio::ip::address& src,
87                const boost::asio::ip::address& dst,
88                uint32_t vni);
89
90   /**
91    * Construct a new object matching the desried state with a handle
92    * read from VPP
93    */
94   vxlan_tunnel(const handle_t& hdl,
95                const boost::asio::ip::address& src,
96                const boost::asio::ip::address& dst,
97                uint32_t vni);
98
99   /*
100    * Destructor
101    */
102   ~vxlan_tunnel();
103
104   /**
105    * Copy constructor
106    */
107   vxlan_tunnel(const vxlan_tunnel& o);
108
109   /**
110    * Return the matching 'singular instance'
111    */
112   std::shared_ptr<vxlan_tunnel> singular() const;
113
114   /**
115    * Debug rpint function
116    */
117   virtual std::string to_string() const;
118
119   /**
120    * Return VPP's handle to this object
121    */
122   const handle_t& handle() const;
123
124   /**
125    * Dump all L3Configs into the stream provided
126    */
127   static void dump(std::ostream& os);
128
129 private:
130   /**
131    * Class definition for listeners to OM events
132    */
133   class event_handler : public OM::listener, public inspect::command_handler
134   {
135   public:
136     event_handler();
137     virtual ~event_handler() = default;
138
139     /**
140      * Handle a populate event
141      */
142     void handle_populate(const client_db::key_t& key);
143
144     /**
145      * Handle a replay event
146      */
147     void handle_replay();
148
149     /**
150      * Show the object in the Singular DB
151      */
152     void show(std::ostream& os);
153
154     /**
155      * Get the sortable Id of the listener
156      */
157     dependency_t order() const;
158   };
159
160   /**
161    * Event handle to register with OM
162    */
163   static event_handler m_evh;
164
165   /**
166    * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
167    */
168   void update(const vxlan_tunnel& obj);
169
170   /**
171    * Return the matching 'instance' of the sub-interface
172    *  over-ride from the base class
173    */
174   std::shared_ptr<interface> singular_i() const;
175
176   /**
177    * Find the VXLAN tunnel in the OM
178    */
179   static std::shared_ptr<vxlan_tunnel> find_or_add(const vxlan_tunnel& temp);
180
181   /*
182    * It's the VPPHW class that updates the objects in HW
183    */
184   friend class OM;
185
186   /**
187    * It's the singular_db class that calls replay()
188    */
189   friend class singular_db<endpoint_t, vxlan_tunnel>;
190
191   /**
192    * Sweep/reap the object if still stale
193    */
194   void sweep(void);
195
196   /**
197    * replay the object to create it in hardware
198    */
199   void replay(void);
200
201   /**
202    * Tunnel enpoint/key
203    */
204   endpoint_t m_tep;
205
206   /**
207    * A map of all VLAN tunnela against thier key
208    */
209   static singular_db<endpoint_t, vxlan_tunnel> m_db;
210
211   /**
212    * Construct a unique name for the tunnel
213    */
214   static std::string mk_name(const boost::asio::ip::address& src,
215                              const boost::asio::ip::address& dst,
216                              uint32_t vni);
217 };
218
219 /**
220  * Ostream output for a tunnel endpoint
221  */
222 std::ostream& operator<<(std::ostream& os, const vxlan_tunnel::endpoint_t& ep);
223
224 }; // namespace VOM
225
226 /*
227  * fd.io coding-style-patch-verification: ON
228  *
229  * Local Variables:
230  * eval: (c-set-style "mozilla")
231  * End:
232  */
233
234 #endif