Actually report a meaningful network status instead of always OK

This commit is contained in:
Adam Ierymenko 2013-08-08 10:41:17 -04:00
parent 86056fdbd9
commit 5cabb60a6f
3 changed files with 46 additions and 3 deletions

View File

@ -104,6 +104,17 @@ bool Network::Certificate::qualifyMembership(const Network::Certificate &mc) con
return true;
}
const char *Network::statusString(const Status s)
throw()
{
switch(s) {
case NETWORK_WAITING_FOR_FIRST_AUTOCONF: return "WAITING_FOR_FIRST_AUTOCONF";
case NETWORK_OK: return "OK";
case NETWORK_ACCESS_DENIED: return "ACCESS_DENIED";
}
return "(invalid)";
}
Network::~Network()
{
delete _tap;
@ -202,6 +213,7 @@ void Network::clean()
std::string mcdbPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + toString() + ".mcerts");
Mutex::Lock _l(_lock);
if (_configuration.isOpen()) {
_membershipCertificates.clear();
Utils::rm(mcdbPath);
@ -242,6 +254,14 @@ void Network::clean()
}
}
Network::Status Network::status() const
{
Mutex::Lock _l(_lock);
if (_configuration.containsAllFields())
return NETWORK_OK;
return NETWORK_WAITING_FOR_FIRST_AUTOCONF;
}
void Network::_CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data)
{
const RuntimeEnvironment *_r = ((Network *)arg)->_r;

View File

@ -265,6 +265,23 @@ public:
}
};
/**
* Status for networks
*/
enum Status
{
NETWORK_WAITING_FOR_FIRST_AUTOCONF,
NETWORK_OK,
NETWORK_ACCESS_DENIED
};
/**
* @param s Status
* @return String description
*/
static const char *statusString(const Status s)
throw();
private:
// Only NodeConfig can create, only SharedPtr can delete
@ -404,6 +421,11 @@ public:
return _lastConfigUpdate;
}
/**
* @return Status of this network
*/
Status status() const;
private:
static void _CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data);
void _restoreState();

View File

@ -175,11 +175,12 @@ std::vector<std::string> NodeConfig::execute(const char *command)
}
// TODO: display network status, such as "permission denied to closed
// network" or "waiting".
_P("200 listnetworks %.16llx OK %s %s %s",
_P("200 listnetworks %.16llx %s %s %s %s",
(unsigned long long)nw->first,
(nw->second->isOpen() ? "public" : "private"),
Network::statusString(nw->second->status()),
(nw->second->isOpen() ? "open" : "private"),
nw->second->tap().deviceName().c_str(),
tmp.c_str());
((tmp.length() > 0) ? tmp.c_str() : "-"));
}
} else if (cmd[0] == "join") {
if (cmd.size() > 1) {