summaryrefslogtreecommitdiff
path: root/dht/TCPProber.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-01-03 18:22:16 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-07 13:24:59 -0500
commit15ab3290ad04280764968ba4760474a8c0cbfa52 (patch)
tree8df7bdfe38005f5478243427bb2b692d32843283 /dht/TCPProber.hs
parentb411ab66ceee7386e4829e2337c735a08fb3d54d (diff)
Modify kademlia search to distinguish a Canceled from timed-out query.
Diffstat (limited to 'dht/TCPProber.hs')
-rw-r--r--dht/TCPProber.hs13
1 files changed, 8 insertions, 5 deletions
diff --git a/dht/TCPProber.hs b/dht/TCPProber.hs
index faf8b35c..17b68f64 100644
--- a/dht/TCPProber.hs
+++ b/dht/TCPProber.hs
@@ -26,6 +26,7 @@ import Data.Wrapper.PSQ as PSQ
26import Network.Kademlia.Search 26import Network.Kademlia.Search
27import Network.Tox.NodeId 27import Network.Tox.NodeId
28import qualified Network.Tox.TCP as TCP 28import qualified Network.Tox.TCP as TCP
29import Network.QueryResponse as QR
29 30
30-- Probe TCP ports in a staggered fashion to up the odds of discovering 31-- Probe TCP ports in a staggered fashion to up the odds of discovering
31-- a higher priority port like 443. 32-- a higher priority port like 443.
@@ -156,7 +157,7 @@ runProbeQueue prober client maxjobs = do
156 loop 157 loop
157 158
158 159
159getNodes :: TCPProber -> TCP.TCPClient err Nonce8 -> NodeId -> TCP.NodeInfo -> IO (Maybe ([TCP.NodeInfo],[TCP.NodeInfo],Maybe ())) 160getNodes :: TCPProber -> TCP.TCPClient err Nonce8 -> NodeId -> TCP.NodeInfo -> IO (Result ([TCP.NodeInfo],[TCP.NodeInfo],Maybe ()))
160getNodes prober tcp seeking dst = do 161getNodes prober tcp seeking dst = do
161 r <- TCP.getUDPNodes' tcp seeking (TCP.udpNodeInfo dst) 162 r <- TCP.getUDPNodes' tcp seeking (TCP.udpNodeInfo dst)
162 dput XTCP $ "Got via TCP nodes: " ++ show r 163 dput XTCP $ "Got via TCP nodes: " ++ show r
@@ -164,14 +165,16 @@ getNodes prober tcp seeking dst = do
164 where ns' = do 165 where ns' = do
165 n <- ns 166 n <- ns
166 [ TCP.NodeInfo n 0 ] 167 [ TCP.NodeInfo n 0 ]
167 fmap join $ forM r $ \(ns,gw) -> do 168 case r of
169 Success (ns,gw) -> do
168 let ts = tcps ns 170 let ts = tcps ns
169 if TCP.nodeId gw == TCP.nodeId dst 171 if TCP.nodeId gw == TCP.nodeId dst
170 then return $ Just ts 172 then return $ Success ts
171 else do 173 else do
172 enqueueProbe prober (TCP.udpNodeInfo dst) 174 enqueueProbe prober (TCP.udpNodeInfo dst)
173 return $ Just ts 175 return $ Success ts
174 return $ Just ts 176 return $ Success ts
177 _ -> return $ fmap (const $ error "TCPProber.getNodes: The impossible happened!") r
175 178
176nodeSearch :: TCPProber -> TCP.TCPClient err Nonce8 -> Search NodeId (IP, PortNumber) () TCP.NodeInfo TCP.NodeInfo 179nodeSearch :: TCPProber -> TCP.TCPClient err Nonce8 -> Search NodeId (IP, PortNumber) () TCP.NodeInfo TCP.NodeInfo
177nodeSearch prober tcp = Search 180nodeSearch prober tcp = Search