OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
routing_policy_match.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_MATCH_H_
6 #define SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_MATCH_H_
7 
8 #include <stdint.h>
9 
10 #include <set>
11 #include <string>
12 #include <typeinfo>
13 #include <utility>
14 #include <vector>
15 
16 #include "base/regex.h"
17 #include "bgp/bgp_config.h"
18 #include "bgp/inet/inet_route.h"
19 #include "bgp/inet6/inet6_route.h"
20 
21 class BgpAttr;
22 class BgpPath;
23 class BgpRoute;
24 class Community;
25 
27 public:
28  virtual std::string ToString() const = 0;
29  virtual ~RoutingPolicyMatch() {
30  }
31  bool operator()(const BgpRoute *route,
32  const BgpPath *path, const BgpAttr *attr) const {
33  return Match(route, path, attr);
34  }
35  virtual bool Match(const BgpRoute *route,
36  const BgpPath *path, const BgpAttr *attr) const = 0;
37  virtual bool operator==(const RoutingPolicyMatch &match) const {
38  if (typeid(match) == typeid(*this))
39  return(IsEqual(match));
40  return false;
41  }
42  virtual bool operator!=(const RoutingPolicyMatch &match) const {
43  return !operator==(match);
44  }
45  virtual bool IsEqual(const RoutingPolicyMatch &match) const = 0;
46 };
47 
49 public:
50  typedef std::set<uint32_t> CommunityList;
51  typedef std::vector<std::string> CommunityRegexStringList;
52  typedef std::vector<contrail::regex> CommunityRegexList;
53 
54  MatchCommunity(const std::vector<std::string> &communities, bool match_all);
55  virtual ~MatchCommunity();
56  virtual bool Match(const BgpRoute *route,
57  const BgpPath *path, const BgpAttr *attr) const;
58  virtual std::string ToString() const;
59  virtual bool IsEqual(const RoutingPolicyMatch &community) const;
60  bool match_all() const { return match_all_; }
61  const CommunityList &communities() const { return to_match_; }
64  }
65  const CommunityRegexList &regexs() const { return to_match_regexs_; }
66 
67 private:
68  bool MatchAll(const BgpAttr *attr) const;
69  bool MatchAny(const BgpAttr *attr) const;
70 
71  bool match_all_;
75 };
76 
78 public:
79  typedef std::vector<std::string> CommunityRegexStringList;
80  typedef std::vector<contrail::regex> CommunityRegexList;
81 
82  MatchExtCommunity(const std::vector<std::string> &communities,
83  bool match_all);
84  virtual ~MatchExtCommunity();
85  virtual bool Match(const BgpRoute *route,
86  const BgpPath *path, const BgpAttr *attr) const;
87  virtual std::string ToString() const;
88  virtual bool IsEqual(const RoutingPolicyMatch &community) const;
89  bool match_all() const { return match_all_; }
91  return to_match_;
92  }
95  }
96  const CommunityRegexList &regexs() const { return to_match_regexs_; }
97  bool Find(const ExtCommunity::ExtCommunityValue &community) const;
98 
99 private:
100  bool MatchAll(const BgpAttr *attr) const;
101  bool MatchAny(const BgpAttr *attr) const;
103  const std::string &comm);
104 
109 };
110 
112 public:
124  };
125  typedef std::vector<MatchProtocolType> PathSourceList;
126  explicit MatchProtocol(const std::vector<std::string> &protocols);
127  virtual ~MatchProtocol();
128  virtual bool Match(const BgpRoute *route,
129  const BgpPath *path, const BgpAttr *attr) const;
130  virtual std::string ToString() const;
131  virtual bool IsEqual(const RoutingPolicyMatch &community) const;
132  const PathSourceList &protocols() const {
133  return to_match_;
134  }
135 
136 private:
138 };
139 const std::string MatchProtocolToString(MatchProtocol::MatchProtocolType protocol);
140 
141 template <typename T1, typename T2>
143  typedef T1 RouteT;
144  typedef T2 PrefixT;
145 };
146 
149 
150 template <typename T>
152 public:
153  typedef typename T::RouteT RouteT;
154  typedef typename T::PrefixT PrefixT;
155  enum MatchType {
159  };
160 
161  class PrefixMatch {
162  public:
164  : prefix(prefix), match_type(match_type) {
165  }
166  bool operator==(const PrefixMatch &rhs) const {
167  return (prefix == rhs.prefix && match_type == rhs.match_type);
168  }
169  bool operator<(const PrefixMatch &rhs) const {
172  return false;
173  }
174 
177  };
178 
179  explicit MatchPrefix(const PrefixMatchConfigList &match_config_list);
180  virtual ~MatchPrefix();
181  virtual bool Match(const BgpRoute *route,
182  const BgpPath *path, const BgpAttr *attr) const;
183  virtual std::string ToString() const;
184  virtual bool IsEqual(const RoutingPolicyMatch &prefix) const;
185 
186  static MatchType GetMatchType(const std::string &match_type_str);
187 
188 private:
189  template <typename U> friend class MatchPrefixTest;
190  typedef std::vector<PrefixMatch> PrefixMatchList;
191 
193 };
194 
197 
198 #endif // SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_MATCH_H_
virtual bool IsEqual(const RoutingPolicyMatch &community) const
bool Find(const ExtCommunity::ExtCommunityValue &community) const
virtual bool IsEqual(const RoutingPolicyMatch &community) const
std::vector< std::string > CommunityRegexStringList
boost::array< uint8_t, 8 > ExtCommunityValue
Definition: community.h:152
bool match_all() const
PrefixMatch(PrefixT prefix, MatchType match_type)
virtual std::string ToString() const
CommunityRegexList to_match_regexs_
virtual bool Match(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const
bool MatchAny(const BgpAttr *attr) const
PathSourceList to_match_
bool operator()(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const
virtual bool Match(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const
virtual bool Match(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const =0
virtual bool Match(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const
MatchExtCommunity(const std::vector< std::string > &communities, bool match_all)
const CommunityList & communities() const
MatchProtocol(const std::vector< std::string > &protocols)
virtual bool Match(const BgpRoute *route, const BgpPath *path, const BgpAttr *attr) const
virtual std::string ToString() const
const CommunityRegexList & regexs() const
const ExtCommunity::ExtCommunityList ExtCommunityFromString(const std::string &comm)
virtual std::string ToString() const
bool MatchAny(const BgpAttr *attr) const
virtual bool IsEqual(const RoutingPolicyMatch &match) const =0
virtual std::string ToString() const
const CommunityRegexStringList & regex_strings() const
CommunityRegexList to_match_regexs_
const CommunityRegexList & regexs() const
virtual bool IsEqual(const RoutingPolicyMatch &community) const
#define BOOL_KEY_COMPARE(x, y)
Definition: util.h:64
std::vector< PrefixMatch > PrefixMatchList
std::vector< PrefixMatchConfig > PrefixMatchConfigList
Definition: bgp_config.h:358
bool operator==(const PrefixMatch &rhs) const
PrefixMatchList match_list_
virtual bool operator!=(const RoutingPolicyMatch &match) const
std::vector< contrail::regex > CommunityRegexList
MatchPrefix< PrefixMatchInet > MatchPrefixInet
const string MatchProtocolToString(MatchProtocol::MatchProtocolType protocol)
virtual std::string ToString() const =0
std::vector< std::string > CommunityRegexStringList
const PathSourceList & protocols() const
CommunityList to_match_
const CommunityRegexStringList & regex_strings() const
std::vector< ExtCommunityValue > ExtCommunityList
Definition: community.h:153
std::vector< contrail::regex > CommunityRegexList
virtual bool IsEqual(const RoutingPolicyMatch &prefix) const
CommunityRegexStringList to_match_regex_strings_
friend class MatchPrefixTest
MatchPrefix(const PrefixMatchConfigList &match_config_list)
bool MatchAll(const BgpAttr *attr) const
PrefixMatchBase< Inet6Route, Inet6Prefix > PrefixMatchInet6
ExtCommunity::ExtCommunityList to_match_
MatchCommunity(const std::vector< std::string > &communities, bool match_all)
virtual bool operator==(const RoutingPolicyMatch &match) const
PrefixMatchBase< InetRoute, Ip4Prefix > PrefixMatchInet
MatchPrefix< PrefixMatchInet6 > MatchPrefixInet6
std::vector< MatchProtocolType > PathSourceList
bool operator<(const PrefixMatch &rhs) const
std::set< uint32_t > CommunityList
bool MatchAll(const BgpAttr *attr) const
const ExtCommunity::ExtCommunityList & communities() const
CommunityRegexStringList to_match_regex_strings_
static MatchType GetMatchType(const std::string &match_type_str)