OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
load_balance.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
6 
7 #include <boost/foreach.hpp>
8 
9 #include <algorithm>
10 #include <string>
11 #include <vector>
12 
13 using std::copy;
14 using std::string;
15 
16 // Initialize default attribute statically.
20 
22  value1 = 0; // reset all fields
23  value2 = 0; // reset all fields
26 
27  l3_source_address = true;
29  l4_protocol = true;
30  l4_source_port = true;
31  l4_destination_port = true;
32  reserved1 = false;
33 
34  reserved2 = 0;
35 
36  source_bias = false;
37 
38  reserved3 = 0;
39  reserved4 = 0;
40  reserved5 = 0;
41 }
42 
44  uint32_t value1, uint32_t value2) : value1(value1), value2(value2) {
45 }
46 
48  autogen::LoadBalanceType *lb_type) const {
49  lb_type->load_balance_fields.load_balance_field_list.clear();
51  lb_type->load_balance_fields.load_balance_field_list.push_back(
52  string("l3-source-address"));
54  lb_type->load_balance_fields.load_balance_field_list.push_back(
55  string("l3-destination-address"));
56  if (l4_protocol)
57  lb_type->load_balance_fields.load_balance_field_list.push_back(
58  string("l4-protocol"));
59  if (l4_source_port)
60  lb_type->load_balance_fields.load_balance_field_list.push_back(
61  string("l4-source-port"));
63  lb_type->load_balance_fields.load_balance_field_list.push_back(
64  string("l4-destination-port"));
65  lb_type->load_balance_decision = source_bias ? "source-bias" : "field-hash";
66 }
67 
69  const LoadBalance::LoadBalanceAttribute &other) const {
70  return value1 == other.value1 && value2 == other.value2;
71 }
72 
74  const LoadBalance::LoadBalanceAttribute &other) const {
75  return value1 != other.value1 || value2 != other.value2;
76 }
77 
79  return *this == kDefaultLoadBalanceAttribute;
80 }
81 
84  put_value(&data_[0], 4, attr.value1);
85  put_value(&data_[4], 4, attr.value2);
86 }
87 
89  copy(data.begin(), data.end(), data_.begin());
90 }
91 
93  LoadBalance();
94  if (!path)
95  return;
96  const BgpAttr *attr = path->GetAttr();
97  if (!attr)
98  return;
99  const ExtCommunity *ext_community = attr->ext_community();
100  if (!ext_community)
101  return;
102  for (const auto &comm : ext_community->communities()) {
103  if (ExtCommunity::is_load_balance(comm)) {
104  copy(comm.begin(), comm.end(), data_.begin());
105  break;
106  }
107  }
108 }
109 
111  put_value(&data_[0], 4, attr.value1);
112  put_value(&data_[4], 4, attr.value2);
113 }
114 
115 LoadBalance::LoadBalance(const autogen::LoadBalanceType &lb_type) {
117 
118  attr.source_bias = lb_type.load_balance_decision == "source-bias";
119 
120  // autogen::LoadBalanceType fields list empty should imply as standard
121  // 5-tuple fields set. xml schema does not let one specifify default values
122  // for a complex type such as a list in this case.
123  bool load_balance_default =
124  !attr.source_bias && (lb_type.load_balance_fields.begin() ==
125  lb_type.load_balance_fields.end());
126  attr.l3_source_address = load_balance_default || false;
127  attr.l3_destination_address = load_balance_default || false;
128  attr.l4_protocol = load_balance_default || false;
129  attr.l4_source_port = load_balance_default || false;
130  attr.l4_destination_port = load_balance_default || false;
131 
132  for (autogen::LoadBalanceFieldListType::const_iterator it =
133  lb_type.load_balance_fields.begin();
134  it != lb_type.load_balance_fields.end(); ++it) {
135  const string s = *it;
136  if (s == "l3-source-address") {
137  attr.l3_source_address = true;
138  continue;
139  }
140  if (s == "l3-destination-address") {
141  attr.l3_destination_address = true;
142  continue;
143  }
144  if (s == "l4-protocol") {
145  attr.l4_protocol = true;
146  continue;
147  }
148  if (s == "l4-source-port") {
149  attr.l4_source_port = true;
150  continue;
151  }
152  if (s == "l4-destination-port") {
153  attr.l4_destination_port = true;
154  continue;
155  }
156  }
157 
158  put_value(&data_[0], 4, attr.value1);
159  put_value(&data_[4], 4, attr.value2);
160 }
161 
163  attr->value1 = get_value(&data_[0], 4);
164  attr->value2 = get_value(&data_[4], 4);
165 }
166 
168  return LoadBalanceAttribute(
169  get_value_unaligned(&data_[0], 4),
170  get_value_unaligned(&data_[4], 4));
171 }
172 
175  attr.l3_source_address = flag;
176 
177  put_value(&data_[0], 4, attr.value1);
178  put_value(&data_[4], 4, attr.value2);
179 }
180 
183  attr.l3_destination_address = flag;
184 
185  put_value(&data_[0], 4, attr.value1);
186  put_value(&data_[4], 4, attr.value2);
187 }
188 
189 void LoadBalance::SetL4Protocol(bool flag) {
191  attr.l4_protocol = flag;
192 
193  put_value(&data_[0], 4, attr.value1);
194  put_value(&data_[4], 4, attr.value2);
195 }
196 
199  attr.l4_source_port = flag;
200 
201  put_value(&data_[0], 4, attr.value1);
202  put_value(&data_[4], 4, attr.value2);
203 }
204 
207  attr.l4_destination_port = flag;
208 
209  put_value(&data_[0], 4, attr.value1);
210  put_value(&data_[4], 4, attr.value2);
211 }
212 
213 void LoadBalance::SetSourceBias(bool flag) {
215  attr.source_bias = flag;
216 
217  put_value(&data_[0], 4, attr.value1);
218  put_value(&data_[4], 4, attr.value2);
219 }
220 
221 bool LoadBalance::IsPresent(const BgpPath *path) {
222  if (!path)
223  return false;
224  const BgpAttr *attr = path->GetAttr();
225  if (!attr)
226  return false;
227  const ExtCommunity *ext_community = attr->ext_community();
228  if (!ext_community)
229  return false;
230  BOOST_FOREACH(const ExtCommunity::ExtCommunityValue &comm,
231  ext_community->communities()) {
232  if (ExtCommunity::is_load_balance(comm)) {
233  return true;
234  }
235  }
236  return false;
237 }
238 
239 const bool LoadBalance::IsDefault() const {
241 }
242 
243 bool LoadBalance::operator==(const LoadBalance &other) const {
244  return ToAttribute() == other.ToAttribute();
245 }
246 
247 bool LoadBalance::operator!=(const LoadBalance &other) const {
248  return ToAttribute() != other.ToAttribute();
249 }
250 
251 void LoadBalance::ShowAttribute(ShowLoadBalance *show_load_balance) const {
252  const LoadBalanceAttribute attr = ToAttribute();
253  vector<string> fields = vector<string>();
254  if (attr.source_bias) {
255  show_load_balance->set_decision_type("source-bias");
256  show_load_balance->set_fields(fields);
257  return;
258  }
259 
260  show_load_balance->set_decision_type("field-hash");
261  if (attr.l3_source_address)
262  fields.push_back("l3-source-address");
263  if (attr.l3_destination_address)
264  fields.push_back("l3-destination-address");
265  if (attr.l4_protocol)
266  fields.push_back("l4-protocol");
267  if (attr.l4_source_port)
268  fields.push_back("l4-source-port");
269  if (attr.l4_destination_port)
270  fields.push_back("l4-destination-port");
271  show_load_balance->set_fields(fields);
272 }
273 
274 string LoadBalance::ToString() const {
275  const LoadBalanceAttribute attr = ToAttribute();
276  string str("load-balance:");
277  str += attr.source_bias ? "source-bias" : "field-hash";
278  return str;
279 }
void ShowAttribute(ShowLoadBalance *show_load_balance) const
const bool IsDefault() const
uint8_t source_bias
Definition: load_balance.h:123
boost::array< uint8_t, 8 > ExtCommunityValue
Definition: community.h:152
void SetL4Protocol(bool flag)
const LoadBalanceAttribute ToAttribute() const
static uint64_t get_value_unaligned(const uint8_t *data, int size)
Definition: parse_object.h:30
bool operator!=(const LoadBalance &other) const
static const LoadBalanceAttribute kDefaultLoadBalanceAttribute
Definition: load_balance.h:47
void SetL4DestinationPort(bool flag)
void SetSourceBias(bool flag)
static uint64_t get_value(const uint8_t *data, int size)
Definition: parse_object.h:39
static bool IsPresent(const BgpPath *path)
void Encode(autogen::LoadBalanceType *lb_type) const
Definition: load_balance.cc:47
bool operator==(const LoadBalance &other) const
boost::array< uint8_t, kSize > bytes_type
Definition: load_balance.h:44
const ExtCommunityList & communities() const
Definition: community.h:180
bool operator!=(const LoadBalanceAttribute &other) const
Definition: load_balance.cc:73
void SetL3DestinationAddress(bool flag)
bytes_type data_
Definition: load_balance.h:139
uint8_t l4_source_port
Definition: load_balance.h:116
uint8_t l4_protocol
Definition: load_balance.h:115
void SetL3SourceAddress(bool flag)
uint32_t value1
Definition: load_balance.h:107
uint32_t value2
Definition: load_balance.h:108
uint8_t l4_destination_port
Definition: load_balance.h:117
uint8_t l3_destination_address
Definition: load_balance.h:114
void SetL4SourcePort(bool flag)
const ExtCommunity * ext_community() const
Definition: bgp_attr.h:915
const BgpAttr * GetAttr() const
Definition: bgp_path.h:87
uint8_t l3_source_address
Definition: load_balance.h:113
std::string ToString() const
void FillAttribute(LoadBalanceAttribute *attr)
bool operator==(const LoadBalanceAttribute &other) const
Definition: load_balance.cc:68
static bool is_load_balance(const ExtCommunityValue &val)
Definition: community.h:372
static void put_value(uint8_t *data, int size, uint64_t value)
Definition: parse_object.h:55