summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network.cpp17
-rw-r--r--src/network.h2
-rw-r--r--test/attach.test2
-rw-r--r--test/discovery.test2
-rw-r--r--test/sync.test2
5 files changed, 16 insertions, 9 deletions
diff --git a/src/network.cpp b/src/network.cpp
index 1e95571..1d38bdd 100644
--- a/src/network.cpp
+++ b/src/network.cpp
@@ -222,6 +222,7 @@ Server::Priv::Priv(const Head<LocalState> & local, const Identity & self,
for (struct ifaddrs * ifa = addrs.get(); ifa; ifa = ifa->ifa_next) {
if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET &&
ifa->ifa_flags & IFF_BROADCAST) {
+ localAddresses.push_back(((sockaddr_in*)ifa->ifa_addr)->sin_addr);
bcastAddresses.push_back(((sockaddr_in*)ifa->ifa_broadaddr)->sin_addr);
}
}
@@ -278,7 +279,7 @@ void Server::Priv::doListen()
vector<uint8_t> buf, decrypted, *current;
unique_lock<mutex> lock(dataMutex);
- while (!finish) {
+ for (; !finish; lock.lock()) {
sockaddr_in paddr;
lock.unlock();
@@ -292,6 +293,9 @@ void Server::Priv::doListen()
break;
buf.resize(ret);
+ if (isSelfAddress(paddr))
+ continue;
+
auto & peer = getPeer(paddr);
current = &buf;
@@ -334,8 +338,6 @@ void Server::Priv::doListen()
} else {
std::cerr << "invalid packet\n";
}
-
- lock.lock();
}
}
@@ -369,6 +371,15 @@ void Server::Priv::doAnnounce()
}
}
+bool Server::Priv::isSelfAddress(const sockaddr_in & paddr)
+{
+ for (const auto & in : localAddresses)
+ if (in.s_addr == paddr.sin_addr.s_addr &&
+ ntohs(paddr.sin_port) == discoveryPort)
+ return true;
+ return false;
+}
+
Server::Peer & Server::Priv::getPeer(const sockaddr_in & paddr)
{
for (auto & peer : peers)
diff --git a/src/network.h b/src/network.h
index b1ecf86..a59a1bc 100644
--- a/src/network.h
+++ b/src/network.h
@@ -147,6 +147,7 @@ struct Server::Priv
void doListen();
void doAnnounce();
+ bool isSelfAddress(const sockaddr_in & paddr);
Peer & getPeer(const sockaddr_in & paddr);
void handlePacket(Peer &, const TransportHeader &, ReplyBuilder &);
@@ -173,6 +174,7 @@ struct Server::Priv
vector<weak_ptr<WaitingRef>> waiting;
int sock;
+ vector<in_addr> localAddresses;
vector<in_addr> bcastAddresses;
// Start destruction with finalizing services
diff --git a/test/attach.test b/test/attach.test
index 0c97fb1..4e2238e 100644
--- a/test/attach.test
+++ b/test/attach.test
@@ -9,9 +9,7 @@ test:
send "start-server" to p2
expect /local-identity Device1 Owner/ from p1
expect /local-identity Device2/ from p2
- expect /peer [0-9]+ 192.168.0.11:29665/ from p1
expect /peer [0-9]+ 192.168.0.12:29665/ from p1
- expect /peer [0-9]+ 192.168.0.12:29665/ from p2
expect /peer [0-9]+ 192.168.0.11:29665/ from p2
expect /peer [0-9]+ Device2 Device2/ from p1
expect /peer [0-9]+ Owner Device1/ from p2
diff --git a/test/discovery.test b/test/discovery.test
index 26e8eaf..aba6b15 100644
--- a/test/discovery.test
+++ b/test/discovery.test
@@ -5,9 +5,7 @@ test:
send "create-identity Device2" to p2
send "start-server" to p1
send "start-server" to p2
- expect /peer [0-9]+ 192.168.0.11:29665/ from p1
expect /peer [0-9]+ 192.168.0.12:29665/ from p1
- expect /peer [0-9]+ 192.168.0.12:29665/ from p2
expect /peer [0-9]+ 192.168.0.11:29665/ from p2
expect /peer [0-9]+ Device2 Device2/ from p1
expect /peer [0-9]+ Device1 Device1/ from p2
diff --git a/test/sync.test b/test/sync.test
index 1b243c2..2480ce9 100644
--- a/test/sync.test
+++ b/test/sync.test
@@ -12,9 +12,7 @@ test:
expect /local-identity Device1 Owner/ from p1
expect /local-identity Device2/ from p2
expect /shared-identity Owner/ from p1
- expect /peer [0-9]+ 192.168.0.11:29665/ from p1
expect /peer [0-9]+ 192.168.0.12:29665/ from p1
- expect /peer [0-9]+ 192.168.0.12:29665/ from p2
expect /peer [0-9]+ 192.168.0.11:29665/ from p2
expect /peer [0-9]+ Device2 Device2/ from p1
expect /peer [0-9]+ Owner Device1/ from p2