OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
interface_uve_stats_table.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
7 #include <uve/agent_uve_stats.h>
8 
10  uint32_t default_intvl)
11  : InterfaceUveTable(agent, default_intvl) {
12 }
13 
15 }
16 
18  EndpointSecurityStats *obj) const {
19  assert(!entry->deleted_);
20  const VmInterface *vm_intf = entry->intf_;
21  if (vm_intf->cfg_name().empty()) {
22  return false;
23  }
24  entry->FillEndpointStats(agent_, obj);
25  return true;
26 }
27 
29  VMIStats *uve) const {
30  uint64_t in_band = 0, out_band = 0;
31  bool diff_fip_list_non_zero = false;
32  VmInterfaceStats if_stats;
33  vector<VmFloatingIPStats> agg_fip_list;
34  vector<VmFloatingIPStats> diff_fip_list;
35 
36  const VmInterface *vm_intf = entry->intf_;
37  assert(!entry->deleted_);
38  if (vm_intf->cfg_name().empty()) {
39  return false;
40  }
41  uve->set_name(vm_intf->cfg_name());
42  entry->SetVMIStatsVnVm(uve);
43 
44  const Interface *intf = static_cast<const Interface *>(vm_intf);
45  AgentUveStats *agent_uve = static_cast<AgentUveStats *>(agent_->uve());
47  agent_uve->stats_manager()->GetInterfaceStats(intf);
48  if (s == NULL) {
49  return false;
50  }
51 
52  AgentDropStats ds;
53  agent_uve->stats_manager()->BuildDropStats(s->drop_stats, ds);
54  uve->set_raw_drop_stats(ds);
55 
56  /* Send aggregate interface stats always */
57  if_stats.set_in_pkts(s->in_pkts);
58  if_stats.set_in_bytes(s->in_bytes);
59  if_stats.set_out_pkts(s->out_pkts);
60  if_stats.set_out_bytes(s->out_bytes);
61  uve->set_raw_if_stats(if_stats);
62 
63  /* Compute bandwidth only if there is change in statistics */
64  uint64_t in_b, out_b;
65  s->GetDiffStats(&in_b, &out_b);
66  if ((in_b != 0) || (out_b != 0)) {
67  in_band = GetVmPortBandwidth(s, true);
68  out_band = GetVmPortBandwidth(s, false);
69  }
70 
71  if (entry->InBandChanged(in_band)) {
72  uve->set_in_bw_usage(in_band);
73  entry->uve_stats_.set_in_bw_usage(in_band);
74  }
75  if (entry->OutBandChanged(out_band)) {
76  uve->set_out_bw_usage(out_band);
77  entry->uve_stats_.set_out_bw_usage(out_band);
78  }
80 
81  /* Make sure that update of prev_in_bytes and prev_out_bytes are done only
82  * after GetVmPortBandwidth is done for both directions as they get used
83  * in those APIs. */
84  s->UpdatePrevStats();
85 
86  PortBucketBitmap map;
87  L4PortBitmap &port_bmap = entry->port_bitmap_;
88  port_bmap.Encode(map);
89  if (entry->PortBitmapChanged(map)) {
90  uve->set_port_bucket_bmap(map);
91  entry->uve_stats_.set_port_bucket_bmap(map);
92  }
93 
94  FrameFipStatsMsg(vm_intf, agg_fip_list, diff_fip_list,
95  diff_fip_list_non_zero);
96  if (entry->FipAggStatsChanged(agg_fip_list)) {
97  uve->set_fip_agg_stats(agg_fip_list);
98  entry->uve_stats_.set_fip_agg_stats(agg_fip_list);
99  }
100  /* Diff stats need not be sent if the value of the stats is 0.
101  * If any of the entry in diff_fip_list has non-zero stats, then
102  * diff_fip_list_non_zero is expected to be true */
103  if (diff_fip_list_non_zero) {
104  uve->set_fip_diff_stats(diff_fip_list);
105  }
106 
107  VrouterFlowRate flow_rate;
108  uint64_t created = 0, aged = 0;
109  uint32_t active_flows = 0;
110  agent_->pkt()->get_flow_proto()->InterfaceFlowCount(vm_intf, &created,
111  &aged, &active_flows);
112  bool built = agent_uve->stats_manager()->BuildFlowRate(s->added, s->deleted,
113  s->flow_info,
114  flow_rate);
115  if (built) {
116  flow_rate.set_active_flows(active_flows);
117  uve->set_flow_rate(flow_rate);
118  }
119  /* Populate TagSet and policy-list in UVE */
120  entry->FillTagSetAndPolicyList(uve);
121 
122  return true;
123 }
124 
126  if (entry->deleted_) {
127  return;
128  }
129  VMIStats uve;
130 
131  bool send = FrameInterfaceStatsMsg(entry, &uve);
132  if (send) {
133  DispatchVMIStatsMsg(uve);
134  }
135  EndpointSecurityStats *obj_log = ENDPOINT_SECURITY_STATS_CREATE();
136  send = FrameInterfaceObjectLog(entry, obj_log);
137  if (send) {
139  }
140 }
141 
143  InterfaceMap::iterator it = interface_tree_.begin();
144  while (it != interface_tree_.end()) {
145  UveInterfaceEntry* entry = it->second.get();
146  {
147  tbb::mutex::scoped_lock lock(entry->mutex_);
148  SendInterfaceStatsMsg(entry);
149  }
150  it++;
151  }
152 }
153 
155  (StatsManager::InterfaceStats *s, bool dir_in) const {
156  if (s->stats_time == 0) {
157  return 0;
158  }
159  uint64_t bits;
160  if (dir_in) {
161  bits = (s->in_bytes - s->prev_in_bytes) * 8;
162  } else {
163  bits = (s->out_bytes - s->prev_out_bytes) * 8;
164  }
165  uint64_t cur_time = UTCTimestampUsec();
166  uint64_t b_intvl = agent_->uve()->bandwidth_intvl();
167  uint64_t diff_seconds = (cur_time - s->stats_time) / b_intvl;
168  if (diff_seconds == 0) {
169  return 0;
170  }
171  return bits/diff_seconds;
172 }
173 
175  Interface *intf = dynamic_cast<Interface *>
177  if (intf == NULL) {
178  return;
179  }
180  tbb::mutex::scoped_lock lock(interface_tree_mutex_);
181  VmInterface *vmi = static_cast<VmInterface *>(intf);
182  InterfaceMap::iterator intf_it = interface_tree_.find(vmi->cfg_name());
183 
184  /*
185  * 1. VM interface with floating-ip becomes active
186  * 2. Flow is created on this interface and interface floating ip info is
187  * stored in flow record
188  * 3. VM Interface is disassociated from VM
189  * 4. VM Interface info is removed from interface_tree_ because of
190  * disassociation
191  * 5. FlowStats collection task initiates export of flow stats
192  * 6. Since interface is absent in interface_tree_ we cannot update
193  * stats in this case
194  */
195  if (intf_it != interface_tree_.end()) {
196  UveInterfaceEntry *entry = intf_it->second.get();
197  entry->UpdateFloatingIpStats(fip_info);
198  }
199 }
200 
202  vector<VmFloatingIPStats> &fip_list,
203  vector<VmFloatingIPStats> &diff_list,
204  bool &diff_list_send) const {
205  bool changed = false;
206  diff_list_send = false;
207  InterfaceMap::const_iterator it = interface_tree_.find(itf->cfg_name());
208 
209  if (it != interface_tree_.end()) {
210  UveInterfaceEntry *entry = it->second.get();
211  changed = entry->FillFloatingIpStats(fip_list, diff_list,
212  diff_list_send);
213  }
214  return changed;
215 }
216 
217 
219  (const string &name, uint8_t proto, uint16_t sport, uint16_t dport) {
220  tbb::mutex::scoped_lock lock(interface_tree_mutex_);
221  InterfaceMap::const_iterator it = interface_tree_.find(name);
222 
223  if (it != interface_tree_.end()) {
224  UveInterfaceEntry *entry = it->second.get();
225  entry->UpdatePortBitmap(proto, sport, dport);
226  }
227 }
228 
230  (uint32_t fip, const string &vn, Interface *intf) {
231  tbb::mutex::scoped_lock lock(interface_tree_mutex_);
232  VmInterface *vmi = static_cast<VmInterface *>(intf);
233  InterfaceMap::iterator intf_it = interface_tree_.find(vmi->cfg_name());
234 
235  if (intf_it == interface_tree_.end()) {
236  return NULL;
237  }
238 
239  UveInterfaceEntry *entry = intf_it->second.get();
240  return entry->FipEntry(fip, vn);
241 }
242 
244  (const FlowUveStatsRequest *req) {
245  if (!req->sg_info_valid()) {
246  return;
247  }
248  InterfaceMap::iterator intf_it = interface_tree_.find(req->interface());
249 
250  if (intf_it != interface_tree_.end()) {
251  UveInterfaceEntry *entry = intf_it->second.get();
252  entry->UpdateInterfaceAceStats(req->sg_rule_uuid());
253  }
254 }
255 
257  const FlowUveFwPolicyInfo &info) {
258  if (!info.is_valid_) {
259  return false;
260  }
261  InterfaceMap::iterator intf_it = interface_tree_.find(itf);
262 
263  if (intf_it != interface_tree_.end()) {
264  UveInterfaceEntry *entry = intf_it->second.get();
265  /* We don't send EndpointSecurityStats objectlog for deleted interfaces.
266  * So, there is no need to update stats on deleted interfaces */
267  if (entry->deleted_) {
268  return false;
269  }
270  entry->UpdateInterfaceFwPolicyStats(info);
271  return true;
272  }
273  return false;
274 }
275 
277  UveInterfaceEntry *entry) {
278  VMIStats uve;
279  if (entry->FrameInterfaceAceStatsMsg(name, &uve)) {
280  DispatchVMIStatsMsg(uve);
281  }
282 }
283 
285  &info) {
286  tbb::mutex::scoped_lock lock(interface_tree_mutex_);
287  InterfaceMap::iterator intf_it = interface_tree_.find(info.vmi->cfg_name());
288  if (intf_it != interface_tree_.end()) {
289  UveInterfaceEntry *entry = intf_it->second.get();
290  entry->UpdateSecurityPolicyStats(info);
291  }
292 }
293 
294 void InterfaceUveStatsTable::BuildInterfaceUveInfo(InterfaceUveInfoResp *r) {
295 
296  vector<InterfaceUveInfo> &list =
297  const_cast<std::vector<InterfaceUveInfo>&>(r->get_resp_list());
298  tbb::mutex::scoped_lock lock(interface_tree_mutex_);
299  InterfaceMap::iterator intf_it = interface_tree_.begin();
300  while (intf_it != interface_tree_.end()) {
301  InterfaceUveInfo item;
302  UveInterfaceEntry *entry = intf_it->second.get();
303  ++intf_it;
304  entry->BuildInterfaceUveInfo(&item);
305  list.push_back(item);
306  }
307 
308 }
309 
310 void InterfaceUveInfoReq::HandleRequest() const {
311  InterfaceUveInfoResp *resp = new InterfaceUveInfoResp();
312  Agent *agent = Agent::GetInstance();
313  InterfaceUveStatsTable *table = static_cast<InterfaceUveStatsTable *>
314  (agent->uve()->interface_uve_table());
315  table->BuildInterfaceUveInfo(resp);
316  resp->set_context(context());
317  resp->Response();
318  return;
319 }
StatsManager * stats_manager() const
const std::string & sg_rule_uuid() const
void UpdatePortBitmap(uint8_t proto, uint16_t sport, uint16_t dport)
void UpdateInterfaceAceStats(const std::string &ace_uuid)
void BuildInterfaceUveInfo(InterfaceUveInfoResp *r)
bool FrameInterfaceObjectLog(UveInterfaceEntry *entry, EndpointSecurityStats *obj) const
void SetVMIStatsVnVm(VMIStats *uve) const
static Agent * GetInstance()
Definition: agent.h:436
InterfaceMap interface_tree_
bool FipAggStatsChanged(const vector< VmFloatingIPStats > &list) const
void UpdateSecurityPolicyStats(const EndpointStatsInfo &info)
AgentUveBase * uve() const
Definition: agent.cc:909
const VmInterface * vmi
InterfaceUveTable::FloatingIp * FipEntry(uint32_t fip, const string &vn, Interface *intf)
void SendInterfaceStatsMsg(UveInterfaceEntry *entry)
AgentDBEntry * FindActiveEntry(const DBEntry *key)
Definition: agent_db.cc:110
InterfaceTable * interface_table() const
Definition: agent.h:465
tbb::mutex interface_tree_mutex_
void BuildDropStats(const vr_drop_stats_req &r, AgentDropStats &ds) const
bool IncrInterfaceEndpointHits(const std::string &itf, const FlowUveFwPolicyInfo &info)
virtual void DispatchInterfaceObjectLog(EndpointSecurityStats *obj)
bool FrameFipStatsMsg(const VmInterface *vm_intf, vector< VmFloatingIPStats > &fip_list, vector< VmFloatingIPStats > &diff_list, bool &diff_list_send) const
void UpdatePortBitmap(const string &name, uint8_t proto, uint16_t sport, uint16_t dport)
void UpdateInterfaceFwPolicyStats(const FlowUveFwPolicyInfo &info)
uint64_t GetVmPortBandwidth(StatsManager::InterfaceStats *s, bool dir_in) const
void UpdateFloatingIpStats(const FipInfo &fip_info)
void SendInterfaceAceStats(const string &name, UveInterfaceEntry *entry)
Definition: agent.h:358
bool OutBandChanged(uint64_t out_band) const
bool InBandChanged(uint64_t in_band) const
FlowRateComputeInfo flow_info
Definition: stats_manager.h:56
bool FrameInterfaceStatsMsg(UveInterfaceEntry *entry, VMIStats *uve) const
const std::string & interface() const
vr_drop_stats_req drop_stats
Definition: stats_manager.h:60
InterfaceUveStatsTable(Agent *agent, uint32_t default_intvl)
bool PortBitmapChanged(const PortBucketBitmap &bmap) const
bool FillFloatingIpStats(vector< VmFloatingIPStats > &result, vector< VmFloatingIPStats > &diff_list, bool &diff_list_send)
void FillEndpointStats(Agent *agent, EndpointSecurityStats *obj)
AgentStats::FlowCounters deleted
Definition: stats_manager.h:58
bool BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const
virtual void DispatchVMIStatsMsg(const VMIStats &uve)
FlowProto * get_flow_proto() const
Definition: pkt_init.h:43
InterfaceUveTable * interface_uve_table() const
InterfaceUveTable::FloatingIp * FipEntry(uint32_t ip, const std::string &vn)
void UpdateFloatingIpStats(const FipInfo &fip_info)
void UpdateVmiTagBasedStats(const EndpointStatsInfo &info)
bool FrameInterfaceAceStatsMsg(const std::string &name, VMIStats *s_intf)
AgentStats::FlowCounters added
Definition: stats_manager.h:57
static uint64_t UTCTimestampUsec()
Definition: time_util.h:13
const std::string & cfg_name() const
void BuildInterfaceUveInfo(InterfaceUveInfo *r) const
void IncrInterfaceAceStats(const FlowUveStatsRequest *req)
PktModule * pkt() const
Definition: agent.cc:965
void GetDiffStats(uint64_t *in_b, uint64_t *out_b) const
void InterfaceFlowCount(const Interface *intf, uint64_t *created, uint64_t *aged, uint32_t *active_flows) const
Definition: flow_proto.cc:925
InterfaceStats * GetInterfaceStats(const Interface *intf)
void Encode(PortBucketBitmap &bmap)