diff --git a/include/llarp/service/Intro.hpp b/include/llarp/service/Intro.hpp index 2ef0ac2f8..d9720b66e 100644 --- a/include/llarp/service/Intro.hpp +++ b/include/llarp/service/Intro.hpp @@ -28,6 +28,20 @@ namespace llarp expiresAt = other.expiresAt; } + bool + IsExpired(llarp_time_t now) const + { + return now <= expiresAt; + } + + bool + ExpiresSoon(llarp_time_t now, llarp_time_t dlt = 5000) const + { + if(dlt) + return now <= (expiresAt - (llarp_randint() % dlt)); + return IsExpired(now); + } + ~Introduction(); friend std::ostream& @@ -55,4 +69,4 @@ namespace llarp } // namespace service } // namespace llarp -#endif \ No newline at end of file +#endif diff --git a/include/llarp/service/IntroSet.hpp b/include/llarp/service/IntroSet.hpp index 3020bdd1a..70dc89cc1 100644 --- a/include/llarp/service/IntroSet.hpp +++ b/include/llarp/service/IntroSet.hpp @@ -102,20 +102,18 @@ namespace llarp } bool - IsNewerThan(const IntroSet& other) const + OtherIsNewerThan(const IntroSet& other) const { - return GetNewestIntro().expiresAt > other.GetNewestIntro().expiresAt; + return GetNewestIntroExpiration() < other.GetNewestIntroExpiration(); } - Introduction - GetNewestIntro() const + llarp_time_t + GetNewestIntroExpiration() const { - Introduction i; - i.expiresAt = 0; + llarp_time_t t = 0; for(const auto& intro : I) - if(intro.expiresAt > i.expiresAt) - i = intro; - return i; + t = std::max(intro.expiresAt, t); + return t; } bool diff --git a/include/llarp/service/endpoint.hpp b/include/llarp/service/endpoint.hpp index f9b733b6f..7d2ff110a 100644 --- a/include/llarp/service/endpoint.hpp +++ b/include/llarp/service/endpoint.hpp @@ -188,7 +188,7 @@ namespace llarp private: bool - OnIntroSetUpdate(const IntroSet* i); + OnIntroSetUpdate(const Address& addr, const IntroSet* i); void EncryptAndSendTo(path::Path* p, llarp_buffer_t payload, ProtocolType t); @@ -275,7 +275,7 @@ namespace llarp private: bool - OnOutboundLookup(const IntroSet* i); /* */ + OnOutboundLookup(const Address&, const IntroSet* i); /* */ static bool SetupIsolatedNetwork(void* user, bool success); diff --git a/llarp/dht/context.cpp b/llarp/dht/context.cpp index 898232c2f..12d1b1cb8 100644 --- a/llarp/dht/context.cpp +++ b/llarp/dht/context.cpp @@ -123,7 +123,7 @@ namespace llarp { if(itr->second.introset.IsExpired(now)) { - llarp::LogInfo("introset expired ", itr->second.introset.A.Addr()); + llarp::LogDebug("introset expired ", itr->second.introset.A.Addr()); itr = nodes.erase(itr); } else diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index c8b7934ab..a73830ca1 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -238,7 +238,7 @@ namespace llarp if(itr != m_AddrToIP.end()) { // mark ip active - m_IPActivity[itr->second] = now; + m_IPActivity[itr->second] = std::max(now, m_IPActivity[itr->second]); return itr->second; } } @@ -276,7 +276,7 @@ namespace llarp } // mark ip active - m_IPActivity[nextIP] = now; + m_IPActivity[nextIP] = std::max(m_IPActivity[nextIP], now); return nextIP; } @@ -290,7 +290,7 @@ namespace llarp void TunEndpoint::MarkIPActive(uint32_t ip) { - m_IPActivity[ip] = llarp_time_now_ms(); + m_IPActivity[ip] = std::max(llarp_time_now_ms(), m_IPActivity[ip]); } void diff --git a/llarp/relay_up_down.cpp b/llarp/relay_up_down.cpp index 23c8de38f..25ef53a49 100644 --- a/llarp/relay_up_down.cpp +++ b/llarp/relay_up_down.cpp @@ -119,6 +119,7 @@ namespace llarp { return path->HandleDownstream(X.Buffer(), Y, r); } + llarp::LogWarn("unhandled downstream message"); return false; } } // namespace llarp diff --git a/llarp/service.cpp b/llarp/service.cpp index f4aa1fbc5..8d108b901 100644 --- a/llarp/service.cpp +++ b/llarp/service.cpp @@ -105,7 +105,7 @@ namespace llarp auto highest = now; for(const auto& i : I) highest = std::max(i.expiresAt, highest); - return highest == now; + return highest >= now; } Introduction::~Introduction() diff --git a/llarp/service/endpoint.cpp b/llarp/service/endpoint.cpp index 4b1e499c9..0df9b84a5 100644 --- a/llarp/service/endpoint.cpp +++ b/llarp/service/endpoint.cpp @@ -477,8 +477,7 @@ namespace llarp Endpoint::ShouldPublishDescriptors(llarp_time_t now) const { if(m_IntroSet.HasExpiredIntros(now)) - return m_CurrentPublishTX == 0 - && now - m_LastPublishAttempt >= INTROSET_PUBLISH_RETRY_INTERVAL; + return now - m_LastPublishAttempt >= INTROSET_PUBLISH_RETRY_INTERVAL; return m_CurrentPublishTX == 0 && now - m_LastPublish >= INTROSET_PUBLISH_INTERVAL; } @@ -498,7 +497,8 @@ namespace llarp } Address remote; - typedef std::function< bool(const IntroSet*) > HandlerFunc; + typedef std::function< bool(const Address&, const IntroSet*) > + HandlerFunc; HandlerFunc handle; HiddenServiceAddressLookup(Endpoint* p, HandlerFunc h, @@ -511,19 +511,11 @@ namespace llarp HandleResponse(const std::set< IntroSet >& results) { llarp::LogInfo("found ", results.size(), " for ", remote.ToString()); - if(results.size() == 1) + if(results.size() > 0) { - llarp::LogInfo("hidden service lookup for ", remote.ToString(), - " success"); - handle(&*results.begin()); + return handle(remote, &*results.begin()); } - else - { - llarp::LogInfo("no response in hidden service lookup for ", - remote.ToString()); - handle(nullptr); - } - return false; + return handle(remote, nullptr); } llarp::routing::IMessage* @@ -661,10 +653,17 @@ namespace llarp } bool - Endpoint::OnOutboundLookup(const IntroSet* introset) + Endpoint::OnOutboundLookup(const Address& addr, const IntroSet* introset) { if(!introset) + { + auto itr = m_PendingServiceLookups.find(addr); + if(itr != m_PendingServiceLookups.end()) + { + itr->second(addr, nullptr); + } return false; + } PutNewOutboundContext(*introset); return true; } @@ -701,7 +700,8 @@ namespace llarp HiddenServiceAddressLookup* job = new HiddenServiceAddressLookup( this, - std::bind(&Endpoint::OnOutboundLookup, this, std::placeholders::_1), + std::bind(&Endpoint::OnOutboundLookup, this, std::placeholders::_1, + std::placeholders::_2), remote, GenTXID()); if(job->SendRequestViaPath(path, Router())) @@ -726,9 +726,10 @@ namespace llarp } bool - Endpoint::OutboundContext::OnIntroSetUpdate(const IntroSet* i) + Endpoint::OutboundContext::OnIntroSetUpdate(const Address& addr, + const IntroSet* i) { - if(i && i->IsNewerThan(currentIntroSet)) + if(i && addr == i->A.Addr() && currentIntroSet.OtherIsNewerThan(*i)) { currentIntroSet = *i; } @@ -784,7 +785,7 @@ namespace llarp selectedIntro = intro; } } - ManualRebuild(2); + ManualRebuild(1); } void @@ -911,7 +912,7 @@ namespace llarp { UpdateIntroSet(); } - if(selectedIntro.expiresAt <= now || now - selectedIntro.expiresAt > 1000) + if(selectedIntro.ExpiresSoon(now, 10000)) { ShiftIntroduction(); } @@ -921,7 +922,7 @@ namespace llarp if(path) { routing::PathTransferMessage transfer(msg, selectedIntro.pathID); - llarp::LogInfo("sending frame via ", path->Upstream(), " to ", + llarp::LogInfo("sending frame via ", selectedIntro.pathID, " to ", path->Endpoint(), " for ", Name()); if(!path->SendRoutingMessage(&transfer, m_Parent->Router())) llarp::LogError("Failed to send frame on path"); @@ -943,13 +944,13 @@ namespace llarp Endpoint::OutboundContext::UpdateIntroSet() { auto addr = currentIntroSet.A.Addr(); - auto path = m_Parent->GetEstablishedPathClosestTo(addr.ToRouter()); + auto path = m_Parent->PickRandomEstablishedPath(); if(path) { HiddenServiceAddressLookup* job = new HiddenServiceAddressLookup( m_Parent, std::bind(&Endpoint::OutboundContext::OnIntroSetUpdate, this, - std::placeholders::_1), + std::placeholders::_1, std::placeholders::_2), addr, m_Parent->GenTXID()); if(!job->SendRequestViaPath(path, m_Parent->Router())) diff --git a/vendor/libtuntap-master/tuntap-unix-linux.c b/vendor/libtuntap-master/tuntap-unix-linux.c index 4bc234beb..523da0a4c 100644 --- a/vendor/libtuntap-master/tuntap-unix-linux.c +++ b/vendor/libtuntap-master/tuntap-unix-linux.c @@ -35,187 +35,215 @@ #include "tuntap.h" int -tuntap_sys_start(struct device *dev, int mode, int tun) { - int fd; - int persist; - char *ifname; - struct ifreq ifr; - - /* Get the persistence bit */ - if (mode & TUNTAP_MODE_PERSIST) { - mode &= ~TUNTAP_MODE_PERSIST; - persist = 1; - } else { - persist = 0; - } - - /* Set the mode: tun or tap */ - (void)memset(&ifr, '\0', sizeof ifr); - if (mode == TUNTAP_MODE_ETHERNET) { - ifr.ifr_flags = IFF_TAP; - ifname = "tap%i"; - } else if (mode == TUNTAP_MODE_TUNNEL) { - ifr.ifr_flags = IFF_TUN; - ifname = "tun%i"; - } else { - tuntap_log(TUNTAP_LOG_ERR, "Invalid parameter 'mode'"); - return -1; - } - ifr.ifr_flags |= IFF_NO_PI; - - if (tun < 0) { - tuntap_log(TUNTAP_LOG_ERR, "Invalid parameter 'tun'"); - return -1; +tuntap_sys_start(struct device *dev, int mode, int tun) +{ + int fd; + int persist; + char *ifname; + struct ifreq ifr; + + /* Get the persistence bit */ + if(mode & TUNTAP_MODE_PERSIST) + { + mode &= ~TUNTAP_MODE_PERSIST; + persist = 1; + } + else + { + persist = 0; + } + + /* Set the mode: tun or tap */ + (void)memset(&ifr, '\0', sizeof ifr); + if(mode == TUNTAP_MODE_ETHERNET) + { + ifr.ifr_flags = IFF_TAP; + ifname = "tap%i"; + } + else if(mode == TUNTAP_MODE_TUNNEL) + { + ifr.ifr_flags = IFF_TUN; + if(dev->if_name[0]) + strncpy(ifr.ifr_name, dev->if_name, sizeof(ifr.ifr_name)); + else + ifname = "tun%i"; + } + else + { + tuntap_log(TUNTAP_LOG_ERR, "Invalid parameter 'mode'"); + return -1; + } + ifr.ifr_flags |= IFF_NO_PI; + + if(tun < 0) + { + tuntap_log(TUNTAP_LOG_ERR, "Invalid parameter 'tun'"); + return -1; + } + + /* Open the clonable interface */ + fd = -1; + if((fd = open("/dev/net/tun", O_RDWR)) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't open /dev/net/tun"); + return -1; + } + + /* Set the interface name, if any */ + + if(fd > TUNTAP_ID_MAX) + { + return -1; + } + if(ifr.ifr_name[0] == 0 && tun) + (void)snprintf(ifr.ifr_name, sizeof ifr.ifr_name, ifname, tun); + /* Save interface name *after* SIOCGIFFLAGS */ + + /* Configure the interface */ + if(ioctl(fd, TUNSETIFF, &ifr) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't set interface name"); + return -1; + } + + /* Set it persistent if needed */ + if(persist == 1) + { + if(ioctl(fd, TUNSETPERSIST, 1) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't set persistent"); + return -1; } - - /* Open the clonable interface */ - fd = -1; - if ((fd = open("/dev/net/tun", O_RDWR)) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't open /dev/net/tun"); - return -1; - } - - /* Set the interface name, if any */ - if (tun != TUNTAP_ID_ANY) { - if (fd > TUNTAP_ID_MAX) { - return -1; - } - (void)snprintf(ifr.ifr_name, sizeof ifr.ifr_name, - ifname, tun); - /* Save interface name *after* SIOCGIFFLAGS */ - } - - /* Configure the interface */ - if (ioctl(fd, TUNSETIFF, &ifr) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't set interface name"); - return -1; - } - - /* Set it persistent if needed */ - if (persist == 1) { - if (ioctl(fd, TUNSETPERSIST, 1) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't set persistent"); - return -1; - } - } - - /* Get the interface default values */ - if (ioctl(dev->ctrl_sock, SIOCGIFFLAGS, &ifr) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't get interface values"); - return -1; - } - - /* Save flags for tuntap_{up, down} */ - dev->flags = ifr.ifr_flags; - - /* Save interface name */ - (void)memcpy(dev->if_name, ifr.ifr_name, sizeof ifr.ifr_name); - - /* Save pre-existing MAC address */ - if (mode == TUNTAP_MODE_ETHERNET) { - struct ifreq ifr_hw; - - (void)memcpy(ifr_hw.ifr_name, dev->if_name, - sizeof(dev->if_name)); - if (ioctl(fd, SIOCGIFHWADDR, &ifr_hw) == -1) { - tuntap_log(TUNTAP_LOG_WARN, - "Can't get link-layer address"); - return fd; - } - (void)memcpy(dev->hwaddr, ifr_hw.ifr_hwaddr.sa_data, ETH_ALEN); - } - return fd; + } + + /* Get the interface default values */ + if(ioctl(dev->ctrl_sock, SIOCGIFFLAGS, &ifr) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't get interface values"); + return -1; + } + + /* Save flags for tuntap_{up, down} */ + dev->flags = ifr.ifr_flags; + + /* Save interface name */ + (void)memcpy(dev->if_name, ifr.ifr_name, sizeof ifr.ifr_name); + + /* Save pre-existing MAC address */ + if(mode == TUNTAP_MODE_ETHERNET) + { + struct ifreq ifr_hw; + + (void)memcpy(ifr_hw.ifr_name, dev->if_name, sizeof(dev->if_name)); + if(ioctl(fd, SIOCGIFHWADDR, &ifr_hw) == -1) + { + tuntap_log(TUNTAP_LOG_WARN, "Can't get link-layer address"); + return fd; + } + (void)memcpy(dev->hwaddr, ifr_hw.ifr_hwaddr.sa_data, ETH_ALEN); + } + return fd; } void -tuntap_sys_destroy(struct device *dev) { - if (ioctl(dev->tun_fd, TUNSETPERSIST, 0) == -1) { - tuntap_log(TUNTAP_LOG_WARN, "Can't destroy the interface"); - } +tuntap_sys_destroy(struct device *dev) +{ + if(ioctl(dev->tun_fd, TUNSETPERSIST, 0) == -1) + { + tuntap_log(TUNTAP_LOG_WARN, "Can't destroy the interface"); + } } int -tuntap_sys_set_hwaddr(struct device *dev, struct ether_addr *eth_addr) { - struct ifreq ifr; - - (void)memset(&ifr, '\0', sizeof ifr); - (void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); - - ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; - (void)memcpy(ifr.ifr_hwaddr.sa_data, eth_addr->ether_addr_octet, 6); - - /* Linux has a special flag for setting the MAC address */ - if (ioctl(dev->ctrl_sock, SIOCSIFHWADDR, &ifr) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't set link-layer address"); - return -1; - } - return 0; +tuntap_sys_set_hwaddr(struct device *dev, struct ether_addr *eth_addr) +{ + struct ifreq ifr; + + (void)memset(&ifr, '\0', sizeof ifr); + (void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); + + ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + (void)memcpy(ifr.ifr_hwaddr.sa_data, eth_addr->ether_addr_octet, 6); + + /* Linux has a special flag for setting the MAC address */ + if(ioctl(dev->ctrl_sock, SIOCSIFHWADDR, &ifr) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't set link-layer address"); + return -1; + } + return 0; } int -tuntap_sys_set_ipv4(struct device *dev, t_tun_in_addr *s4, uint32_t bits) { - struct ifreq ifr; - struct sockaddr_in mask; - - (void)memset(&ifr, '\0', sizeof ifr); - (void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); - - /* Set the IP address first */ - (void)memcpy(&(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), - s4, sizeof(struct in_addr)); - ifr.ifr_addr.sa_family = AF_INET; - if (ioctl(dev->ctrl_sock, SIOCSIFADDR, &ifr) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't set IP address"); - return -1; - } - - /* Reinit the struct ifr */ - (void)memset(&ifr.ifr_addr, '\0', sizeof ifr.ifr_addr); - - /* Then set the netmask */ - (void)memset(&mask, '\0', sizeof mask); - mask.sin_family = AF_INET; - mask.sin_addr.s_addr = bits; - (void)memcpy(&ifr.ifr_netmask, &mask, sizeof ifr.ifr_netmask); - if (ioctl(dev->ctrl_sock, SIOCSIFNETMASK, &ifr) == -1) { - tuntap_log(TUNTAP_LOG_ERR, "Can't set netmask"); - return -1; - } - - return 0; +tuntap_sys_set_ipv4(struct device *dev, t_tun_in_addr *s4, uint32_t bits) +{ + struct ifreq ifr; + struct sockaddr_in mask; + + (void)memset(&ifr, '\0', sizeof ifr); + (void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); + + /* Set the IP address first */ + (void)memcpy(&(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), s4, + sizeof(struct in_addr)); + ifr.ifr_addr.sa_family = AF_INET; + if(ioctl(dev->ctrl_sock, SIOCSIFADDR, &ifr) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't set IP address"); + return -1; + } + + /* Reinit the struct ifr */ + (void)memset(&ifr.ifr_addr, '\0', sizeof ifr.ifr_addr); + + /* Then set the netmask */ + (void)memset(&mask, '\0', sizeof mask); + mask.sin_family = AF_INET; + mask.sin_addr.s_addr = bits; + (void)memcpy(&ifr.ifr_netmask, &mask, sizeof ifr.ifr_netmask); + if(ioctl(dev->ctrl_sock, SIOCSIFNETMASK, &ifr) == -1) + { + tuntap_log(TUNTAP_LOG_ERR, "Can't set netmask"); + return -1; + } + + return 0; } int -tuntap_sys_set_ipv6(struct device *dev, t_tun_in6_addr *s6, uint32_t bits) { - (void)dev; - (void)s6; - (void)bits; - tuntap_log(TUNTAP_LOG_NOTICE, "IPv6 is not implemented on your system"); - return -1; +tuntap_sys_set_ipv6(struct device *dev, t_tun_in6_addr *s6, uint32_t bits) +{ + (void)dev; + (void)s6; + (void)bits; + tuntap_log(TUNTAP_LOG_NOTICE, "IPv6 is not implemented on your system"); + return -1; } int -tuntap_sys_set_ifname(struct device *dev, const char *ifname, size_t len) { - struct ifreq ifr; - - (void)strncpy(ifr.ifr_name, dev->if_name, IF_NAMESIZE); - (void)strncpy(ifr.ifr_newname, ifname, len); - - if (ioctl(dev->ctrl_sock, SIOCSIFNAME, &ifr) == -1) { - perror(NULL); - tuntap_log(TUNTAP_LOG_ERR, "Can't set interface name"); - return -1; - } - return 0; +tuntap_sys_set_ifname(struct device *dev, const char *ifname, size_t len) +{ + struct ifreq ifr; + + (void)strncpy(ifr.ifr_name, dev->if_name, IF_NAMESIZE); + (void)strncpy(ifr.ifr_newname, ifname, len); + + if(ioctl(dev->ctrl_sock, SIOCSIFNAME, &ifr) == -1) + { + perror(NULL); + tuntap_log(TUNTAP_LOG_ERR, "Can't set interface name"); + return -1; + } + return 0; } int -tuntap_sys_set_descr(struct device *dev, const char *descr, size_t len) { - (void)dev; - (void)descr; - (void)len; - tuntap_log(TUNTAP_LOG_NOTICE, - "Your system does not support tuntap_set_descr()"); - return -1; +tuntap_sys_set_descr(struct device *dev, const char *descr, size_t len) +{ + (void)dev; + (void)descr; + (void)len; + tuntap_log(TUNTAP_LOG_NOTICE, + "Your system does not support tuntap_set_descr()"); + return -1; } -