5 #ifndef SRC_BGP_BGP_XMPP_CHANNEL_H_
6 #define SRC_BGP_BGP_XMPP_CHANNEL_H_
8 #include <boost/function.hpp>
9 #include <boost/system/error_code.hpp>
10 #include <boost/scoped_ptr.hpp>
11 #include <tbb/mutex.h>
23 #include "schema/xmpp_mvpn_types.h"
24 #include "tbb/atomic.h"
39 class BgpXmppChannelMock;
41 class BgpXmppChannelManagerMock;
45 class XmppPeerInfoData;
115 const std::string &
ToString()
const;
116 const std::string &
ToUVEKey()
const;
183 bool expect_prefix_len)
const;
257 typedef std::map<RoutingInstance *, SubscriptionState>
261 typedef std::map<std::string,
268 typedef std::map<std::string,
274 typedef std::multimap<VrfTableName, DBRequest *>
DeferQ;
279 int *instance_id, uint64_t *subscribed_at,
RequestType *req_type);
281 BgpTable **table,
int *instance_id, uint64_t *subscribed_at,
282 bool *subscribe_pending,
bool add_change);
288 const std::string &table_name);
290 const std::string &table_name)
const;
296 const std::string &instance)
const;
298 bool ProcessItem(std::string vrf_name,
const pugi::xml_node &node,
299 bool add_change,
int primary_instance_id = 0);
303 const pugi::xml_node &item,
bool add_change);
305 const pugi::xml_node &item,
bool add_change);
307 IpAddress src_address,
bool add_change, uint64_t subscription_gen_id,
310 IpAddress src_address,
bool add_change, uint64_t subscription_gen_id,
311 int instance_id,
DBRequest &req,
const autogen::MvpnNextHopType &nh);
313 const pugi::xml_node &item,
bool add_change);
341 std::string error_message);
426 tbb::mutex::scoped_lock lock(
mutex_);
430 tbb::mutex::scoped_lock lock(
mutex_);
447 bool CollectStats(BgpRouterState *state,
bool first)
const;
boost::asio::ip::address IpAddress
boost::asio::ip::address_v4 Ip4Address
void IdentifierUpdateCallback(Ip4Address old_identifier)
tbb::atomic< uint64_t > subscription_gen_id_
virtual void XmppHandleChannelEvent(XmppChannel *channel, xmps::PeerState state)
friend class BgpXmppChannelManagerMock
tbb::atomic< int32_t > deleting_count_
virtual bool DeleteChannel(BgpXmppChannel *channel)
const_name_iterator name_clower_bound(const std::string &name) const
XmppChannelNameMap::const_iterator const_name_iterator
void SetQueueDisable(bool disabled)
std::map< std::string, BgpXmppChannel * > XmppChannelNameMap
friend class BgpXmppUnitTest
void VisitChannels(BgpXmppChannelManager::VisitorFn)
uint32_t NumUpPeer() const
void RemoveChannel(XmppChannel *channel)
XmppServer * xmpp_server_
void FillPeerInfo(const BgpXmppChannel *channel) const
int admin_down_listener_id_
const XmppServer * xmpp_server() const
BgpXmppChannel * FindChannel(std::string client)
int32_t deleting_count() const
void ASNUpdateCallback(as_t old_asn, as_t old_local_asn)
BgpXmppChannel * FindChannel(const XmppChannel *channel)
void DSCPUpdateCallback(uint8_t value)
size_t GetQueueSize() const
XmppServer * xmpp_server()
WorkQueue< BgpXmppChannel * > queue_
BgpXmppChannelManager(XmppServer *, BgpServer *)
DISALLOW_COPY_AND_ASSIGN(BgpXmppChannelManager)
void RoutingInstanceCallback(std::string vrf_name, int op)
std::map< const XmppChannel *, BgpXmppChannel * > XmppChannelMap
void Enqueue(BgpXmppChannel *bx_channel)
const_name_iterator name_cbegin() const
void increment_deleting_count()
const XmppChannelMap & channel_map() const
XmppChannelMap channel_map_
bool CollectStats(BgpRouterState *state, bool first) const
uint64_t get_subscription_gen_id()
const_name_iterator name_cend() const
XmppChannelNameMap channel_name_map_
int identifier_listener_id_
boost::function< void(BgpXmppChannel *)> VisitorFn
void decrement_deleting_count()
virtual ~BgpXmppChannelManager()
bool IsReadyForDeletion()
virtual BgpXmppChannel * CreateChannel(XmppChannel *channel)
boost::scoped_ptr< BgpXmppPeerClose > peer_close_
void FlushDeferQ(std::string vrf_name, std::string table_name)
RibExportPolicy bgp_policy_
Timer * eor_receive_timer_
void RoutingInstanceCallback(std::string vrf_name, int op)
BgpXmppChannelManager * manager()
virtual ~BgpXmppChannel()
bool ProcessInet6Item(std::string vrf_name, const pugi::xml_node &node, bool add_change)
BgpXmppChannel(XmppChannel *channel, BgpServer *bgp_server=NULL, BgpXmppChannelManager *manager=NULL)
void FillCloseInfo(BgpNeighborResp *resp) const
void set_deleted(bool deleted)
void XMPPPeerInfoSend(const XmppPeerInfoData &peer_info) const
size_t GetMembershipRequestQueueSize() const
void ClearStaledSubscription(RoutingInstance *rt_instance, SubscriptionState *sub_state)
virtual time_t GetEndOfRibSendTime() const
boost::scoped_ptr< BgpXmppRTargetManager > rtarget_manager_
void AddTableMembershipState(const std::string &table_name, TableMembershipRequestState tmr_state)
const Stats & rx_stats() const
bool table_membership_request_map_empty() const
SubscribedRoutingInstanceList routing_instances_
TcpSession::Endpoint local_endpoint() const
TableMembershipRequestMap table_membership_request_map_
bool ProcessMvpnItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
virtual TcpSession::Endpoint endpoint() const
void UnregisterTable(int line, BgpTable *table)
PeerCloseManager * close_manager()
bool IsSubscriptionLlgrStale(RoutingInstance *instance) const
BgpXmppChannelManager * manager_
TableMembershipRequestState * GetTableMembershipState(const std::string &table_name)
void CreateType7MvpnRouteRequest(IpAddress grp_address, IpAddress src_address, bool add_change, uint64_t subscription_gen_id, DBRequest &req)
friend class BgpXmppUnitTest
std::multimap< VrfTableName, DBRequest * > DeferQ
void AddSubscriptionState(RoutingInstance *rt_instance, int index)
std::map< std::string, TableMembershipRequestState > TableMembershipRequestMap
virtual bool GetMembershipInfo(BgpTable *table, int *instance_id, uint64_t *subscribed_at, RequestType *req_type)
std::string transport_address_string() const
XmppChannel * xmpp_channel() const
void ASNUpdateCallback(as_t old_asn, as_t old_local_asn)
uint64_t get_tx_route_reach() const
const XmppSession * GetSession() const
InstanceMembershipRequestMap instance_membership_request_map_
time_t eor_receive_timer_start_time_
void LlgrStaleCurrentSubscriptions()
WorkQueue< std::string > membership_response_worker_
const std::string & ToUVEKey() const
void set_peer_closed(bool flag)
friend class BgpXmppParseTest
bool delete_in_progress() const
void DeleteSubscriptionState(RoutingInstance *rt_instance)
uint64_t peer_closed_at() const
void AddInstanceMembershipState(const std::string &instance, InstanceMembershipRequestState imr_state)
DISALLOW_COPY_AND_ASSIGN(BgpXmppChannel)
uint64_t get_tx_update() const
bool ProcessItem(std::string vrf_name, const pugi::xml_node &node, bool add_change, int primary_instance_id=0)
void RegisterTable(int line, BgpTable *table, const TableMembershipRequestState *tmr_state)
bool IsSubscriptionGrStale(RoutingInstance *instance) const
ErrorStats & error_stats()
void ResetEndOfRibSendState()
const TableMembershipRequestState * GetTableMembershipState(const std::string &table_name) const
void MembershipRequestCallback(BgpTable *table)
uint64_t get_rx_route_unreach() const
const std::string & ToString() const
bool IsSubscriptionEmpty() const
void ProcessDeferredSubscribeRequest(RoutingInstance *rt_instance, const InstanceMembershipRequestState &imr_state)
friend class BgpXmppChannelMock
time_t eor_send_timer_start_time_
virtual const InstanceMembershipRequestState * GetInstanceMembershipState(const std::string &instance) const
const BgpXmppChannelManager * manager() const
Timer * eor_send_timer() const
int GetPrimaryInstanceID(const std::string &s, bool expect_prefix_len) const
void ClearEndOfRibState()
bool DeleteInstanceMembershipState(const std::string &instance)
std::pair< const std::string, const std::string > VrfTableName
const Stats & tx_stats() const
bool EndOfRibReceiveTimerExpired()
TcpSession::Endpoint remote_endpoint() const
void StartEndOfRibReceiveTimer()
void SweepCurrentSubscriptions()
virtual void ReceiveUpdate(const XmppStanza::XmppMessage *msg)
size_t table_membership_requests() const
bool skip_update_send_cached_
std::map< RoutingInstance *, SubscriptionState > SubscribedRoutingInstanceList
void CreateType5MvpnRouteRequest(IpAddress grp_address, IpAddress src_address, bool add_change, uint64_t subscription_gen_id, int instance_id, DBRequest &req, const autogen::MvpnNextHopType &nh)
void ProcessPendingSubscriptions()
boost::scoped_ptr< PeerStats > peer_stats_
const ErrorStats & error_stats() const
const RoutingInstance::RouteTargetList & GetSubscribedRTargets(RoutingInstance *instance) const
static const int kEndOfRibSendRetryTime
void FlushDeferQ(std::string vrf_name)
void ClearSubscriptions()
uint64_t get_rx_update() const
void ProcessSubscriptionRequest(std::string rt_instance, const XmppStanza::XmppMessageIq *iq, bool add_change)
void FillTableMembershipInfo(BgpNeighborResp *resp) const
ChannelStats channel_stats_
void EndOfRibTimerErrorHandler(std::string error_name, std::string error_message)
void set_delete_in_progress(bool flag)
BgpXmppRTargetManager * rtarget_manager()
void ReceiveEndOfRIB(Address::Family family)
uint64_t get_tx_route_unreach() const
std::map< std::string, InstanceMembershipRequestState > InstanceMembershipRequestMap
bool VerifyMembership(const std::string &vrf_name, Address::Family family, BgpTable **table, int *instance_id, uint64_t *subscribed_at, bool *subscribe_pending, bool add_change)
boost::scoped_ptr< PeerCloseManager > close_manager_
bool EndOfRibSendTimerExpired()
void FillInstanceMembershipInfo(BgpNeighborResp *resp) const
bool peer_deleted() const
bool ProcessEnetItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
bool ProcessMcastItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
const XmppChannel * channel() const
SubscriptionState * GetSubscriptionState(RoutingInstance *rt_instance)
std::string StateName() const
void StaleCurrentSubscriptions()
bool XmppDecodeAddress(int af, const std::string &address, IpAddress *addrp, bool zero_ok=false)
LabelBlockManagerPtr lb_mgr_
bool ProcessMembershipResponse(std::string table_name, TableMembershipRequestState *tmr_state)
bool MembershipResponseHandler(std::string table_name)
boost::scoped_ptr< XmppPeer > peer_
bool DeleteTableMembershipState(const std::string &table_name)
void DequeueRequest(const std::string &table_name, DBRequest *request)
uint64_t get_rx_route_reach() const
std::set< RouteTarget > RouteTargetList
boost::asio::ip::tcp::endpoint Endpoint
bool Enqueue(QueueEntryT entry)
boost::intrusive_ptr< LabelBlockManager > LabelBlockManagerPtr
tbb::atomic< uint64_t > table_subscribe
tbb::atomic< uint64_t > instance_unsubscribe
tbb::atomic< uint64_t > instance_subscribe
tbb::atomic< uint64_t > table_unsubscribe_complete
tbb::atomic< uint64_t > table_unsubscribe
tbb::atomic< uint64_t > table_subscribe_complete
tbb::atomic< uint64_t > inet6_rx_bad_afi_safi_count
void incr_inet6_rx_bad_xml_token_count()
uint64_t get_inet6_rx_bad_xml_token_count() const
void incr_inet6_rx_bad_prefix_count()
tbb::atomic< uint64_t > inet6_rx_bad_xml_token_count
uint64_t get_inet6_rx_bad_nexthop_count() const
void incr_inet6_rx_bad_afi_safi_count()
tbb::atomic< uint64_t > inet6_rx_bad_prefix_count
uint64_t get_inet6_rx_bad_afi_safi_count() const
void incr_inet6_rx_bad_nexthop_count()
uint64_t get_inet6_rx_bad_prefix_count() const
tbb::atomic< uint64_t > inet6_rx_bad_nexthop_count
InstanceMembershipRequestState(int instance_id=-1, bool no_ribout=false)
tbb::atomic< uint64_t > rt_updates
tbb::atomic< uint64_t > end_of_rib
tbb::atomic< uint64_t > unreach
tbb::atomic< uint64_t > reach
RoutingInstance::RouteTargetList targets
SubscriptionState(const RoutingInstance::RouteTargetList &targets, int index)
TableMembershipRequestState(RequestType current, int id, bool no_ribout=false)