summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Erebos/Discovery.hs13
-rw-r--r--src/Erebos/Network.hs1
-rw-r--r--test/discovery.et86
3 files changed, 100 insertions, 0 deletions
diff --git a/src/Erebos/Discovery.hs b/src/Erebos/Discovery.hs
index 16b67e6..7487d7d 100644
--- a/src/Erebos/Discovery.hs
+++ b/src/Erebos/Discovery.hs
@@ -553,6 +553,19 @@ instance Service DiscoveryService where
forM_ searchingFor $ \dgst -> do
sendToPeer peer $ DiscoverySearch (Right dgst)
+ serviceUpdatedPeer = do
+ pid <- asks svcPeerIdentity
+ peer <- asks svcPeer
+ isPeerDropped peer >>= \case
+ True -> do
+ peers <- dgsPeers <$> svcGetGlobal
+ let peers' = M.filter ((Just peer /=) . dpPeer) peers
+ svcModifyGlobal $ \s -> s { dgsPeers = peers' }
+ debugLog $ "dropped peer " <> show [ refDigest $ storedRef $ idData pid, refDigest $ storedRef $ idExtData pid ] <>
+ ", map size " <> show (M.size peers) <> " -> " <> show (M.size peers')
+ False -> do
+ debugLog $ "updated peer " <> show [ refDigest $ storedRef $ idData pid, refDigest $ storedRef $ idExtData pid ]
+
#ifdef ENABLE_ICE_SUPPORT
serviceStopServer _ _ _ pstates = do
forM_ pstates $ \( _, DiscoveryPeerState {..} ) -> do
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs
index ebecbc0..518e992 100644
--- a/src/Erebos/Network.hs
+++ b/src/Erebos/Network.hs
@@ -908,6 +908,7 @@ dropPeerInner peer pvalue = do
PeerConnected conn -> do
connClose conn
writeTChan (serverChanPeer $ peerServer peer) peer
+ notifyServicesOfPeer False peer
_ -> return ()
writeTVar (peerState peer) PeerDropped
return $ M.delete (peerAddress peer) pvalue
diff --git a/test/discovery.et b/test/discovery.et
index e80a755..07173b6 100644
--- a/test/discovery.et
+++ b/test/discovery.et
@@ -164,6 +164,92 @@ test DiscoveryTunnel:
expect /stop-server-done/ from p
+test DiscoveryTunnelWithChangedAddresses:
+ let services = "discovery:tunnel"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+
+ for n in [ p1.node, p2.node ]:
+ shell on n:
+ nft add table inet filter
+ nft add chain inet filter input '{ type filter hook input priority filter ; policy drop; }'
+ nft add rule inet filter input 'ct state { established, related } accept'
+
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ for id in [ p1obase ]:
+ send "start-server services $services test-log" to pd
+
+ for p in [ p1, p2 ]:
+ send "start-server services $services test-log" to p
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id .*/
+
+ send "peer-drop 1" to pd
+ send "peer-drop 2" to pd
+ for p in [ p1, p2 ]:
+ send "stop-server" to p
+ for p in [ p1, p2 ]:
+ shell on p.node as get_default:
+ ip route | grep ^default
+ expect /.* via ([0-9.]+).*/ from get_default capture default_route
+ shell on p.node:
+ ip addr del dev veth0 ${p.node.ip}/24
+ ip addr add dev veth0 ${p.node.ip}0/24
+ ip route add default via ${default_route} dev veth0 src ${p.node.ip}0
+ for p in [ p1, p2 ]:
+ expect /stop-server-done/ from p
+ for p in [ p1, p2 ]:
+ send "start-server services $services test-log" to p
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [0-9]+ addr ${p.node.ip}0 29665/
+ /peer [0-9]+ id .*/
+
+ send "discovery-tunnel 1 $id" to p2
+
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p2
+ expect /net-ostream-open ${p1.node.ip}0 29665 1 1/ from pd
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p1
+ expect /net-ostream-open ${p2.node.ip}0 29665 1 1/ from pd
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
test DiscoveryTunnelRefused:
let services = "discovery"