diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-06-13 14:06:34 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-06-13 14:06:34 -0700 |
| commit | 08b7bb3c7a774d2df3c86da7079f7614aaa7b9bd (patch) | |
| tree | b3621a26248893ae13b405b6da15b97e227806db /node/Network.hpp | |
| parent | d6a4f8d77bf1d31bb623c25150479ff8c0daacd7 (diff) | |
| download | infinitytier-08b7bb3c7a774d2df3c86da7079f7614aaa7b9bd.tar.gz infinitytier-08b7bb3c7a774d2df3c86da7079f7614aaa7b9bd.zip | |
Network memory for bridge-side multicast groups that we learn - GitHub issue #68
Diffstat (limited to 'node/Network.hpp')
| -rw-r--r-- | node/Network.hpp | 59 |
1 files changed, 15 insertions, 44 deletions
diff --git a/node/Network.hpp b/node/Network.hpp index 0a89c848..ceb2af72 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -158,27 +158,7 @@ public: * * @return True if internal multicast group set has changed */ - inline bool updateMulticastGroups() - { - Mutex::Lock _l(_lock); - EthernetTap *t = _tap; - if (t) { - bool updated = _tap->updateMulticastGroups(_multicastGroups); - if ((_config)&&(_config->enableBroadcast())) { - if (_multicastGroups.count(BROADCAST)) - return updated; - else { - _multicastGroups.insert(BROADCAST); - return true; - } - } else { - if (_multicastGroups.count(BROADCAST)) { - _multicastGroups.erase(BROADCAST); - return true; - } else return updated; - } - } else return false; - } + bool updateMulticastGroups(); /** * @return Latest set of multicast groups for this network's tap @@ -272,28 +252,7 @@ public: /** * @return Status of this network */ - inline Status status() const - throw() - { - Mutex::Lock _l(_lock); - if (_tap) { - switch(_netconfFailure) { - case NETCONF_FAILURE_ACCESS_DENIED: - return NETWORK_ACCESS_DENIED; - case NETCONF_FAILURE_NOT_FOUND: - return NETWORK_NOT_FOUND; - case NETCONF_FAILURE_NONE: - if (_lastConfigUpdate > 0) - return NETWORK_OK; - else return NETWORK_WAITING_FOR_FIRST_AUTOCONF; - case NETCONF_FAILURE_INIT_FAILED: - default: - return NETWORK_INITIALIZATION_FAILED; - } - } else if (_netconfFailure == NETCONF_FAILURE_INIT_FAILED) { - return NETWORK_INITIALIZATION_FAILED; - } else return NETWORK_INITIALIZING; - } + Status status() const; /** * Update multicast balance for an address and multicast group, return whether packet is allowed @@ -418,7 +377,7 @@ public: /** * @param mac MAC address - * @return ZeroTier address of bridge to this MAC or null address if not found + * @return ZeroTier address of bridge to this MAC or null address if not found (also check result for self, since this can happen) */ inline Address findBridgeTo(const MAC &mac) const { @@ -437,6 +396,17 @@ public: */ void learnBridgeRoute(const MAC &mac,const Address &addr); + /** + * Learn a multicast group that is bridged to our tap device + * + * @param mg Multicast group + */ + inline void learnBridgedMulticastGroup(const MulticastGroup &mg) + { + Mutex::Lock _l(_lock); + _bridgedMulticastGroups[mg] = Utils::now(); + } + private: static void _CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data); @@ -457,6 +427,7 @@ private: std::map<Address,uint64_t> _lastPushedMembershipCertificate; std::map<MAC,Address> _bridgeRoutes; + std::map<MulticastGroup,uint64_t> _bridgedMulticastGroups; SharedPtr<NetworkConfig> _config; volatile uint64_t _lastConfigUpdate; |
