OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
metadata_ip.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_VNSW_AGENT_OPER_METADATA_IP_H_
6 #define SRC_VNSW_AGENT_OPER_METADATA_IP_H_
7 
8 #include <cmn/agent.h>
9 #include <cmn/index_vector.h>
10 
11 class Agent;
13 
15 // MetaDataIp module handles creation/management of LinkLocal/Metadata IP
16 // used to provide underlay to overlay access on a particular
17 // Virtual-Machine-Interface.
18 //
19 // MetaDataIP installs metadata IP route in fabric VRF with rules to set
20 // source and destination Address to be used to do NAT, which can be used
21 // to associate single interface with multiple metadata IPs defining separate
22 // NAT source/destination IP.
23 //
24 // MetaDataIP becomes active only when interface is L3 Active and have a
25 // valid mpls label associated, which needs to be used to export linklocal
26 // route
28 
29 class MetaDataIp {
30 public:
31  static const IpAddress kDefaultIp;
32 
34  LINKLOCAL = 0,
37  };
38 
39  MetaDataIp(MetaDataIpAllocator *allocator, VmInterface *intf,
40  MetaDataIpType type, bool insert_metadata_ip, bool ipv4 = true);
41  MetaDataIp(MetaDataIpAllocator *allocator, VmInterface *intf,
42  uint16_t index, bool ipv4 = true);
43  ~MetaDataIp();
44 
45  template<class IpT>
46  static IpT IndexToIpAddress(uint32_t idx){return IpT();};
47 
48  template<class IpT>
49  static uint32_t IpAddressToIndex(const IpT& ip){return 0xFFFF + 1;};
50 
51  IpAddress GetLinkLocalIp() const;
52 
54 
56 
57  IpAddress service_ip() const;
58 
59  IpAddress destination_ip() const;
60 
61  void set_destination_ip(const IpAddress &dst_ip);
62 
63  void set_active(bool active);
64 
65  void UpdateInterfaceCb();
66 
67  const Interface *GetInterface() const;
68 
69 private:
70 
71  friend class MetaDataIpAllocator;
72 
73  void UpdateRoute();
74 
76  // index represents the metadata IP in use
77  uint16_t index_;
78  // interface which MetaData IP is associated to
80  uint32_t intf_label_;
83  bool active_;
86  bool ipv4_;
88 };
89 
90 template<> Ip4Address
91 MetaDataIp::IndexToIpAddress<Ip4Address>(uint32_t idx);
92 template<> Ip6Address
93 MetaDataIp::IndexToIpAddress<Ip6Address>(uint32_t idx);
94 
95 template<> uint32_t
96 MetaDataIp::IpAddressToIndex<Ip4Address>(const Ip4Address& ip);
97 template<> uint32_t
98 MetaDataIp::IpAddressToIndex<Ip6Address>(const Ip6Address& ip);
99 
101 public:
102  MetaDataIpAllocator(Agent *agent, uint16_t start, uint16_t end);
104 
105  MetaDataIp *FindIndex(uint16_t id);
106 
107 private:
108  friend class MetaDataIp;
109 
110  uint16_t AllocateIndex(MetaDataIp *ip);
111  void AllocateIndex(MetaDataIp *ipi, uint16_t index);
112  void ReleaseIndex(MetaDataIp *ip);
113  bool CanAddRoute(MetaDataIp* ip);
114  void AddFabricRoute(MetaDataIp *ip);
115  void DelFabricRoute(MetaDataIp *ip);
116 
119  uint16_t start_;
120  uint16_t end_;
122 };
123 
124 #endif // SRC_VNSW_AGENT_OPER_METADATA_IP_H_
void AddFabricRoute(MetaDataIp *ip)
Definition: metadata_ip.cc:198
IpAddress service_ip_
Definition: metadata_ip.h:81
bool CanAddRoute(MetaDataIp *ip)
Definition: metadata_ip.cc:189
bool ipv4_
Definition: metadata_ip.h:86
MetaDataIp * FindIndex(uint16_t id)
Definition: metadata_ip.cc:167
IpAddress destination_ip_
Definition: metadata_ip.h:82
boost::asio::ip::address IpAddress
Definition: address.h:13
MetaDataIpAllocator(Agent *agent, uint16_t start, uint16_t end)
Definition: metadata_ip.cc:159
IpAddress destination_ip() const
Definition: metadata_ip.cc:119
IndexVector< MetaDataIp * > index_table_
Definition: metadata_ip.h:118
IpAddress service_ip() const
Definition: metadata_ip.cc:94
const Interface * GetInterface() const
Definition: metadata_ip.cc:145
MetaDataIp(MetaDataIpAllocator *allocator, VmInterface *intf, MetaDataIpType type, bool insert_metadata_ip, bool ipv4=true)
Definition: metadata_ip.cc:14
DISALLOW_COPY_AND_ASSIGN(MetaDataIpAllocator)
uint8_t type
Definition: load_balance.h:109
Ip6Address GetLinkLocalIp6() const
Definition: metadata_ip.cc:90
Definition: agent.h:358
void UpdateRoute()
Definition: metadata_ip.cc:149
VmInterface * intf_
Definition: metadata_ip.h:79
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
uint32_t intf_label_
Definition: metadata_ip.h:80
void DelFabricRoute(MetaDataIp *ip)
Definition: metadata_ip.cc:238
IpAddress GetLinkLocalIp() const
Definition: metadata_ip.cc:79
uint16_t index_
Definition: metadata_ip.h:77
void ReleaseIndex(MetaDataIp *ip)
Definition: metadata_ip.cc:184
uint16_t AllocateIndex(MetaDataIp *ip)
Definition: metadata_ip.cc:172
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
static IpT IndexToIpAddress(uint32_t idx)
Definition: metadata_ip.h:46
bool insert_metadata_ip_
Definition: metadata_ip.h:85
void set_destination_ip(const IpAddress &dst_ip)
Definition: metadata_ip.cc:126
static const IpAddress kDefaultIp
Definition: metadata_ip.h:31
void set_active(bool active)
Definition: metadata_ip.cc:130
MetaDataIpType type_
Definition: metadata_ip.h:84
DISALLOW_COPY_AND_ASSIGN(MetaDataIp)
Ip4Address GetLinkLocalIp4() const
Definition: metadata_ip.cc:86
bool active_
Definition: metadata_ip.h:83
static uint32_t IpAddressToIndex(const IpT &ip)
Definition: metadata_ip.h:49
void UpdateInterfaceCb()
Definition: metadata_ip.cc:138
MetaDataIpAllocator * allocator_
Definition: metadata_ip.h:75