OpenSDN source code
inet_route.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  * Copyright Contributors to the OpenSDN project
4  */
5 
6 #ifndef SRC_BGP_INET_INET_ROUTE_H_
7 #define SRC_BGP_INET_INET_ROUTE_H_
8 
9 #include <string>
10 #include <vector>
11 
12 #include "bgp/bgp_attr.h"
13 #include "bgp/bgp_route.h"
14 #include "base/address.h"
15 #include "net/bgp_af.h"
16 
17 class Ip4Prefix {
18 public:
19  Ip4Prefix() : prefixlen_(0) { }
22  }
23  int CompareTo(const Ip4Prefix &rhs) const;
24 
25  Ip4Address addr() const { return ip4_addr_; }
26  Ip4Address ip4_addr() const { return ip4_addr_; }
27 
28  int prefixlen() const { return prefixlen_; }
29 
30  static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix,
31  Ip4Prefix *prefix);
32  static int FromProtoPrefix(BgpServer *server,
33  const BgpProtoPrefix &proto_prefix,
34  const BgpAttr *attr,
35  const Address::Family family, Ip4Prefix *prefix,
36  BgpAttrPtr *new_attr, uint32_t *label,
37  uint32_t *l3_label);
38  static Ip4Prefix FromString(const std::string &str,
39  boost::system::error_code *errorp = NULL);
40 
41  std::string ToString() const;
42 
43  bool operator==(const Ip4Prefix &rhs) const {
44  return (CompareTo(rhs) == 0);
45  }
46  bool operator!=(const Ip4Prefix &rhs) const {
47  return (CompareTo(rhs) != 0);
48  }
49  bool operator<(const Ip4Prefix &rhs) const {
50  int cmp = CompareTo(rhs);
51  return (cmp < 0);
52  }
53  bool operator>(const Ip4Prefix &rhs) const {
54  int cmp = CompareTo(rhs);
55  return (cmp > 0);
56  }
57 
58  // Check whether 'this' is more specific than rhs.
59  bool IsMoreSpecific(const Ip4Prefix &rhs) const;
60 
61 private:
64 };
65 
66 class InetRoute : public BgpRoute {
67 public:
68  explicit InetRoute(const Ip4Prefix &prefix);
69  virtual int CompareTo(const Route &rhs) const;
70  virtual std::string ToString() const { return prefix_str_; }
71  const Ip4Prefix &GetPrefix() const { return prefix_; }
72 
73  virtual KeyPtr GetDBRequestKey() const;
74  virtual void SetKey(const DBRequestKey *reqkey);
75 
76  virtual void BuildProtoPrefix(BgpProtoPrefix *prefix,
77  const BgpAttr *attr = NULL,
78  uint32_t label = 0,
79  uint32_t l3_label = 0) const;
80  virtual void BuildBgpProtoNextHop(std::vector<uint8_t> &nh,
81  IpAddress nexthop) const;
82 
83  virtual bool IsLess(const DBEntry &genrhs) const {
84  const InetRoute &rhs = static_cast<const InetRoute &>(genrhs);
85  int cmp = CompareTo(rhs);
86  return (cmp < 0);
87  }
88 
89  virtual bool IsMoreSpecific(const std::string &match) const;
90  virtual bool IsLessSpecific(const std::string &match) const;
91 
92 private:
94  std::string prefix_str_;
95 
97 };
98 
99 #endif // SRC_BGP_INET_INET_ROUTE_H_
boost::asio::ip::address IpAddress
Definition: address.h:14
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:15
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:999
Family
Definition: address.h:25
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
virtual KeyPtr GetDBRequestKey() const
Definition: inet_route.cc:142
DISALLOW_COPY_AND_ASSIGN(InetRoute)
const Ip4Prefix & GetPrefix() const
Definition: inet_route.h:71
std::string prefix_str_
Definition: inet_route.h:94
virtual void BuildProtoPrefix(BgpProtoPrefix *prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
Definition: inet_route.cc:153
virtual std::string ToString() const
Definition: inet_route.h:70
virtual void SetKey(const DBRequestKey *reqkey)
Definition: inet_route.cc:147
virtual bool IsMoreSpecific(const std::string &match) const
Definition: inet_route.cc:119
virtual bool IsLess(const DBEntry &genrhs) const
Definition: inet_route.h:83
virtual int CompareTo(const Route &rhs) const
Definition: inet_route.cc:113
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
Definition: inet_route.cc:179
virtual bool IsLessSpecific(const std::string &match) const
Definition: inet_route.cc:131
Ip4Prefix prefix_
Definition: inet_route.h:93
InetRoute(const Ip4Prefix &prefix)
Definition: inet_route.cc:108
int prefixlen() const
Definition: inet_route.h:28
bool operator!=(const Ip4Prefix &rhs) const
Definition: inet_route.h:46
Ip4Prefix(Ip4Address addr, int prefixlen)
Definition: inet_route.h:20
bool IsMoreSpecific(const Ip4Prefix &rhs) const
Definition: inet_route.cc:97
Ip4Address ip4_addr() const
Definition: inet_route.h:26
static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix, Ip4Prefix *prefix)
Definition: inet_route.cc:16
bool operator==(const Ip4Prefix &rhs) const
Definition: inet_route.h:43
int prefixlen_
Definition: inet_route.h:63
Ip4Address ip4_addr_
Definition: inet_route.h:62
Ip4Address addr() const
Definition: inet_route.h:25
int CompareTo(const Ip4Prefix &rhs) const
Definition: inet_route.cc:69
std::string ToString() const
Definition: inet_route.cc:61
bool operator<(const Ip4Prefix &rhs) const
Definition: inet_route.h:49
bool operator>(const Ip4Prefix &rhs) const
Definition: inet_route.h:53
static Ip4Prefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Definition: inet_route.cc:85
Definition: route.h:15