Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "srv-hosts.h"
00035
00036 #include "common/wave_ex.h"
00037
00038 #include "threadsafe/threadsafe_map.h"
00039
00040
00041 namespace aesop {
00042
00043
00044 HostManager::~HostManager(void) throw() { }
00045
00046
00047
00049
00050
00051
00053
00054 class HostMgr : public HostManager {
00055 public:
00056 HostMgr(void) throw();
00057 ~HostMgr(void) throw() { }
00058
00059
00060 void initialize(IN int udpSize);
00061
00062
00063 void addHost(IN conn_id_t hostId,
00064 IN long udpToken,
00065 IN const char * publicKey);
00066 bool getHostByUdpConnectionID(IN conn_id_t udpConnID,
00067 OUT host_rec_t& hr);
00068 bool getHostByTcpConnectionID(IN conn_id_t tcpConnID,
00069 OUT host_rec_t& hr);
00070 void updateHost(IN host_rec_t& hr);
00071 bool removeHost(IN conn_id_t hostId);
00072 void getIterator(OUT iterator_t& iterator);
00073 bool getNextHost(IO iterator_t& iterator,
00074 OUT host_rec_t& pr);
00075
00076 private:
00077
00078 struct host_data_t {
00079 host_rec_t hr;
00080 };
00081
00082 typedef threadsafe_map<conn_id_t, smart_ptr<host_data_t> > host_map_t;
00083
00084
00085 static host_map_t::iterator_t * castIterator(IN iterator_t& i) throw() {
00086 return (host_map_t::iterator_t *) &i;
00087 }
00088
00089
00090 host_map_t m_hosts;
00091 int m_udpSize;
00092 };
00093
00094
00095
00096 HostMgr::HostMgr(void)
00097 throw()
00098 {
00099 m_udpSize = 0;
00100 }
00101
00102
00103
00104 void
00105 HostMgr::initialize
00106 (
00107 IN int udpSize
00108 )
00109 {
00110 ASSERT(udpSize > 63 && udpSize <= 1024, "Bad udp size: %d", udpSize);
00111
00112 m_udpSize = udpSize;
00113
00114
00115 ASSERT2(sizeof(iterator_t) >= sizeof(host_map_t::iterator_t),
00116 "Public iterator is too small! " << sizeof(iterator_t)
00117 << " bytes vs. " << sizeof(host_map_t::iterator_t) << " bytes.");
00118 }
00119
00120
00121
00123
00124
00125
00127
00128 void
00129 HostMgr::addHost
00130 (
00131 IN conn_id_t hostId,
00132 IN long udpToken,
00133 IN const char * publicKey
00134 )
00135 {
00136 ASSERT(hostId, "null");
00137 ASSERT(udpToken, "null");
00138 ASSERT(publicKey, "null");
00139
00140
00141
00142
00143 smart_ptr<host_data_t> hd;
00144 if (m_hosts.lookup(hostId, hd)) {
00145 DPRINTF("Already have a host record for conn_id=%lu",
00146 (long) hostId);
00147 return;
00148 }
00149
00150
00151 hd = new host_data_t;
00152 ASSERT(hd, "out of memory");
00153 host_rec_t& hr = hd->hr;
00154
00155 hr.mode = eHostMode_Connected;
00156 hr.udpConn = hostId;
00157 hr.udpToken = udpToken;
00158 hr.netQueue = netrq::Queue::create();
00159 hr.desKey = crypto::DESKey::create();
00160 hr.outbuf = xdrbuf::Output::create(m_udpSize);
00161 hr.publicKey = crypto::RSAPublicKey::create(publicKey);
00162
00163
00164 m_hosts.insert(hostId, hd);
00165 }
00166
00167
00168
00169 bool
00170 HostMgr::getHostByUdpConnectionID
00171 (
00172 IN conn_id_t hostId,
00173 OUT host_rec_t& hr
00174 )
00175 {
00176 ASSERT(hostId, "null");
00177
00178 hr.clear();
00179
00180 smart_ptr<host_data_t> hd;
00181 if (!m_hosts.lookup(hostId, hd))
00182 return false;
00183
00184
00185 hr = hd->hr;
00186
00187
00188 return true;
00189 }
00190
00191
00192
00193 bool
00194 HostMgr::getHostByTcpConnectionID
00195 (
00196 IN conn_id_t tcpConnID,
00197 OUT host_rec_t& hr
00198 )
00199 {
00200 hr.clear();
00201
00202
00203
00204
00205 host_map_t::iterator_t i;
00206 m_hosts.getIterator(i);
00207
00208 conn_id_t hostId;
00209 smart_ptr<host_data_t> hd;
00210 while (m_hosts.getNextElement(i, hostId, hd)) {
00211 if (tcpConnID == hd->hr.tcpConn) {
00212
00213 hr = hd->hr;
00214 return true;
00215 }
00216 }
00217
00218
00219 return false;
00220 }
00221
00222
00223
00224 void
00225 HostMgr::updateHost
00226 (
00227 IN host_rec_t& hr
00228 )
00229 {
00230 ASSERT(hr.udpConn, "null");
00231
00232 smart_ptr<host_data_t> hd;
00233 if (!m_hosts.lookup(hr.udpConn, hd)) {
00234 DPRINTF("Attempting to update a non-existent host?");
00235 return;
00236 }
00237 ASSERT(hd, "null host data in map");
00238
00239
00240
00241
00242
00243
00244 hd->hr = hr;
00245 }
00246
00247
00248
00249 bool
00250 HostMgr::removeHost
00251 (
00252 IN conn_id_t hostId
00253 )
00254 {
00255 ASSERT(hostId, "null");
00256
00257 return m_hosts.remove(hostId);
00258 }
00259
00260
00261
00262 void
00263 HostMgr::getIterator
00264 (
00265 OUT iterator_t& iterator
00266 )
00267 {
00268 host_map_t::iterator_t * ri = castIterator(iterator);
00269 ASSERT(ri, "null");
00270
00271 m_hosts.getIterator(*ri);
00272 }
00273
00274
00275
00276 bool
00277 HostMgr::getNextHost
00278 (
00279 IO iterator_t& iterator,
00280 OUT host_rec_t& hr
00281 )
00282 {
00283 hr.clear();
00284
00285 host_map_t::iterator_t * ri = castIterator(iterator);
00286 ASSERT(ri, "null");
00287
00288 conn_id_t hostId;
00289 smart_ptr<host_data_t> hd;
00290 if (!m_hosts.getNextElement(*ri, hostId, hd))
00291 return false;
00292
00293 hr = hd->hr;
00294 return true;
00295 }
00296
00297
00298
00300
00301
00302
00304
00305
00306
00308
00309
00310
00312
00313 smart_ptr<HostManager>
00314 HostManager::create
00315 (
00316 IN int udpSize
00317 )
00318 {
00319 ASSERT(udpSize > 0, "bad udp size: %d", udpSize);
00320
00321 smart_ptr<HostMgr> local = new HostMgr;
00322 ASSERT(local, "out of memory");
00323
00324 local->initialize(udpSize);
00325
00326 return local;
00327 }
00328
00329
00330
00331 };
00332