summaryrefslogtreecommitdiff
path: root/node/Network.hpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-06-13 14:06:34 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-06-13 14:06:34 -0700
commit08b7bb3c7a774d2df3c86da7079f7614aaa7b9bd (patch)
treeb3621a26248893ae13b405b6da15b97e227806db /node/Network.hpp
parentd6a4f8d77bf1d31bb623c25150479ff8c0daacd7 (diff)
downloadinfinitytier-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.hpp59
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;