diff --git a/src/discovery/client/discovery_client.cc b/src/discovery/client/discovery_client.cc index ef57342ea8d..b895d9290ed 100644 --- a/src/discovery/client/discovery_client.cc +++ b/src/discovery/client/discovery_client.cc @@ -644,7 +644,7 @@ void DiscoveryServiceClient::SubscribeResponseHandler(std::string &xmls, hdr->sub_rcvd_++; hdr->attempts_ = 0; - if ((hdr->chksum_ == gen_chksum) || (ds_response.size() == 0)) { + if (ds_response.size() == 0) { //Restart Subscribe Timer hdr->StartSubscribeTimer(ttl); DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler", @@ -656,8 +656,10 @@ void DiscoveryServiceClient::SubscribeResponseHandler(std::string &xmls, return; //No change in message, ignore } - DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler", - serviceName, xmls); + if (hdr->chksum_ != gen_chksum) { + DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler", + serviceName, xmls); + } // Update connection info ConnectionState::GetInstance()->Update(ConnectionType::DISCOVERY, serviceName, ConnectionStatus::UP, ds_endpoint_, diff --git a/src/vnsw/agent/cmn/agent.h b/src/vnsw/agent/cmn/agent.h index 5b21ec4148f..6d981e7d270 100644 --- a/src/vnsw/agent/cmn/agent.h +++ b/src/vnsw/agent/cmn/agent.h @@ -391,6 +391,50 @@ class Agent { // TODO: Should they be moved under controller/dns/cfg? + // Discovery Control-Node Server Response + const std::string &controller_ifmap_discovery_xmpp_server(uint8_t idx) const { + return xs_disc_addr_[idx]; + } + void set_controller_ifmap_discovery_xmpp_server(const std::string &addr, uint8_t idx) { + xs_disc_addr_[idx] = addr; + } + const uint32_t controller_ifmap_discovery_xmpp_port(uint8_t idx) const { + return xs_disc_port_[idx]; + } + void set_controller_ifmap_discovery_xmpp_port(uint32_t port, uint8_t idx) { + xs_disc_port_[idx] = port; + } + void reset_controller_ifmap_discovery_xmpp_servers() { + uint8_t count = 0; + while (count < MAX_XMPP_SERVERS) { + xs_disc_addr_[count].clear(); + xs_disc_port_[count] = 0; + count++; + } + } + + // Discovery Dns Server Response + const std::string &dns_discovery_server(uint8_t idx) const { + return dns_disc_addr_[idx]; + } + void set_dns_discovery_server(const std::string &addr, uint8_t idx) { + dns_disc_addr_[idx] = addr; + } + const uint32_t dns_discovery_port(uint8_t idx) const { + return dns_disc_port_[idx]; + } + void set_dns_discovery_port(uint32_t port, uint8_t idx) { + dns_disc_port_[idx] = port; + } + void reset_dns_discovery_servers() { + uint8_t count = 0; + while (count < MAX_XMPP_SERVERS) { + dns_disc_addr_[count].clear(); + dns_disc_port_[count] = 0; + count++; + } + } + // Common XMPP Client for control-node and config clients const std::string &controller_ifmap_xmpp_server(uint8_t idx) const { return xs_addr_[idx]; @@ -983,6 +1027,11 @@ class Agent { uint32_t dns_port_[MAX_XMPP_SERVERS]; bool dns_auth_enable_[MAX_XMPP_SERVERS]; std::string dns_server_cert_[MAX_XMPP_SERVERS]; + // Discovery Responses + std::string xs_disc_addr_[MAX_XMPP_SERVERS]; + uint32_t xs_disc_port_[MAX_XMPP_SERVERS]; + std::string dns_disc_addr_[MAX_XMPP_SERVERS]; + uint32_t dns_disc_port_[MAX_XMPP_SERVERS]; // Discovery std::string dss_addr_; uint32_t dss_port_; diff --git a/src/vnsw/agent/controller/controller.sandesh b/src/vnsw/agent/controller/controller.sandesh index 2b8dbe9ca64..8bc3bc2132d 100644 --- a/src/vnsw/agent/controller/controller.sandesh +++ b/src/vnsw/agent/controller/controller.sandesh @@ -41,6 +41,12 @@ struct AgentXmppDnsData { 12: string xmpp_auth_type; } +struct AgentDiscoveryXmppConnections { + 1: string agent_controller_ip; + 2: u32 agent_controller_port; + 3: string discovery_controller_ip; + 4: u32 discovery_controller_port; +} traceobject sandesh AgentXmppTrace { 1: string peer; @@ -126,3 +132,17 @@ request sandesh AgentDnsXmppConnectionStatusReq { response sandesh AgentDnsXmppConnectionStatus { 1: listpeer; } + +request sandesh AgentDiscoveryXmppConnectionsRequest { +} + +response sandesh AgentDiscoveryXmppConnectionsResponse { + 1: listxmppc; +} + +request sandesh AgentDiscoveryDnsXmppConnectionsRequest { +} + +response sandesh AgentDiscoveryDnsXmppConnectionsResponse { + 1: listxmppc; +} diff --git a/src/vnsw/agent/controller/controller_init.cc b/src/vnsw/agent/controller/controller_init.cc index 6c402dbf4c3..22a20a2335d 100644 --- a/src/vnsw/agent/controller/controller_init.cc +++ b/src/vnsw/agent/controller/controller_init.cc @@ -310,31 +310,30 @@ void VNController::DeleteConnectionInfo(const std::string &addr, bool is_dns) void VNController::DisConnectControllerIfmapServer(uint8_t idx) { - DeleteConnectionInfo(agent_->controller_ifmap_xmpp_server(idx), - false); - - // Managed Delete of XmppClient object, which deletes the - // dependent XmppClientConnection object and - // scoped XmppChannel object - XmppClient *xc = agent_->controller_ifmap_xmpp_client(idx); - xc->UnRegisterConnectionEvent(xmps::BGP); - xc->Shutdown(); // ManagedDelete - agent_->set_controller_ifmap_xmpp_client(NULL, idx); - - //cleanup AgentXmppChannel - agent_->ResetAgentMcastLabelRange(idx); + DeleteConnectionInfo(agent_->controller_ifmap_xmpp_server(idx), false); + + // Managed Delete of XmppClient object, which deletes the + // dependent XmppClientConnection object and + // scoped XmppChannel object + XmppClient *xc = agent_->controller_ifmap_xmpp_client(idx); + xc->UnRegisterConnectionEvent(xmps::BGP); + xc->Shutdown(); // ManagedDelete + agent_->set_controller_ifmap_xmpp_client(NULL, idx); + + //cleanup AgentXmppChannel + agent_->ResetAgentMcastLabelRange(idx); DeleteAgentXmppChannel(agent_->controller_xmpp_channel(idx)); - agent_->set_controller_xmpp_channel(NULL, idx); + agent_->set_controller_xmpp_channel(NULL, idx); - //cleanup AgentIfmapXmppChannel + //cleanup AgentIfmapXmppChannel delete agent_->ifmap_xmpp_channel(idx); - agent_->set_ifmap_xmpp_channel(NULL, idx); + agent_->set_ifmap_xmpp_channel(NULL, idx); - agent_->controller_ifmap_xmpp_init(idx)->Reset(); - delete agent_->controller_ifmap_xmpp_init(idx); - agent_->set_controller_ifmap_xmpp_init(NULL, idx); + agent_->controller_ifmap_xmpp_init(idx)->Reset(); + delete agent_->controller_ifmap_xmpp_init(idx); + agent_->set_controller_ifmap_xmpp_init(NULL, idx); - agent_->reset_controller_ifmap_xmpp_server(idx); + agent_->reset_controller_ifmap_xmpp_server(idx); } bool VNController::AgentXmppServerExists(const std::string &server_ip, @@ -360,12 +359,17 @@ void VNController::ApplyDiscoveryXmppServices(std::vector resp) { bool VNController::ApplyDiscoveryXmppServicesInternal(std::vector resp) { std::vector::iterator iter; int8_t count = -1; + agent_->reset_controller_ifmap_discovery_xmpp_servers(); for (iter = resp.begin(); iter != resp.end(); iter++) { DSResponse dr = *iter; count ++; CONTROLLER_TRACE(DiscoveryConnection, "XMPP Discovery Server Response", count, dr.ep.address().to_string(), integerToString(dr.ep.port())); + agent_->set_controller_ifmap_discovery_xmpp_server( + dr.ep.address().to_string(), count); + agent_->set_controller_ifmap_discovery_xmpp_port( + dr.ep.port(), count); AgentXmppChannel *chnl = FindAgentXmppChannel(dr.ep.address().to_string()); if (chnl) { @@ -425,17 +429,21 @@ bool VNController::ApplyDiscoveryXmppServicesInternal(std::vector re } } - /* Remove stale Servers */ + /* Remove stale Servers if DOWN */ for (uint8_t idx = 0; idx < MAX_XMPP_SERVERS; idx++) { if (agent_->controller_xmpp_channel(idx) != NULL) { if (!AgentXmppServerExists( - agent_->controller_ifmap_xmpp_server(idx), resp)) { + agent_->controller_ifmap_xmpp_server(idx), resp)) { - CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Xmpp ", - idx, agent_->controller_ifmap_xmpp_server(idx), ""); - DisConnectControllerIfmapServer(idx); - agent_->reset_controller_ifmap_xmpp_server(idx); + if (agent_->controller_xmpp_channel(idx)->GetXmppChannel()-> + GetPeerState() == xmps::NOT_READY) { + + CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Xmpp ", + idx, agent_->controller_ifmap_xmpp_server(idx), ""); + DisConnectControllerIfmapServer(idx); + agent_->reset_controller_ifmap_xmpp_server(idx); + } } } } @@ -488,12 +496,15 @@ void VNController::ApplyDiscoveryDnsXmppServices(std::vector resp) { std::vector::iterator iter; int8_t count = -1; + agent_->reset_dns_discovery_servers(); for (iter = resp.begin(); iter != resp.end(); iter++) { DSResponse dr = *iter; count++; CONTROLLER_TRACE(DiscoveryConnection, "DNS Discovery Server Response", count, dr.ep.address().to_string(), integerToString(dr.ep.port())); + agent_->set_dns_discovery_server(dr.ep.address().to_string(), count); + agent_->set_dns_discovery_port(dr.ep.port(), count); AgentDnsXmppChannel *chnl = FindAgentDnsXmppChannel(dr.ep.address().to_string()); if (chnl) { @@ -551,21 +562,25 @@ void VNController::ApplyDiscoveryDnsXmppServices(std::vector resp) { } } - /* Remove stale Servers */ + /* Remove stale Servers if DOWN*/ for (uint8_t idx = 0; idx < MAX_XMPP_SERVERS; idx++) { if (agent_->dns_xmpp_channel(idx) != NULL) { - if (AgentXmppServerExists( - agent_->dns_server(idx), resp)) { - - CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Dns Xmpp", - idx, agent_->dns_server(idx), ""); - DisConnectDnsServer(idx); - agent_->reset_dns_server(idx); + if (!AgentXmppServerExists( + agent_->dns_server(idx), resp)) { + + if (agent_->dns_xmpp_channel(idx)->GetXmppChannel()-> + GetPeerState() == xmps::NOT_READY) { + + CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Dns Xmpp", + idx, agent_->dns_server(idx), ""); + DisConnectDnsServer(idx); + agent_->reset_dns_server(idx); + } } } } - + DnsXmppServerConnect(); } diff --git a/src/vnsw/agent/controller/controller_sandesh.cc b/src/vnsw/agent/controller/controller_sandesh.cc index f75e6aafbe3..fa297d01e61 100644 --- a/src/vnsw/agent/controller/controller_sandesh.cc +++ b/src/vnsw/agent/controller/controller_sandesh.cc @@ -34,7 +34,8 @@ void AgentXmppConnectionStatusReq::HandleRequest() const { data.set_mcast_controller("No"); } - if (Agent::GetInstance()->ifmap_active_xmpp_server().compare(Agent::GetInstance()->controller_ifmap_xmpp_server(count)) == 0) { + if (Agent::GetInstance()->ifmap_active_xmpp_server().compare + (Agent::GetInstance()->controller_ifmap_xmpp_server(count)) == 0) { data.set_cfg_controller("Yes"); } else { data.set_cfg_controller("No"); @@ -128,3 +129,70 @@ void AgentDnsXmppConnectionStatusReq::HandleRequest() const { resp->set_more(false); resp->Response(); } + +void AgentDiscoveryXmppConnectionsRequest::HandleRequest() const { + uint8_t count = 0; + AgentDiscoveryXmppConnectionsResponse *resp = + new AgentDiscoveryXmppConnectionsResponse(); + + while (count < MAX_XMPP_SERVERS) { + + AgentDiscoveryXmppConnections data; + if (!Agent::GetInstance()->controller_ifmap_xmpp_server(count).empty()) { + data.set_agent_controller_ip( + Agent::GetInstance()->controller_ifmap_xmpp_server(count)); + data.set_agent_controller_port( + Agent::GetInstance()->controller_ifmap_xmpp_port(count)); + } + if (!Agent::GetInstance()-> + controller_ifmap_discovery_xmpp_server(count).empty()) { + data.set_discovery_controller_ip(Agent::GetInstance()-> + controller_ifmap_discovery_xmpp_server(count)); + data.set_discovery_controller_port(Agent::GetInstance()-> + controller_ifmap_discovery_xmpp_port(count)); + } + + std::vector &list = + const_cast&>(resp->get_xmppc()); + list.push_back(data); + + count++; + } + + resp->set_context(context()); + resp->set_more(false); + resp->Response(); +} + +void AgentDiscoveryDnsXmppConnectionsRequest::HandleRequest() const { + uint8_t dns_count = 0; + AgentDiscoveryDnsXmppConnectionsResponse *resp = + new AgentDiscoveryDnsXmppConnectionsResponse(); + + while (dns_count < MAX_XMPP_SERVERS) { + + AgentDiscoveryXmppConnections data; + if (!Agent::GetInstance()->dns_server(dns_count).empty()) { + data.set_agent_controller_ip( + Agent::GetInstance()->dns_server(dns_count)); + data.set_agent_controller_port( + Agent::GetInstance()->dns_server_port(dns_count)); + } + if (!Agent::GetInstance()->dns_discovery_server(dns_count).empty()) { + data.set_discovery_controller_ip( + Agent::GetInstance()->dns_discovery_server(dns_count)); + data.set_discovery_controller_port( + Agent::GetInstance()->dns_discovery_port(dns_count)); + } + + std::vector &list = + const_cast&>(resp->get_xmppc()); + list.push_back(data); + + dns_count++; + } + + resp->set_context(context()); + resp->set_more(false); + resp->Response(); +}