From 1a530df40b56341239048f485cc07441893f222a Mon Sep 17 00:00:00 2001 From: Naveen N Date: Tue, 25 Oct 2016 14:26:32 +0530 Subject: [PATCH] * Retry vrouter dpdk datagram socket connect upon error. Upon agent restart, agent can connect to dpdk_pkt0 socket before sending reset to vrouter. Once reset happens dpdk_pkt0 socket would be deleted, and readded again at which point agent should retry connect. Fixing the same. Closes-bug:#1636025 Change-Id: If24f254c6faffb3bd50ac672832c90992e0f4a3b --- .../agent/contrail/pkt0_interface_base.cc | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vnsw/agent/contrail/pkt0_interface_base.cc b/src/vnsw/agent/contrail/pkt0_interface_base.cc index 9a0cfb1cea8..683cbe31dce 100644 --- a/src/vnsw/agent/contrail/pkt0_interface_base.cc +++ b/src/vnsw/agent/contrail/pkt0_interface_base.cc @@ -179,10 +179,14 @@ void Pkt0Socket::AsyncRead() { } void Pkt0Socket::StartConnectTimer() { + connected_ = false; Agent *agent = pkt_handler()->agent(); - timer_.reset(TimerManager::CreateTimer( - *(agent->event_manager()->io_service()), - "UnixSocketConnectTimer")); + if (timer_ == NULL) { + timer_.reset(TimerManager::CreateTimer( + *(agent->event_manager()->io_service()), + "UnixSocketConnectTimer")); + } + TAP_TRACE(Err, "Starting connect to vrouter unix socket "); timer_->Start(kConnectTimeout, boost::bind(&Pkt0Socket::OnTimeout, this)); } @@ -192,8 +196,8 @@ bool Pkt0Socket::OnTimeout() { boost::system::error_code ec; socket_.connect(ep, ec); if (ec != 0) { - LOG(DEBUG, "Error connecting to socket " << kVrouterSocketPath - << ": " << ec.message()); + TAP_TRACE(Err, "Error connecting to vrouter unix socket " + + ec.message()); return true; } connected_ = true; @@ -246,8 +250,13 @@ void Pkt0Socket::ReadHandler(const boost::system::error_code &error, void Pkt0Socket::WriteHandler(const boost::system::error_code &error, std::size_t length, PacketBufferPtr pkt, uint8_t *buff) { - if (error) + if (error == boost::system::errc::not_connected) { + StartConnectTimer(); + } + + if (error) { TAP_TRACE(Err, "Packet Error <" + error.message() + "> sending packet"); + } delete [] buff; }