diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-04-11 08:47:02 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-04-11 08:47:02 -0700 |
| commit | 88a4a3b1bae97548142b73031ff415db6ebd31d0 (patch) | |
| tree | 1b1c6d58dd9c3f54ec340f6fb30d9bad14093d58 /node/Node.cpp | |
| parent | 6fabaae736de2daa1ba0c22701bbb11539e3fba7 (diff) | |
| download | infinitytier-88a4a3b1bae97548142b73031ff415db6ebd31d0.tar.gz infinitytier-88a4a3b1bae97548142b73031ff415db6ebd31d0.zip | |
Pass tptr on leave.
Diffstat (limited to 'node/Node.cpp')
| -rw-r--r-- | node/Node.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/node/Node.cpp b/node/Node.cpp index e7dc637f..9844b09e 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -305,26 +305,35 @@ ZT_ResultCode Node::join(uint64_t nwid,void *uptr,void *tptr) { Mutex::Lock _l(_networks_m); SharedPtr<Network> nw = _network(nwid); - if(!nw) - _networks.push_back(std::pair< uint64_t,SharedPtr<Network> >(nwid,SharedPtr<Network>(new Network(RR,tptr,nwid,uptr)))); - std::sort(_networks.begin(),_networks.end()); // will sort by nwid since it's the first in a pair<> + if(!nw) { + const std::pair< uint64_t,SharedPtr<Network> > nn(nwid,SharedPtr<Network>(new Network(RR,tptr,nwid,uptr))); + _networks.insert(std::upper_bound(_networks.begin(),_networks.end(),nn),nn); + } return ZT_RESULT_OK; } ZT_ResultCode Node::leave(uint64_t nwid,void **uptr,void *tptr) { + ZT_VirtualNetworkConfig ctmp; std::vector< std::pair< uint64_t,SharedPtr<Network> > > newn; + void **nUserPtr = (void **)0; Mutex::Lock _l(_networks_m); + for(std::vector< std::pair< uint64_t,SharedPtr<Network> > >::const_iterator n(_networks.begin());n!=_networks.end();++n) { - if (n->first != nwid) + if (n->first != nwid) { newn.push_back(*n); - else { + } else { if (uptr) - *uptr = n->second->userPtr(); + *uptr = *n->second->userPtr(); n->second->destroy(); + nUserPtr = n->second->userPtr(); } } _networks.swap(newn); + + if (nUserPtr) + RR->node->configureVirtualNetworkPort(tptr,nwid,nUserPtr,ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY,&ctmp); + return ZT_RESULT_OK; } |
