Major changes

This commit is contained in:
Daniel Adolfsson 2011-09-14 10:53:21 +02:00
parent 77b328ad15
commit 35567ed082
9 changed files with 111 additions and 27 deletions

View File

@ -264,12 +264,14 @@ struct in6_addr& address::addr()
return _addr; return _addr;
} }
const struct in6_addr& address::const_addr() const
{
return _addr;
}
struct in6_addr& address::mask() struct in6_addr& address::mask()
{ {
return _mask; return _mask;
} }
__NDPPD_NS_END __NDPPD_NS_END

View File

@ -42,6 +42,8 @@ public:
struct in6_addr& addr(); struct in6_addr& addr();
const struct in6_addr& const_addr() const;
struct in6_addr& mask(); struct in6_addr& mask();
// Compare _a/_m against a._a. // Compare _a/_m against a._a.

View File

@ -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& 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 sockaddr_in6 daddr_tmp;
struct msghdr mhdr; 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_len = sizeof(struct sockaddr_in6);
daddr_tmp.sin6_family = AF_INET6; daddr_tmp.sin6_family = AF_INET6;
daddr_tmp.sin6_port = htons(IPPROTO_ICMPV6); // Needed? 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_len = size;
iov.iov_base = (caddr_t)msg; iov.iov_base = (caddr_t)msg;
@ -245,7 +245,7 @@ ssize_t iface::write(address& daddr, uint8_t *msg, size_t size)
return len; return len;
} }
ssize_t iface::write_solicit(address& taddr) ssize_t iface::write_solicit(const address& taddr)
{ {
struct nd_neighbor_solicit msg; 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; 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 = multicast;
daddr.addr().s6_addr[13] = taddr.addr().s6_addr[13]; daddr.addr().s6_addr[13] = taddr.const_addr().s6_addr[13];
daddr.addr().s6_addr[14] = taddr.addr().s6_addr[14]; daddr.addr().s6_addr[14] = taddr.const_addr().s6_addr[14];
daddr.addr().s6_addr[15] = taddr.addr().s6_addr[15]; daddr.addr().s6_addr[15] = taddr.const_addr().s6_addr[15];
DBG("iface::write_solicit() taddr=%s, daddr=%s", DBG("iface::write_solicit() taddr=%s, daddr=%s",
taddr.to_string().c_str(), daddr.to_string().c_str()); 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)); 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) int iface::read_nd(address& saddr, address& daddr, address& taddr)
{ {
uint8_t msg[256]; uint8_t msg[256];
@ -314,14 +321,19 @@ void iface::fixup_pollfds()
} }
} }
ptr<proxy> iface::get_proxy() const void iface::pr(const ptr<proxy>& pr)
{
_proxy = pr;
}
const ptr<proxy>& iface::pr() const
{ {
return _proxy; return _proxy;
} }
void iface::set_proxy(const ptr<proxy>& pr) void iface::remove_session(const ptr<session>& se)
{ {
_proxy = pr; _sessions.remove(se);
} }
void iface::add_session(const ptr<session>& se) void iface::add_session(const ptr<session>& se)

View File

@ -76,22 +76,26 @@ public:
ssize_t read(address& saddr, address& daddr, uint8_t *msg, size_t size); 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); int read_nd(address& saddr, address& daddr, address& taddr);
// Returns the name of the interface. // Returns the name of the interface.
const std::string& name() const; const std::string& name() const;
ptr<proxy> get_proxy() const; const ptr<proxy>& pr() const;
void set_proxy(const ptr<proxy>& pr); void pr(const ptr<proxy>& pr);
// Adds a session to be monitored for ND_NEIGHBOR_ADVERT messages. // Adds a session to be monitored for ND_NEIGHBOR_ADVERT messages.
void add_session(const ptr<session>& se); void add_session(const ptr<session>& se);
void remove_session(const ptr<session>& se);
}; };
__NDPPD_NS_END __NDPPD_NS_END

View File

