From 35567ed08235f661ad85d1f039fab2fd15b5720f Mon Sep 17 00:00:00 2001 From: Daniel Adolfsson Date: Wed, 14 Sep 2011 10:53:21 +0200 Subject: [PATCH] Major changes --- src/address.cc | 8 +++++--- src/address.h | 2 ++ src/iface.cc | 32 ++++++++++++++++++++++---------- src/iface.h | 12 ++++++++---- src/ndppd.cc | 23 ++++++++++++++++++++--- src/proxy.cc | 10 +++++++--- src/proxy.h | 2 ++ src/session.cc | 41 +++++++++++++++++++++++++++++++++++++++-- src/session.h | 8 ++++++-- 9 files changed, 111 insertions(+), 27 deletions(-) diff --git a/src/address.cc b/src/address.cc index a0606da..ac3859e 100644 --- a/src/address.cc +++ b/src/address.cc @@ -264,12 +264,14 @@ struct in6_addr& address::addr() return _addr; } +const struct in6_addr& address::const_addr() const +{ + return _addr; +} + struct in6_addr& address::mask() { return _mask; } __NDPPD_NS_END - - - diff --git a/src/address.h b/src/address.h index 319d129..be1aa6a 100644 --- a/src/address.h +++ b/src/address.h @@ -42,6 +42,8 @@ public: struct in6_addr& addr(); + const struct in6_addr& const_addr() const; + struct in6_addr& mask(); // Compare _a/_m against a._a. diff --git a/src/iface.cc b/src/iface.cc index 340401c..a454251 100644 --- a/src/iface.cc +++ b/src/iface.cc @@ -213,7 +213,7 @@ ssize_t iface::read(address& saddr, address& daddr, uint8_t *msg, size_t size) //ssize_t iface::write(address& saddr, address& daddr, uint8_t *msg, size_t size) -ssize_t iface::write(address& daddr, uint8_t *msg, size_t size) +ssize_t iface::write(const address& daddr, const uint8_t *msg, size_t size) { struct sockaddr_in6 daddr_tmp; struct msghdr mhdr; @@ -223,7 +223,7 @@ ssize_t iface::write(address& daddr, uint8_t *msg, size_t size) //daddr_tmp.sin6_len = sizeof(struct sockaddr_in6); daddr_tmp.sin6_family = AF_INET6; daddr_tmp.sin6_port = htons(IPPROTO_ICMPV6); // Needed? - memcpy(&daddr_tmp.sin6_addr, &daddr.addr(), sizeof(struct in6_addr)); + memcpy(&daddr_tmp.sin6_addr, &daddr.const_addr(), sizeof(struct in6_addr)); iov.iov_len = size; iov.iov_base = (caddr_t)msg; @@ -245,7 +245,7 @@ ssize_t iface::write(address& daddr, uint8_t *msg, size_t size) return len; } -ssize_t iface::write_solicit(address& taddr) +ssize_t iface::write_solicit(const address& taddr) { struct nd_neighbor_solicit msg; @@ -258,13 +258,13 @@ ssize_t iface::write_solicit(address& taddr) msg.nd_ns_hdr.icmp6_type = ND_NEIGHBOR_SOLICIT; - memcpy(&msg.nd_ns_target, &taddr.addr(), sizeof(struct in6_addr)); + memcpy(&msg.nd_ns_target, &taddr.const_addr(), sizeof(struct in6_addr)); daddr = multicast; - daddr.addr().s6_addr[13] = taddr.addr().s6_addr[13]; - daddr.addr().s6_addr[14] = taddr.addr().s6_addr[14]; - daddr.addr().s6_addr[15] = taddr.addr().s6_addr[15]; + daddr.addr().s6_addr[13] = taddr.const_addr().s6_addr[13]; + daddr.addr().s6_addr[14] = taddr.const_addr().s6_addr[14]; + daddr.addr().s6_addr[15] = taddr.const_addr().s6_addr[15]; DBG("iface::write_solicit() taddr=%s, daddr=%s", taddr.to_string().c_str(), daddr.to_string().c_str()); @@ -272,6 +272,13 @@ ssize_t iface::write_solicit(address& taddr) return write(daddr, (uint8_t *)&msg, sizeof(struct nd_neighbor_solicit)); } +ssize_t iface::write_advert(const address& daddr, const address& taddr) +{ + struct nd_neighbor_advert msg; + + +} + int iface::read_nd(address& saddr, address& daddr, address& taddr) { uint8_t msg[256]; @@ -314,14 +321,19 @@ void iface::fixup_pollfds() } } -ptr iface::get_proxy() const +void iface::pr(const ptr& pr) +{ + _proxy = pr; +} + +const ptr& iface::pr() const { return _proxy; } -void iface::set_proxy(const ptr& pr) +void iface::remove_session(const ptr& se) { - _proxy = pr; + _sessions.remove(se); } void iface::add_session(const ptr& se) diff --git a/src/iface.h b/src/iface.h index b02fdfb..d1a41fc 100644 --- a/src/iface.h +++ b/src/iface.h @@ -76,22 +76,26 @@ public: ssize_t read(address& saddr, address& daddr, uint8_t *msg, size_t size); - ssize_t write(address& daddr, uint8_t *msg, size_t size); + ssize_t write(const address& daddr, const uint8_t *msg, size_t size); - ssize_t write_solicit(address& taddr); + ssize_t write_solicit(const address& taddr); + + ssize_t write_advert(const address& daddr, const address& taddr); int read_nd(address& saddr, address& daddr, address& taddr); // Returns the name of the interface. const std::string& name() const; - ptr get_proxy() const; + const ptr& pr() const; - void set_proxy(const ptr& pr); + void pr(const ptr& pr); // Adds a session to be monitored for ND_NEIGHBOR_ADVERT messages. void add_session(const ptr& se); + void remove_session(const ptr& se); + }; __NDPPD_NS_END diff --git a/src/ndppd.cc b/src/ndppd.cc index f34665c..eac2df3 100644 --- a/src/ndppd.cc +++ b/src/ndppd.cc @@ -18,6 +18,7 @@ #include #include +#include #include "ndppd.h" @@ -68,10 +69,26 @@ int main(int argc, char *argv[], char *env[]) if(!conf::load(config_path)) return -1; - while(iface::poll_all() >= 0) ; + + struct timeval t1, t2; + + gettimeofday(&t1, 0); + + while(iface::poll_all() >= 0) + { + int elapsed_time; + gettimeofday(&t2, 0); + + elapsed_time = + ((t2.tv_sec - t1.tv_sec) * 1000) + + ((t2.tv_usec - t1.tv_usec) / 1000); + + t1.tv_sec = t2.tv_sec; + t1.tv_usec = t2.tv_usec; + + session::update_all(elapsed_time); + } return 0; } - - diff --git a/src/proxy.cc b/src/proxy.cc index 76cabe6..0c016f0 100644 --- a/src/proxy.cc +++ b/src/proxy.cc @@ -36,7 +36,7 @@ ptr proxy::create(const ptr& ifa) pr->_weak_ptr = pr.weak_copy(); pr->_ifa = ifa; - ifa->set_proxy(pr); + ifa->pr(pr); DBG("proxy_create() ifa=%x =%x", (iface *)ifa, (proxy *)pr); @@ -117,6 +117,10 @@ ptr proxy::add_rule(const address& addr) return ru; } +void proxy::remove_session(const ptr& se) +{ + _sessions.remove(se); +} + __NDPPD_NS_END - - + diff --git a/src/proxy.h b/src/proxy.h index 1a0c576..eb6c52c 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -50,6 +50,8 @@ public: void handle_solicit(const address& saddr, const address& daddr, const address& taddr); + void remove_session(const ptr& se); + ptr add_rule(const address& addr, const ptr& ifa); ptr add_rule(const address& addr); diff --git a/src/session.cc b/src/session.cc index c72062b..e0adaf4 100644 --- a/src/session.cc +++ b/src/session.cc @@ -22,8 +22,42 @@ __NDPPD_NS_BEGIN -session::session() +std::list > session::_sessions; + +void session::update_all(int elapsed_time) { + for(std::list >::iterator it = _sessions.begin(); + it != _sessions.end(); ) + { + ptr se = *it++; + + if((se->_ttl -= elapsed_time) >= 0) + continue; + + switch(se->_status) + { + case session::WAITING: + DBG("session is now invalid"); + se->_status = session::INVALID; + se->_ttl = 30 * 1000; + break; + + default: + se->_pr->remove_session(se); + } + } +} + +session::~session() +{ + _sessions.remove(_weak_ptr); + + for(std::list >::iterator it = _ifaces.begin(); + it != _ifaces.end(); it++) + { + (*it)->remove_session(_weak_ptr); + } + } ptr session::create(const ptr& pr, const address& saddr, @@ -36,6 +70,9 @@ ptr session::create(const ptr& pr, const address& saddr, se->_saddr = saddr; se->_taddr = taddr; se->_daddr = daddr; + se->_ttl = 500; + + _sessions.push_back(se.weak_copy()); DBG("session::create() pr=%x, saddr=%s, daddr=%s, taddr=%s, =%x", (proxy *)pr, saddr.to_string().c_str(), daddr.to_string().c_str(), @@ -49,7 +86,7 @@ void session::add_iface(const ptr& ifa) if(std::find(_ifaces.begin(), _ifaces.end(), ifa) != _ifaces.end()) return; - ifa->add_session(_weak_ptr.strong_copy()); + ifa->add_session(_weak_ptr); _ifaces.push_back(ifa); } diff --git a/src/session.h b/src/session.h index 648ae21..42d6b27 100644 --- a/src/session.h +++ b/src/session.h @@ -44,8 +44,7 @@ private: int _status; - // Constructor. - session(); + static std::list > _sessions; public: enum @@ -55,6 +54,11 @@ public: INVALID // Invalid; }; + static void update_all(int elapsed_time); + + // Destructor. + ~session(); + static ptr create(const ptr& pr, const address& saddr, const address& daddr, const address& taddr);