Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include <cmn/agent.h> 6 : #include <init/agent_param.h> 7 : #include <bind/bind_resolver.h> 8 : #include <vnc_cfg_types.h> 9 : #include <oper_db.h> 10 : #include <controller/controller_init.h> 11 : #include <forwarding_class.h> 12 : #include <global_system_config.h> 13 : #include <config_manager.h> 14 : #include <cfg/cfg_init.h> 15 : #include "oper/bgp_as_service.h" 16 : 17 : #define DEFAULT_XMPP_HOLD_TIME 90 18 : 19 3 : void BGPaaServiceParameters::Reset() { 20 3 : port_start = 0; 21 3 : port_end = 0; 22 3 : } 23 : 24 3 : void GracefulRestartParameters::Reset() { 25 3 : enable_ = true; 26 3 : end_of_rib_time_ = 0; 27 3 : long_lived_restart_time_ = 0; 28 3 : xmpp_helper_enable_ = true; 29 3 : config_seen_ = false; 30 3 : } 31 : 32 3 : void FastConvergenceParameters::Reset() { 33 3 : enable = false; 34 3 : xmpp_hold_time = DEFAULT_XMPP_HOLD_TIME; 35 3 : } 36 : 37 0 : void GracefulRestartParameters::Update(autogen::GlobalSystemConfig *cfg) { 38 0 : bool changed = false; 39 : 40 0 : config_seen_ = true; 41 0 : if (enable_ != cfg->graceful_restart_parameters().enable) { 42 0 : enable_ = cfg->graceful_restart_parameters().enable; 43 0 : changed = true; 44 : } 45 : 46 0 : if (xmpp_helper_enable_ != 47 0 : cfg->graceful_restart_parameters().xmpp_helper_enable) { 48 0 : xmpp_helper_enable_ = 49 0 : cfg->graceful_restart_parameters().xmpp_helper_enable; 50 0 : changed = true; 51 : } 52 : 53 0 : if (end_of_rib_time_ != 54 0 : (uint32_t)cfg->graceful_restart_parameters().end_of_rib_timeout) { 55 0 : end_of_rib_time_ = 56 0 : (uint32_t)cfg->graceful_restart_parameters().end_of_rib_timeout; 57 0 : changed = true; 58 : } 59 : 60 0 : if (long_lived_restart_time_ != 61 0 : (uint32_t)cfg->graceful_restart_parameters().long_lived_restart_time) { 62 0 : long_lived_restart_time_ = 63 0 : (uint32_t)cfg->graceful_restart_parameters().long_lived_restart_time; 64 0 : changed = true; 65 : } 66 : 67 0 : if (changed) { 68 0 : Notify(); 69 : } 70 0 : } 71 : 72 0 : void GracefulRestartParameters::Notify() { 73 0 : for (GracefulRestartParameters::CallbackList::iterator it = 74 0 : callbacks_.begin(); it != callbacks_.end(); it++) { 75 0 : (*it)(); 76 : } 77 0 : } 78 : 79 3 : void GracefulRestartParameters::Register(GracefulRestartParameters::Callback cb) 80 : { 81 3 : callbacks_.push_back(cb); 82 3 : } 83 : 84 3 : GlobalSystemConfig::GlobalSystemConfig(Agent *agent) : OperIFMapTable(agent) { 85 3 : Reset(); 86 3 : } 87 : 88 6 : GlobalSystemConfig::~GlobalSystemConfig() { 89 6 : } 90 : 91 0 : void GlobalSystemConfig::ConfigDelete(IFMapNode *node) { 92 0 : if (node->IsDeleted()) { 93 0 : Reset(); 94 : } 95 0 : } 96 : 97 3 : void GlobalSystemConfig::Reset() { 98 3 : bgpaas_parameters_.Reset(); 99 3 : gres_parameters_.Reset(); 100 3 : fc_params_.Reset(); 101 3 : cfg_igmp_enable_ = false; 102 3 : } 103 : 104 0 : void GlobalSystemConfig::ConfigAddChange(IFMapNode *node) { 105 : autogen::GlobalSystemConfig *cfg = 106 0 : dynamic_cast<autogen::GlobalSystemConfig *>(node->GetObject()); 107 : 108 0 : if (!cfg) { 109 0 : Reset(); 110 0 : return; 111 : } 112 : 113 : //Populate BGP-aas params 114 0 : if ((bgpaas_parameters_.port_start != 115 0 : cfg->bgpaas_parameters().port_start) || 116 0 : (bgpaas_parameters_.port_end != 117 0 : cfg->bgpaas_parameters().port_end)) { 118 0 : bgpaas_parameters_.port_start = cfg->bgpaas_parameters().port_start; 119 0 : bgpaas_parameters_.port_end = cfg->bgpaas_parameters().port_end; 120 : // update BgpaaS session info 121 : agent()->oper_db()->bgp_as_a_service()-> 122 0 : UpdateBgpAsAServiceSessionInfo(); 123 : } 124 : 125 : //Populate fast convergence params 126 0 : if ((fc_params_.enable != 127 0 : cfg->fast_convergence_parameters().enable) || 128 0 : (fc_params_.xmpp_hold_time != 129 0 : cfg->fast_convergence_parameters().xmpp_hold_time)) { 130 0 : fc_params_.enable = cfg->fast_convergence_parameters().enable; 131 0 : fc_params_.xmpp_hold_time = 132 0 : cfg->fast_convergence_parameters().xmpp_hold_time; 133 : // if fc_enabled is not set, use default hold time 134 0 : if (!fc_params_.enable) 135 0 : fc_params_.xmpp_hold_time = DEFAULT_XMPP_HOLD_TIME; 136 : // update hold time in existing xmpp sessions 137 0 : agent()->controller()->XmppServerUpdate(fc_params_.xmpp_hold_time); 138 : } 139 : 140 0 : if (cfg_igmp_enable_ != cfg->igmp_enable()) { 141 : 142 0 : cfg_igmp_enable_ = cfg->igmp_enable(); 143 : 144 0 : agent()->cfg()->cfg_vm_interface_table()->NotifyAllEntries(); 145 : } 146 : 147 : //Populate gres params 148 0 : gres_parameters_.Update(cfg); 149 : } 150 : 151 0 : void GlobalSystemConfig::ConfigManagerEnqueue(IFMapNode *node) { 152 0 : agent()->config_manager()->AddGlobalSystemConfigNode(node); 153 0 : } 154 : 155 26 : GracefulRestartParameters &GlobalSystemConfig::gres_parameters() { 156 26 : return gres_parameters_; 157 : } 158 : 159 70 : bool GlobalSystemConfig::cfg_igmp_enable() const { 160 70 : return cfg_igmp_enable_; 161 : } 162 : 163 0 : void GlobalSystemConfig::FillSandeshInfo(GlobalSystemConfigResp *resp) 164 : { 165 0 : BGPaaSSandeshData bgp_params; 166 0 : bgp_params.set_port_start(bgpaas_parameters_.port_start); 167 0 : bgp_params.set_end_port(bgpaas_parameters_.port_end); 168 0 : GracefulRestartSandeshData graceful_restart; 169 0 : graceful_restart.set_enable(gres_parameters_.enable()); 170 0 : graceful_restart.set_end_of_rib_time(gres_parameters_.end_of_rib_time()); 171 0 : graceful_restart.set_xmpp_helper_enable(gres_parameters_.xmpp_helper_enable()); 172 0 : graceful_restart.set_config_seen(gres_parameters_.config_seen()); 173 0 : IgmpSandeshData igmp_params; 174 0 : igmp_params.set_cfg_igmp_enable(cfg_igmp_enable()); 175 0 : resp->set_bgp_parameters(bgp_params); 176 0 : resp->set_llgr_parameters(graceful_restart); 177 0 : resp->set_igmp_parameters(igmp_params); 178 0 : } 179 : 180 0 : void GlobalSystemConfigReq::HandleRequest() const { 181 0 : GlobalSystemConfigResp *resp = new GlobalSystemConfigResp(); 182 0 : Agent *agent = Agent::GetInstance(); 183 0 : GlobalSystemConfig *global_sys_config = agent->oper_db()->global_system_config(); 184 0 : if (!global_sys_config) { 185 0 : resp->set_more(false); 186 0 : resp->Response(); 187 0 : return; 188 : } 189 0 : resp->set_context(context()); 190 0 : global_sys_config->FillSandeshInfo(resp); 191 0 : resp->set_more(false); 192 0 : resp->Response(); 193 0 : return; 194 : }