OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
inet_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_INET_INET_ROUTE_H_
6 #define SRC_BGP_INET_INET_ROUTE_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "bgp/bgp_attr.h"
12 #include "bgp/bgp_route.h"
13 #include "base/address.h"
14 #include "net/bgp_af.h"
15 
16 class Ip4Prefix {
17 public:
18  Ip4Prefix() : prefixlen_(0) { }
20  : ip4_addr_(addr), prefixlen_(prefixlen) {
21  }
22  int CompareTo(const Ip4Prefix &rhs) const;
23 
24  Ip4Address addr() const { return ip4_addr_; }
25  Ip4Address ip4_addr() const { return ip4_addr_; }
26 
27  int prefixlen() const { return prefixlen_; }
28 
29  static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix,
30  Ip4Prefix *prefix);
31  static int FromProtoPrefix(BgpServer *server,
32  const BgpProtoPrefix &proto_prefix,
33  const BgpAttr *attr,
34  const Address::Family family, Ip4Prefix *prefix,
35  BgpAttrPtr *new_attr, uint32_t *label,
36  uint32_t *l3_label);
37  static Ip4Prefix FromString(const std::string &str,
38  boost::system::error_code *errorp = NULL);
39 
40  std::string ToString() const;
41 
42  bool operator==(const Ip4Prefix &rhs) const {
43  return (CompareTo(rhs) == 0);
44  }
45  bool operator!=(const Ip4Prefix &rhs) const {
46  return (CompareTo(rhs) != 0);
47  }
48  bool operator<(const Ip4Prefix &rhs) const {
49  int cmp = CompareTo(rhs);
50  return (cmp < 0);
51  }
52  bool operator>(const Ip4Prefix &rhs) const {
53  int cmp = CompareTo(rhs);
54  return (cmp > 0);
55  }
56 
57  // Check whether 'this' is more specific than rhs.
58  bool IsMoreSpecific(const Ip4Prefix &rhs) const;
59 
60 private:
63 };
64 
65 class InetRoute : public BgpRoute {
66 public:
67  explicit InetRoute(const Ip4Prefix &prefix);
68  virtual int CompareTo(const Route &rhs) const;
69  virtual std::string ToString() const { return prefix_str_; }
70  const Ip4Prefix &GetPrefix() const { return prefix_; }
71 
72  virtual KeyPtr GetDBRequestKey() const;
73  virtual void SetKey(const DBRequestKey *reqkey);
74 
75  virtual void BuildProtoPrefix(BgpProtoPrefix *prefix,
76  const BgpAttr *attr = NULL,
77  uint32_t label = 0,
78  uint32_t l3_label = 0) const;
79  virtual void BuildBgpProtoNextHop(std::vector<uint8_t> &nh,
80  IpAddress nexthop) const;
81 
82  virtual bool IsLess(const DBEntry &genrhs) const {
83  const InetRoute &rhs = static_cast<const InetRoute &>(genrhs);
84  int cmp = CompareTo(rhs);
85  return (cmp < 0);
86  }
87 
88  virtual bool IsMoreSpecific(const std::string &match) const;
89  virtual bool IsLessSpecific(const std::string &match) const;
90 
91 private:
93  std::string prefix_str_;
94 
96 };
97 
98 #endif // SRC_BGP_INET_INET_ROUTE_H_
static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix, Ip4Prefix *prefix)
Definition: inet_route.cc:15
int CompareTo(const Ip4Prefix &rhs) const
Definition: inet_route.cc:68
Ip4Address addr() const
Definition: inet_route.h:24
std::string prefix_str_
Definition: inet_route.h:93
bool operator!=(const Ip4Prefix &rhs) const
Definition: inet_route.h:45
virtual bool IsMoreSpecific(const std::string &match) const
Definition: inet_route.cc:118
bool operator==(const Ip4Prefix &rhs) const
Definition: inet_route.h:42
Family
Definition: address.h:24
boost::asio::ip::address IpAddress
Definition: address.h:13
Definition: route.h:14
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
int prefixlen() const
Definition: inet_route.h:27
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
Ip4Address ip4_addr() const
Definition: inet_route.h:25
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
Definition: inet_route.cc:178
static Ip4Prefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Definition: inet_route.cc:84
virtual int CompareTo(const Route &rhs) const
Definition: inet_route.cc:112
std::string ToString() const
Definition: inet_route.cc:60
virtual bool IsLessSpecific(const std::string &match) const
Definition: inet_route.cc:130
const Ip4Prefix & GetPrefix() const
Definition: inet_route.h:70
virtual KeyPtr GetDBRequestKey() const
Definition: inet_route.cc:141
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
bool operator<(const Ip4Prefix &rhs) const
Definition: inet_route.h:48
bool operator>(const Ip4Prefix &rhs) const
Definition: inet_route.h:52
virtual void SetKey(const DBRequestKey *reqkey)
Definition: inet_route.cc:146
bool IsMoreSpecific(const Ip4Prefix &rhs) const
Definition: inet_route.cc:96
Ip4Prefix(Ip4Address addr, int prefixlen)
Definition: inet_route.h:19
Ip4Prefix prefix_
Definition: inet_route.h:92
virtual void BuildProtoPrefix(BgpProtoPrefix *prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
Definition: inet_route.cc:152
InetRoute(const Ip4Prefix &prefix)
Definition: inet_route.cc:107
Ip4Address ip4_addr_
Definition: inet_route.h:61
int prefixlen_
Definition: inet_route.h:62
virtual bool IsLess(const DBEntry &genrhs) const
Definition: inet_route.h:82
virtual std::string ToString() const
Definition: inet_route.h:69
DISALLOW_COPY_AND_ASSIGN(InetRoute)