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;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user