diff options
-rw-r--r-- | examples/dhtd.hs | 33 | ||||
-rw-r--r-- | src/Network/BitTorrent/MainlineDHT.hs | 9 | ||||
-rw-r--r-- | src/Network/Tox.hs | 9 |
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 | ||
200 | nodesFileName :: String -> String | 201 | nodesFileName :: 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 | ||
541 | newClient :: SwarmsDatabase -> SockAddr -> IO (MainlineClient, Routing) | 541 | newClient :: SwarmsDatabase -> SockAddr |
542 | -> IO ( MainlineClient | ||
543 | , Routing | ||
544 | , [NodeInfo] -> [NodeInfo] -> IO () | ||
545 | , [NodeInfo] -> [NodeInfo] -> IO () | ||
546 | ) | ||
542 | newClient swarms addr = do | 547 | newClient 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 | |||
88 | import Crypto.Tox | 88 | import Crypto.Tox |
89 | import Data.Word64Map (fitsInInt) | 89 | import Data.Word64Map (fitsInInt) |
90 | import qualified Data.Word64Map (empty) | 90 | import qualified Data.Word64Map (empty) |
91 | import Network.Kademlia.Bootstrap (forkPollForRefresh) | 91 | import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap) |
92 | import Network.Tox.Crypto.Transport (NetCrypto) | 92 | import Network.Tox.Crypto.Transport (NetCrypto) |
93 | import Network.Tox.Crypto.Handlers (cryptoNetHandler, newSessionsState, defaultUnRecHook, defaultCryptoDataHooks, NetCryptoSessions(..)) | 93 | import Network.Tox.Crypto.Handlers (cryptoNetHandler, newSessionsState, defaultUnRecHook, defaultCryptoDataHooks, NetCryptoSessions(..)) |
94 | import qualified Network.Tox.DHT.Handlers as DHT | 94 | import qualified Network.Tox.DHT.Handlers as DHT |
@@ -354,7 +354,7 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do | |||
354 | onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) | 354 | onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) |
355 | onionTimeout Tox { toxOnionRoutes = or } (DHT.TransactionId n8 _) od = lookupTimeout or n8 od | 355 | onionTimeout Tox { toxOnionRoutes = or } (DHT.TransactionId n8 _) od = lookupTimeout or n8 od |
356 | 356 | ||
357 | forkTox :: Tox -> IO (IO ()) | 357 | forkTox :: Tox -> IO (IO (), [NodeInfo] -> [NodeInfo] -> IO (), [NodeInfo] -> [NodeInfo] -> IO ()) |
358 | forkTox tox = do | 358 | forkTox 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 | ||