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