diff options
| -rw-r--r-- | src/Erebos/Network/Protocol.hs | 16 | ||||
| -rw-r--r-- | test/network.et | 23 |
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 |