diff options
Diffstat (limited to 'src/Network/Tox')
-rw-r--r-- | src/Network/Tox/Crypto/Handlers.hs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/Network/Tox/Crypto/Handlers.hs b/src/Network/Tox/Crypto/Handlers.hs index 5192e180..2632c936 100644 --- a/src/Network/Tox/Crypto/Handlers.hs +++ b/src/Network/Tox/Crypto/Handlers.hs | |||
@@ -769,8 +769,9 @@ runUponHandshake netCryptoSession0 addr pktoq = do | |||
769 | loop | 769 | loop |
770 | dput XNetCrypto $ "runUponHandshake: " ++ show threadidOutgoing ++ " = NetCryptoDequeueOutgoing." ++ show (key2id remotePublicKey) | 770 | dput XNetCrypto $ "runUponHandshake: " ++ show threadidOutgoing ++ " = NetCryptoDequeueOutgoing." ++ show (key2id remotePublicKey) |
771 | -- launch ping Machine thread | 771 | -- launch ping Machine thread |
772 | fuzz <- randomRIO (0,2000) | 772 | fuzz <- return 0 -- randomRIO (0,2000) -- Fuzz to prevent simultaneous ping/pong exchanges. |
773 | pingMachine <- forkPingMachine ("NetCrypto." ++ show (key2id remotePublicKey)) (15000 + fuzz) 2000 | 773 | -- Disabled because tox has no pong event. |
774 | pingMachine <- forkPingMachine ("NetCrypto." ++ show (key2id remotePublicKey)) (8000 + fuzz) 4000 | ||
774 | pingThreadId <- forkIO $ do | 775 | pingThreadId <- forkIO $ do |
775 | tid <- myThreadId | 776 | tid <- myThreadId |
776 | event <- atomically $ pingWait pingMachine | 777 | event <- atomically $ pingWait pingMachine |
@@ -778,6 +779,12 @@ runUponHandshake netCryptoSession0 addr pktoq = do | |||
778 | case event of | 779 | case event of |
779 | PingIdle -> do | 780 | PingIdle -> do |
780 | dput XNetCrypto $ "pingThread (session: " ++ show (ncSessionId netCryptoSession0) ++ ") PingIdle" | 781 | dput XNetCrypto $ "pingThread (session: " ++ show (ncSessionId netCryptoSession0) ++ ") PingIdle" |
782 | -- Normally, we would not bump the PingMachine until we receive | ||
783 | -- an inbound packet. We are doing this here because tox has | ||
784 | -- no pong response packet and so we need to mark the | ||
785 | -- connection non-idle here. Doing this prevents a PingTimeOut | ||
786 | -- from ever occurring. (TODO: handle timed-out sessions somehow.) | ||
787 | pingBump pingMachine | ||
781 | lr <- sendPing crypto netCryptoSession0 | 788 | lr <- sendPing crypto netCryptoSession0 |
782 | case lr of | 789 | case lr of |
783 | Left s -> dput XNetCrypto $ "(pingThread session: " ++ show (ncSessionId netCryptoSession0) ++ ") " ++ s | 790 | Left s -> dput XNetCrypto $ "(pingThread session: " ++ show (ncSessionId netCryptoSession0) ++ ") " ++ s |
@@ -1043,7 +1050,13 @@ sessionPacketH sessions addrRaw (CryptoPacket nonce16 encrypted) = do | |||
1043 | atomically $ writeTVar ncState {-Confirmed-}Established | 1050 | atomically $ writeTVar ncState {-Confirmed-}Established |
1044 | -- bump ping machine | 1051 | -- bump ping machine |
1045 | case ncPingMachine of | 1052 | case ncPingMachine of |
1046 | Just pingMachine -> pingBump pingMachine | 1053 | Just pingMachine -> -- Normally, we would bump the PingMachine to mark the connection |
1054 | -- as non-idle so that we don't need to send a ping message. | ||
1055 | -- Because tox has no pong message, we need to send a ping every | ||
1056 | -- eight seconds regardless, so we will let the PingIdle event be | ||
1057 | -- signaled even when we receive packets. | ||
1058 | -- pingBump pingMachine | ||
1059 | return () | ||
1047 | Nothing -> return () | 1060 | Nothing -> return () |
1048 | msgTypes <- atomically $ readTVar ncIncomingTypeArray | 1061 | msgTypes <- atomically $ readTVar ncIncomingTypeArray |
1049 | let msgTyp = cd ^. messageType | 1062 | let msgTyp = cd ^. messageType |