summaryrefslogtreecommitdiff
path: root/dht/OnionRouter.hs
diff options
context:
space:
mode:
Diffstat (limited to 'dht/OnionRouter.hs')
-rw-r--r--dht/OnionRouter.hs30
1 files changed, 24 insertions, 6 deletions
diff --git a/dht/OnionRouter.hs b/dht/OnionRouter.hs
index bdaf04b2..e6f647b5 100644
--- a/dht/OnionRouter.hs
+++ b/dht/OnionRouter.hs
@@ -70,7 +70,7 @@ data OnionRouter = OnionRouter
70 -- | A set for TCP relays to use as trampolines when UDP is not available. 70 -- | A set for TCP relays to use as trampolines when UDP is not available.
71 , trampolinesTCP :: TrampolineSet TCP.NodeInfo 71 , trampolinesTCP :: TrampolineSet TCP.NodeInfo
72 -- | True when we need to rely on TCP relays because UDP is apparently unavailable. 72 -- | True when we need to rely on TCP relays because UDP is apparently unavailable.
73 , tcpMode :: TVar Bool 73 , tcpMode :: TVar (Maybe Bool) -- Nothing: tcp disabled, False: use trampolinesUDP, True: use trampolinesTCP
74 -- | The pseudo-random generator used to select onion routes. 74 -- | The pseudo-random generator used to select onion routes.
75 , onionDRG :: TVar ChaChaDRG 75 , onionDRG :: TVar ChaChaDRG
76 -- | Building onion routes happens in a dedicated thread. See 'forkRouteBuilder'. 76 -- | Building onion routes happens in a dedicated thread. See 'forkRouteBuilder'.
@@ -154,11 +154,12 @@ newtype RouteEvent = BuildRoute RouteId
154 154
155newOnionRouter :: TransportCrypto 155newOnionRouter :: TransportCrypto
156 -> (String -> IO ()) 156 -> (String -> IO ())
157 -> Bool -- is tcp enabled?
157 -> IO ( OnionRouter 158 -> IO ( OnionRouter
158 , TVar ( ChaChaDRG 159 , TVar ( ChaChaDRG
159 , Word64Map (Either (Maybe (Bool,TCP.RelayPacket) -> IO ()) 160 , Word64Map (Either (Maybe (Bool,TCP.RelayPacket) -> IO ())
160 (Maybe (OnionMessage Identity) -> IO ())))) 161 (Maybe (OnionMessage Identity) -> IO ()))))
161newOnionRouter crypto perror = do 162newOnionRouter crypto perror tcp_enabled = do
162 drg0 <- drgNew 163 drg0 <- drgNew
163 (rlog,pq,rm) <- atomically $ do 164 (rlog,pq,rm) <- atomically $ do
164 rlog <- newTChan 165 rlog <- newTChan
@@ -222,7 +223,7 @@ newOnionRouter crypto perror = do
222 tbl 223 tbl
223 (TCP.nodeSearch prober tcp) 224 (TCP.nodeSearch prober tcp)
224 (fmap (maybe False $ const True) . TCP.tcpPing (TCP.tcpClient tcp)) 225 (fmap (maybe False $ const True) . TCP.tcpPing (TCP.tcpClient tcp))
225 tcpmode <- newTVar True 226 tcpmode <- newTVar $ if tcp_enabled then Just True else Nothing
226 let o = OnionRouter 227 let o = OnionRouter
227 { pendingRoutes = pr 228 { pendingRoutes = pr
228 , onionDRG = drg 229 , onionDRG = drg
@@ -369,9 +370,12 @@ selectTrampolines or = do
369 let tset :: (forall x. TrampolineSet x -> STM (Either [x] [x])) 370 let tset :: (forall x. TrampolineSet x -> STM (Either [x] [x]))
370 -> STM (Either (Either [TCP.NodeInfo] [NodeInfo]) 371 -> STM (Either (Either [TCP.NodeInfo] [NodeInfo])
371 (Either [TCP.NodeInfo] [NodeInfo])) 372 (Either [TCP.NodeInfo] [NodeInfo]))
372 tset f = bool (left Right . right Right <$> f (trampolinesUDP or)) 373 tset f = do
373 (left Left . right Left <$> f (trampolinesTCP or)) 374 mm <- readTVar (tcpMode or)
374 =<< readTVar (tcpMode or) 375 -- TODO: better logic for deciding to use TCP or UDP trampolines.
376 if fromMaybe False mm
377 then left Left . right Left <$> f (trampolinesTCP or)
378 else left Right . right Right <$> f (trampolinesUDP or)
375 atomically (tset $ internalSelectTrampolines (onionDRG or)) >>= \case 379 atomically (tset $ internalSelectTrampolines (onionDRG or)) >>= \case
376 Left ns -> do 380 Left ns -> do
377 -- atomically $ writeTChan (routeLog or) 381 -- atomically $ writeTChan (routeLog or)
@@ -710,3 +714,17 @@ ipClass' :: SockAddr -> IPClass
710ipClass' (SockAddrInet _ addr) = IPClass (fromBE32 addr .&. 0xFF000000) 714ipClass' (SockAddrInet _ addr) = IPClass (fromBE32 addr .&. 0xFF000000)
711ipClass' (SockAddrInet6 _ _ (hiword,_,_,_) _) = IPClass hiword 715ipClass' (SockAddrInet6 _ _ (hiword,_,_,_) _) = IPClass hiword
712ipClass' _ = IPClass 0 -- unreachable. 716ipClass' _ = IPClass 0 -- unreachable.
717
718requestTCPMode :: OnionRouter -> Maybe Bool -> IO Bool
719requestTCPMode or wanted_mode = atomically $ requestTCPModeSTM or wanted_mode
720
721requestTCPModeSTM :: OnionRouter -> Maybe Bool -> STM Bool
722requestTCPModeSTM or wanted_mode = do
723 m <- readTVar (tcpMode or)
724 case m of
725 Nothing -> return False
726 Just oldmode -> case wanted_mode of
727 Just newmode -> do
728 writeTVar (tcpMode or) (Just newmode)
729 return newmode
730 Nothing -> return oldmode