OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
inet6_route.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_INET6_INET6_ROUTE_H_
6 #define SRC_BGP_INET6_INET6_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 Inet6Prefix {
17 public:
18  static const uint8_t kMaxV6PrefixLen = Address::kMaxV6PrefixLen;
19 
22  : ip6_addr_(addr), prefixlen_(prefixlen) {
23  }
24  int CompareTo(const Inet6Prefix &rhs) const;
25 
26  Ip6Address addr() const { return ip6_addr_; }
27  Ip6Address ip6_addr() const { return ip6_addr_; }
28 
29  const Ip6Address::bytes_type ToBytes() const {
30  return ip6_addr_.to_bytes();
31  }
32 
33  int prefixlen() const { return prefixlen_; }
34 
35  static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix,
36  Inet6Prefix *prefix);
37  static int FromProtoPrefix(BgpServer *server,
38  const BgpProtoPrefix &proto_prefix,
39  const BgpAttr *attr,
40  const Address::Family family,
41  Inet6Prefix *prefix, BgpAttrPtr *new_attr,
42  uint32_t *label, uint32_t *l3_label);
43  static Inet6Prefix FromString(const std::string &str,
44  boost::system::error_code *errorp = NULL);
45  std::string ToString() const;
46 
47  bool operator==(const Inet6Prefix &rhs) const {
48  return (CompareTo(rhs) == 0);
49  }
50  bool operator!=(const Inet6Prefix &rhs) const {
51  return (CompareTo(rhs) != 0);
52  }
53  bool operator<(const Inet6Prefix &rhs) const {
54  int cmp = CompareTo(rhs);
55  return (cmp < 0);
56  }
57  bool operator>(const Inet6Prefix &rhs) const {
58  int cmp = CompareTo(rhs);
59  return (cmp > 0);
60  }
61 
62  // Check whether 'this' is more specific than rhs.
63  bool IsMoreSpecific(const Inet6Prefix &rhs) const;
64 
65  Inet6Prefix operator&(const Inet6Prefix& rhs) const;
66 
67 private:
68  Ip6Address::bytes_type ToBytes() { return ip6_addr_.to_bytes(); }
69 
72 };
73 
74 class Inet6Route : public BgpRoute {
75 public:
76  explicit Inet6Route(const Inet6Prefix &prefix);
77  virtual int CompareTo(const Route &rhs) const;
78  virtual std::string ToString() const { return prefix_str_; }
79 
80  const Inet6Prefix &GetPrefix() const { return prefix_; }
81 
82  virtual KeyPtr GetDBRequestKey() const;
83  virtual void SetKey(const DBRequestKey *reqkey);
84 
85  virtual void BuildProtoPrefix(BgpProtoPrefix *prefix,
86  const BgpAttr *attr = NULL,
87  uint32_t label = 0,
88  uint32_t l3_label = 0) const;
89  virtual void BuildBgpProtoNextHop(std::vector<uint8_t> &nh,
90  IpAddress nexthop) const;
91 
92  virtual bool IsLess(const DBEntry &genrhs) const {
93  const Inet6Route &rhs = static_cast<const Inet6Route &>(genrhs);
94  int cmp = CompareTo(rhs);
95  return (cmp < 0);
96  }
97 
98  virtual bool IsMoreSpecific(const std::string &match) const;
99  virtual bool IsLessSpecific(const std::string &match) const;
100 
101 private:
103  std::string prefix_str_;
104 
106 };
107 
108 class Inet6Masks {
109 public:
110  static void Init();
111  static void Clear();
112  static const Inet6Prefix& PrefixlenToMask(uint8_t prefix_len);
113 private:
114  static Inet6Prefix CalculateMaskFromPrefixlen(int prefixlen);
115 
116  static std::vector<Inet6Prefix> masks_;
117  static bool initialized_;
118 };
119 
120 #endif // SRC_BGP_INET6_INET6_ROUTE_H_
Inet6Prefix prefix_
Definition: inet6_route.h:102
static bool initialized_
Definition: inet6_route.h:117
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
Definition: inet6_route.cc:159
static const uint8_t kMaxV6PrefixLen
Definition: address.h:22
virtual bool IsMoreSpecific(const std::string &match) const
Definition: inet6_route.cc:110
static void Init()
Definition: inet6_route.cc:184
virtual bool IsLess(const DBEntry &genrhs) const
Definition: inet6_route.h:92
Family
Definition: address.h:24
boost::asio::ip::address IpAddress
Definition: address.h:13
virtual void SetKey(const DBRequestKey *reqkey)
Definition: inet6_route.cc:138
static int FromProtoPrefix(const BgpProtoPrefix &proto_prefix, Inet6Prefix *prefix)
Definition: inet6_route.cc:15
DISALLOW_COPY_AND_ASSIGN(Inet6Route)
Definition: route.h:14
static std::vector< Inet6Prefix > masks_
Definition: inet6_route.h:116
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
int CompareTo(const Inet6Prefix &rhs) const
Definition: inet6_route.cc:42
Inet6Route(const Inet6Prefix &prefix)
Definition: inet6_route.cc:99
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
static Inet6Prefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Definition: inet6_route.cc:58
Inet6Prefix operator&(const Inet6Prefix &rhs) const
Definition: inet6_route.cc:81
Ip6Address addr() const
Definition: inet6_route.h:26
virtual void BuildProtoPrefix(BgpProtoPrefix *prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
Definition: inet6_route.cc:144
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
std::string ToString() const
Definition: inet6_route.cc:36
Ip6Address ip6_addr_
Definition: inet6_route.h:70
Inet6Prefix(Ip6Address addr, int prefixlen)
Definition: inet6_route.h:21
virtual KeyPtr GetDBRequestKey() const
Definition: inet6_route.cc:133
const Ip6Address::bytes_type ToBytes() const
Definition: inet6_route.h:29
int prefixlen_
Definition: inet6_route.h:71
Ip6Address ip6_addr() const
Definition: inet6_route.h:27
virtual std::string ToString() const
Definition: inet6_route.h:78
static const uint8_t kMaxV6PrefixLen
Definition: inet6_route.h:18
bool operator>(const Inet6Prefix &rhs) const
Definition: inet6_route.h:57
bool operator!=(const Inet6Prefix &rhs) const
Definition: inet6_route.h:50
int prefixlen() const
Definition: inet6_route.h:33
bool operator<(const Inet6Prefix &rhs) const
Definition: inet6_route.h:53
static void Clear()
Definition: inet6_route.cc:192
static Inet6Prefix CalculateMaskFromPrefixlen(int prefixlen)
Definition: inet6_route.cc:197
bool operator==(const Inet6Prefix &rhs) const
Definition: inet6_route.h:47
const Inet6Prefix & GetPrefix() const
Definition: inet6_route.h:80
Ip6Address::bytes_type ToBytes()
Definition: inet6_route.h:68
virtual bool IsLessSpecific(const std::string &match) const
Definition: inet6_route.cc:122
virtual int CompareTo(const Route &rhs) const
Definition: inet6_route.cc:104
bool IsMoreSpecific(const Inet6Prefix &rhs) const
Definition: inet6_route.cc:69
static const Inet6Prefix & PrefixlenToMask(uint8_t prefix_len)
Definition: inet6_route.cc:179
std::string prefix_str_
Definition: inet6_route.h:103