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