Added automatic renewal of active sessions (what determines if its active can be improved in future)
This commit is contained in:
parent
7e0948bf96
commit
f8ea51ab5e
@ -588,7 +588,7 @@ int iface::poll_all()
|
||||
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -72,6 +72,8 @@ void proxy::handle_solicit(const address& saddr, const address& daddr,
|
||||
|
||||
for (std::list<ptr<session> >::iterator sit = _sessions.begin();
|
||||
sit != _sessions.end(); sit++) {
|
||||
|
||||
(*sit)->touch();
|
||||
|
||||
if ((*sit)->taddr() == taddr) {
|
||||
switch ((*sit)->status()) {
|
||||
@ -80,6 +82,7 @@ void proxy::handle_solicit(const address& saddr, const address& daddr,
|
||||
break;
|
||||
|
||||
case session::VALID:
|
||||
case session::RENEWING:
|
||||
(*sit)->send_advert();
|
||||
}
|
||||
|
||||
|
@ -48,6 +48,20 @@ void session::update_all(int elapsed_time)
|
||||
se->_status = session::INVALID;
|
||||
se->_ttl = se->_pr->deadtime();
|
||||
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:
|
||||
se->_pr->remove_session(se);
|
||||
@ -82,6 +96,7 @@ ptr<session> session::create(const ptr<proxy>& pr, const address& saddr,
|
||||
se->_daddr = daddr;
|
||||
se->_autowire = auto_wire;
|
||||
se->_ttl = pr->timeout();
|
||||
se->_touched = true;
|
||||
|
||||
_sessions.push_back(se);
|
||||
|
||||
@ -112,6 +127,11 @@ void session::send_solicit()
|
||||
}
|
||||
}
|
||||
|
||||
void session::touch()
|
||||
{
|
||||
_touched = true;
|
||||
}
|
||||
|
||||
void session::send_advert()
|
||||
{
|
||||
_pr->ifa()->write_advert(_saddr, _taddr, _pr->router());
|
||||
@ -197,6 +217,11 @@ bool session::autowire() const
|
||||
return _autowire;
|
||||
}
|
||||
|
||||
bool session::touched() const
|
||||
{
|
||||
return _touched;
|
||||
}
|
||||
|
||||
int session::status() const
|
||||
{
|
||||
return _status;
|
||||
|
@ -33,6 +33,8 @@ private:
|
||||
address _saddr, _daddr, _taddr;
|
||||
|
||||
bool _autowire;
|
||||
|
||||
bool _touched;
|
||||
|
||||
// An array of interfaces this session is monitoring for
|
||||
// ND_NEIGHBOR_ADVERT on.
|
||||
@ -49,9 +51,10 @@ private:
|
||||
public:
|
||||
enum
|
||||
{
|
||||
WAITING, // Waiting for an advert response.
|
||||
VALID, // Valid;
|
||||
INVALID // Invalid;
|
||||
WAITING, // Waiting for an advert response.
|
||||
RENEWING, // Renewing;
|
||||
VALID, // Valid;
|
||||
INVALID // Invalid;
|
||||
};
|
||||
|
||||
static void update_all(int elapsed_time);
|
||||
@ -71,6 +74,8 @@ public:
|
||||
const address& saddr() const;
|
||||
|
||||
bool autowire() const;
|
||||
|
||||
bool touched() const;
|
||||
|
||||
int status() const;
|
||||
|
||||
@ -83,6 +88,8 @@ public:
|
||||
void handle_auto_wire(const ptr<iface>& ifa);
|
||||
|
||||
void handle_auto_unwire(const ptr<iface>& ifa);
|
||||
|
||||
void touch();
|
||||
|
||||
void send_advert();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user