diff options
Diffstat (limited to 'dht/OnionRouter.hs')
-rw-r--r-- | dht/OnionRouter.hs | 30 |
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 | ||
155 | newOnionRouter :: TransportCrypto | 155 | newOnionRouter :: 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 ())))) |
161 | newOnionRouter crypto perror = do | 162 | newOnionRouter 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 | |||
710 | ipClass' (SockAddrInet _ addr) = IPClass (fromBE32 addr .&. 0xFF000000) | 714 | ipClass' (SockAddrInet _ addr) = IPClass (fromBE32 addr .&. 0xFF000000) |
711 | ipClass' (SockAddrInet6 _ _ (hiword,_,_,_) _) = IPClass hiword | 715 | ipClass' (SockAddrInet6 _ _ (hiword,_,_,_) _) = IPClass hiword |
712 | ipClass' _ = IPClass 0 -- unreachable. | 716 | ipClass' _ = IPClass 0 -- unreachable. |
717 | |||
718 | requestTCPMode :: OnionRouter -> Maybe Bool -> IO Bool | ||
719 | requestTCPMode or wanted_mode = atomically $ requestTCPModeSTM or wanted_mode | ||
720 | |||
721 | requestTCPModeSTM :: OnionRouter -> Maybe Bool -> STM Bool | ||
722 | requestTCPModeSTM 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 | ||