OpenSDN source code
mvpn_route.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_MVPN_MVPN_ROUTE_H_
6 #define SRC_BGP_MVPN_MVPN_ROUTE_H_
7 
8 
9 #include <set>
10 #include <string>
11 #include <vector>
12 
13 #include <boost/system/error_code.hpp>
14 
15 #include "base/util.h"
16 #include "base/address.h"
17 #include "bgp/bgp_attr.h"
18 #include "bgp/bgp_attr_base.h"
19 #include "bgp/bgp_route.h"
20 #include "net/bgp_af.h"
21 #include "net/rd.h"
22 
23 class MvpnPrefix {
24 public:
25 
26  static const size_t kRdSize;
27  static const size_t kIp4AddrSize;
28  static const size_t kIp4AddrBitSize;
29  static const size_t kAsnSize;
30  static const size_t kPrefixBytes;
31  static const size_t kIntraASPMSIADRouteSize;
32  static const size_t kInterASPMSIADRouteSize;
33  static const size_t kSPMSIADRouteSize;
34  static const size_t kLeafADRouteSize;
35  static const size_t kSourceActiveADRouteSize;
36  static const size_t kSourceTreeJoinRouteSize;
37 
38  enum RouteType {
47  };
48 
49  MvpnPrefix();
50  MvpnPrefix(uint8_t type, const RouteDistinguisher &rd,
51  const Ip4Address &originator);
52  MvpnPrefix(uint8_t type, const RouteDistinguisher &rd,
53  const uint32_t asn);
54  MvpnPrefix(uint8_t type, const RouteDistinguisher &rd,
55  const Ip4Address &group, const Ip4Address &source);
56  MvpnPrefix(uint8_t type, const Ip4Address &originator);
57  MvpnPrefix(uint8_t type, const RouteDistinguisher &rd,
58  const Ip4Address &originator,
59  const Ip4Address &group, const Ip4Address &source);
60  MvpnPrefix(uint8_t type, const RouteDistinguisher &rd, const uint32_t asn,
61  const Ip4Address &group, const Ip4Address &source);
62 
64  void SetLeafADPrefixFromSPMSIPrefix(const MvpnPrefix &prefix);
65  void SetSPMSIPrefixFromLeafADPrefix(const MvpnPrefix &prefix);
66 
67  std::string ToString() const;
68  std::string ToXmppIdString() const;
69  bool operator==(const MvpnPrefix &rhs) const;
70  int CompareTo(const MvpnPrefix &rhs) const;
71 
72  uint8_t type() const { return type_; }
73  const RouteDistinguisher &route_distinguisher() const { return rd_; }
74  Ip4Address group() const { return group_; }
75  Ip4Address source() const { return source_; }
76  Ip4Address originator() const { return originator_; }
81  uint32_t asn() const { return asn_; }
83  uint8_t ip_prefix_length() const { return ip_prefixlen_; }
84  void BuildProtoPrefix(BgpProtoPrefix *prefix) const;
85  const std::string GetType() const;
86 
87  static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix,
88  MvpnPrefix *prefix);
89  static int FromProtoPrefix(BgpServer *server,
90  const BgpProtoPrefix &proto_prefix,
91  const BgpAttr *attr,
92  const Address::Family family,
93  MvpnPrefix *prefix,
94  BgpAttrPtr *new_attr, uint32_t *label,
95  uint32_t *l3_label);
96  static MvpnPrefix FromString(const std::string &str,
97  boost::system::error_code *errorp = NULL);
98  static bool IsValid(uint8_t type);
99 
100 private:
101  static bool GetTypeFromString(MvpnPrefix *prefix,
102  const std::string &str, boost::system::error_code *errorp,
103  size_t *pos1);
104  static bool GetRDFromString(MvpnPrefix *prefix,
105  const std::string &str, size_t pos1, size_t *pos2,
106  boost::system::error_code *ec);
107  static bool GetOriginatorFromString(MvpnPrefix *prefix,
108  const std::string &str, size_t pos1,
109  boost::system::error_code *errorp);
110  static bool GetAsnFromString(MvpnPrefix *prefix,
111  const std::string &str, size_t pos1, size_t *pos2,
112  boost::system::error_code *ec);
113  static bool GetSourceFromString(MvpnPrefix *prefix,
114  const std::string &str, size_t pos1, size_t *pos2,
115  boost::system::error_code *ec);
116  static bool GetGroupFromString(MvpnPrefix *prefix,
117  const std::string &str, size_t pos1, size_t *pos2,
118  boost::system::error_code *ec, bool last = false);
119  static int SpmsiAdRouteFromProtoPrefix(const BgpProtoPrefix &proto_prefix,
120  MvpnPrefix *prefix, size_t rd_offset);
121  uint8_t type_;
126  uint8_t ip_prefixlen_;
127  uint32_t asn_;
128  std::vector<uint8_t> rt_key_;
129 };
130 
131 class MvpnRoute : public BgpRoute {
132 public:
133  explicit MvpnRoute(const MvpnPrefix &prefix);
134  virtual int CompareTo(const Route &rhs) const;
135  virtual std::string ToString() const;
136  virtual std::string ToXmppIdString() const;
137  virtual bool IsValid() const;
138 
139  const MvpnPrefix &GetPrefix() const { return prefix_; }
140 
141  virtual KeyPtr GetDBRequestKey() const;
142  virtual void SetKey(const DBRequestKey *reqkey);
143  virtual void BuildProtoPrefix(BgpProtoPrefix *prefix,
144  const BgpAttr *attr = NULL,
145  uint32_t label = 0,
146  uint32_t l3_label = 0) const;
147  virtual void BuildBgpProtoNextHop(std::vector<uint8_t> &nh,
148  IpAddress nexthop) const;
149 
150  virtual bool IsLess(const DBEntry &genrhs) const {
151  const MvpnRoute &rhs = static_cast<const MvpnRoute &>(genrhs);
152  int cmp = CompareTo(rhs);
153  return (cmp < 0);
154  }
155 
156  const std::string GetType() const;
157 
158 private:
160  mutable std::string xmpp_id_str_;
161 
163 };
164 
165 #endif // SRC_BGP_MVPN_MVPN_ROUTE_H_
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
Family
Definition: address.h:24
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
void SetLeafADPrefixFromSPMSIPrefix(const MvpnPrefix &prefix)
Definition: mvpn_route.cc:767
IpAddress originatorIpAddress() const
Definition: mvpn_route.h:79
std::string ToString() const
Definition: mvpn_route.cc:666
void SetSPMSIPrefixFromLeafADPrefix(const MvpnPrefix &prefix)
Definition: mvpn_route.cc:799
static const size_t kIntraASPMSIADRouteSize
Definition: mvpn_route.h:31
void set_route_distinguisher(const RouteDistinguisher &rd)
Definition: mvpn_route.h:82
bool operator==(const MvpnPrefix &rhs) const
Definition: mvpn_route.cc:820
Ip4Address group_
Definition: mvpn_route.h:124
static bool GetAsnFromString(MvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *ec)
Definition: mvpn_route.cc:467
static const size_t kSourceActiveADRouteSize
Definition: mvpn_route.h:35
static const size_t kPrefixBytes
Definition: mvpn_route.h:30
static int SpmsiAdRouteFromProtoPrefix(const BgpProtoPrefix &proto_prefix, MvpnPrefix *prefix, size_t rd_offset)
Definition: mvpn_route.cc:91
const std::string GetType() const
Definition: mvpn_route.cc:886
static bool GetSourceFromString(MvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *ec)
Definition: mvpn_route.cc:420
uint8_t ip_prefix_length() const
Definition: mvpn_route.h:83
static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix, MvpnPrefix *prefix)
Definition: mvpn_route.cc:111
std::vector< uint8_t > rt_key_
Definition: mvpn_route.h:128
static const size_t kInterASPMSIADRouteSize
Definition: mvpn_route.h:32
uint8_t ip_prefixlen_
Definition: mvpn_route.h:126
Ip4Address source() const
Definition: mvpn_route.h:75
void set_originator(const Ip4Address &originator)
Definition: mvpn_route.cc:227
std::string ToXmppIdString() const
Definition: mvpn_route.cc:809
uint8_t type_
Definition: mvpn_route.h:121
static const size_t kSPMSIADRouteSize
Definition: mvpn_route.h:33
uint8_t type() const
Definition: mvpn_route.h:72
static bool GetOriginatorFromString(MvpnPrefix *prefix, const std::string &str, size_t pos1, boost::system::error_code *errorp)
Definition: mvpn_route.cc:406
static bool GetRDFromString(MvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *ec)
Definition: mvpn_route.cc:385
static const size_t kAsnSize
Definition: mvpn_route.h:29
static const size_t kIp4AddrBitSize
Definition: mvpn_route.h:28
IpAddress sourceIpAddress() const
Definition: mvpn_route.h:78
static bool GetTypeFromString(MvpnPrefix *prefix, const std::string &str, boost::system::error_code *errorp, size_t *pos1)
Definition: mvpn_route.cc:365
static const size_t kSourceTreeJoinRouteSize
Definition: mvpn_route.h:36
uint32_t asn_
Definition: mvpn_route.h:127
static MvpnPrefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Definition: mvpn_route.cc:483
uint32_t asn() const
Definition: mvpn_route.h:81
static bool IsValid(uint8_t type)
Definition: mvpn_route.cc:816
@ SourceTreeJoinRoute
Definition: mvpn_route.h:46
@ SharedTreeJoinRoute
Definition: mvpn_route.h:45
@ IntraASPMSIADRoute
Definition: mvpn_route.h:40
@ SPMSIADRoute
Definition: mvpn_route.h:42
@ SourceActiveADRoute
Definition: mvpn_route.h:44
@ InterASPMSIADRoute
Definition: mvpn_route.h:41
int CompareTo(const MvpnPrefix &rhs) const
Definition: mvpn_route.cc:726
Ip4Address GetType3OriginatorFromType4Route() const
Definition: mvpn_route.cc:85
static bool GetGroupFromString(MvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *ec, bool last=false)
Definition: mvpn_route.cc:441
Ip4Address originator() const
Definition: mvpn_route.h:76
const RouteDistinguisher & route_distinguisher() const
Definition: mvpn_route.h:73
void BuildProtoPrefix(BgpProtoPrefix *prefix) const
Definition: mvpn_route.cc:241
IpAddress groupIpAddress() const
Definition: mvpn_route.h:77
static const size_t kIp4AddrSize
Definition: mvpn_route.h:27
Ip4Address source_
Definition: mvpn_route.h:125
static const size_t kRdSize
Definition: mvpn_route.h:26
Ip4Address originator_
Definition: mvpn_route.h:123
static const size_t kLeafADRouteSize
Definition: mvpn_route.h:34
RouteDistinguisher rd_
Definition: mvpn_route.h:122
Ip4Address group() const
Definition: mvpn_route.h:74
virtual int CompareTo(const Route &rhs) const
Definition: mvpn_route.cc:832
MvpnPrefix prefix_
Definition: mvpn_route.h:159
virtual std::string ToString() const
Definition: mvpn_route.cc:845
virtual std::string ToXmppIdString() const
Definition: mvpn_route.cc:849
virtual void SetKey(const DBRequestKey *reqkey)
Definition: mvpn_route.cc:862
DISALLOW_COPY_AND_ASSIGN(MvpnRoute)
MvpnRoute(const MvpnPrefix &prefix)
Definition: mvpn_route.cc:829
const std::string GetType() const
Definition: mvpn_route.cc:908
virtual bool IsValid() const
Definition: mvpn_route.cc:855
const MvpnPrefix & GetPrefix() const
Definition: mvpn_route.h:139
virtual KeyPtr GetDBRequestKey() const
Definition: mvpn_route.cc:880
std::string xmpp_id_str_
Definition: mvpn_route.h:160
virtual void BuildProtoPrefix(BgpProtoPrefix *prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
Definition: mvpn_route.cc:868
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
Definition: mvpn_route.cc:873
virtual bool IsLess(const DBEntry &genrhs) const
Definition: mvpn_route.h:150
Definition: route.h:14