13 intf_listener_id_(
DBTableBase::kInvalidId), agent_(agent),
14 request_queue_(agent->task_scheduler()->GetTaskId(
"Agent::Uve"), 0,
18 (*(agent->event_manager())->io_service(),
"IntfFlowStatsUpdateTimer",
28 InterfaceStatsTree::iterator it;
38 InterfaceStatsTree::iterator it;
52 StatsManager::VrfIdToVrfStatsTree::iterator it;
70 StatsManager::VrfIdToVrfStatsTree::iterator it;
104 StatsManager::InterfaceStatsTree::iterator it;
106 it = if_stats_tree_.find(intf);
107 if (it == if_stats_tree_.end()) {
115 StatsManager::VrfIdToVrfStatsTree::iterator it;
127 bool set_state =
false, reset_state =
false;
131 switch (intf->
type()) {
159 }
else if (reset_state) {
207 : name(
""), speed(0), duplexity(0), in_pkts(0), in_bytes(0),
208 out_pkts(0), out_bytes(0), prev_in_bytes(0), prev_out_bytes(0)
209 , prev_5min_in_bytes(0), prev_5min_out_bytes(0), stats_time(0), flow_info(),
210 added(), deleted(), drop_stats_received(false) {
214 (uint64_t in_b, uint64_t in_p, uint64_t out_b, uint64_t out_p) {
222 prev_in_bytes = in_bytes;
223 prev_out_bytes = out_bytes;
227 uint64_t *out_b)
const {
228 *in_b = in_bytes - prev_in_bytes;
229 *out_b = out_bytes - prev_out_bytes;
233 : name(
""), discards(0), resolves(0), receives(0), udp_tunnels(0),
234 udp_mpls_tunnels(0), gre_mpls_tunnels(0), ecmp_composites(0),
235 l2_mcast_composites(0), fabric_composites(0), encaps(0), l2_encaps(0),
236 gros(0), diags(0), encap_composites(0), evpn_composites(0),
237 vrf_translates(0), vxlan_tunnels(0), arp_virtual_proxy(0),
238 arp_virtual_stitch(0), arp_virtual_flood(0), arp_physical_stitch(0),
239 arp_tor_proxy(0), arp_physical_flood(0), l2_receives(0), uuc_floods(0),
240 prev_discards(0), prev_resolves(0), prev_receives(0), prev_udp_tunnels(0),
241 prev_udp_mpls_tunnels(0), prev_gre_mpls_tunnels(0), prev_ecmp_composites(0),
242 prev_l2_mcast_composites(0), prev_fabric_composites(0), prev_encaps(0),
243 prev_l2_encaps(0), prev_gros(0), prev_diags(0), prev_encap_composites(0),
244 prev_evpn_composites(0), prev_vrf_translates(0), prev_vxlan_tunnels(0),
245 prev_arp_virtual_proxy(0), prev_arp_virtual_stitch(0),
246 prev_arp_virtual_flood(0), prev_arp_physical_stitch(0),
247 prev_arp_tor_proxy(0), prev_arp_physical_flood(0), prev_l2_receives(0),
248 prev_uuc_floods(0), k_discards(0), k_resolves(0), k_receives(0),
249 k_udp_tunnels(0), k_udp_mpls_tunnels(0), k_gre_mpls_tunnels(0),
250 k_ecmp_composites(0), k_l2_mcast_composites(0), k_fabric_composites(0),
251 k_encaps(0), k_l2_encaps(0), k_gros(0), k_diags(0), k_encap_composites(0),
252 k_evpn_composites(0), k_vrf_translates(0), k_vxlan_tunnels(0),
253 k_arp_virtual_proxy(0), k_arp_virtual_stitch(0), k_arp_virtual_flood(0),
254 k_arp_physical_stitch(0), k_arp_tor_proxy(0), k_arp_physical_flood(0),
255 k_l2_receives(0), k_uuc_floods(0) {
280 bool intf_changed =
false;
341 switch (req->event()) {
357 VrouterFlowRate &flow_rate)
const {
358 uint64_t max_add_rate = 0, min_add_rate = 0;
359 uint64_t max_del_rate = 0, min_del_rate = 0;
362 uint64_t diff_time = cur_time - flow_info.
prev_time_;
363 uint64_t diff_secs = diff_time / 1000000;
374 LOG(WARN,
"Invalid max_flow_adds_per_second " << max_add_rate);
378 LOG(WARN,
"Invalid min_flow_adds_per_second " << min_add_rate);
386 LOG(WARN,
"Invalid max_flow_deletes_per_second " << max_del_rate);
390 LOG(WARN,
"Invalid min_flow_deletes_per_second " << min_del_rate);
395 flow_rate.set_added_flows(created_flows);
396 flow_rate.set_max_flow_adds_per_second(max_add_rate);
397 flow_rate.set_min_flow_adds_per_second(min_add_rate);
398 flow_rate.set_deleted_flows(aged_flows);
399 flow_rate.set_max_flow_deletes_per_second(max_del_rate);
400 flow_rate.set_min_flow_deletes_per_second(min_del_rate);
416 InterfaceStatsTree::iterator it;
420 uint64_t created = 0, aged = 0;
437 AgentDropStats &ds)
const {
438 ds.set_ds_discard(req.get_vds_discard());
439 uint64_t drop_pkts = ds.get_ds_discard();
441 ds.set_ds_pull(req.get_vds_pull());
442 drop_pkts += ds.get_ds_pull();
444 ds.set_ds_invalid_if(req.get_vds_invalid_if());
445 drop_pkts += ds.get_ds_invalid_if();
447 ds.set_ds_invalid_arp(req.get_vds_invalid_arp());
448 drop_pkts += ds.get_ds_invalid_arp();
450 ds.set_ds_trap_no_if(req.get_vds_trap_no_if());
451 drop_pkts += ds.get_ds_trap_no_if();
453 ds.set_ds_nowhere_to_go(req.get_vds_nowhere_to_go());
454 drop_pkts += ds.get_ds_nowhere_to_go();
456 ds.set_ds_flow_queue_limit_exceeded(req.get_vds_flow_queue_limit_exceeded());
457 drop_pkts += ds.get_ds_flow_queue_limit_exceeded();
459 ds.set_ds_flow_no_memory(req.get_vds_flow_no_memory());
460 drop_pkts += ds.get_ds_flow_no_memory();
462 ds.set_ds_flow_invalid_protocol(req.get_vds_flow_invalid_protocol());
463 drop_pkts += ds.get_ds_flow_invalid_protocol();
465 ds.set_ds_flow_nat_no_rflow(req.get_vds_flow_nat_no_rflow());
466 drop_pkts += ds.get_ds_flow_nat_no_rflow();
468 ds.set_ds_flow_action_drop(req.get_vds_flow_action_drop());
469 drop_pkts += ds.get_ds_flow_action_drop();
471 ds.set_ds_flow_action_invalid(req.get_vds_flow_action_invalid());
472 drop_pkts += ds.get_ds_flow_action_invalid();
474 ds.set_ds_flow_unusable(req.get_vds_flow_unusable());
475 drop_pkts += ds.get_ds_flow_unusable();
477 ds.set_ds_flow_table_full(req.get_vds_flow_table_full());
478 drop_pkts += ds.get_ds_flow_table_full();
480 ds.set_ds_interface_tx_discard(req.get_vds_interface_tx_discard());
481 drop_pkts += ds.get_ds_interface_tx_discard();
483 ds.set_ds_interface_drop(req.get_vds_interface_drop());
484 drop_pkts += ds.get_ds_interface_drop();
486 ds.set_ds_duplicated(req.get_vds_duplicated());
487 drop_pkts += ds.get_ds_duplicated();
489 ds.set_ds_push(req.get_vds_push());
490 drop_pkts += ds.get_ds_push();
492 ds.set_ds_ttl_exceeded(req.get_vds_ttl_exceeded());
493 drop_pkts += ds.get_ds_ttl_exceeded();
495 ds.set_ds_invalid_nh(req.get_vds_invalid_nh());
496 drop_pkts += ds.get_ds_invalid_nh();
498 ds.set_ds_invalid_label(req.get_vds_invalid_label());
499 drop_pkts += ds.get_ds_invalid_label();
501 ds.set_ds_invalid_protocol(req.get_vds_invalid_protocol());
502 drop_pkts += ds.get_ds_invalid_protocol();
504 ds.set_ds_interface_rx_discard(req.get_vds_interface_rx_discard());
505 drop_pkts += ds.get_ds_interface_rx_discard();
507 ds.set_ds_invalid_mcast_source(req.get_vds_invalid_mcast_source());
508 drop_pkts += ds.get_ds_invalid_mcast_source();
510 ds.set_ds_head_alloc_fail(req.get_vds_head_alloc_fail());
511 drop_pkts += ds.get_ds_head_alloc_fail();
513 ds.set_ds_pcow_fail(req.get_vds_pcow_fail());
514 drop_pkts += ds.get_ds_pcow_fail();
516 ds.set_ds_mcast_clone_fail(req.get_vds_mcast_clone_fail());
517 drop_pkts += ds.get_ds_mcast_clone_fail();
519 ds.set_ds_mcast_df_bit(req.get_vds_mcast_df_bit());
520 drop_pkts += ds.get_ds_mcast_df_bit();
522 ds.set_ds_no_memory(req.get_vds_no_memory());
523 drop_pkts += ds.get_ds_no_memory();
525 ds.set_ds_rewrite_fail(req.get_vds_rewrite_fail());
526 drop_pkts += ds.get_ds_rewrite_fail();
528 ds.set_ds_misc(req.get_vds_misc());
529 drop_pkts += ds.get_ds_misc();
531 ds.set_ds_invalid_packet(req.get_vds_invalid_packet());
532 drop_pkts += ds.get_ds_invalid_packet();
534 ds.set_ds_cksum_err(req.get_vds_cksum_err());
535 drop_pkts += ds.get_ds_cksum_err();
537 ds.set_ds_no_fmd(req.get_vds_no_fmd());
538 drop_pkts += ds.get_ds_no_fmd();
540 ds.set_ds_invalid_vnid(req.get_vds_invalid_vnid());
541 drop_pkts += ds.get_ds_invalid_vnid();
543 ds.set_ds_frag_err(req.get_vds_frag_err());
544 drop_pkts += ds.get_ds_frag_err();
546 ds.set_ds_invalid_source(req.get_vds_invalid_source());
547 drop_pkts += ds.get_ds_invalid_source();
549 ds.set_ds_l2_no_route(req.get_vds_l2_no_route());
550 drop_pkts += ds.get_ds_l2_no_route();
552 ds.set_ds_fragment_queue_fail(req.get_vds_fragment_queue_fail());
553 drop_pkts += ds.get_ds_fragment_queue_fail();
555 ds.set_ds_vlan_fwd_tx(req.get_vds_vlan_fwd_tx());
556 drop_pkts += ds.get_ds_vlan_fwd_tx();
558 ds.set_ds_vlan_fwd_enq(req.get_vds_vlan_fwd_enq());
559 drop_pkts += ds.get_ds_vlan_fwd_enq();
561 ds.set_ds_drop_new_flow(req.get_vds_drop_new_flow());
562 drop_pkts += ds.get_ds_drop_new_flow();
564 ds.set_ds_flow_evict(req.get_vds_flow_evict());
565 drop_pkts += ds.get_ds_flow_evict();
567 ds.set_ds_trap_original(req.get_vds_trap_original());
568 drop_pkts += ds.get_ds_trap_original();
570 ds.set_ds_no_frag_entry(req.get_vds_no_frag_entry());
571 drop_pkts += ds.get_ds_no_frag_entry();
573 ds.set_ds_icmp_error(req.get_vds_icmp_error());
574 drop_pkts += ds.get_ds_icmp_error();
576 ds.set_ds_clone_fail(req.get_vds_clone_fail());
577 drop_pkts += ds.get_ds_clone_fail();
579 ds.set_ds_drop_pkts(drop_pkts);
const std::string & sg_rule_uuid() const
void AddNamelessVrfStatsEntry()
void SetBounded(bool bounded)
VnUveTableBase * vn_uve_table() const
VrfStats * GetVrfStats(int vrf_id)
void IncrVnAceStats(const FlowUveVnAcePolicyInfo &info)
uint64_t prev_evpn_composites
uint64_t prev_l2_mcast_composites
FlowUveFwPolicyInfo fw_policy_info
uint64_t arp_virtual_proxy
uint32_t min_flows_per_second
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
uint64_t arp_physical_stitch
WorkQueue< boost::shared_ptr< FlowUveStatsRequest > > request_queue_
void Shutdown(bool delete_entries=true)
uint64_t prev_gre_mpls_tunnels
FlowAceTree flow_ace_tree_
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
uint64_t k_l2_mcast_composites
static const uint32_t kInvalidFlowCount
uint64_t arp_virtual_flood
uint64_t encap_composites
StatsManager(Agent *agent)
std::pair< const boost::uuids::uuid, FlowRuleMatchInfo > FlowAcePair
AgentUveBase * uve() const
InterfaceStatsTree if_stats_tree_
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
uint64_t prev_fabric_composites
AgentStats * stats() const
const FlowUveFwPolicyInfo & fw_policy_info() const
uint64_t arp_virtual_stitch
uint64_t prev_arp_physical_flood
uint64_t prev_vrf_translates
InterfaceTable * interface_table() const
uint64_t prev_udp_tunnels
void BuildDropStats(const vr_drop_stats_req &r, AgentDropStats &ds) const
bool IncrInterfaceEndpointHits(const std::string &itf, const FlowUveFwPolicyInfo &info)
const string & GetName() const
const FlowUveVnAcePolicyInfo & vn_ace_info() const
uint64_t prev_encap_composites
uint64_t prev_flow_created_
void DelVrfStatsEntry(const VrfEntry *intf)
uint32_t max_flows_per_second
void Unregister(ListenerId listener)
void ResetFlowMinMaxStats(FlowCounters &stat) const
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
bool RequestHandler(boost::shared_ptr< FlowUveStatsRequest > req)
void DeleteFlow(const FlowUveStatsRequest *req)
uint32_t hold_flow_count() const
uint64_t k_udp_mpls_tunnels
void AddInterfaceStatsEntry(const Interface *intf)
VrfIdToVrfStatsTree vrf_stats_tree_
void EnqueueEvent(const boost::shared_ptr< FlowUveStatsRequest > &req)
const std::string & interface() const
uint64_t arp_physical_flood
void UpdateFlowMinMaxStats(uint64_t total_flows, FlowCounters &stat) const
uint64_t k_fabric_composites
uint64_t prev_udp_mpls_tunnels
bool IsFwPolicyInfoEqual(const FlowUveFwPolicyInfo &info) const
#define kTaskFlowStatsUpdate
AgentStats::FlowCounters deleted
const uint32_t vrf_id() const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
std::pair< const Interface *, InterfaceStats > InterfaceStatsPair
bool BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const
FlowProto * get_flow_proto() const
VrfTable * vrf_table() const
uint64_t prev_arp_virtual_proxy
void AddFlow(const FlowUveStatsRequest *req)
InterfaceUveTable * interface_uve_table() const
uint64_t prev_l2_receives
bool IsVnAceInfoEqual(const FlowUveVnAcePolicyInfo &info) const
void InterfaceNotify(DBTablePartBase *part, DBEntryBase *e)
AgentStats::FlowCounters added
static uint64_t UTCTimestampUsec()
uint64_t prev_arp_virtual_stitch
#define DEFAULT_FUVE_REQUEST_QUEUE_SIZE
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
uint64_t prev_arp_physical_stitch
std::string GetNamelessVrf()
uint64_t k_ecmp_composites
void AddUpdateVrfStatsEntry(const VrfEntry *intf)
#define LOG(_Level, _Msg)
uint64_t prev_ecmp_composites
void DelInterfaceStatsEntry(const Interface *intf)
const std::string & name() const
void IncrInterfaceAceStats(const FlowUveStatsRequest *req)
uint64_t prev_arp_virtual_flood
uint64_t prev_arp_tor_proxy
DBTableBase::ListenerId vrf_listener_id_
void GetDiffStats(uint64_t *in_b, uint64_t *out_b) const
bool Enqueue(QueueEntryT entry)
void InterfaceFlowCount(const Interface *intf, uint64_t *created, uint64_t *aged, uint32_t *active_flows) const
std::pair< int, VrfStats > VrfStatsPair
void UpdateStats(uint64_t in_b, uint64_t in_p, uint64_t out_b, uint64_t out_p)
InterfaceStats * GetInterfaceStats(const Interface *intf)
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
int flow_stats_update_timeout() const
uint64_t prev_vxlan_tunnels
const boost::uuids::uuid & uuid() const
FlowUveVnAcePolicyInfo vn_ace_info
static bool DeleteTimer(Timer *Timer)
uint64_t k_gre_mpls_tunnels
DBTableBase::ListenerId intf_listener_id_