Major changes
This commit is contained in:
parent
77b328ad15
commit
35567ed082
@ -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.
|
||||
|
32
src/iface.cc
32
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<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)
|
||||
|
12
src/iface.h
12
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<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
|
||||
|
23
src/ndppd.cc
23
src/ndppd.cc
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
10
src/proxy.cc
10
src/proxy.cc
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user