LCOV - code coverage report
Current view: top level - control-node - control_node.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 151 172 87.8 %
Date: 2026-09-21 02:11:39 Functions: 1 3 33.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : 
       5             : #include "control_node.h"
       6             : 
       7             : #include <boost/assign.hpp>
       8             : #include <sys/resource.h>
       9             : 
      10             : #include "base/task.h"
      11             : #include "control-node/control_node.h"
      12             : #include "db/db.h"
      13             : 
      14             : using process::ProcessState;
      15             : 
      16             : //
      17             : // Default scheduler policy for control-node daemon and test processes.
      18             : //
      19          20 : void ControlNode::SetDefaultSchedulingPolicy() {
      20             :     static bool policy_set;
      21             : 
      22          20 :     if (policy_set)
      23           1 :         return;
      24          19 :     policy_set = true;
      25             : 
      26          19 :     TaskScheduler *scheduler = TaskScheduler::GetInstance();
      27             : 
      28             :     // Policy for bgp::Config Task.
      29             :     TaskPolicy config_policy = boost::assign::list_of
      30          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
      31          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      32          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
      33          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
      34          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      35          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
      36          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      37          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
      38          38 :         (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
      39          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      40          38 :         (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
      41          38 :         (TaskExclusion(scheduler->GetTaskId("ifmap::StateMachine")))
      42          38 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
      43          38 :         (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
      44          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
      45          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
      46          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      47          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      48          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      49          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
      50          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::Config"), config_policy);
      51             : 
      52             :     // Policy for bgp::ConfigHelper Task.
      53             :     // Same as that for bgp:Config Task except that bgp:ConfigHelper
      54             :     // is not exclusive with db::IFMapTable and ifmap::StateMachine.
      55             :     TaskPolicy config_helper_policy = boost::assign::list_of
      56          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      57          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      58          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
      59          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
      60          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      61          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
      62          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      63          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
      64          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      65          38 :         (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
      66          38 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
      67          38 :         (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
      68          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
      69          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
      70          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      71          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      72          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      73          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
      74          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::ConfigHelper"),
      75             :         config_helper_policy);
      76             : 
      77             :     // Policy for bgp::ServiceChain and bgp::StaticRoute Tasks.
      78             :     TaskPolicy static_service_chain_policy = boost::assign::list_of
      79          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      80          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
      81          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      82          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      83          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      84          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      85          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      86          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      87          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      88          19 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
      89          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::ServiceChain"),
      90             :         static_service_chain_policy);
      91          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::StaticRoute"),
      92             :         static_service_chain_policy);
      93             : 
      94             :     // Policy for bgp::StateMachine and xmpp::StateMachine Tasks.
      95             :     // Add policy to provision exclusion between io::Reader and
      96             :     // bgp/xmpp StateMachine tasks with the same task instance.
      97             :     TaskPolicy sm_policy = boost::assign::list_of
      98          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      99          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     100          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     101          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
     102          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")));
     103          95 :     for (int idx = 0; idx < scheduler->HardwareThreadCount(); ++idx) {
     104          76 :         sm_policy.push_back(
     105         152 :             (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"), idx)));
     106             :     }
     107          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::StateMachine"),
     108             :         sm_policy);
     109          19 :     scheduler->SetPolicy(scheduler->GetTaskId("xmpp::StateMachine"),
     110             :         sm_policy);
     111             : 
     112             :     // Policy for bgp::PeerMembership Task.
     113             :     TaskPolicy peer_membership_policy = boost::assign::list_of
     114          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     115          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     116          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     117          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     118          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     119          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
     120          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     121          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
     122          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
     123          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
     124          19 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")));
     125          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::PeerMembership"),
     126             :         peer_membership_policy);
     127             : 
     128             :     // Policy for bgp::SendUpdate Task.
     129             :     // Add policy to provision exclusion between db::DBTable and
     130             :     // bgp::SendUpdate tasks with the same task instance.
     131             :     TaskPolicy send_update_policy = boost::assign::list_of
     132          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     133          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     134          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     135          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")));
     136          95 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     137          76 :         send_update_policy.push_back(
     138         152 :             (TaskExclusion(scheduler->GetTaskId("db::DBTable"), idx)));
     139             :     }
     140          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::SendUpdate"),
     141             :         send_update_policy);
     142             : 
     143             :     // Policy for bgp::SendReadyTask Task.
     144             :     TaskPolicy send_ready_policy = boost::assign::list_of
     145          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     146          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     147          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     148          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
     149          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")));
     150          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::SendReadyTask"),
     151             :         send_ready_policy);
     152             : 
     153             :     // Policy for bgp::EvpnSegment Task.
     154             :     TaskPolicy evpn_segment_policy = boost::assign::list_of
     155          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     156          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     157          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     158          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     159          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     160          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     161          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
     162          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     163          19 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
     164          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::EvpnSegment"),
     165             :         evpn_segment_policy);
     166             : 
     167             :     // Policy for bgp::RTFilter Task.
     168             :     TaskPolicy rtfilter_policy = boost::assign::list_of
     169          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     170          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     171          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
     172          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     173          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")));
     174          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::RTFilter"),
     175             :         rtfilter_policy);
     176             : 
     177             :     // Policy for bgp::ResolverPath Task.
     178             :     TaskPolicy resolver_path_policy = boost::assign::list_of
     179          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     180          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     181          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     182          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     183          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     184          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
     185          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     186          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     187          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     188          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::ResolverPath"),
     189             :         resolver_path_policy);
     190             : 
     191             :     // Policy for bgp::ResolverNexthop Task.
     192             :     TaskPolicy resolver_nexthop_policy = boost::assign::list_of
     193          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     194          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     195          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     196          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     197          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")));
     198          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::ResolverNexthop"),
     199             :         resolver_nexthop_policy);
     200             : 
     201             :     // Policy for bgp::RouteAggregation Task.
     202             :     TaskPolicy route_aggregation_policy = boost::assign::list_of
     203          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     204          38 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     205          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     206          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     207          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     208          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
     209          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     210          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     211          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     212          19 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::RouteAggregation"),
     213             :         route_aggregation_policy);
     214             : 
     215             :     // Policy for db::IFMapTable Task.
     216             :     TaskPolicy db_ifmap_policy = boost::assign::list_of
     217          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     218          19 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")));
     219          19 :     scheduler->SetPolicy(scheduler->GetTaskId("db::IFMapTable"),
     220             :         db_ifmap_policy);
     221             : 
     222             :     // Policy for db::Walker Task.
     223             :     // Rules:
     224             :     // 1. All tasks that trigger WalkTable should be mutually exclusive to
     225             :     // db::Walker task
     226             :     // 2. All tasks that updates the db table partition should be mutually
     227             :     // mutually exclusive
     228             :     TaskPolicy walker_policy = boost::assign::list_of
     229             :         // Following tasks trigger WalkTable
     230          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     231          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     232          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     233          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
     234             :         // Following tasks updates db table partition
     235          38 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     236          38 :         (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
     237          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     238          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     239          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     240          38 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     241          19 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     242          19 :     scheduler->SetPolicy(scheduler->GetTaskId("db::Walker"), walker_policy);
     243          19 : }
     244             : 
     245             : // Immediately exit control-node non-gracefully without creating any core dump.
     246           0 : void ControlNode::Exit(bool do_assert) {
     247             :     rlimit new_core_limit;
     248           0 :     new_core_limit.rlim_cur = 0;
     249           0 :     new_core_limit.rlim_max = 0;
     250           0 :     setrlimit(RLIMIT_CORE, &new_core_limit);
     251           0 :     if (do_assert)
     252           0 :         assert(false);
     253           0 :     abort();
     254             : }
     255             : 
     256           0 : string ControlNode::GetProcessState(bool bgpHasSelfConfiguration,
     257             :         bool bgpIsAdminDown, bool configEndOfRibComputed,
     258             :         ProcessState::type *state, string *message) {
     259           0 :     if (!configEndOfRibComputed) {
     260           0 :         *state = ProcessState::NON_FUNCTIONAL;
     261           0 :         (*message) += (message->empty() ? "" : ", ") +
     262           0 :             string("IFMap Server End-Of-RIB not computed");
     263             :     }
     264             : 
     265           0 :     if (!bgpHasSelfConfiguration) {
     266           0 :         *state = ProcessState::NON_FUNCTIONAL;
     267           0 :         (*message) += (message->empty() ? "" : ", ") +
     268           0 :             string("No BGP configuration for self");
     269             :     }
     270             : 
     271           0 :     if (bgpIsAdminDown) {
     272           0 :         *state = ProcessState::NON_FUNCTIONAL;
     273           0 :         (*message) += (message->empty() ? "" : ", ") +
     274           0 :             string("BGP is administratively down");
     275             :     }
     276             : 
     277           0 :     return *message;
     278             : }

Generated by: LCOV version 1.14