Added automatic renewal of active sessions (what determines if its active can be improved in future)

This commit is contained in:
John Sharratt 2017-07-01 11:31:50 +02:00
parent 7e0948bf96
commit f8ea51ab5e
4 changed files with 39 additions and 4 deletions

View File

@ -588,7 +588,7 @@ int iface::poll_all()
const ptr<session> sess = *s_it; const ptr<session> sess = *s_it;
if ((sess->taddr() == taddr) && (sess->status() == session::WAITING)) { if ((sess->taddr() == taddr) && (sess->status() == session::WAITING || sess->status() == session::RENEWING)) {
sess->handle_advert(ifa); sess->handle_advert(ifa);
break; break;
} }

View File

@ -72,6 +72,8 @@ void proxy::handle_solicit(const address& saddr, const address& daddr,
for (std::list<ptr<session> >::iterator sit = _sessions.begin(); for (std::list<ptr<session> >::iterator sit = _sessions.begin();
sit != _sessions.end(); sit++) { sit != _sessions.end(); sit++) {
(*sit)->touch();
if ((*sit)->taddr() == taddr) { if ((*sit)->taddr() == taddr) {
switch ((*sit)->status()) { switch ((*sit)->status()) {
@ -80,6 +82,7 @@ void proxy::handle_solicit(const address& saddr, const address& daddr,
break; break;
case session::VALID: case session::VALID:
case session::RENEWING:
(*sit)->send_advert(); (*sit)->send_advert();
} }

View File

@ -48,6 +48,20 @@ void session::update_all(int elapsed_time)
se->_status = session::INVALID; se->_status = session::INVALID;
se->_ttl = se->_pr->deadtime(); se->_ttl = se->_pr->deadtime();
break; break;
case session::VALID:
if (se->_touched == true) {
logger::debug() << "session is renewing";
se->_status = session::RENEWING;
se->_ttl = se->_pr->timeout();
se->_touched = false;
// Send another solicit to make sure the route is still valid
se->send_solicit();
} else {
se->_pr->remove_session(se);
}
break;
default: default:
se->_pr->remove_session(se); se->_pr->remove_session(se);
@ -82,6 +96,7 @@ ptr<session> session::create(const ptr<proxy>& pr, const address& saddr,
se->_daddr = daddr; se->_daddr = daddr;
se->_autowire = auto_wire; se->_autowire = auto_wire;
se->_ttl = pr->timeout(); se->_ttl = pr->timeout();
se->_touched = true;
_sessions.push_back(se); _sessions.push_back(se);
@ -112,6 +127,11 @@ void session::send_solicit()
} }
} }
void session::touch()
{
_touched = true;
}
void session::send_advert() void session::send_advert()
{ {
_pr->ifa()->write_advert(_saddr, _taddr, _pr->router()); _pr->ifa()->write_advert(_saddr, _taddr, _pr->router());
@ -197,6 +217,11 @@ bool session::autowire() const
return _autowire; return _autowire;
} }
bool session::touched() const
{
return _touched;
}
int session::status() const int session::status() const
{ {
return _status; return _status;

View File

@ -33,6 +33,8 @@ private:
address _saddr, _daddr, _taddr; address _saddr, _daddr, _taddr;
bool _autowire; bool _autowire;
bool _touched;
// An array of interfaces this session is monitoring for // An array of interfaces this session is monitoring for
// ND_NEIGHBOR_ADVERT on. // ND_NEIGHBOR_ADVERT on.
@ -49,9 +51,10 @@ private:
public: public:
enum enum
{ {
WAITING, // Waiting for an advert response. WAITING, // Waiting for an advert response.
VALID, // Valid; RENEWING, // Renewing;
INVALID // Invalid; VALID, // Valid;
INVALID // Invalid;
}; };
static void update_all(int elapsed_time); static void update_all(int elapsed_time);
@ -71,6 +74,8 @@ public:
const address& saddr() const; const address& saddr() const;
bool autowire() const; bool autowire() const;
bool touched() const;
int status() const; int status() const;
@ -83,6 +88,8 @@ public:
void handle_auto_wire(const ptr<iface>& ifa); void handle_auto_wire(const ptr<iface>& ifa);
void handle_auto_unwire(const ptr<iface>& ifa); void handle_auto_unwire(const ptr<iface>& ifa);
void touch();
void send_advert(); void send_advert();