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