summaryrefslogtreecommitdiff
path: root/dht/src/Network/SessionTransports.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-12-14 16:11:03 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-01 23:26:49 -0500
commitd5efdc327bbb69a905043df45415817e318e38ee (patch)
tree7be975048f3e40c27811bdb39ba92d871a42588c /dht/src/Network/SessionTransports.hs
parent8c04d9cca70241bebe4b94b779fe7bbfe6140f51 (diff)
Multi Transports: TCP for DHT/Cookies/Handshakes.
Diffstat (limited to 'dht/src/Network/SessionTransports.hs')
-rw-r--r--dht/src/Network/SessionTransports.hs19
1 files changed, 10 insertions, 9 deletions
diff --git a/dht/src/Network/SessionTransports.hs b/dht/src/Network/SessionTransports.hs
index b36fbcfd..b6d02f36 100644
--- a/dht/src/Network/SessionTransports.hs
+++ b/dht/src/Network/SessionTransports.hs
@@ -16,19 +16,20 @@ import qualified Data.IntMap.Strict as IntMap
16import qualified Data.Map.Strict as Map 16import qualified Data.Map.Strict as Map
17 ;import Data.Map.Strict (Map) 17 ;import Data.Map.Strict (Map)
18 18
19import qualified Data.Tox.DHT.Multi as Multi
19import Network.Address (SockAddr,either4or6) 20import Network.Address (SockAddr,either4or6)
20import Network.QueryResponse 21import Network.QueryResponse
21import qualified Data.IntervalSet as S 22import qualified Data.IntervalSet as S
22 ;import Data.IntervalSet (IntSet) 23 ;import Data.IntervalSet (IntSet)
23 24
24data Sessions x = Sessions 25data Sessions x = Sessions
25 { sessionsByAddr :: TVar (Map SockAddr (IntMap (x -> IO Bool))) 26 { sessionsByAddr :: TVar (Map Multi.SessionAddress (IntMap (x -> IO Bool)))
26 , sessionsById :: TVar (IntMap SockAddr) 27 , sessionsById :: TVar (IntMap Multi.SessionAddress)
27 , sessionIds :: TVar IntSet 28 , sessionIds :: TVar IntSet
28 , sessionsSendRaw :: SockAddr -> x -> IO () 29 , sessionsSendRaw :: Multi.SessionAddress -> x -> IO ()
29 } 30 }
30 31
31initSessions :: (SockAddr -> x -> IO ()) -> IO (Sessions x) 32initSessions :: (Multi.SessionAddress -> x -> IO ()) -> IO (Sessions x)
32initSessions send = atomically $ do 33initSessions send = atomically $ do
33 byaddr <- newTVar Map.empty 34 byaddr <- newTVar Map.empty
34 byid <- newTVar IntMap.empty 35 byid <- newTVar IntMap.empty
@@ -49,13 +50,13 @@ rmSession sid (Just m) = case IntMap.delete sid m of
49 50
50newSession :: Sessions raw 51newSession :: Sessions raw
51 -> (addr -> y -> IO raw) 52 -> (addr -> y -> IO raw)
52 -> (SockAddr -> raw -> IO (Maybe (x, addr))) 53 -> (Multi.SessionAddress -> raw -> IO (Maybe (x, addr)))
53 -> SockAddr 54 -> Multi.SessionAddress
54 -> IO (Maybe (Int,TransportA err addr x y)) 55 -> IO (Maybe (Int,TransportA err addr x y))
55newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do 56newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do
56 mvar <- atomically newEmptyTMVar 57 mvar <- atomically newEmptyTMVar
57 let saddr = -- Canonical in case of 6-mapped-4 addresses. 58 let saddr = -- Canonical in case of 6-mapped-4 addresses.
58 either id id $ either4or6 addr0 59 Multi.canonize addr0
59 handlePacket x = do 60 handlePacket x = do
60 m <- wrap saddr x 61 m <- wrap saddr x
61 case m of 62 case m of
@@ -91,10 +92,10 @@ newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwr
91 } 92 }
92 return (sid,tr) 93 return (sid,tr)
93 94
94sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x))) 95sessionHandler :: Sessions x -> (Multi.SessionAddress -> x -> IO (Maybe (x -> x)))
95sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do 96sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do
96 let addr = -- Canonical in case of 6-mapped-4 addresses. 97 let addr = -- Canonical in case of 6-mapped-4 addresses.
97 either id id $ either4or6 addr0 98 Multi.canonize addr0
98 dispatch [] = return () 99 dispatch [] = return ()
99 dispatch (f:fs) = do b <- f x 100 dispatch (f:fs) = do b <- f x
100 when (not b) $ dispatch fs 101 when (not b) $ dispatch fs