LCOV - code coverage report
Current view: top level - vnsw/agent/uve - stats_manager.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 221 409 54.0 %
Date: 2026-11-09 02:10:49 Functions: 19 27 70.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
       3             :  * Copyright Contributors to the OpenSDN project
       4             :  */
       5             : 
       6             : #include <uve/stats_manager.h>
       7             : #include <uve/vn_uve_table.h>
       8             : #include <uve/interface_uve_stats_table.h>
       9             : #include <oper/vm_interface.h>
      10             : #include <uve/agent_uve_stats.h>
      11             : 
      12           2 : StatsManager::StatsManager(Agent* agent)
      13           2 :     : vrf_listener_id_(DBTableBase::kInvalidId),
      14           2 :       intf_listener_id_(DBTableBase::kInvalidId), agent_(agent),
      15           2 :       request_queue_(agent->task_scheduler()->GetTaskId("Agent::Uve"), 0,
      16             :                      boost::bind(&StatsManager::RequestHandler, this, _1),
      17             :                      DEFAULT_FUVE_REQUEST_QUEUE_SIZE),
      18           2 :       timer_(TimerManager::CreateTimer
      19           2 :         (*(agent->event_manager())->io_service(), "IntfFlowStatsUpdateTimer",
      20           2 :          TaskScheduler::GetInstance()->GetTaskId(kTaskFlowStatsUpdate), 1)) {
      21           2 :     request_queue_.SetBounded(true);
      22           2 :     AddNamelessVrfStatsEntry();
      23           2 : }
      24             : 
      25           4 : StatsManager::~StatsManager() {
      26           4 : }
      27             : 
      28         176 : void StatsManager::AddInterfaceStatsEntry(const Interface *intf) {
      29         176 :     InterfaceStatsTree::iterator it;
      30         176 :     it = if_stats_tree_.find(intf);
      31         176 :     if (it == if_stats_tree_.end()) {
      32         176 :         InterfaceStats stats;
      33         176 :         stats.name = intf->name();
      34         176 :         if_stats_tree_.insert(InterfaceStatsPair(intf, stats));
      35         176 :     }
      36         176 : }
      37             : 
      38         176 : void StatsManager::DelInterfaceStatsEntry(const Interface *intf) {
      39         176 :     InterfaceStatsTree::iterator it;
      40         176 :     it = if_stats_tree_.find(intf);
      41         176 :     if (it != if_stats_tree_.end()) {
      42         176 :         if_stats_tree_.erase(it);
      43             :     }
      44         176 : }
      45             : 
      46           2 : void StatsManager::AddNamelessVrfStatsEntry() {
      47           2 :     VrfStats stats;
      48           2 :     stats.name = GetNamelessVrf();
      49           2 :     vrf_stats_tree_.insert(VrfStatsPair(GetNamelessVrfId(), stats));
      50           2 : }
      51             : 
      52         142 : void StatsManager::AddUpdateVrfStatsEntry(const VrfEntry *vrf) {
      53         142 :     StatsManager::VrfIdToVrfStatsTree::iterator it;
      54         142 :     it = vrf_stats_tree_.find(vrf->vrf_id());
      55         142 :     if (it == vrf_stats_tree_.end()) {
      56          10 :         VrfStats stats;
      57          10 :         stats.name = vrf->GetName();
      58          10 :         vrf_stats_tree_.insert(VrfStatsPair(vrf->vrf_id(), stats));
      59          10 :     } else {
      60             :         /* Vrf could be deleted in agent oper DB but not in Kernel. To handle
      61             :          * this case we maintain vrfstats object in StatsManager even
      62             :          * when vrf is absent in agent oper DB.  Since vrf could get deleted and
      63             :          * re-added we need to update the name in vrfstats object.
      64             :          */
      65         132 :         VrfStats *stats = &it->second;
      66         132 :         stats->name = vrf->GetName();
      67             :     }
      68         142 : }
      69             : 
      70          74 : void StatsManager::DelVrfStatsEntry(const VrfEntry *vrf) {
      71          74 :     StatsManager::VrfIdToVrfStatsTree::iterator it;
      72          74 :     it = vrf_stats_tree_.find(vrf->vrf_id());
      73          74 :     if (it != vrf_stats_tree_.end()) {
      74          74 :         VrfStats *stats = &it->second;
      75          74 :         stats->prev_discards = stats->k_discards;
      76          74 :         stats->prev_resolves = stats->k_resolves;
      77          74 :         stats->prev_receives = stats->k_receives;
      78          74 :         stats->prev_udp_mpls_tunnels = stats->k_udp_mpls_tunnels;
      79          74 :         stats->prev_udp_tunnels = stats->k_udp_tunnels;
      80          74 :         stats->prev_gre_mpls_tunnels = stats->k_gre_mpls_tunnels;
      81          74 :         stats->prev_fabric_composites = stats->k_fabric_composites;
      82          74 :         stats->prev_l2_mcast_composites = stats->k_l2_mcast_composites;
      83          74 :         stats->prev_ecmp_composites = stats->k_ecmp_composites;
      84          74 :         stats->prev_l2_encaps = stats->k_l2_encaps;
      85          74 :         stats->prev_encaps = stats->k_encaps;
      86          74 :         stats->prev_gros = stats->gros;
      87          74 :         stats->prev_diags = stats->diags;
      88          74 :         stats->prev_encap_composites = stats->encap_composites;
      89          74 :         stats->prev_evpn_composites = stats->evpn_composites;
      90          74 :         stats->prev_vrf_translates = stats->vrf_translates;
      91          74 :         stats->prev_vxlan_tunnels = stats->vxlan_tunnels;
      92          74 :         stats->prev_arp_virtual_proxy = stats->arp_virtual_proxy;
      93          74 :         stats->prev_arp_virtual_stitch = stats->arp_virtual_stitch;
      94          74 :         stats->prev_arp_virtual_flood = stats->arp_virtual_flood;
      95          74 :         stats->prev_arp_physical_stitch = stats->arp_physical_stitch;
      96          74 :         stats->prev_arp_tor_proxy = stats->arp_tor_proxy;
      97          74 :         stats->prev_arp_physical_flood = stats->arp_physical_flood;
      98          74 :         stats->prev_l2_receives = stats->l2_receives;
      99          74 :         stats->prev_uuc_floods = stats->uuc_floods;
     100             :     }
     101          74 : }
     102             : 
     103           0 : StatsManager::InterfaceStats *StatsManager::GetInterfaceStats
     104             :     (const Interface *intf) {
     105           0 :     StatsManager::InterfaceStatsTree::iterator it;
     106             : 
     107           0 :     it = if_stats_tree_.find(intf);
     108           0 :     if (it == if_stats_tree_.end()) {
     109           0 :         return NULL;
     110             :     }
     111             : 
     112           0 :     return &it->second;
     113             : }
     114             : 
     115           0 : StatsManager::VrfStats *StatsManager::GetVrfStats(int vrf_id) {
     116           0 :     StatsManager::VrfIdToVrfStatsTree::iterator it;
     117           0 :     it = vrf_stats_tree_.find(vrf_id);
     118           0 :     if (it == vrf_stats_tree_.end()) {
     119           0 :         return NULL;
     120             :     }
     121             : 
     122           0 :     return &it->second;
     123             : }
     124             : 
     125        1421 : void StatsManager::InterfaceNotify(DBTablePartBase *part, DBEntryBase *e) {
     126        1421 :     const Interface *intf = static_cast<const Interface *>(e);
     127        1421 :     const VmInterface *vmi = NULL;
     128        1421 :     bool set_state = false, reset_state = false;
     129             : 
     130             :     DBState *state = static_cast<DBState *>
     131        1421 :                       (e->GetState(part->parent(), intf_listener_id_));
     132        1421 :     switch (intf->type()) {
     133        1400 :     case Interface::VM_INTERFACE:
     134        1400 :         vmi = static_cast<const VmInterface *>(intf);
     135        1400 :         if (e->IsDeleted() || (vmi->IsUveActive() == false)) {
     136         423 :             if (state) {
     137         169 :                 reset_state = true;
     138             :             }
     139             :         } else {
     140         977 :             if (!state) {
     141         169 :                 set_state = true;
     142             :             }
     143             :         }
     144        1400 :         break;
     145          21 :     default:
     146          21 :         if (e->IsDeleted()) {
     147           7 :             if (state) {
     148           7 :                 reset_state = true;
     149             :             }
     150             :         } else {
     151          14 :             if (!state) {
     152           7 :                 set_state = true;
     153             :             }
     154             :         }
     155             :     }
     156        1421 :     if (set_state) {
     157         176 :         state = new DBState();
     158         176 :         e->SetState(part->parent(), intf_listener_id_, state);
     159         176 :         AddInterfaceStatsEntry(intf);
     160        1245 :     } else if (reset_state) {
     161         176 :         DelInterfaceStatsEntry(intf);
     162         176 :         delete state;
     163         176 :         e->ClearState(part->parent(), intf_listener_id_);
     164             :     }
     165        1421 :     return;
     166             : }
     167             : 
     168         683 : void StatsManager::VrfNotify(DBTablePartBase *part, DBEntryBase *e) {
     169         683 :     const VrfEntry *vrf = static_cast<const VrfEntry *>(e);
     170             :     DBState *state = static_cast<DBState *>
     171         683 :                       (e->GetState(part->parent(), vrf_listener_id_));
     172         683 :     if (e->IsDeleted()) {
     173         541 :         if (state) {
     174          74 :             DelVrfStatsEntry(vrf);
     175          74 :             delete state;
     176          74 :             e->ClearState(part->parent(), vrf_listener_id_);
     177             :         }
     178             :     } else {
     179         142 :         if (!state) {
     180          74 :             state = new DBState();
     181          74 :             e->SetState(part->parent(), vrf_listener_id_, state);
     182             :         }
     183         142 :         AddUpdateVrfStatsEntry(vrf);
     184             :     }
     185         683 : }
     186             : 
     187           2 : void StatsManager::RegisterDBClients() {
     188           2 :     InterfaceTable *intf_table = agent_->interface_table();
     189           2 :     intf_listener_id_ = intf_table->Register
     190           2 :         (boost::bind(&StatsManager::InterfaceNotify, this, _1, _2));
     191             : 
     192           2 :     VrfTable *vrf_table = agent_->vrf_table();
     193           2 :     vrf_listener_id_ = vrf_table->Register
     194           2 :         (boost::bind(&StatsManager::VrfNotify, this, _1, _2));
     195           2 : }
     196             : 
     197           2 : void StatsManager::Shutdown(void) {
     198           2 :     agent_->vrf_table()->Unregister(vrf_listener_id_);
     199           2 :     agent_->interface_table()->Unregister(intf_listener_id_);
     200           2 :     request_queue_.Shutdown();
     201           2 :     if (timer_) {
     202           2 :         timer_->Cancel();
     203           2 :         TimerManager::DeleteTimer(timer_);
     204             :     }
     205           2 : }
     206             : 
     207         326 : StatsManager::InterfaceStats::InterfaceStats()
     208         326 :     : name(""), speed(0), duplexity(0), in_pkts(0), in_bytes(0),
     209         326 :     out_pkts(0), out_bytes(0), prev_in_bytes(0), prev_out_bytes(0)
     210         326 :     , prev_5min_in_bytes(0), prev_5min_out_bytes(0), stats_time(0), flow_info(),
     211         326 :     added(), deleted(), drop_stats_received(false) {
     212         326 : }
     213             : 
     214           0 : void StatsManager::InterfaceStats::UpdateStats
     215             :     (uint64_t in_b, uint64_t in_p, uint64_t out_b, uint64_t out_p) {
     216           0 :     in_bytes = in_b;
     217           0 :     in_pkts = in_p;
     218           0 :     out_bytes = out_b;
     219           0 :     out_pkts = out_p;
     220           0 : }
     221             : 
     222           0 : void StatsManager::InterfaceStats::UpdatePrevStats() {
     223           0 :     prev_in_bytes = in_bytes;
     224           0 :     prev_out_bytes = out_bytes;
     225           0 : }
     226             : 
     227           0 : void StatsManager::InterfaceStats::GetDiffStats(uint64_t *in_b,
     228             :                                                 uint64_t *out_b) const {
     229           0 :     *in_b = in_bytes - prev_in_bytes;
     230           0 :     *out_b = out_bytes - prev_out_bytes;
     231           0 : }
     232             : 
     233          12 : StatsManager::VrfStats::VrfStats()
     234          12 :     : name(""), discards(0), resolves(0), receives(0), udp_tunnels(0),
     235          12 :     udp_mpls_tunnels(0), gre_mpls_tunnels(0), ecmp_composites(0),
     236          12 :     l2_mcast_composites(0), fabric_composites(0), encaps(0), l2_encaps(0),
     237          12 :     gros(0), diags(0), encap_composites(0), evpn_composites(0),
     238          12 :     vrf_translates(0), vxlan_tunnels(0), arp_virtual_proxy(0),
     239          12 :     arp_virtual_stitch(0), arp_virtual_flood(0), arp_physical_stitch(0),
     240          12 :     arp_tor_proxy(0), arp_physical_flood(0), l2_receives(0), uuc_floods(0),
     241          12 :     prev_discards(0), prev_resolves(0), prev_receives(0), prev_udp_tunnels(0),
     242          12 :     prev_udp_mpls_tunnels(0), prev_gre_mpls_tunnels(0), prev_ecmp_composites(0),
     243          12 :     prev_l2_mcast_composites(0), prev_fabric_composites(0), prev_encaps(0),
     244          12 :     prev_l2_encaps(0), prev_gros(0), prev_diags(0), prev_encap_composites(0),
     245          12 :     prev_evpn_composites(0), prev_vrf_translates(0), prev_vxlan_tunnels(0),
     246          12 :     prev_arp_virtual_proxy(0), prev_arp_virtual_stitch(0),
     247          12 :     prev_arp_virtual_flood(0), prev_arp_physical_stitch(0),
     248          12 :     prev_arp_tor_proxy(0), prev_arp_physical_flood(0), prev_l2_receives(0),
     249          12 :     prev_uuc_floods(0), k_discards(0), k_resolves(0), k_receives(0),
     250          12 :     k_udp_tunnels(0), k_udp_mpls_tunnels(0), k_gre_mpls_tunnels(0),
     251          12 :     k_ecmp_composites(0), k_l2_mcast_composites(0), k_fabric_composites(0),
     252          12 :     k_encaps(0), k_l2_encaps(0), k_gros(0), k_diags(0), k_encap_composites(0),
     253          12 :     k_evpn_composites(0), k_vrf_translates(0), k_vxlan_tunnels(0),
     254          12 :     k_arp_virtual_proxy(0), k_arp_virtual_stitch(0), k_arp_virtual_flood(0),
     255          12 :     k_arp_physical_stitch(0), k_arp_tor_proxy(0), k_arp_physical_flood(0),
     256          12 :     k_l2_receives(0), k_uuc_floods(0) {
     257          12 : }
     258             : 
     259         226 : void StatsManager::AddFlow(const FlowUveStatsRequest *req) {
     260         226 :     FlowAceTree::iterator it = flow_ace_tree_.find(req->uuid());
     261         226 :     AgentUveStats *uve = static_cast<AgentUveStats *>(agent_->uve());
     262             :     InterfaceUveStatsTable *itable = static_cast<InterfaceUveStatsTable *>
     263         226 :         (uve->interface_uve_table());
     264         226 :     VnUveTable *vtable = static_cast<VnUveTable *>(uve->vn_uve_table());
     265         226 :     FlowUveFwPolicyInfo fw_info = req->fw_policy_info();
     266         226 :     if (fw_info.is_valid_) {
     267         138 :         assert(fw_info.added_);
     268             :     }
     269         226 :     if (it == flow_ace_tree_.end()) {
     270         150 :         InterfaceStats stats;
     271         150 :         itable->IncrInterfaceAceStats(req);
     272         150 :         bool fw_valid = itable->IncrInterfaceEndpointHits(req->interface(),
     273             :                                                           fw_info);
     274         150 :         fw_info.is_valid_ = fw_valid;
     275         150 :         vtable->IncrVnAceStats(req->vn_ace_info());
     276             :         FlowRuleMatchInfo info(req->interface(), req->sg_rule_uuid(), fw_info,
     277         150 :                                req->vn_ace_info());
     278         150 :         flow_ace_tree_.insert(FlowAcePair(req->uuid(), info));
     279         150 :     } else {
     280          76 :         FlowRuleMatchInfo &info = it->second;
     281          76 :         bool intf_changed = false;
     282          76 :         const string old_itf = info.interface;
     283          76 :         if (req->interface() != info.interface) {
     284           0 :             info.interface = req->interface();
     285           0 :             intf_changed = true;
     286             :         }
     287          76 :         if (intf_changed || (req->sg_rule_uuid() != info.sg_rule_uuid)) {
     288          29 :             itable->IncrInterfaceAceStats(req);
     289          29 :             info.sg_rule_uuid = req->sg_rule_uuid();
     290             :         }
     291         152 :         if (intf_changed ||
     292          76 :             (fw_info.is_valid_ && !info.IsFwPolicyInfoEqual(fw_info))) {
     293             :             /* When there is change either in interface-name or key of
     294             :              * Endpoint record, treat it as delete for old key and add for new
     295             :              * key.
     296             :              * (a) Increment added counter for new interface and new key
     297             :              * (b) Increment deleted counter for old interface and old key
     298             :              * (c) Update flow to point to new key
     299             :              */
     300          53 :             if (itable->IncrInterfaceEndpointHits(req->interface(), fw_info)) {
     301             :                 /* Increment deleted counter for old interface and old key */
     302           0 :                 FlowUveFwPolicyInfo old_info = info.fw_policy_info;
     303           0 :                 old_info.added_ = false;
     304           0 :                 itable->IncrInterfaceEndpointHits(old_itf, old_info);
     305             :                 /* Update the flow with new key of endpoint after delete
     306             :                  * counter is incremented */
     307           0 :                 info.fw_policy_info = fw_info;
     308           0 :             }
     309             :         }
     310          76 :         if (!info.IsVnAceInfoEqual(req->vn_ace_info())) {
     311          17 :             vtable->IncrVnAceStats(req->vn_ace_info());
     312          17 :             info.vn_ace_info = req->vn_ace_info();
     313             :         }
     314          76 :     }
     315         226 : }
     316             : 
     317         152 : void StatsManager::DeleteFlow(const FlowUveStatsRequest *req) {
     318         152 :     FlowAceTree::iterator it = flow_ace_tree_.find(req->uuid());
     319         152 :     if (it == flow_ace_tree_.end()) {
     320           2 :         return;
     321             :     }
     322         150 :     FlowRuleMatchInfo &old_fw_info = it->second;
     323         150 :     const FlowUveFwPolicyInfo &new_fw_info = req->fw_policy_info();
     324             :     /* Increment deleted counter only if add counter was incremented earlier
     325             :      * for this. This is determined by checking whether old and new keys are
     326             :      * equal */
     327         150 :     if (old_fw_info.IsFwPolicyInfoEqual(new_fw_info)) {
     328           5 :         AgentUveStats *uve = static_cast<AgentUveStats *>(agent_->uve());
     329             :         InterfaceUveStatsTable *itable = static_cast<InterfaceUveStatsTable *>
     330           5 :             (uve->interface_uve_table());
     331           5 :         itable->IncrInterfaceEndpointHits(req->interface(), new_fw_info);
     332             :     }
     333         150 :     flow_ace_tree_.erase(it);
     334             : }
     335             : 
     336         378 : void StatsManager::EnqueueEvent(const boost::shared_ptr<FlowUveStatsRequest>
     337             :                                 &req) {
     338         378 :     request_queue_.Enqueue(req);
     339         378 : }
     340             : 
     341         378 : bool StatsManager::RequestHandler(boost::shared_ptr<FlowUveStatsRequest> req) {
     342         378 :     switch (req->event()) {
     343         226 :     case FlowUveStatsRequest::ADD_FLOW:
     344         226 :         AddFlow(req.get());
     345         226 :         break;
     346         152 :     case FlowUveStatsRequest::DELETE_FLOW:
     347         152 :         DeleteFlow(req.get());
     348         152 :         break;
     349           0 :     default:
     350           0 :         assert(0);
     351             :     }
     352         378 :     return true;
     353             : }
     354             : 
     355           0 : bool StatsManager::BuildFlowRate(AgentStats::FlowCounters &created,
     356             :                                  AgentStats::FlowCounters &aged,
     357             :                                  FlowRateComputeInfo &flow_info,
     358             :                                  VrouterFlowRate &flow_rate) const {
     359           0 :     uint64_t max_add_rate = 0, min_add_rate = 0;
     360           0 :     uint64_t max_del_rate = 0, min_del_rate = 0;
     361           0 :     uint64_t cur_time = UTCTimestampUsec();
     362           0 :     if (flow_info.prev_time_) {
     363           0 :         uint64_t diff_time = cur_time - flow_info.prev_time_;
     364           0 :         uint64_t diff_secs = diff_time / 1000000;
     365           0 :         if (diff_secs) {
     366           0 :             uint64_t created_flows = created.prev_flow_count -
     367           0 :                 flow_info.prev_flow_created_;
     368           0 :             uint64_t aged_flows = aged.prev_flow_count -
     369           0 :                 flow_info.prev_flow_aged_;
     370             :             //Flow setup/delete rate are always sent
     371           0 :             if (created_flows) {
     372           0 :                 max_add_rate = created.max_flows_per_second;
     373           0 :                 min_add_rate = created.min_flows_per_second;
     374           0 :                 if (max_add_rate == AgentStats::kInvalidFlowCount) {
     375           0 :                     LOG(WARN, "Invalid max_flow_adds_per_second " << max_add_rate);
     376           0 :                     max_add_rate = 0;
     377             :                 }
     378           0 :                 if (min_add_rate == AgentStats::kInvalidFlowCount) {
     379           0 :                     LOG(WARN, "Invalid min_flow_adds_per_second " << min_add_rate);
     380           0 :                     min_add_rate = 0;
     381             :                 }
     382             :             }
     383           0 :             if (aged_flows) {
     384           0 :                 max_del_rate = aged.max_flows_per_second;
     385           0 :                 min_del_rate = aged.min_flows_per_second;
     386           0 :                 if (max_del_rate == AgentStats::kInvalidFlowCount) {
     387           0 :                     LOG(WARN, "Invalid max_flow_deletes_per_second " << max_del_rate);
     388           0 :                     max_del_rate = 0;
     389             :                 }
     390           0 :                 if (min_del_rate == AgentStats::kInvalidFlowCount) {
     391           0 :                     LOG(WARN, "Invalid min_flow_deletes_per_second " << min_del_rate);
     392           0 :                     min_del_rate = 0;
     393             :                 }
     394             :             }
     395             : 
     396           0 :             flow_rate.set_added_flows(created_flows);
     397           0 :             flow_rate.set_max_flow_adds_per_second(max_add_rate);
     398           0 :             flow_rate.set_min_flow_adds_per_second(min_add_rate);
     399           0 :             flow_rate.set_deleted_flows(aged_flows);
     400           0 :             flow_rate.set_max_flow_deletes_per_second(max_del_rate);
     401           0 :             flow_rate.set_min_flow_deletes_per_second(min_del_rate);
     402           0 :             agent_->stats()->ResetFlowMinMaxStats(created);
     403           0 :             agent_->stats()->ResetFlowMinMaxStats(aged);
     404           0 :             flow_info.prev_time_ = cur_time;
     405           0 :             flow_info.prev_flow_created_ = created.prev_flow_count;
     406           0 :             flow_info.prev_flow_aged_ = aged.prev_flow_count;
     407           0 :             flow_rate.set_hold_flows(agent_->stats()->hold_flow_count());
     408           0 :             return true;
     409             :         }
     410             :     } else {
     411           0 :         flow_info.prev_time_ = cur_time;
     412             :     }
     413           0 :     return false;
     414             : }
     415             : 
     416           0 : bool StatsManager::FlowStatsUpdate() {
     417           0 :     InterfaceStatsTree::iterator it;
     418           0 :     it = if_stats_tree_.begin();
     419           0 :     while (it != if_stats_tree_.end()) {
     420           0 :         InterfaceStats &s = it->second;
     421           0 :         uint64_t created = 0, aged = 0;
     422             :         uint32_t dummy; //not used
     423           0 :         agent_->pkt()->get_flow_proto()->InterfaceFlowCount(it->first, &created,
     424             :                                                             &aged, &dummy);
     425           0 :         agent_->stats()->UpdateFlowMinMaxStats(created, s.added);
     426           0 :         agent_->stats()->UpdateFlowMinMaxStats(aged, s.deleted);
     427           0 :         ++it;
     428             :     }
     429           0 :     return true;
     430             : }
     431             : 
     432           2 : void StatsManager::InitDone() {
     433           2 :     timer_->Start(agent_->stats()->flow_stats_update_timeout(),
     434             :         boost::bind(&StatsManager::FlowStatsUpdate, this));
     435           2 : }
     436             : 
     437           0 : void StatsManager::BuildDropStats(const vr_drop_stats_req &req,
     438             :                                   AgentDropStats &ds) const {
     439           0 :     ds.set_ds_discard(req.get_vds_discard());
     440           0 :     uint64_t drop_pkts = ds.get_ds_discard();
     441             : 
     442           0 :     ds.set_ds_pull(req.get_vds_pull());
     443           0 :     drop_pkts += ds.get_ds_pull();
     444             : 
     445           0 :     ds.set_ds_invalid_if(req.get_vds_invalid_if());
     446           0 :     drop_pkts += ds.get_ds_invalid_if();
     447             : 
     448           0 :     ds.set_ds_invalid_arp(req.get_vds_invalid_arp());
     449           0 :     drop_pkts += ds.get_ds_invalid_arp();
     450             : 
     451           0 :     ds.set_ds_trap_no_if(req.get_vds_trap_no_if());
     452           0 :     drop_pkts += ds.get_ds_trap_no_if();
     453             : 
     454           0 :     ds.set_ds_nowhere_to_go(req.get_vds_nowhere_to_go());
     455           0 :     drop_pkts += ds.get_ds_nowhere_to_go();
     456             : 
     457           0 :     ds.set_ds_flow_queue_limit_exceeded(req.get_vds_flow_queue_limit_exceeded());
     458           0 :     drop_pkts += ds.get_ds_flow_queue_limit_exceeded();
     459             : 
     460           0 :     ds.set_ds_flow_no_memory(req.get_vds_flow_no_memory());
     461           0 :     drop_pkts += ds.get_ds_flow_no_memory();
     462             : 
     463           0 :     ds.set_ds_flow_invalid_protocol(req.get_vds_flow_invalid_protocol());
     464           0 :     drop_pkts += ds.get_ds_flow_invalid_protocol();
     465             : 
     466           0 :     ds.set_ds_flow_nat_no_rflow(req.get_vds_flow_nat_no_rflow());
     467           0 :     drop_pkts += ds.get_ds_flow_nat_no_rflow();
     468             : 
     469           0 :     ds.set_ds_flow_action_drop(req.get_vds_flow_action_drop());
     470           0 :     drop_pkts += ds.get_ds_flow_action_drop();
     471             : 
     472           0 :     ds.set_ds_flow_action_invalid(req.get_vds_flow_action_invalid());
     473           0 :     drop_pkts += ds.get_ds_flow_action_invalid();
     474             : 
     475           0 :     ds.set_ds_flow_unusable(req.get_vds_flow_unusable());
     476           0 :     drop_pkts += ds.get_ds_flow_unusable();
     477             : 
     478           0 :     ds.set_ds_flow_table_full(req.get_vds_flow_table_full());
     479           0 :     drop_pkts += ds.get_ds_flow_table_full();
     480             : 
     481           0 :     ds.set_ds_interface_tx_discard(req.get_vds_interface_tx_discard());
     482           0 :     drop_pkts += ds.get_ds_interface_tx_discard();
     483             : 
     484           0 :     ds.set_ds_interface_drop(req.get_vds_interface_drop());
     485           0 :     drop_pkts += ds.get_ds_interface_drop();
     486             : 
     487           0 :     ds.set_ds_duplicated(req.get_vds_duplicated());
     488           0 :     drop_pkts += ds.get_ds_duplicated();
     489             : 
     490           0 :     ds.set_ds_push(req.get_vds_push());
     491           0 :     drop_pkts += ds.get_ds_push();
     492             : 
     493           0 :     ds.set_ds_ttl_exceeded(req.get_vds_ttl_exceeded());
     494           0 :     drop_pkts += ds.get_ds_ttl_exceeded();
     495             : 
     496           0 :     ds.set_ds_invalid_nh(req.get_vds_invalid_nh());
     497           0 :     drop_pkts += ds.get_ds_invalid_nh();
     498             : 
     499           0 :     ds.set_ds_invalid_label(req.get_vds_invalid_label());
     500           0 :     drop_pkts += ds.get_ds_invalid_label();
     501             : 
     502           0 :     ds.set_ds_invalid_protocol(req.get_vds_invalid_protocol());
     503           0 :     drop_pkts += ds.get_ds_invalid_protocol();
     504             : 
     505           0 :     ds.set_ds_interface_rx_discard(req.get_vds_interface_rx_discard());
     506           0 :     drop_pkts += ds.get_ds_interface_rx_discard();
     507             : 
     508           0 :     ds.set_ds_invalid_mcast_source(req.get_vds_invalid_mcast_source());
     509           0 :     drop_pkts += ds.get_ds_invalid_mcast_source();
     510             : 
     511           0 :     ds.set_ds_head_alloc_fail(req.get_vds_head_alloc_fail());
     512           0 :     drop_pkts += ds.get_ds_head_alloc_fail();
     513             : 
     514           0 :     ds.set_ds_pcow_fail(req.get_vds_pcow_fail());
     515           0 :     drop_pkts += ds.get_ds_pcow_fail();
     516             : 
     517           0 :     ds.set_ds_mcast_clone_fail(req.get_vds_mcast_clone_fail());
     518           0 :     drop_pkts += ds.get_ds_mcast_clone_fail();
     519             : 
     520           0 :     ds.set_ds_mcast_df_bit(req.get_vds_mcast_df_bit());
     521           0 :     drop_pkts += ds.get_ds_mcast_df_bit();
     522             : 
     523           0 :     ds.set_ds_no_memory(req.get_vds_no_memory());
     524           0 :     drop_pkts += ds.get_ds_no_memory();
     525             : 
     526           0 :     ds.set_ds_rewrite_fail(req.get_vds_rewrite_fail());
     527           0 :     drop_pkts += ds.get_ds_rewrite_fail();
     528             : 
     529           0 :     ds.set_ds_misc(req.get_vds_misc());
     530           0 :     drop_pkts += ds.get_ds_misc();
     531             : 
     532           0 :     ds.set_ds_invalid_packet(req.get_vds_invalid_packet());
     533           0 :     drop_pkts += ds.get_ds_invalid_packet();
     534             : 
     535           0 :     ds.set_ds_cksum_err(req.get_vds_cksum_err());
     536           0 :     drop_pkts += ds.get_ds_cksum_err();
     537             : 
     538           0 :     ds.set_ds_no_fmd(req.get_vds_no_fmd());
     539           0 :     drop_pkts += ds.get_ds_no_fmd();
     540             : 
     541           0 :     ds.set_ds_invalid_vnid(req.get_vds_invalid_vnid());
     542           0 :     drop_pkts += ds.get_ds_invalid_vnid();
     543             : 
     544           0 :     ds.set_ds_frag_err(req.get_vds_frag_err());
     545           0 :     drop_pkts += ds.get_ds_frag_err();
     546             : 
     547           0 :     ds.set_ds_invalid_source(req.get_vds_invalid_source());
     548           0 :     drop_pkts += ds.get_ds_invalid_source();
     549             : 
     550           0 :     ds.set_ds_l2_no_route(req.get_vds_l2_no_route());
     551           0 :     drop_pkts += ds.get_ds_l2_no_route();
     552             : 
     553           0 :     ds.set_ds_fragment_queue_fail(req.get_vds_fragment_queue_fail());
     554           0 :     drop_pkts += ds.get_ds_fragment_queue_fail();
     555             : 
     556           0 :     ds.set_ds_vlan_fwd_tx(req.get_vds_vlan_fwd_tx());
     557           0 :     drop_pkts += ds.get_ds_vlan_fwd_tx();
     558             : 
     559           0 :     ds.set_ds_vlan_fwd_enq(req.get_vds_vlan_fwd_enq());
     560           0 :     drop_pkts += ds.get_ds_vlan_fwd_enq();
     561             : 
     562           0 :     ds.set_ds_drop_new_flow(req.get_vds_drop_new_flow());
     563           0 :     drop_pkts += ds.get_ds_drop_new_flow();
     564             : 
     565           0 :     ds.set_ds_flow_evict(req.get_vds_flow_evict());
     566           0 :     drop_pkts += ds.get_ds_flow_evict();
     567             : 
     568           0 :     ds.set_ds_trap_original(req.get_vds_trap_original());
     569           0 :     drop_pkts += ds.get_ds_trap_original();
     570             : 
     571           0 :     ds.set_ds_no_frag_entry(req.get_vds_no_frag_entry());
     572           0 :     drop_pkts += ds.get_ds_no_frag_entry();
     573             : 
     574           0 :     ds.set_ds_icmp_error(req.get_vds_icmp_error());
     575           0 :     drop_pkts += ds.get_ds_icmp_error();
     576             : 
     577           0 :     ds.set_ds_clone_fail(req.get_vds_clone_fail());
     578           0 :     drop_pkts += ds.get_ds_clone_fail();
     579             : 
     580           0 :     ds.set_ds_drop_pkts(drop_pkts);
     581           0 : }

Generated by: LCOV version 1.14