OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp/evpn/evpn_route.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_EVPN_EVPN_ROUTE_H_
6 #define SRC_BGP_EVPN_EVPN_ROUTE_H_
7 
8 #include <boost/system/error_code.hpp>
9 
10 #include <string>
11 #include <vector>
12 
13 #include "bgp/bgp_route.h"
14 #include "bgp/inet/inet_route.h"
15 #include "bgp/inet6/inet6_route.h"
16 #include "base/address.h"
17 #include "net/bgp_af.h"
18 #include "net/esi.h"
19 #include "net/mac_address.h"
20 #include "net/rd.h"
21 
22 class BgpServer;
23 
24 class EvpnPrefix {
25 public:
26  static const EvpnPrefix kNullPrefix;
27  static const uint32_t kInvalidLabel;
28  static const uint32_t kNullTag;
29  static const uint32_t kMaxTag;
30  static const uint32_t kMaxVni;
31  static const int32_t kMaxVniSigned;
32 
33  static const size_t kRdSize;
34  static const size_t kEsiSize;
35  static const size_t kTagSize;
36  static const size_t kIp4AddrSize;
37  static const size_t kIp6AddrSize;
38  static const size_t kMacSize;
39  static const size_t kLabelSize;
40  static const size_t kMinAutoDiscoveryRouteSize;
41  static const size_t kMinMacAdvertisementRouteSize;
42  static const size_t kMinInclusiveMulticastRouteSize;
43  static const size_t kMinSelectiveMulticastRouteSize;
44  static const size_t kMinSegmentRouteSize;
45  static const size_t kMinInetPrefixRouteSize;
46  static const size_t kMinInet6PrefixRouteSize;
47 
48  enum RouteType {
56  };
57 
58  EvpnPrefix();
60  uint32_t tag);
62  const MacAddress &mac_addr, const IpAddress &ip_address);
63  EvpnPrefix(const RouteDistinguisher &rd, uint32_t tag,
64  const MacAddress &mac_addr, const IpAddress &ip_address);
65  EvpnPrefix(const RouteDistinguisher &rd, uint32_t tag,
66  const IpAddress &ip_address);
68  const IpAddress &ip_address);
70  const IpAddress &ip_address, uint8_t ip_prefixlen);
71  EvpnPrefix(const RouteDistinguisher &rd, uint32_t tag,
72  const IpAddress &source, const IpAddress &group,
73  const IpAddress &originator);
74 
75  void BuildProtoPrefix(BgpProtoPrefix *proto_prefix,
76  const BgpAttr *attr, uint32_t label, uint32_t l3_label = 0) const;
77 
78  static int FromProtoPrefix(BgpServer *server,
79  const BgpProtoPrefix &proto_prefix, const BgpAttr *attr,
80  const Address::Family family, EvpnPrefix *evpn_prefix,
81  BgpAttrPtr *new_attr, uint32_t *label, uint32_t *l3_label = NULL);
82  static EvpnPrefix FromString(const std::string &str,
83  boost::system::error_code *errorp = NULL);
84  std::string ToString() const;
85  std::string ToXmppIdString() const;
86 
87  int CompareTo(const EvpnPrefix &rhs) const;
88  bool operator==(const EvpnPrefix &rhs) const {
89  return CompareTo(rhs) == 0;
90  }
91  bool operator!=(const EvpnPrefix &rhs) const {
92  return CompareTo(rhs) != 0;
93  }
94  bool operator<(const EvpnPrefix &rhs) const {
95  return (CompareTo(rhs) < 0);
96  }
97  bool operator>(const EvpnPrefix &rhs) const {
98  return (CompareTo(rhs) > 0);
99  }
100  uint8_t type() const { return type_; }
101  const RouteDistinguisher &route_distinguisher() const { return rd_; }
102  const EthernetSegmentId &esi() const { return esi_; }
103  uint32_t tag() const { return tag_; }
104  const MacAddress &mac_addr() const { return mac_addr_; }
105  Address::Family family() const { return family_; }
106  const IpAddress& addr() const { return ip_address_; }
107  IpAddress ip_address() const { return ip_address_; }
108  IpAddress group() const { return group_; }
109  IpAddress source() const { return source_; }
110  uint8_t ip_address_length() const;
111  uint8_t prefixlen() const { return ip_prefixlen_; }
112  const Ip4Address ip4_addr() const { return ip_address_.to_v4(); }
113  const Ip6Address ip6_addr() const { return ip_address_.to_v6(); }
115  return Ip4Prefix(ip_address_.to_v4(), ip_prefixlen_);
116  }
118  return Inet6Prefix(ip_address_.to_v6(), ip_prefixlen_);
119  }
121 
122  // Check whether 'this' is more specific than rhs.
123  bool IsMoreSpecific(const EvpnPrefix &rhs) const;
124 
125 private:
126  uint8_t type_;
129  uint32_t tag_;
135  uint8_t ip_prefixlen_;
136  uint8_t flags_;
137 
138  size_t GetIpAddressSize() const;
139  void ReadIpAddress(const BgpProtoPrefix &proto_prefix,
140  size_t ip_offset, size_t ip_size, size_t ip_psize);
141  void ReadSource(const BgpProtoPrefix &proto_prefix,
142  size_t ip_offset, size_t ip_size);
143  void ReadGroup(const BgpProtoPrefix &proto_prefix,
144  size_t ip_offset, size_t ip_size);
145  void WriteIpAddress(BgpProtoPrefix *proto_prefix, size_t ip_offset) const;
146  void WriteSource(BgpProtoPrefix *proto_prefix, size_t ip_offset) const;
147  void WriteGroup(BgpProtoPrefix *proto_prefix, size_t ip_offset) const;
148  static bool GetSourceFromString(EvpnPrefix *prefix, const std::string &str,
149  size_t pos1, size_t *pos2, boost::system::error_code *errorp);
150  static bool GetGroupFromString(EvpnPrefix *prefix, const std::string &str,
151  size_t pos1, size_t *pos2, boost::system::error_code *errorp);
152 };
153 
154 class EvpnRoute : public BgpRoute {
155 public:
156  explicit EvpnRoute(const EvpnPrefix &prefix);
157  virtual int CompareTo(const Route &rhs) const;
158  virtual std::string ToString() const;
159  virtual std::string ToXmppIdString() const;
160  virtual bool IsValid() const;
161 
162  const EvpnPrefix &GetPrefix() const { return prefix_; }
163 
164  virtual KeyPtr GetDBRequestKey() const;
165  virtual void SetKey(const DBRequestKey *reqkey);
166 
167  virtual void BuildProtoPrefix(BgpProtoPrefix *proto_prefix,
168  const BgpAttr *attr = NULL, uint32_t label = 0,
169  uint32_t l3_label = 0) const;
170  virtual void BuildBgpProtoNextHop(std::vector<uint8_t> &nh,
171  IpAddress nexthop) const;
172 
173  virtual bool IsLess(const DBEntry &genrhs) const {
174  const EvpnRoute &rhs = static_cast<const EvpnRoute &>(genrhs);
175  int cmp = CompareTo(rhs);
176  return (cmp < 0);
177  }
178 
179 private:
181  mutable std::string xmpp_id_str_;
182 
184 };
185 
186 #endif // SRC_BGP_EVPN_EVPN_ROUTE_H_
EvpnRoute(const EvpnPrefix &prefix)
static const size_t kLabelSize
const MacAddress & mac_addr() const
EthernetSegmentId esi_
virtual KeyPtr GetDBRequestKey() const
void WriteGroup(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
uint32_t tag() const
virtual int CompareTo(const Route &rhs) const
static const size_t kMacSize
Family
Definition: address.h:24
boost::asio::ip::address IpAddress
Definition: address.h:13
bool operator==(const EvpnPrefix &rhs) const
const IpAddress & addr() const
bool operator<(const EvpnPrefix &rhs) const
Definition: route.h:14
static const size_t kIp6AddrSize
void WriteIpAddress(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
static const uint32_t kInvalidLabel
std::string ToXmppIdString() const
void WriteSource(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
EvpnPrefix prefix_
static const EvpnPrefix kNullPrefix
static const size_t kMinInclusiveMulticastRouteSize
MacAddress mac_addr_
void BuildProtoPrefix(BgpProtoPrefix *proto_prefix, const BgpAttr *attr, uint32_t label, uint32_t l3_label=0) const
static const size_t kMinSegmentRouteSize
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
static const size_t kMinInet6PrefixRouteSize
static const size_t kMinInetPrefixRouteSize
static const size_t kMinMacAdvertisementRouteSize
uint8_t prefixlen() const
static const uint32_t kMaxVni
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
virtual void BuildProtoPrefix(BgpProtoPrefix *proto_prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
void ReadSource(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size)
static bool GetGroupFromString(EvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *errorp)
const Ip4Address ip4_addr() const
static const size_t kIp4AddrSize
Inet6Prefix inet6_prefix() const
static const size_t kMinAutoDiscoveryRouteSize
static const size_t kRdSize
IpAddress source() const
IpAddress ip_address_
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
static const uint32_t kMaxTag
Ip4Prefix inet_prefix() const
static const size_t kMinSelectiveMulticastRouteSize
uint8_t type() const
virtual bool IsLess(const DBEntry &genrhs) const
virtual std::string ToXmppIdString() const
void ReadGroup(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size)
static const size_t kTagSize
DISALLOW_COPY_AND_ASSIGN(EvpnRoute)
uint8_t ip_address_length() const
int CompareTo(const EvpnPrefix &rhs) const
std::string ToString() const
static const int32_t kMaxVniSigned
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
static const size_t kEsiSize
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void ReadIpAddress(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size, size_t ip_psize)
bool operator>(const EvpnPrefix &rhs) const
const EvpnPrefix & GetPrefix() const
static EvpnPrefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
const EthernetSegmentId & esi() const
IpAddress group() const
IpAddress ip_address() const
bool operator!=(const EvpnPrefix &rhs) const
size_t GetIpAddressSize() const
bool IsMoreSpecific(const EvpnPrefix &rhs) const
virtual void SetKey(const DBRequestKey *reqkey)
const RouteDistinguisher & route_distinguisher() const
std::string xmpp_id_str_
RouteDistinguisher rd_
static bool GetSourceFromString(EvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *errorp)
Address::Family family_
static int FromProtoPrefix(BgpServer *server, const BgpProtoPrefix &proto_prefix, const BgpAttr *attr, const Address::Family family, EvpnPrefix *evpn_prefix, BgpAttrPtr *new_attr, uint32_t *label, uint32_t *l3_label=NULL)
const Ip6Address ip6_addr() const
void set_route_distinguisher(const RouteDistinguisher &rd)
static const uint32_t kNullTag
Address::Family family() const
virtual bool IsValid() const
virtual std::string ToString() const