summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-07-26 09:07:01 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-07-31 22:06:16 +0200
commit2d1b098f4dee1fa7aac7a81c7b3a43e2dadd351b (patch)
tree50e4fef7bf91b6a5e123a87664624a8048c44263
parentf8c856864eba8186b19a7b4ebb61866d95f9e65a (diff)
Network: ignore connection attempts to selfHEADmaster
-rw-r--r--src/Erebos/Network/Protocol.hs16
-rw-r--r--test/network.et23
2 files changed, 32 insertions, 7 deletions
diff --git a/src/Erebos/Network/Protocol.hs b/src/Erebos/Network/Protocol.hs
index c0dff4b..f015db6 100644
--- a/src/Erebos/Network/Protocol.hs
+++ b/src/Erebos/Network/Protocol.hs
@@ -738,18 +738,20 @@ processPacket gs@GlobalState {..} econn secure packet@(TransportPacket (Transpor
_ -> return Nothing
-- Initiation packet
- | _:_ <- mapMaybe (\case Initiation x -> Just x; _ -> Nothing) header
+ | _ : _ <- mapMaybe (\case Initiation x -> Just x; _ -> Nothing) header
+ , pids <- mapMaybe (\case AnnounceSelf x -> Just x; _ -> Nothing) header
, Just ver <- version
-> do
cookie <- createCookie gs addr
atomically $ do
identity <- fst <$> readTVar gIdentity
- let reply = BL.toStrict $ serializeObject $ transportToObject gStorage $ TransportHeader
- [ CookieSet cookie
- , AnnounceSelf $ refDigest $ storedRef $ idData identity
- , ProtocolVersion ver
- ]
- writeFlow gDataFlow (addr, reply)
+ when ((refDigest $ storedRef $ idData identity) `notElem` pids) $ do
+ let reply = BL.toStrict $ serializeObject $ transportToObject gStorage $ TransportHeader
+ [ CookieSet cookie
+ , AnnounceSelf $ refDigest $ storedRef $ idData identity
+ , ProtocolVersion ver
+ ]
+ writeFlow gDataFlow (addr, reply)
return Nothing
-- Announce packet outside any connection
diff --git a/test/network.et b/test/network.et
index 59537c5..ead1354 100644
--- a/test/network.et
+++ b/test/network.et
@@ -514,3 +514,26 @@ test SendUnknownObjectType:
local:
expect /load-(.*)/ capture done
guard (done == "done")
+
+
+test ConnectToSelf:
+ subnet s1
+ subnet s2
+
+ spawn on s1 as p1
+ spawn on s2 as p2
+
+ send "create-identity Device1" to p1
+ send "create-identity Device2" to p2
+
+ for p in [ p1, p2 ]:
+ with p:
+ expect /create-identity-done .*/
+ send "start-server"
+
+ # no peer should be added:
+ send "peer-add ${p.node.ip}"
+
+ send "peer-add ${p2.node.ip}" to p1
+ expect /peer 1 addr ${p2.node.ip} 29665/ from p1
+ expect /peer 1 addr ${p1.node.ip} 29665/ from p2