diff options
author | Joe Crayne <joe@jerkface.net> | 2019-12-14 16:11:03 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-01-01 23:26:49 -0500 |
commit | d5efdc327bbb69a905043df45415817e318e38ee (patch) | |
tree | 7be975048f3e40c27811bdb39ba92d871a42588c /dht/src/Network/SessionTransports.hs | |
parent | 8c04d9cca70241bebe4b94b779fe7bbfe6140f51 (diff) |
Multi Transports: TCP for DHT/Cookies/Handshakes.
Diffstat (limited to 'dht/src/Network/SessionTransports.hs')
-rw-r--r-- | dht/src/Network/SessionTransports.hs | 19 |
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 | |||
16 | import qualified Data.Map.Strict as Map | 16 | import qualified Data.Map.Strict as Map |
17 | ;import Data.Map.Strict (Map) | 17 | ;import Data.Map.Strict (Map) |
18 | 18 | ||
19 | import qualified Data.Tox.DHT.Multi as Multi | ||
19 | import Network.Address (SockAddr,either4or6) | 20 | import Network.Address (SockAddr,either4or6) |
20 | import Network.QueryResponse | 21 | import Network.QueryResponse |
21 | import qualified Data.IntervalSet as S | 22 | import qualified Data.IntervalSet as S |
22 | ;import Data.IntervalSet (IntSet) | 23 | ;import Data.IntervalSet (IntSet) |
23 | 24 | ||
24 | data Sessions x = Sessions | 25 | data 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 | ||
31 | initSessions :: (SockAddr -> x -> IO ()) -> IO (Sessions x) | 32 | initSessions :: (Multi.SessionAddress -> x -> IO ()) -> IO (Sessions x) |
32 | initSessions send = atomically $ do | 33 | initSessions 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 | ||
50 | newSession :: Sessions raw | 51 | newSession :: 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)) |
55 | newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do | 56 | newSession 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 | ||
94 | sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x))) | 95 | sessionHandler :: Sessions x -> (Multi.SessionAddress -> x -> IO (Maybe (x -> x))) |
95 | sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do | 96 | sessionHandler 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 |