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