FD.io VPP  v19.04.2-12-g66b1689
Vector Packet Processing
prefix.hpp
Go to the documentation of this file.
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_PREFIX_H__
17 #define __VOM_PREFIX_H__
18 
19 #include "vom/enum_base.hpp"
20 #include <boost/asio/ip/address.hpp>
21 
22 namespace VOM {
23 /**
24  * Types belonging to Routing
25  */
26 
27 /**
28  * A next-hop protocol describes the protocol of a peer to which packets
29  * are sent after matching a route.
30  */
31 class nh_proto_t : public enum_base<nh_proto_t>
32 {
33 public:
34  const static nh_proto_t IPV4;
35  const static nh_proto_t IPV6;
36  const static nh_proto_t MPLS;
37  const static nh_proto_t ETHERNET;
38 
40 
41 private:
42  /**
43  * Private constructor taking the value and the string name
44  */
45  nh_proto_t(int v, const std::string& s);
46 };
47 
48 /**
49  * An L3 protocol can be used to construct a prefix that is used
50  * to match packets are part of a route.
51  */
52 class l3_proto_t : public enum_base<l3_proto_t>
53 {
54 public:
55  const static l3_proto_t IPV4;
56  const static l3_proto_t IPV6;
57  const static l3_proto_t MPLS;
58 
59  bool is_ipv4();
60  bool is_ipv6();
61 
63 
64  const nh_proto_t& to_nh_proto() const;
65 
66 private:
67  /**
68  * Private constructor taking the value and the string name
69  */
70  l3_proto_t(int v, const std::string& s);
71 };
72 
73 /**
74  * Ostream output for l3_proto_t
75  */
76 std::ostream& operator<<(std::ostream& os, const l3_proto_t& l3p);
77 
78 namespace route {
79 /**
80  * type def the table-id
81  */
82 typedef uint32_t table_id_t;
83 
84 /**
85  * The table-id for the default table
86  */
87 const static table_id_t DEFAULT_TABLE = 0;
88 
89 /**
90  * A prefix defintion. Address + length
91  */
92 class prefix_t
93 {
94 public:
95  /**
96  * Default Constructor - creates ::/0
97  */
98  prefix_t();
99  /**
100  * Constructor with address and length
101  */
102  prefix_t(const boost::asio::ip::address& addr, uint8_t len);
103  /**
104  * Constructor with just the address, this creates a
105  * host prefix
106  */
107  prefix_t(const boost::asio::ip::address& addr);
108 
109  /**
110  * Constructor with string and length
111  */
112  prefix_t(const std::string& s, uint8_t len);
113 
114  /**
115  * Copy Constructor
116  */
117  prefix_t(const prefix_t&);
118 
119  /**
120  * Constructor with VPP API prefix representation
121  */
122  prefix_t(uint8_t is_ip6, uint8_t* addr, uint8_t len);
123  /**
124  * Destructor
125  */
126  ~prefix_t();
127 
128  /**
129  * Get the address
130  */
131  const boost::asio::ip::address& address() const;
132 
133  /**
134  * Get the network mask width
135  */
136  uint8_t mask_width() const;
137 
138  /**
139  * Assignement
140  */
141  prefix_t& operator=(const prefix_t&);
142 
143  /**
144  * Less than operator
145  */
146  bool operator<(const prefix_t& o) const;
147 
148  /**
149  * equals operator
150  */
151  bool operator==(const prefix_t& o) const;
152 
153  /**
154  * not equal opartor
155  */
156  bool operator!=(const prefix_t& o) const;
157 
158  /**
159  * convert to string format for debug purposes
160  */
161  std::string to_string() const;
162 
163  /**
164  * The all Zeros prefix
165  */
166  const static prefix_t ZERO;
167 
168  /**
169  * The all Zeros v6 prefix
170  */
171  const static prefix_t ZEROv6;
172 
173  /**
174  * Convert the prefix into VPP API parameters
175  */
176  void to_vpp(uint8_t* is_ip6, uint8_t* addr, uint8_t* len) const;
177 
178  /**
179  * Return a address representation of the mask, e.g. 255.255.0.0
180  */
181  boost::asio::ip::address mask() const;
182 
183  /**
184  * get the lowest address in the prefix
185  */
186  prefix_t low() const;
187 
188  /**
189  * Get the highest address in the prefix
190  */
191  prefix_t high() const;
192 
193  /**
194  * Get the L3 protocol
195  */
196  l3_proto_t l3_proto() const;
197 
198 private:
199  /**
200  * The address
201  */
203 
204  /**
205  * The prefix length
206  */
207  uint8_t m_len;
208 };
209 
210 /**
211 * A prefix defintion. Address + length
212 */
214 {
215 public:
216  /**
217  * Default Constructor - creates ::/0
218  */
219  mprefix_t();
220  /**
221  * Constructor for (S,G)
222  */
223  mprefix_t(const boost::asio::ip::address& saddr,
224  const boost::asio::ip::address& gaddr);
225  /*
226  * Constructor for (*,G)
227  */
228  mprefix_t(const boost::asio::ip::address& gaddr);
229 
230  /*
231  * Constructor for (*,G/n)
232  */
233  mprefix_t(const boost::asio::ip::address& gaddr, uint8_t len);
234 
235  /**
236 *Constructor for (S,G)
237 */
238  mprefix_t(const boost::asio::ip::address& saddr,
239  const boost::asio::ip::address& gaddr,
240  uint16_t len);
241 
242  /**
243  * Copy Constructor
244  */
245  mprefix_t(const mprefix_t&);
246 
247  /**
248  * Destructor
249  */
250  ~mprefix_t();
251 
252  /**
253  * Get the address
254  */
255  const boost::asio::ip::address& grp_address() const;
256  const boost::asio::ip::address& src_address() const;
257 
258  /**
259  * Get the network mask width
260  */
261  uint8_t mask_width() const;
262 
263  /**
264  * Assignement
265  */
266  mprefix_t& operator=(const mprefix_t&);
267 
268  /**
269  * Less than operator
270  */
271  bool operator<(const mprefix_t& o) const;
272 
273  /**
274  * equals operator
275  */
276  bool operator==(const mprefix_t& o) const;
277 
278  /**
279  * not equal opartor
280  */
281  bool operator!=(const mprefix_t& o) const;
282 
283  /**
284  * convert to string format for debug purposes
285  */
286  std::string to_string() const;
287 
288  /**
289  * The all Zeros prefix
290  */
291  const static mprefix_t ZERO;
292 
293  /**
294  * The all Zeros v6 prefix
295  */
296  const static mprefix_t ZEROv6;
297 
298  /**
299  * Get the L3 protocol
300  */
301  l3_proto_t l3_proto() const;
302 
303  void to_vpp(uint8_t* is_ip6,
304  uint8_t* saddr,
305  uint8_t* gaddr,
306  uint16_t* len) const;
307 
308 private:
309  /**
310  * The address
311  */
312  boost::asio::ip::address m_gaddr;
313  boost::asio::ip::address m_saddr;
314 
315  /**
316  * The prefix length
317  */
318  uint8_t m_len;
319 };
320 
321 }; // namespace route
322 
323 boost::asio::ip::address_v4 operator|(const boost::asio::ip::address_v4& addr1,
324  const boost::asio::ip::address_v4& addr2);
325 
326 boost::asio::ip::address_v4 operator&(const boost::asio::ip::address_v4& addr1,
327  const boost::asio::ip::address_v4& addr2);
328 
329 boost::asio::ip::address_v4 operator~(const boost::asio::ip::address_v4& addr1);
330 
331 boost::asio::ip::address_v6 operator|(const boost::asio::ip::address_v6& addr1,
332  const boost::asio::ip::address_v6& addr2);
333 
334 boost::asio::ip::address_v6 operator&(const boost::asio::ip::address_v6& addr1,
335  const boost::asio::ip::address_v6& addr2);
336 
337 boost::asio::ip::address_v6 operator~(const boost::asio::ip::address_v6& addr1);
338 
340  const boost::asio::ip::address& addr2);
341 
343  const boost::asio::ip::address& addr2);
344 
346 
347 /**
348  * Ostream printer for prefix_t
349  */
350 std::ostream& operator<<(std::ostream& os, const route::prefix_t& pfx);
351 
352 /**
353  * Convert a boost address into a VPP bytes string
354  */
356  uint8_t* is_ip6,
357  uint8_t* array);
358 void to_bytes(const boost::asio::ip::address_v4& addr, uint8_t* array);
359 void to_bytes(const boost::asio::ip::address_v6& addr, uint8_t* array);
360 
361 /**
362  * Get the prefix mask length of a host route from the boost address
363  */
364 uint32_t mask_width(const boost::asio::ip::address& addr);
365 
366 /**
367  * Convert a VPP byte stinrg into a boost addresss
368  */
369 boost::asio::ip::address from_bytes(uint8_t is_ip6, const uint8_t* array);
370 };
371 
372 /*
373  * fd.io coding-style-patch-verification: ON
374  *
375  * Local Variables:
376  * eval: (c-set-style "mozilla")
377  * End:
378  */
379 
380 #endif
uint32_t table_id_t
type def the table-id
Definition: prefix.hpp:82
typedef address
Definition: ip_types.api:30
A template base class for all enum types.
Definition: enum_base.hpp:30
static const nh_proto_t IPV6
Definition: prefix.hpp:35
void to_vpp(const route::path &p, vapi_payload_ip_add_del_route &payload)
static const nh_proto_t IPV4
Definition: prefix.hpp:34
static const prefix_t ZEROv6
The all Zeros v6 prefix.
Definition: prefix.hpp:171
An L3 protocol can be used to construct a prefix that is used to match packets are part of a route...
Definition: prefix.hpp:52
static const nh_proto_t & from_address(const boost::asio::ip::address &addr)
Definition: prefix.cpp:90
vhost_vring_addr_t addr
Definition: vhost_user.h:121
static const l3_proto_t MPLS
Definition: prefix.hpp:57
Types belonging to Routing.
Definition: prefix.hpp:31
static const l3_proto_t IPV4
Definition: prefix.hpp:55
static const l3_proto_t IPV6
Definition: prefix.hpp:56
void to_bytes(const boost::asio::ip::address_v6 &addr, uint8_t *array)
Definition: prefix.cpp:218
static const table_id_t DEFAULT_TABLE
The table-id for the default table.
Definition: prefix.hpp:87
bool operator!=(const enum_base &e) const
Comparison operator.
Definition: enum_base.hpp:78
static const mprefix_t ZERO
The all Zeros prefix.
Definition: prefix.hpp:291
boost::asio::ip::address_v4 operator~(const boost::asio::ip::address_v4 &addr1)
Definition: prefix.cpp:296
vl_api_address_union_t src_address
Definition: ip_types.api:44
static const mprefix_t ZEROv6
The all Zeros v6 prefix.
Definition: prefix.hpp:296
u8 len
Definition: ip_types.api:49
bool operator==(const enum_base &e) const
Comparison operator.
Definition: enum_base.hpp:41
uint32_t mask_width(const boost::asio::ip::address &addr)
Get the prefix mask length of a host route from the boost address.
Definition: prefix.cpp:242
boost::asio::ip::address_v4 operator&(const boost::asio::ip::address_v4 &addr1, const boost::asio::ip::address_v4 &addr2)
Definition: prefix.cpp:287
boost::asio::ip::address from_bytes(uint8_t is_ip6, const uint8_t *bytes)
Convert a VPP byte stinrg into a boost addresss.
Definition: prefix.cpp:193
enum_base & operator=(const enum_base &e)
Assignment.
Definition: enum_base.hpp:46
std::ostream & operator<<(std::ostream &os, const std::pair< direction_t, interface::key_t > &key)
static const nh_proto_t MPLS
Definition: prefix.hpp:36
The VPP Object Model (VOM) library.
Definition: acl_binding.cpp:19
A prefix defintion.
Definition: prefix.hpp:213
static const prefix_t ZERO
The all Zeros prefix.
Definition: prefix.hpp:166
vl_api_address_union_t grp_address
Definition: ip_types.api:43
enum_base operator|(const enum_base &e1) const
bitwise or
Definition: enum_base.hpp:68
const std::string & to_string() const
convert to string format for debug purposes
Definition: enum_base.hpp:36
A prefix defintion.
Definition: prefix.hpp:92
static const nh_proto_t ETHERNET
Definition: prefix.hpp:37