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

@ -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

@ -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.

@ -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<proxy> iface::get_proxy() const
void iface::pr(const ptr<proxy>& pr)
{
_proxy = pr;
}
const ptr<proxy>& iface::pr() const
{
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)

@ -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<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.
void add_session(const ptr<session>& se);
void remove_session(const ptr<session>& se);
};
__NDPPD_NS_END

@ -18,6 +18,7 @@
#include <string>
#include <getopt.h>
#include <sys/time.h>
#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;
}

@ -36,7 +36,7 @@ ptr<proxy> proxy::create(const ptr<iface>& 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<rule> proxy::add_rule(const address& addr)
return ru;
}
void proxy::remove_session(const ptr<session>& se)
{
_sessions.remove(se);
}
__NDPPD_NS_END

@ -50,6 +50,8 @@ public:
void handle_solicit(const address& saddr, const address& daddr,
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);

@ -22,8 +22,42 @@
__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,
@ -36,6 +70,9 @@ ptr<session> session::create(const ptr<proxy>& 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<iface>& 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);
}

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