@ -18,6 +18,7 @@
#include <string> #include <string>
#include <getopt.h> #include <getopt.h>
#include <sys/time.h>
#include "ndppd.h" #include "ndppd.h"
@ -68,10 +69,26 @@ int main(int argc, char *argv[], char *env[])
if(!conf::load(config_path)) if(!conf::load(config_path))
return -1; 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; return 0;
} }

View File

@ -36,7 +36,7 @@ ptr<proxy> proxy::create(const ptr<iface>& ifa)
pr->_weak_ptr = pr.weak_copy(); pr->_weak_ptr = pr.weak_copy();
pr->_ifa = ifa; pr->_ifa = ifa;
ifa->set_proxy(pr); ifa->pr(pr);
DBG("proxy_create() ifa=%x =%x", (iface *)ifa, (proxy *)pr); DBG("proxy_create() ifa=%x =%x", (iface *)ifa, (proxy *)pr);
@ -117,6 +117,10 @@ ptr<rule> proxy::add_rule(const address& addr)
return ru; return ru;
} }
void proxy::remove_session(const ptr<session>& se)
{
_sessions.remove(se);
}
__NDPPD_NS_END __NDPPD_NS_END

View File

@ -50,6 +50,8 @@ public:
void handle_solicit(const address& saddr, const address& daddr, void handle_solicit(const address& saddr, const address& daddr,
const address& taddr); const address& taddr);
void remove_session(const ptr<session>& se);
ptr<rule> add_rule(const address& addr, const ptr<iface>& ifa); ptr<rule> add_rule(const address& addr, const ptr<iface>& ifa);
ptr<rule> add_rule(const address& addr); ptr<rule> add_rule(const address& addr);

View File

@ -22,8 +22,42 @@
__NDPPD_NS_BEGIN __NDPPD_NS_BEGIN
session::session() std::list<ptr<session> > session::_sessions;
void session::update_all(int elapsed_time)
{ {
for(std::list<ptr<session> >::iterator it = _sessions.begin();
it != _sessions.end(); )
{
ptr<session> 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<ptr<iface> >::iterator it = _ifaces.begin();
it != _ifaces.end(); it++)
{
(*it)->remove_session(_weak_ptr);
}
} }
ptr<session> session::create(const ptr<proxy>& pr, const address& saddr, ptr<session> session::create(const ptr<proxy>& pr, const address& saddr,
@ -36,6 +70,9 @@ ptr<session> session::create(const ptr<proxy>& pr, const address& saddr,
se->_saddr = saddr; se->_saddr = saddr;
se->_taddr = taddr; se->_taddr = taddr;
se->_daddr = daddr; se->_daddr = daddr;
se->_ttl = 500;
_sessions.push_back(se.weak_copy());
DBG("session::create() pr=%x, saddr=%s, daddr=%s, taddr=%s, =%x", DBG("session::create() pr=%x, saddr=%s, daddr=%s, taddr=%s, =%x",
(proxy *)pr, saddr.to_string().c_str(), daddr.to_string().c_str(), (proxy *)pr, saddr.to_string().c_str(), daddr.to_string().c_str(),
@ -49,7 +86,7 @@ void session::add_iface(const ptr<iface>& ifa)
if(std::find(_ifaces.begin(), _ifaces.end(), ifa) != _ifaces.end()) if(std::find(_ifaces.begin(), _ifaces.end(), ifa) != _ifaces.end())
return; return;
ifa->add_session(_weak_ptr.strong_copy()); ifa->add_session(_weak_ptr);
_ifaces.push_back(ifa); _ifaces.push_back(ifa);
} }

View File

@ -44,8 +44,7 @@ private:
int _status; int _status;
// Constructor. static std::list<ptr<session> > _sessions;
session();
public: public:
enum enum
@ -55,6 +54,11 @@ public:
INVALID // Invalid; INVALID // Invalid;
}; };
static void update_all(int elapsed_time);
// Destructor.
~session();
static ptr<session> create(const ptr<proxy>& pr, const address& saddr, static ptr<session> create(const ptr<proxy>& pr, const address& saddr,
const address& daddr, const address& taddr); const address& daddr, const address& taddr);