diff --git a/src/bgp/test/bgp_xmpp_channel_test.cc b/src/bgp/test/bgp_xmpp_channel_test.cc index bc1a78cbe45..081b2527ccc 100644 --- a/src/bgp/test/bgp_xmpp_channel_test.cc +++ b/src/bgp/test/bgp_xmpp_channel_test.cc @@ -97,6 +97,9 @@ class XmppChannelMock : public XmppChannel { virtual std::string LastFlap() const { return ""; } + virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb) { + return; + } }; class BgpXmppChannelMock : public BgpXmppChannel { diff --git a/src/bgp/test/bgp_xmpp_parse_test.cc b/src/bgp/test/bgp_xmpp_parse_test.cc index 7b888b5af1b..6b603344d79 100644 --- a/src/bgp/test/bgp_xmpp_parse_test.cc +++ b/src/bgp/test/bgp_xmpp_parse_test.cc @@ -80,6 +80,9 @@ class XmppChannelMock : public XmppChannel { virtual string LastFlap() const { return ""; } + virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb) { + return; + } }; class BgpXmppChannelMock : public BgpXmppChannel { diff --git a/src/vnsw/agent/controller/controller.sandesh b/src/vnsw/agent/controller/controller.sandesh index d94afbbf3d7..98e62031f36 100644 --- a/src/vnsw/agent/controller/controller.sandesh +++ b/src/vnsw/agent/controller/controller.sandesh @@ -113,6 +113,18 @@ trace sandesh AgentXmppTimer { 3: string channel; } +trace sandesh AgentXmppMessage { + 1: "Received xmpp message from: "; + 2: string IPaddress; + 3: "Port"; + 4: i32 port; + 5: "Size: "; + 6: i32 size; + 7: "Packet: "; + 8: string packet; + 9: "$"; +} + request sandesh AgentXmppConnectionStatusReq { } diff --git a/src/vnsw/agent/controller/controller_ifmap.h b/src/vnsw/agent/controller/controller_ifmap.h index e63963cbe7f..73bbd43ad23 100644 --- a/src/vnsw/agent/controller/controller_ifmap.h +++ b/src/vnsw/agent/controller/controller_ifmap.h @@ -34,6 +34,7 @@ class AgentIfMapXmppChannel { uint8_t GetXmppServerIdx() { return xs_idx_; } static uint64_t GetSeqNumber() { return seq_number_; } static uint64_t NewSeqNumber(); + protected: virtual void WriteReadyCb(const boost::system::error_code &ec); diff --git a/src/vnsw/agent/controller/controller_init.cc b/src/vnsw/agent/controller/controller_init.cc index c69e7f4b4db..704dc414ca8 100644 --- a/src/vnsw/agent/controller/controller_init.cc +++ b/src/vnsw/agent/controller/controller_init.cc @@ -32,10 +32,16 @@ SandeshTraceBufferPtr ControllerDiscoveryTraceBuf(SandeshTraceBufferCreate( "ControllerDiscovery", 5000)); SandeshTraceBufferPtr ControllerInfoTraceBuf(SandeshTraceBufferCreate( "ControllerInfo", 5000)); +SandeshTraceBufferPtr ControllerTxConfigTraceBuf(SandeshTraceBufferCreate( + "ControllerTxConfig", 5000)); SandeshTraceBufferPtr ControllerRouteWalkerTraceBuf(SandeshTraceBufferCreate( "ControllerRouteWalker", 5000)); SandeshTraceBufferPtr ControllerTraceBuf(SandeshTraceBufferCreate( "Controller", 5000)); +SandeshTraceBufferPtr ControllerRxRouteMessageTraceBuf(SandeshTraceBufferCreate( + "ControllerRxRouteXmppMessage", 5000)); +SandeshTraceBufferPtr ControllerRxConfigMessageTraceBuf(SandeshTraceBufferCreate( + "ControllerRxConfigXmppMessage", 5000)); ControllerDiscoveryData::ControllerDiscoveryData(std::vector resp) : ControllerWorkQueueData(), discovery_response_(resp) { @@ -114,6 +120,9 @@ void VNController::XmppServerConnect() { XmppChannel *channel = client-> FindChannel(XmppInit::kControlNodeJID); assert(channel); + channel->RegisterRxMessageTraceCallback( + boost::bind(&VNController::XmppMessageTrace, + this, _1, _2, _3, _4, _5)); bgp_peer->RegisterXmppChannel(channel); bgp_peer->UpdateConnectionInfo(channel->GetPeerState()); @@ -749,3 +758,20 @@ bool VNController::XmppMessageProcess(ControllerXmppDataType data) { void VNController::Enqueue(ControllerWorkQueueDataType data) { work_queue_.Enqueue(data); } + +bool VNController::XmppMessageTrace(const std::string &to_address, + int port, int size, + const std::string &msg, + const XmppStanza::XmppMessage *xmppmsg) { + const std::string &to = xmppmsg->to; + if (to.find(XmppInit::kBgpPeer) != string::npos) { + CONTROLLER_RX_ROUTE_MESSAGE_TRACE(Message, to_address, + port, size, msg); + return true; + } else if (to.find(XmppInit::kConfigPeer) != string::npos) { + CONTROLLER_RX_CONFIG_MESSAGE_TRACE(Message, to_address, + port, size, msg); + return true; + } + return false; +} diff --git a/src/vnsw/agent/controller/controller_init.h b/src/vnsw/agent/controller/controller_init.h index 5dd356be6af..14ae5a718ba 100644 --- a/src/vnsw/agent/controller/controller_init.h +++ b/src/vnsw/agent/controller/controller_init.h @@ -140,6 +140,10 @@ class VNController { Agent *agent() {return agent_;} void Enqueue(ControllerWorkQueueDataType data); void DeleteAgentXmppChannel(AgentXmppChannel *ch); + bool XmppMessageTrace(const std::string &to_address, + int port, int size, + const std::string &msg, + const XmppStanza::XmppMessage *xmpp_msg); private: AgentXmppChannel *FindAgentXmppChannel(const std::string &server_ip); @@ -161,15 +165,35 @@ class VNController { }; extern SandeshTraceBufferPtr ControllerInfoTraceBuf; +extern SandeshTraceBufferPtr ControllerTxConfigTraceBuf; extern SandeshTraceBufferPtr ControllerDiscoveryTraceBuf; extern SandeshTraceBufferPtr ControllerRouteWalkerTraceBuf; extern SandeshTraceBufferPtr ControllerTraceBuf; +extern SandeshTraceBufferPtr ControllerRxRouteMessageTraceBuf; +extern SandeshTraceBufferPtr ControllerRxConfigMessageTraceBuf; + +#define CONTROLLER_RX_ROUTE_MESSAGE_TRACE(obj, ...)\ +do {\ + AgentXmpp##obj::TraceMsg(ControllerRxRouteMessageTraceBuf, __FILE__, \ + __LINE__, __VA_ARGS__);\ +} while(0);\ + +#define CONTROLLER_RX_CONFIG_MESSAGE_TRACE(obj, ...)\ +do {\ + AgentXmpp##obj::TraceMsg(ControllerRxConfigMessageTraceBuf, __FILE__, \ + __LINE__, __VA_ARGS__);\ +} while(0);\ #define CONTROLLER_INFO_TRACE(obj, ...)\ do {\ AgentXmpp##obj::TraceMsg(ControllerInfoTraceBuf, __FILE__, __LINE__, __VA_ARGS__);\ } while(0);\ +#define CONTROLLER_TX_CONFIG_TRACE(obj, ...)\ +do {\ + AgentXmpp##obj::TraceMsg(ControllerTxConfigTraceBuf, __FILE__, __LINE__, __VA_ARGS__);\ +} while(0);\ + #define CONTROLLER_ROUTE_WALKER_TRACE(obj, ...)\ do {\ AgentXmpp##obj::TraceMsg(ControllerRouteWalkerTraceBuf, __FILE__, __LINE__, __VA_ARGS__);\ diff --git a/src/vnsw/agent/controller/controller_peer.cc b/src/vnsw/agent/controller/controller_peer.cc index 2ed329cc83b..1258872d76a 100644 --- a/src/vnsw/agent/controller/controller_peer.cc +++ b/src/vnsw/agent/controller/controller_peer.cc @@ -1597,7 +1597,7 @@ bool AgentXmppChannel::ControllerSendVmCfgSubscribe(AgentXmppChannel *peer, datalen_ = XmppProto::EncodeMessage(impl.get(), data_, sizeof(data_)); - CONTROLLER_INFO_TRACE(Trace, peer->GetBgpPeerName(), "", + CONTROLLER_TX_CONFIG_TRACE(Trace, peer->GetBgpPeerName(), "", std::string(reinterpret_cast(data_), datalen_)); // send data if (peer->SendUpdate(data_,datalen_) == false) { @@ -1637,7 +1637,7 @@ bool AgentXmppChannel::ControllerSendCfgSubscribe(AgentXmppChannel *peer) { pugi->AddAttribute("node", node); datalen_ = XmppProto::EncodeMessage(impl.get(), data_, sizeof(data_)); - CONTROLLER_INFO_TRACE(Trace, peer->GetBgpPeerName(), "", + CONTROLLER_TX_CONFIG_TRACE(Trace, peer->GetBgpPeerName(), "", std::string(reinterpret_cast(data_), datalen_)); // send data if (peer->SendUpdate(data_,datalen_) == false) { diff --git a/src/vnsw/agent/test/test_cmn_util.h b/src/vnsw/agent/test/test_cmn_util.h index ce93549adfa..a2028f483ba 100644 --- a/src/vnsw/agent/test/test_cmn_util.h +++ b/src/vnsw/agent/test/test_cmn_util.h @@ -397,6 +397,8 @@ class XmppChannelMock : public XmppChannel { std::string FromString() const { return string("fake-from"); } const XmppConnection *connection() const { return NULL; } + virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb) { + } virtual std::string LastStateName() const { return ""; } diff --git a/src/xmpp/xmpp_channel.h b/src/xmpp/xmpp_channel.h index 6422baee83f..4bc68e9eb21 100644 --- a/src/xmpp/xmpp_channel.h +++ b/src/xmpp/xmpp_channel.h @@ -36,11 +36,18 @@ class XmppChannel { typedef boost::function< void(const XmppStanza::XmppMessage *, xmps::PeerState state) > ReceiveCb; + typedef boost::function RxMessageTraceCb; virtual ~XmppChannel() { } virtual bool Send(const uint8_t *, size_t, xmps::PeerId, SendReadyCb) = 0; virtual void RegisterReceive(xmps::PeerId, ReceiveCb) = 0; virtual void UnRegisterReceive(xmps::PeerId) = 0; + virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb) = 0; virtual void Close() = 0; virtual std::string ToString() const = 0; virtual std::string StateName() const = 0; diff --git a/src/xmpp/xmpp_channel_mux.cc b/src/xmpp/xmpp_channel_mux.cc index 5e522970240..d703580a330 100644 --- a/src/xmpp/xmpp_channel_mux.cc +++ b/src/xmpp/xmpp_channel_mux.cc @@ -13,7 +13,7 @@ using namespace std; using namespace xmsm; XmppChannelMux::XmppChannelMux(XmppConnection *connection) - : connection_(connection) { + : connection_(connection), rx_message_trace_cb_(NULL) { } XmppChannelMux::~XmppChannelMux() { @@ -193,3 +193,18 @@ uint32_t XmppChannelMux::FlapCount() const { std::string XmppChannelMux::LastFlap() const { return connection_->last_flap_at(); } + +void XmppChannelMux::RegisterRxMessageTraceCallback(RxMessageTraceCb cb) { + rx_message_trace_cb_ = cb; +} + +bool XmppChannelMux::RxMessageTrace(const std::string &to_address, + int port, + int msg_size, + const std::string &msg, + const XmppStanza::XmppMessage *xmpp_msg) { + if (rx_message_trace_cb_) { + return rx_message_trace_cb_(to_address, port, msg_size, msg, xmpp_msg); + } + return false; +} diff --git a/src/xmpp/xmpp_channel_mux.h b/src/xmpp/xmpp_channel_mux.h index c0c6b97db16..1fa8f07c386 100644 --- a/src/xmpp/xmpp_channel_mux.h +++ b/src/xmpp/xmpp_channel_mux.h @@ -22,6 +22,7 @@ class XmppChannelMux : public XmppChannel { virtual bool Send(const uint8_t *, size_t, xmps::PeerId, SendReadyCb); virtual void RegisterReceive(xmps::PeerId, ReceiveCb); virtual void UnRegisterReceive(xmps::PeerId); + virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb); size_t ReceiverCount() const; std::vector GetReceiverList() const; @@ -51,6 +52,9 @@ class XmppChannelMux : public XmppChannel { virtual const XmppConnection *connection() const { return connection_; } virtual XmppConnection *connection() { return connection_; } + bool RxMessageTrace(const std::string &to_address, int port, int msg_size, + const std::string &msg, + const XmppStanza::XmppMessage *xmpp_msg); protected: friend class XmppChannelMuxMock; @@ -67,6 +71,7 @@ class XmppChannelMux : public XmppChannel { SendReadyCb cb_; XmppConnection *connection_; tbb::mutex mutex_; + RxMessageTraceCb rx_message_trace_cb_; }; #endif // __XMPP_CHANNEL_MUX_H__ diff --git a/src/xmpp/xmpp_connection.cc b/src/xmpp/xmpp_connection.cc index 5a2e7e9918c..904ed802ab0 100644 --- a/src/xmpp/xmpp_connection.cc +++ b/src/xmpp/xmpp_connection.cc @@ -501,9 +501,17 @@ void XmppConnection::ReceiveMsg(XmppSession *session, const string &msg) { if (minfo) { session->IncStats((unsigned int)minfo->type, msg.size()); if (minfo->type != XmppStanza::WHITESPACE_MESSAGE_STANZA) { - XMPP_MESSAGE_TRACE(XmppRxStream, - session->remote_endpoint().address().to_string(), - session->remote_endpoint().port(), msg.size(), msg); + if (!(mux_ && + (mux_->RxMessageTrace(session-> + remote_endpoint().address().to_string(), + session->remote_endpoint().port(), + msg.size(), msg, minfo)))) { + XMPP_MESSAGE_TRACE(XmppRxStream, + session-> + remote_endpoint().address().to_string(), + session-> + remote_endpoint().port(), msg.size(), msg); + } } IncProtoStats((unsigned int)minfo->type); state_machine_->OnMessage(session, minfo); diff --git a/src/xmpp/xmpp_init.cc b/src/xmpp/xmpp_init.cc index c6d3a726473..e1eff934b19 100644 --- a/src/xmpp/xmpp_init.cc +++ b/src/xmpp/xmpp_init.cc @@ -34,7 +34,7 @@ const char *XmppInit::kBgpPeer = "bgp-peer"; const char *XmppInit::kDnsPeer = "dns-peer"; const char *XmppInit::kOtherPeer = "other-peer"; -SandeshTraceBufferPtr XmppMessageTraceBuf(SandeshTraceBufferCreate(XMPP_MESSAGE_TRACE_BUF, 1000)); +SandeshTraceBufferPtr XmppMessageTraceBuf(SandeshTraceBufferCreate(XMPP_MESSAGE_TRACE_BUF, 5000)); SandeshTraceBufferPtr XmppTraceBuf(SandeshTraceBufferCreate(XMPP_TRACE_BUF, 1000)); XmppInit::XmppInit()