Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #ifndef __XMPP_IFMAP_INC__ 6 : #define __XMPP_IFMAP_INC__ 7 : 8 : #include <map> 9 : #include <string> 10 : #include <mutex> 11 : #include <atomic> 12 : 13 : #include <boost/function.hpp> 14 : #include <boost/system/error_code.hpp> 15 : 16 : #include "base/queue_task.h" 17 : #include "ifmap/ifmap_client.h" 18 : #include "ifmap/ifmap_server.h" 19 : #include "xmpp/xmpp_channel.h" 20 : 21 : class XmppChannel; 22 : class XmppServer; 23 : class IFMapChannelManager; 24 : class IFMapXmppChannelMapEntry; 25 : 26 : // Xmpp Channel Events 27 : enum XCEvent { 28 : XCE_NOT_READY = 1, 29 : XCE_VR_SUBSCRIBE = 2, 30 : XCE_VM_SUBSCRIBE = 3, 31 : XCE_VM_UNSUBSCRIBE = 4, 32 : }; 33 : 34 : struct ChannelEventInfo { 35 : XCEvent event; 36 : XmppChannel *channel; 37 : std::string name; 38 : }; 39 : 40 : class IFMapXmppChannel { 41 : public: 42 : static const std::string NoFqnSet; 43 : class IFMapSender; 44 : IFMapXmppChannel(XmppChannel *, IFMapServer *, IFMapChannelManager *); 45 : virtual ~IFMapXmppChannel(); 46 : 47 0 : std::string ToString() const { return channel_->ToString(); } // hostname 48 : IFMapClient *Sender(); 49 : 50 : virtual void ReceiveUpdate(const XmppStanza::XmppMessage *); 51 10 : XmppChannel *channel() { return channel_; } 52 : 53 : void ClearCounters(); 54 : uint64_t msgs_sent() const; 55 : std::string VrSubscribeGetVrName(const std::string &iqnode, 56 : bool *valid_message); 57 : std::string VmSubscribeGetVmUuid(const std::string &iqnode, 58 : bool *valid_message); 59 : bool MustProcessChannelNotReady(); 60 : 61 : void ProcessVrSubscribe(const std::string &identifier); 62 : void EnqueueVrSubscribe(const std::string &identifier); 63 : 64 : void ProcessVmSubscribe(const std::string &vm_uuid); 65 : void ProcessVmUnsubscribe(const std::string &vm_uuid); 66 : void EnqueueVmSubUnsub(bool subscribe, const std::string &vm_uuid); 67 0 : bool get_client_added() { return client_added_; } 68 0 : const std::string& channel_name() { return channel_name_; } 69 : const std::string& FQName() const; 70 : 71 : private: 72 : friend class XmppIfmapTest; 73 : void WriteReadyCb(const boost::system::error_code &ec); 74 : 75 : xmps::PeerId peer_id_; 76 : XmppChannel *channel_; 77 : IFMapServer *ifmap_server_; 78 : IFMapChannelManager *ifmap_channel_manager_; 79 : IFMapSender *ifmap_client_; 80 : bool client_added_; // true if ifmap_server has processed add-client 81 : std::string channel_name_; 82 : }; 83 : 84 : class IFMapChannelManager { 85 : public: 86 : IFMapChannelManager(XmppServer *, IFMapServer *); 87 : virtual ~IFMapChannelManager(); 88 : 89 : IFMapXmppChannel *FindChannel(XmppChannel *); 90 : IFMapXmppChannel *FindChannel(std::string); 91 : void IFMapXmppChannelEventCb(XmppChannel *, xmps::PeerState); 92 : virtual IFMapXmppChannel *CreateIFMapXmppChannel(XmppChannel *); 93 : void EnqueueChannelUnregister(XmppChannel *channel); 94 : void ProcessChannelReady(XmppChannel *channel); 95 : void ProcessChannelNotReady(XmppChannel *channel); 96 : 97 0 : void incr_unknown_subscribe_messages() { ++unknown_subscribe_messages; } 98 0 : void incr_unknown_unsubscribe_messages() { ++unknown_unsubscribe_messages; } 99 0 : void incr_duplicate_channel_ready_messages() { 100 0 : ++duplicate_channel_ready_messages; 101 0 : } 102 0 : void incr_invalid_channel_not_ready_messages() { 103 0 : ++invalid_channel_not_ready_messages; 104 0 : } 105 0 : void incr_invalid_channel_state_messages() { 106 0 : ++invalid_channel_state_messages; 107 0 : } 108 0 : void incr_invalid_vm_subscribe_messages() { 109 0 : ++invalid_vm_subscribe_messages; 110 0 : } 111 0 : void incr_vmsub_novrsub_messages() { 112 0 : ++vmsub_novrsub_messages; 113 0 : } 114 0 : void incr_vmunsub_novrsub_messages() { 115 0 : ++vmunsub_novrsub_messages; 116 0 : } 117 0 : void incr_vmunsub_novmsub_messages() { 118 0 : ++vmunsub_novmsub_messages; 119 0 : } 120 0 : void incr_duplicate_vrsub_messages() { 121 0 : ++duplicate_vrsub_messages; 122 0 : } 123 0 : void incr_duplicate_vmsub_messages() { 124 0 : ++duplicate_vmsub_messages; 125 0 : } 126 : 127 0 : uint64_t get_unknown_subscribe_messages() { 128 0 : return unknown_subscribe_messages; 129 : } 130 0 : uint64_t get_unknown_unsubscribe_messages() { 131 0 : return unknown_unsubscribe_messages; 132 : } 133 0 : uint64_t get_duplicate_channel_ready_messages() { 134 0 : return duplicate_channel_ready_messages; 135 : } 136 0 : uint64_t get_invalid_channel_not_ready_messages() { 137 0 : return invalid_channel_not_ready_messages; 138 : } 139 0 : uint64_t get_invalid_channel_state_messages() { 140 0 : return invalid_channel_state_messages; 141 : } 142 0 : uint64_t get_invalid_vm_subscribe_messages() { 143 0 : return invalid_vm_subscribe_messages; 144 : } 145 0 : uint64_t get_vmsub_novrsub_messages() { 146 0 : return vmsub_novrsub_messages; 147 : } 148 0 : uint64_t get_vmunsub_novrsub_messages() { 149 0 : return vmunsub_novrsub_messages; 150 : } 151 0 : uint64_t get_vmunsub_novmsub_messages() { 152 0 : return vmunsub_novmsub_messages; 153 : } 154 0 : uint64_t get_duplicate_vrsub_messages() { 155 0 : return duplicate_vrsub_messages; 156 : } 157 0 : uint64_t get_duplicate_vmsub_messages() { 158 0 : return duplicate_vmsub_messages; 159 : } 160 : void FillChannelMap(std::vector<IFMapXmppChannelMapEntry> *out_map); 161 : 162 : private: 163 : friend class IFMapChannelManagerTest; 164 : friend class XmppIfmapTest; 165 : typedef std::map<XmppChannel *, IFMapXmppChannel *> ChannelMap; 166 : struct ConfigTaskQueueEntry { 167 : XmppChannel *channel; 168 : }; 169 : 170 : XmppServer *xmpp_server_; 171 : IFMapServer *ifmap_server_; 172 : ChannelMap channel_map_; 173 : std::mutex channel_map_mutex_; // serializes access to channel_map_ 174 : WorkQueue<ConfigTaskQueueEntry> config_task_work_queue_; 175 : 176 : bool ProcessChannelUnregister(ConfigTaskQueueEntry entry); 177 : 178 : void DeleteIFMapXmppChannel(IFMapXmppChannel *ifmap_chnl); 179 : void EnqueueChannelEvent(XCEvent event, XmppChannel *channel); 180 : 181 : std::atomic<uint64_t> unknown_subscribe_messages; 182 : std::atomic<uint64_t> unknown_unsubscribe_messages; 183 : std::atomic<uint64_t> duplicate_channel_ready_messages; 184 : std::atomic<uint64_t> invalid_channel_not_ready_messages; 185 : std::atomic<uint64_t> invalid_channel_state_messages; 186 : std::atomic<uint64_t> invalid_vm_subscribe_messages; 187 : std::atomic<uint64_t> vmsub_novrsub_messages; 188 : std::atomic<uint64_t> vmunsub_novrsub_messages; 189 : std::atomic<uint64_t> vmunsub_novmsub_messages; 190 : std::atomic<uint64_t> duplicate_vrsub_messages; 191 : std::atomic<uint64_t> duplicate_vmsub_messages; 192 : }; 193 : 194 : #endif // __XMPP_IFMAP_INC__