summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/dhtd.hs33
-rw-r--r--src/Network/BitTorrent/MainlineDHT.hs9
-rw-r--r--src/Network/Tox.hs9
3 files changed, 28 insertions, 23 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 7d3661e6..837cb210 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -195,6 +195,7 @@ data DHT = forall nid ni. ( Show ni
195 , dhtParseId :: String -> Either String nid 195 , dhtParseId :: String -> Either String nid
196 , dhtSearches :: TVar (Map.Map (String,nid) (DHTSearch nid ni)) 196 , dhtSearches :: TVar (Map.Map (String,nid) (DHTSearch nid ni))
197 , dhtFallbackNodes :: IO [ni] 197 , dhtFallbackNodes :: IO [ni]
198 , dhtBootstrap :: [ni] -> [ni] -> IO ()
198 } 199 }
199 200
200nodesFileName :: String -> String 201nodesFileName :: String -> String
@@ -1013,7 +1014,7 @@ main = do
1013 "" -> return (return (), Map.empty,return [],[]) 1014 "" -> return (return (), Map.empty,return [],[])
1014 p -> do 1015 p -> do
1015 addr <- getBindAddress p (ip6bt opts) 1016 addr <- getBindAddress p (ip6bt opts)
1016 (bt,btR) <- Mainline.newClient swarms addr 1017 (bt,btR,btBootstrap4, btBootstrap6) <- Mainline.newClient swarms addr
1017 quitBt <- forkListener "bt" (clientNet bt) 1018 quitBt <- forkListener "bt" (clientNet bt)
1018 mainlineSearches <- atomically $ newTVar Map.empty 1019 mainlineSearches <- atomically $ newTVar Map.empty
1019 peerPort <- atomically $ newTVar 6881 -- BitTorrent client TCP port. 1020 peerPort <- atomically $ newTVar 6881 -- BitTorrent client TCP port.
@@ -1083,6 +1084,9 @@ main = do
1083 [ {- TODO -} 1084 [ {- TODO -}
1084 ] 1085 ]
1085 , dhtSecretKey = return Nothing 1086 , dhtSecretKey = return Nothing
1087 , dhtBootstrap = case wantip of
1088 Want_IP4 -> btBootstrap4
1089 Want_IP6 -> btBootstrap6
1086 } 1090 }
1087 dhts = Map.fromList $ 1091 dhts = Map.fromList $
1088 ("bt4", mainlineDHT Mainline.routing4 Want_IP4) 1092 ("bt4", mainlineDHT Mainline.routing4 Want_IP4)
@@ -1107,11 +1111,11 @@ main = do
1107 addrTox <- getBindAddress toxport (ip6tox opts) 1111 addrTox <- getBindAddress toxport (ip6tox opts)
1108 hPutStrLn stderr $ "Supplied key: " ++ show (fmap (Tox.key2id . toPublic) (dhtkey opts)) 1112 hPutStrLn stderr $ "Supplied key: " ++ show (fmap (Tox.key2id . toPublic) (dhtkey opts))
1109 tox <- Tox.newTox keysdb addrTox (Just netCryptoSessionsState) (dhtkey opts) 1113 tox <- Tox.newTox keysdb addrTox (Just netCryptoSessionsState) (dhtkey opts)
1110 quitTox <- Tox.forkTox tox 1114 (quitTox, toxStrap4, toxStrap6) <- Tox.forkTox tox
1111 1115
1112 toxSearches <- atomically $ newTVar Map.empty 1116 toxSearches <- atomically $ newTVar Map.empty
1113 1117
1114 let toxDHT bkts = DHT 1118 let toxDHT bkts wantip = DHT
1115 { dhtBuckets = bkts (Tox.toxRouting tox) 1119 { dhtBuckets = bkts (Tox.toxRouting tox)
1116 , dhtPing = Map.fromList 1120 , dhtPing = Map.fromList
1117 [ ("ping", DHTPing 1121 [ ("ping", DHTPing
@@ -1262,11 +1266,14 @@ main = do
1262 [ {- TODO -} 1266 [ {- TODO -}
1263 ] 1267 ]
1264 , dhtSecretKey = return $ Just $ transportSecret (Tox.toxCryptoKeys tox) 1268 , dhtSecretKey = return $ Just $ transportSecret (Tox.toxCryptoKeys tox)
1269 , dhtBootstrap = case wantip of
1270 Want_IP4 -> toxStrap4
1271 Want_IP6 -> toxStrap6
1265 } 1272 }
1266 dhts = Map.fromList $ 1273 dhts = Map.fromList $
1267 ("tox4", toxDHT Tox.routing4) 1274 ("tox4", toxDHT Tox.routing4 Want_IP4)
1268 : if ip6tox opts 1275 : if ip6tox opts
1269 then [ ("tox6", toxDHT Tox.routing6) ] 1276 then [ ("tox6", toxDHT Tox.routing6 Want_IP6) ]
1270 else [] 1277 else []
1271 ips :: IO [SockAddr] 1278 ips :: IO [SockAddr]
1272 ips = readExternals Tox.nodeAddr [ Tox.routing4 $ Tox.toxRouting tox 1279 ips = readExternals Tox.nodeAddr [ Tox.routing4 $ Tox.toxRouting tox
@@ -1309,7 +1316,8 @@ main = do
1309 $ \(netname, dht@DHT { dhtBuckets = bkts 1316 $ \(netname, dht@DHT { dhtBuckets = bkts
1310 , dhtQuery = qrys 1317 , dhtQuery = qrys
1311 , dhtPing = pings 1318 , dhtPing = pings
1312 , dhtFallbackNodes = getBootstrapNodes }) -> do 1319 , dhtFallbackNodes = getBootstrapNodes
1320 , dhtBootstrap = bootstrap }) -> do
1313 btSaved <- loadNodes netname -- :: IO [Mainline.NodeInfo] 1321 btSaved <- loadNodes netname -- :: IO [Mainline.NodeInfo]
1314 putStrLn $ "Loaded "++show (length btSaved)++" nodes for "++netname++"." 1322 putStrLn $ "Loaded "++show (length btSaved)++" nodes for "++netname++"."
1315 fallbackNodes <- getBootstrapNodes 1323 fallbackNodes <- getBootstrapNodes
@@ -1320,18 +1328,7 @@ main = do
1320 $ Map.lookup "ping" pings 1328 $ Map.lookup "ping" pings
1321 fork $ do 1329 fork $ do
1322 myThreadId >>= flip labelThread ("bootstrap."++netname) 1330 myThreadId >>= flip labelThread ("bootstrap."++netname)
1323 case Map.lookup "node" qrys of 1331 bootstrap btSaved fallbackNodes
1324 Just DHTQuery { qsearch = srch } -> do
1325 case eqT of
1326 Just witness -> let strapper = BucketRefresher
1327 { refreshSearch = isNodesSearch witness srch
1328 , refreshBuckets = bkts
1329 , refreshPing = ping
1330 }
1331 in bootstrap strapper btSaved fallbackNodes
1332 _ -> error $ "Missing node-search for "++netname++"."
1333 saveNodes netname dht
1334 Nothing -> return ()
1335 return () 1332 return ()
1336 1333
1337 waitForSignal 1334 waitForSignal
diff --git a/src/Network/BitTorrent/MainlineDHT.hs b/src/Network/BitTorrent/MainlineDHT.hs
index 3e7a0eda..47d5b3e1 100644
--- a/src/Network/BitTorrent/MainlineDHT.hs
+++ b/src/Network/BitTorrent/MainlineDHT.hs
@@ -538,7 +538,12 @@ mkNodeInfo nid addr = NodeInfo
538 , nodePort = fromMaybe 0 $ sockAddrPort addr 538 , nodePort = fromMaybe 0 $ sockAddrPort addr
539 } 539 }
540 540
541newClient :: SwarmsDatabase -> SockAddr -> IO (MainlineClient, Routing) 541newClient :: SwarmsDatabase -> SockAddr
542 -> IO ( MainlineClient
543 , Routing
544 , [NodeInfo] -> [NodeInfo] -> IO ()
545 , [NodeInfo] -> [NodeInfo] -> IO ()
546 )
542newClient swarms addr = do 547newClient swarms addr = do
543 udp <- udpTransport addr 548 udp <- udpTransport addr
544 nid <- NodeId <$> getRandomBytes 20 549 nid <- NodeId <$> getRandomBytes 20
@@ -651,7 +656,7 @@ newClient swarms addr = do
651 refresh_thread4 <- forkPollForRefresh $ refresher4 routing 656 refresh_thread4 <- forkPollForRefresh $ refresher4 routing
652 refresh_thread6 <- forkPollForRefresh $ refresher6 routing 657 refresh_thread6 <- forkPollForRefresh $ refresher6 routing
653 658
654 return (client, routing) 659 return (client, routing, bootstrap (refresher4 routing), bootstrap (refresher6 routing))
655 660
656-- | Modifies a purely random 'NodeId' to one that is related to a given 661-- | Modifies a purely random 'NodeId' to one that is related to a given
657-- routable address in accordance with BEP 42. 662-- routable address in accordance with BEP 42.
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index 5f691ef3..37802e3c 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -88,7 +88,7 @@ import GHC.TypeLits
88import Crypto.Tox 88import Crypto.Tox
89import Data.Word64Map (fitsInInt) 89import Data.Word64Map (fitsInInt)
90import qualified Data.Word64Map (empty) 90import qualified Data.Word64Map (empty)
91import Network.Kademlia.Bootstrap (forkPollForRefresh) 91import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap)
92import Network.Tox.Crypto.Transport (NetCrypto) 92import Network.Tox.Crypto.Transport (NetCrypto)
93import Network.Tox.Crypto.Handlers (cryptoNetHandler, newSessionsState, defaultUnRecHook, defaultCryptoDataHooks, NetCryptoSessions(..)) 93import Network.Tox.Crypto.Handlers (cryptoNetHandler, newSessionsState, defaultUnRecHook, defaultCryptoDataHooks, NetCryptoSessions(..))
94import qualified Network.Tox.DHT.Handlers as DHT 94import qualified Network.Tox.DHT.Handlers as DHT
@@ -354,7 +354,7 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do
354onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) 354onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int)
355onionTimeout Tox { toxOnionRoutes = or } (DHT.TransactionId n8 _) od = lookupTimeout or n8 od 355onionTimeout Tox { toxOnionRoutes = or } (DHT.TransactionId n8 _) od = lookupTimeout or n8 od
356 356
357forkTox :: Tox -> IO (IO ()) 357forkTox :: Tox -> IO (IO (), [NodeInfo] -> [NodeInfo] -> IO (), [NodeInfo] -> [NodeInfo] -> IO ())
358forkTox tox = do 358forkTox tox = do
359 _ <- forkListener "toxCrypto" (toxCrypto tox) 359 _ <- forkListener "toxCrypto" (toxCrypto tox)
360 _ <- forkListener "toxToRoute" (toxToRoute tox) 360 _ <- forkListener "toxToRoute" (toxToRoute tox)
@@ -362,5 +362,8 @@ forkTox tox = do
362 quit <- forkListener "toxDHT" (clientNet $ toxDHT tox) 362 quit <- forkListener "toxDHT" (clientNet $ toxDHT tox)
363 forkPollForRefresh (DHT.refresher4 $ toxRouting tox) 363 forkPollForRefresh (DHT.refresher4 $ toxRouting tox)
364 forkPollForRefresh (DHT.refresher6 $ toxRouting tox) 364 forkPollForRefresh (DHT.refresher6 $ toxRouting tox)
365 return quit 365 return ( quit
366 , bootstrap (DHT.refresher4 $ toxRouting tox)
367 , bootstrap (DHT.refresher6 $ toxRouting tox)
368 )
366 369