diff --git a/src/iface.cc b/src/iface.cc index 2ea43fa..a576144 100644 --- a/src/iface.cc +++ b/src/iface.cc @@ -211,8 +211,6 @@ ssize_t iface::read(address& saddr, address& daddr, uint8_t *msg, size_t size) return len; } -//ssize_t iface::write(address& saddr, 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; @@ -220,7 +218,6 @@ ssize_t iface::write(const address& daddr, const uint8_t *msg, size_t size) struct iovec iov; memset(&daddr_tmp, 0, sizeof(struct sockaddr_in6)); - //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.const_addr(), sizeof(struct in6_addr)); @@ -234,9 +231,6 @@ ssize_t iface::write(const address& daddr, const uint8_t *msg, size_t size) mhdr.msg_iov = &iov; mhdr.msg_iovlen = 1; - /*mhdr.msg_control = (void *)cmsg; - mhdr.msg_controllen = sizeof(chdr);*/ - int len; if((len = sendmsg(_fd, &mhdr, 0)) < 0) @@ -247,18 +241,18 @@ ssize_t iface::write(const address& daddr, const uint8_t *msg, size_t size) ssize_t iface::write_solicit(const address& taddr) { - struct nd_neighbor_solicit msg; + struct nd_neighbor_solicit ns; // FIXME: Alright, I'm lazy. static address multicast("ff02::1:ff00:0000"); address daddr; - memset(&msg, 0, sizeof(struct nd_neighbor_solicit)); + memset(&ns, 0, sizeof(struct nd_neighbor_solicit)); - msg.nd_ns_hdr.icmp6_type = ND_NEIGHBOR_SOLICIT; + ns.nd_ns_type = ND_NEIGHBOR_SOLICIT; - memcpy(&msg.nd_ns_target, &taddr.const_addr(), sizeof(struct in6_addr)); + memcpy(&ns.nd_ns_target, &taddr.const_addr(), sizeof(struct in6_addr)); daddr = multicast; @@ -269,14 +263,33 @@ ssize_t iface::write_solicit(const address& taddr) DBG("iface::write_solicit() taddr=%s, daddr=%s", taddr.to_string().c_str(), daddr.to_string().c_str()); - return write(daddr, (uint8_t *)&msg, sizeof(struct nd_neighbor_solicit)); + return write(daddr, (uint8_t *)&ns, sizeof(struct nd_neighbor_solicit)); } ssize_t iface::write_advert(const address& daddr, const address& taddr) { - struct nd_neighbor_advert msg; + char buf[256]; + memset(buf, 0, sizeof(buf)); + struct nd_neighbor_advert *na = + (struct nd_neighbor_advert *)&buf[0]; + + struct nd_opt_hdr *opt = + (struct nd_opt_hdr *)&buf[sizeof(struct nd_neighbor_advert)]; + + opt->nd_opt_type = ND_OPT_TARGET_LINKADDR; + opt->nd_opt_len = 1; + + na->nd_na_type = ND_NEIGHBOR_ADVERT; + na->nd_na_flags_reserved = ND_NA_FLAG_SOLICITED | ND_NA_FLAG_ROUTER; + + memcpy(&na->nd_na_target, &taddr.const_addr(), sizeof(struct in6_addr)); + + memcpy(buf + sizeof(struct nd_neighbor_advert) + sizeof(struct nd_opt_hdr), &hwaddr, 6); + + return write(daddr, (uint8_t *)buf, sizeof(struct nd_neighbor_advert) + + sizeof(struct nd_opt_hdr) + 8); } int iface::read_nd(address& saddr, address& daddr, address& taddr) @@ -312,7 +325,7 @@ void iface::fixup_pollfds() DBG("iface::fixup_pollfds() _map.size()=%d", _map.size()); for(std::map >::iterator it = _map.begin(); - it != _map.end(); it++) + it != _map.end(); it++) { _pollfds[i].fd = it->second->_fd; _pollfds[i].events = POLLIN; @@ -364,19 +377,17 @@ int iface::poll_all() if(len == 0) return 0; - std::vector::iterator fit; - std::map >::iterator iit; + std::vector::iterator f_it; + std::map >::iterator i_it; - for(fit = _pollfds.begin(), iit = _map.begin(); fit != _pollfds.end(); fit++, iit++) + for(f_it = _pollfds.begin(), i_it = _map.begin(); f_it != _pollfds.end(); f_it++, i_it++) { - if(!(fit->revents & POLLIN)) + if(!(f_it->revents & POLLIN)) continue; // We assume here that _pollfds is perfectly aligned with _map. - ptr ifa = iit->second; - - //DBG("POLLIN on %s", ifa->_name.c_str()); + ptr ifa = i_it->second; int icmp6_type; address saddr, daddr, taddr; @@ -391,8 +402,6 @@ int iface::poll_all() { DBG("ND_NEIGHBOR_SOLICIT"); - // TODO: Check the cache for recent sessions. - ifa->_proxy->handle_solicit(saddr, daddr, taddr); } else if(icmp6_type == ND_NEIGHBOR_ADVERT) @@ -402,10 +411,12 @@ int iface::poll_all() for(std::list >::iterator s_it = ifa->_sessions.begin(); s_it != ifa->_sessions.end(); s_it++) { - /*if((*s_it)->addr() == taddr) - { - (*s_it)->handle_advert(); - }*/ + ptr se = *s_it; + + //if((se->daddr() = + + + //(*s_it)->handle_advert(); } } } @@ -420,4 +431,3 @@ const std::string& iface::name() const } __NDPPD_NS_END - diff --git a/src/iface.h b/src/iface.h index d1a41fc..8353dc6 100644 --- a/src/iface.h +++ b/src/iface.h @@ -101,5 +101,3 @@ public: __NDPPD_NS_END #endif // __NDPPD_IFACE_H - - diff --git a/src/ptr.h b/src/ptr.h index 3adf044..e47631b 100644 --- a/src/ptr.h +++ b/src/ptr.h @@ -19,7 +19,7 @@ __NDPPD_NS_BEGIN // This template class simplifies the usage of pointers. It's basically -// a reference-counting smart-pointer that supports both weak and +// a reference-counting smart pointer that supports both weak and // strong references. template @@ -204,5 +204,3 @@ public: __NDPPD_NS_END #endif // __NDPPD_PTR_H - - diff --git a/src/session.cc b/src/session.cc index e0adaf4..ef82b5e 100644 --- a/src/session.cc +++ b/src/session.cc @@ -57,7 +57,6 @@ session::~session() { (*it)->remove_session(_weak_ptr); } - } ptr session::create(const ptr& pr, const address& saddr, @@ -99,7 +98,6 @@ void session::send_solicit() { DBG(" on %s", (*it)->name().c_str()); (*it)->write_solicit(_taddr); - // huhh hahh. } } @@ -133,12 +131,4 @@ int session::status() const return _status; } -void refresh() -{ - -} - - __NDPPD_NS_END - -