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-10-05 02:12:29 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          24 : void ControlNode::SetDefaultSchedulingPolicy() {
      20             :     static bool policy_set;
      21             : 
      22          24 :     if (policy_set)
      23           3 :         return;
      24          21 :     policy_set = true;
      25             : 
      26          21 :     TaskScheduler *scheduler = TaskScheduler::GetInstance();
      27             : 
      28             :     // Policy for bgp::Config Task.
      29             :     TaskPolicy config_policy = boost::assign::list_of
      30          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
      31          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      32          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
      33          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
      34          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      35          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
      36          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      37          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
      38          42 :         (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
      39          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      40          42 :         (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
      41          42 :         (TaskExclusion(scheduler->GetTaskId("ifmap::StateMachine")))
      42          42 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
      43          42 :         (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
      44          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
      45          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
      46          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      47          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      48          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      49          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
      50          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      57          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      58          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
      59          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
      60          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      61          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
      62          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      63          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
      64          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      65          42 :         (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
      66          42 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
      67          42 :         (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
      68          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
      69          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
      70          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      71          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      72          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      73          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
      74          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      80          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
      81          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
      82          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
      83          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
      84          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
      85          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
      86          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
      87          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
      88          21 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
      89          21 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::ServiceChain"),
      90             :         static_service_chain_policy);
      91          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
      99          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     100          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     101          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
     102          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")));
     103         105 :     for (int idx = 0; idx < scheduler->HardwareThreadCount(); ++idx) {
     104          84 :         sm_policy.push_back(
     105         168 :             (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"), idx)));
     106             :     }
     107          21 :     scheduler->SetPolicy(scheduler->GetTaskId("bgp::StateMachine"),
     108             :         sm_policy);
     109          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     115          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     116          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     117          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     118          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     119          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
     120          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     121          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
     122          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
     123          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
     124          21 :         (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")));
     125          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     133          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     134          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     135          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")));
     136         105 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     137          84 :         send_update_policy.push_back(
     138         168 :             (TaskExclusion(scheduler->GetTaskId("db::DBTable"), idx)));
     139             :     }
     140          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     146          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     147          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     148          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
     149          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")));
     150          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     156          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     157          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     158          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     159          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     160          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     161          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
     162          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     163          21 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
     164          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     170          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     171          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
     172          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     173          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")));
     174          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     180          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     181          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     182          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     183          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     184          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
     185          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     186          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     187          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     188          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     194          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     195          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     196          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     197          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")));
     198          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     204          42 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")))
     205          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     206          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     207          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     208          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
     209          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     210          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     211          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     212          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     218          21 :         (TaskExclusion(scheduler->GetTaskId("db::Walker")));
     219          21 :     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          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
     231          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
     232          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
     233          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
     234             :         // Following tasks updates db table partition
     235          42 :         (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
     236          42 :         (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
     237          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
     238          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
     239          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
     240          42 :         (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
     241          21 :         (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
     242          21 :     scheduler->SetPolicy(scheduler->GetTaskId("db::Walker"), walker_policy);
     243          21 : }
     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