Fix minor memory leak and logging
This commit is contained in:
parent
997499ec2b
commit
804800864a
32
src/iface.cc
32
src/iface.cc
@ -44,6 +44,8 @@ NDPPD_NS_BEGIN
|
|||||||
|
|
||||||
std::map<std::string, weak_ptr<iface> > iface::_map;
|
std::map<std::string, weak_ptr<iface> > iface::_map;
|
||||||
|
|
||||||
|
bool iface::_map_dirty = false;
|
||||||
|
|
||||||
std::vector<struct pollfd> iface::_pollfds;
|
std::vector<struct pollfd> iface::_pollfds;
|
||||||
|
|
||||||
iface::iface() :
|
iface::iface() :
|
||||||
@ -65,7 +67,7 @@ iface::~iface()
|
|||||||
close(_pfd);
|
close(_pfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
_map.erase(_name);
|
_map_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr<iface> iface::open_pfd(const std::string& name)
|
ptr<iface> iface::open_pfd(const std::string& name)
|
||||||
@ -451,6 +453,10 @@ ssize_t iface::read_advert(address& saddr, address& taddr)
|
|||||||
|
|
||||||
void iface::fixup_pollfds()
|
void iface::fixup_pollfds()
|
||||||
{
|
{
|
||||||
|
if (_map_dirty) {
|
||||||
|
clean();
|
||||||
|
}
|
||||||
|
|
||||||
_pollfds.resize(_map.size()* 2);
|
_pollfds.resize(_map.size()* 2);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -487,8 +493,24 @@ void iface::add_session(const ptr<session>& se)
|
|||||||
_sessions.push_back(se);
|
_sessions.push_back(se);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iface::clean()
|
||||||
|
{
|
||||||
|
for (std::map<std::string, weak_ptr<iface> >::iterator it = _map.begin();
|
||||||
|
it != _map.end(); it++) {
|
||||||
|
if (!it->second) {
|
||||||
|
_map.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_map_dirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
int iface::poll_all()
|
int iface::poll_all()
|
||||||
{
|
{
|
||||||
|
if (_map_dirty) {
|
||||||
|
fixup_pollfds();
|
||||||
|
}
|
||||||
|
|
||||||
if (_pollfds.size() == 0) {
|
if (_pollfds.size() == 0) {
|
||||||
::sleep(1);
|
::sleep(1);
|
||||||
return 0;
|
return 0;
|
||||||
@ -498,11 +520,13 @@ int iface::poll_all()
|
|||||||
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if ((len = ::poll(&_pollfds[0], _pollfds.size(), 50)) < 0)
|
if ((len = ::poll(&_pollfds[0], _pollfds.size(), 50)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
std::map<std::string, weak_ptr<iface> >::iterator i_it = _map.begin();
|
std::map<std::string, weak_ptr<iface> >::iterator i_it = _map.begin();
|
||||||
|
|
||||||
@ -518,7 +542,7 @@ int iface::poll_all()
|
|||||||
|
|
||||||
bool is_pfd = i++ % 2;
|
bool is_pfd = i++ % 2;
|
||||||
|
|
||||||
if (!(f_it->revents& POLLIN)) {
|
if (!(f_it->revents & POLLIN)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
88
src/iface.h
88
src/iface.h
@ -31,48 +31,6 @@ class session;
|
|||||||
class proxy;
|
class proxy;
|
||||||
|
|
||||||
class iface {
|
class iface {
|
||||||
private:
|
|
||||||
// Weak pointer so this object can reference itself.
|
|
||||||
weak_ptr<iface> _ptr;
|
|
||||||
|
|
||||||
static std::map<std::string, weak_ptr<iface> > _map;
|
|
||||||
|
|
||||||
// An array of objects used with ::poll.
|
|
||||||
static std::vector<struct pollfd> _pollfds;
|
|
||||||
|
|
||||||
// Updates the array above.
|
|
||||||
static void fixup_pollfds();
|
|
||||||
|
|
||||||
// The "generic" ICMPv6 socket for reading/writing NB_NEIGHBOR_ADVERT
|
|
||||||
// messages as well as writing NB_NEIGHBOR_SOLICIT messages.
|
|
||||||
int _ifd;
|
|
||||||
|
|
||||||
// This is the PF_PACKET socket we use in order to read
|
|
||||||
// NB_NEIGHBOR_SOLICIT messages.
|
|
||||||
int _pfd;
|
|
||||||
|
|
||||||
// Previous state of ALLMULTI for the interface.
|
|
||||||
int _prev_allmulti;
|
|
||||||
|
|
||||||
// Name of this interface.
|
|
||||||
std::string _name;
|
|
||||||
|
|
||||||
// An array of sessions that are monitoring this interface for
|
|
||||||
// ND_NEIGHBOR_ADVERT messages.
|
|
||||||
std::list<weak_ptr<session> > _sessions;
|
|
||||||
|
|
||||||
weak_ptr<proxy> _pr;
|
|
||||||
|
|
||||||
// The link-layer address of this interface.
|
|
||||||
struct ether_addr hwaddr;
|
|
||||||
|
|
||||||
// Turns on/off ALLMULTI for this interface - returns the previous state
|
|
||||||
// or -1 if there was an error.
|
|
||||||
int allmulti(int state);
|
|
||||||
|
|
||||||
// Constructor.
|
|
||||||
iface();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Destructor.
|
// Destructor.
|
||||||
@ -111,6 +69,52 @@ public:
|
|||||||
void pr(const ptr<proxy>& pr);
|
void pr(const ptr<proxy>& pr);
|
||||||
|
|
||||||
const ptr<proxy>& pr() const;
|
const ptr<proxy>& pr() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::map<std::string, weak_ptr<iface> > _map;
|
||||||
|
|
||||||
|
static bool _map_dirty;
|
||||||
|
|
||||||
|
// An array of objects used with ::poll.
|
||||||
|
static std::vector<struct pollfd> _pollfds;
|
||||||
|
|
||||||
|
// Updates the array above.
|
||||||
|
static void fixup_pollfds();
|
||||||
|
|
||||||
|
static void clean();
|
||||||
|
|
||||||
|
// Weak pointer so this object can reference itself.
|
||||||
|
weak_ptr<iface> _ptr;
|
||||||
|
|
||||||
|
// The "generic" ICMPv6 socket for reading/writing NB_NEIGHBOR_ADVERT
|
||||||
|
// messages as well as writing NB_NEIGHBOR_SOLICIT messages.
|
||||||
|
int _ifd;
|
||||||
|
|
||||||
|
// This is the PF_PACKET socket we use in order to read
|
||||||
|
// NB_NEIGHBOR_SOLICIT messages.
|
||||||
|
int _pfd;
|
||||||
|
|
||||||
|
// Previous state of ALLMULTI for the interface.
|
||||||
|
int _prev_allmulti;
|
||||||
|
|
||||||
|
// Name of this interface.
|
||||||
|
std::string _name;
|
||||||
|
|
||||||
|
// An array of sessions that are monitoring this interface for
|
||||||
|
// ND_NEIGHBOR_ADVERT messages.
|
||||||
|
std::list<weak_ptr<session> > _sessions;
|
||||||
|
|
||||||
|
weak_ptr<proxy> _pr;
|
||||||
|
|
||||||
|
// The link-layer address of this interface.
|
||||||
|
struct ether_addr hwaddr;
|
||||||
|
|
||||||
|
// Turns on/off ALLMULTI for this interface - returns the previous state
|
||||||
|
// or -1 if there was an error.
|
||||||
|
int allmulti(int state);
|
||||||
|
|
||||||
|
// Constructor.
|
||||||
|
iface();
|
||||||
};
|
};
|
||||||
|
|
||||||
NDPPD_NS_END
|
NDPPD_NS_END
|
||||||
|
@ -38,7 +38,7 @@ NDPPD_NS_BEGIN
|
|||||||
"debug"
|
"debug"
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
int logger::_max_pri = LOG_WARNING;
|
int logger::_max_pri = LOG_NOTICE;
|
||||||
|
|
||||||
bool logger::_syslog = false;
|
bool logger::_syslog = false;
|
||||||
|
|
||||||
@ -100,6 +100,11 @@ logger logger::debug()
|
|||||||
return logger(LOG_DEBUG);
|
return logger(LOG_DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger logger::notice()
|
||||||
|
{
|
||||||
|
return logger(LOG_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
logger& logger::operator<<(const std::string& str)
|
logger& logger::operator<<(const std::string& str)
|
||||||
{
|
{
|
||||||
_ss << str;
|
_ss << str;
|
||||||
@ -140,12 +145,12 @@ void logger::flush()
|
|||||||
|
|
||||||
#ifndef DISABLE_SYSLOG
|
#ifndef DISABLE_SYSLOG
|
||||||
if (_syslog) {
|
if (_syslog) {
|
||||||
::syslog(_pri, "%s", _ss.str().c_str());
|
::syslog(_pri, "(%s) %s", _pri_names[_pri].name, _ss.str().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::cout << _ss.str() << std::endl;
|
std::cout << "(" << _pri_names[_pri].name << ") " << _ss.str() << std::endl;
|
||||||
|
|
||||||
_ss.str("");
|
_ss.str("");
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ NDPPD_NS_BEGIN
|
|||||||
|
|
||||||
class logger {
|
class logger {
|
||||||
public:
|
public:
|
||||||
logger(int pri = LOG_INFO);
|
logger(int pri = LOG_NOTICE);
|
||||||
|
|
||||||
logger(const logger& l);
|
logger(const logger& l);
|
||||||
|
|
||||||
@ -69,6 +69,7 @@ public:
|
|||||||
static logger info();
|
static logger info();
|
||||||
static logger warning();
|
static logger warning();
|
||||||
static logger debug();
|
static logger debug();
|
||||||
|
static logger notice();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _pri;
|
int _pri;
|
||||||
|
25
src/ndppd.cc
25
src/ndppd.cc
@ -118,9 +118,17 @@ bool configure(const std::string& path)
|
|||||||
} else if (ru_cf->find("auto")) {
|
} else if (ru_cf->find("auto")) {
|
||||||
pr->add_rule(addr, true);
|
pr->add_rule(addr, true);
|
||||||
} else {
|
} else {
|
||||||
if (addr.prefix() <= 120) {
|
if (!ru_cf->find("static")) {
|
||||||
logger::warning() << "Static rule prefix /" << addr.prefix() << " <= 120 - is this what you want?";
|
logger::warning()
|
||||||
|
<< "## I'm going for 'static' since you didn't specify any method. Please fix this" << logger::endl
|
||||||
|
<< "## as it's not going to be supported in future versions of ndppd. (See 'man ndppd.conf')";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (addr.prefix() <= 120) {
|
||||||
|
logger::warning()
|
||||||
|
<< "Low prefix length (" << addr.prefix() << " <= 120) when using 'static' method";
|
||||||
|
}
|
||||||
|
|
||||||
pr->add_rule(addr, false);
|
pr->add_rule(addr, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +212,7 @@ int main(int argc, char* argv[], char* env[])
|
|||||||
pf.close();
|
pf.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
logger::info().force_log()
|
logger::notice()
|
||||||
<< "ndppd (NDP Proxy Daemon) version " NDPPD_VERSION << logger::endl
|
<< "ndppd (NDP Proxy Daemon) version " NDPPD_VERSION << logger::endl
|
||||||
<< "Using configuration file '" << config_path << "'";
|
<< "Using configuration file '" << config_path << "'";
|
||||||
|
|
||||||
@ -221,7 +229,14 @@ int main(int argc, char* argv[], char* env[])
|
|||||||
|
|
||||||
gettimeofday(&t1, 0);
|
gettimeofday(&t1, 0);
|
||||||
|
|
||||||
while (running && (iface::poll_all() >= 0)) {
|
while (running) {
|
||||||
|
if (iface::poll_all() < 0) {
|
||||||
|
if (running) {
|
||||||
|
logger::error() << "iface::poll_all() failed";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
int elapsed_time;
|
int elapsed_time;
|
||||||
gettimeofday(&t2, 0);
|
gettimeofday(&t2, 0);
|
||||||
|
|
||||||
@ -235,7 +250,7 @@ int main(int argc, char* argv[], char* env[])
|
|||||||
session::update_all(elapsed_time);
|
session::update_all(elapsed_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger::error() << "iface::poll_all() failed";
|
logger::notice() << "Bye";
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user