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