blob: a0b3e9afa3ea22c6b3d839df27a112048b2a3be5 [file] [log] [blame]
Neale Ranns812ed392017-10-16 04:20:13 -07001/*
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"
Neale Ranns812ed392017-10-16 04:20:13 -070026#include "vom/singular_db.hpp"
27
Neale Ranns812ed392017-10-16 04:20:13 -070028namespace VOM {
29/**
30 * A representation of a VXLAN Tunnel in VPP
31 */
32class vxlan_tunnel : public interface
33{
34public:
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
Neale Ranns812ed392017-10-16 04:20:13 -0700129private:
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 */
222std::ostream& operator<<(std::ostream& os, const vxlan_tunnel::endpoint_t& ep);
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700223
224}; // namespace VOM
Neale Ranns812ed392017-10-16 04:20:13 -0700225
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