|
@@ -208,6 +208,30 @@ public:
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ inline void setNetworkId(uint64_t id)
|
|
|
|
+ {
|
|
|
|
+ char buf[32];
|
|
|
|
+ sprintf(buf,"%llu",id);
|
|
|
|
+ (*this)["nwid"] = buf;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline uint64_t networkId() const
|
|
|
|
+ throw(std::invalid_argument)
|
|
|
|
+ {
|
|
|
|
+ return strtoull(get("nwid").c_str(),(char **)0,10);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline void setPeerAddress(Address &a)
|
|
|
|
+ {
|
|
|
|
+ (*this)["peer"] = a.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline Address peerAddress() const
|
|
|
|
+ throw(std::invalid_argument)
|
|
|
|
+ {
|
|
|
|
+ return Address(get("peer"));
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @return Certificate of membership for this network, or empty cert if none
|
|
* @return Certificate of membership for this network, or empty cert if none
|
|
*/
|
|
*/
|
|
@@ -221,7 +245,7 @@ public:
|
|
*/
|
|
*/
|
|
inline bool isOpen() const
|
|
inline bool isOpen() const
|
|
{
|
|
{
|
|
- return (get("isOpen","0") == "1");
|
|
|
|
|
|
+ return (get("isOpen") == "1");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -304,8 +328,12 @@ public:
|
|
inline bool isOpen() const
|
|
inline bool isOpen() const
|
|
throw()
|
|
throw()
|
|
{
|
|
{
|
|
- Mutex::Lock _l(_lock);
|
|
|
|
- return _isOpen;
|
|
|
|
|
|
+ try {
|
|
|
|
+ Mutex::Lock _l(_lock);
|
|
|
|
+ return _configuration.isOpen();
|
|
|
|
+ } catch ( ... ) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -343,6 +371,27 @@ public:
|
|
*/
|
|
*/
|
|
void requestConfiguration();
|
|
void requestConfiguration();
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Add or update a peer's membership certificate
|
|
|
|
+ *
|
|
|
|
+ * The certificate must already have been validated via signature checking.
|
|
|
|
+ *
|
|
|
|
+ * @param peer Peer that owns certificate
|
|
|
|
+ * @param cert Certificate itself
|
|
|
|
+ */
|
|
|
|
+ inline void addMembershipCertificate(const Address &peer,const Certificate &cert)
|
|
|
|
+ {
|
|
|
|
+ Mutex::Lock _l(_lock);
|
|
|
|
+ _membershipCertificates[peer] = cert;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bool isAllowed(const Address &peer) const;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Perform periodic database cleaning such as removing expired membership certificates
|
|
|
|
+ */
|
|
|
|
+ void clean();
|
|
|
|
+
|
|
private:
|
|
private:
|
|
static void _CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data);
|
|
static void _CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data);
|
|
|
|
|
|
@@ -350,10 +399,11 @@ private:
|
|
|
|
|
|
EthernetTap _tap;
|
|
EthernetTap _tap;
|
|
std::set<MulticastGroup> _multicastGroups;
|
|
std::set<MulticastGroup> _multicastGroups;
|
|
-
|
|
|
|
|
|
+ std::map<Address,Certificate> _membershipCertificates;
|
|
|
|
+ Config _configuration;
|
|
|
|
+ Certificate _myCertificate;
|
|
|
|
+ uint64_t _lastCertificateUpdate;
|
|
uint64_t _id;
|
|
uint64_t _id;
|
|
- bool _isOpen;
|
|
|
|
-
|
|
|
|
Mutex _lock;
|
|
Mutex _lock;
|
|
|
|
|
|
AtomicCounter __refCount;
|
|
AtomicCounter __refCount;
|