diff --git a/src/session.cc b/src/session.cc index a8e85b3..083b4db 100644 --- a/src/session.cc +++ b/src/session.cc @@ -60,7 +60,12 @@ session::~session() logger::debug() << "session::~session() this=" << logger::format("%x", this); for (std::list >::iterator it = _ifaces.begin(); - it != _ifaces.end(); it++) { + it != _ifaces.end(); it++) + { + if (_autowire == true) { + handle_auto_unwire((*it)); + } + (*it)->remove_session(_ptr); } } @@ -120,6 +125,7 @@ void session::handle_auto_wire(const ptr& ifa) std::stringstream route_cmd; route_cmd << "ip"; route_cmd << " " << "-6"; + route_cmd << " " << "route"; route_cmd << " " << "replace"; route_cmd << " " << std::string(_taddr); route_cmd << " " << "dev"; @@ -131,6 +137,26 @@ void session::handle_auto_wire(const ptr& ifa) system(route_cmd.str().c_str()); } +void session::handle_auto_unwire(const ptr& ifa) +{ + logger::debug() + << "session::handle_auto_unwire() taddr=" << _taddr << ", ifa=" << ifa->name(); + + std::stringstream route_cmd; + route_cmd << "ip"; + route_cmd << " " << "-6"; + route_cmd << " " << "route"; + route_cmd << " " << "flush"; + route_cmd << " " << std::string(_taddr); + route_cmd << " " << "dev"; + route_cmd << " " << ifa->name(); + + logger::debug() + << "session::system(" << route_cmd.str() << ")"; + + system(route_cmd.str().c_str()); +} + void session::handle_advert(const ptr& ifa) { if (_autowire == true) { diff --git a/src/session.h b/src/session.h index 18dd691..27c57d5 100644 --- a/src/session.h +++ b/src/session.h @@ -81,6 +81,8 @@ public: void handle_advert(const ptr& ifa); void handle_auto_wire(const ptr& ifa); + + void handle_auto_unwire(const ptr& ifa); void send_advert();