diff options
Diffstat (limited to 'testnet/SimNet.cpp')
| -rw-r--r-- | testnet/SimNet.cpp | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/testnet/SimNet.cpp b/testnet/SimNet.cpp index a644a9bc..3349d5c2 100644 --- a/testnet/SimNet.cpp +++ b/testnet/SimNet.cpp @@ -40,50 +40,29 @@ SimNet::~SimNet() { } -SimNetSocketManager *newEndpoint() +SimNetSocketManager *SimNet::newEndpoint(const InetAddress &addr) { Mutex::Lock _l(_lock); if (_endpoints.size() >= ZT_SIMNET_MAX_TESTNET_SIZE) return (SimNetSocketManager *)0; + if (_endpoints.find(addr) != _endpoints.end()) + return (SimNetSocketManager *)0; - InetAddress fake; - uint32_t ip = _prng.next32(); - for(;;) { - ++ip; - ip &= 0x00ffffff; - ip |= 0x0a000000; // 10.x.x.x - if (((ip >> 16) & 0xff) == 0xff) ip ^= 0x00010000; - if (((ip >> 8) & 0xff) == 0xff) ip ^= 0x00000100; - if ((ip & 0xff) == 0xff) --ip; - if ((ip & 0xff) == 0x00) ++ip; - uint32_t ipn = Utils::hton(ip); - fake.set(&ipn,4,8); // 10.x.x.x/8 - if (_endpoints.find(fake) == _endpoints.end()) { - SimNetSocketManager *sm = &(_endpoints[fake]); - sm->_sn = this; - sm->_address = fake; - return sm; - } - } + SimNetSocketManager *sm = new SimNetSocketManager(); + sm->_sn = this; + sm->_address = addr; + _endpoints[addr] = sm; + return sm; } -SimNetSocketManager *get(const InetAddress &addr) +SimNetSocketManager *SimNet::get(const InetAddress &addr) { Mutex::Lock _l(_lock); - std::map< InetAddress,SimNetSocketManager >::iterator ep(_endpoints.find(addr)); + std::map< InetAddress,SimNetSocketManager * >::iterator ep(_endpoints.find(addr)); if (ep == _endpoints.end()) return (SimNetSocketManager *)0; - return &(ep->second); -} - -std::vector<SimNetSocketManager *> SimNet::all() -{ - std::vector<SimNetSocketManager *> a; - Mutex::Lock _l(_lock); - for (std::map< InetAddress,SimNetSocketManager >::iterator ep(_endpoints.begin());ep!=_endpoints.end();++ep) - a.push_back(&(ep->second)); - return a; + return ep->second; } } // namespace ZeroTier |
