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