\subsection{Ping Service}
The Ping Service is used to check if a node is responsive.
\begin{code}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE Safe #-}
module Network.Tox.DHT.PingPacket where
import Data.Binary (Binary)
import Data.MessagePack (MessagePack)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)
import qualified Test.QuickCheck.Gen as Gen
\end{code}
A Ping Packet payload consists of just a boolean value saying whether it is a
request or a response.
The one byte boolean inside the encrypted payload is added to prevent peers
from creating a valid Ping Response from a Ping Request without decrypting the
packet and encrypting a new one. Since symmetric encryption is used, the
encrypted Ping Response would be byte-wise equal to the Ping Request without
the discriminator byte.
\begin{tabular}{l|l|l}
Length & Type & \href{#rpc-services}{Contents} \\
\hline
\texttt{1} & Bool & Response flag: 0x00 for Request, 0x01 for Response \\
\end{tabular}
\subsubsection{Ping Request (0x00)}
A Ping Request is a Ping Packet with the response flag set to False. When a
Ping Request is received and successfully decrypted, a Ping Response packet is
created and sent back to the requestor.
\subsubsection{Ping Response (0x01)}
A Ping Response is a Ping Packet with the response flag set to True.
\begin{code}
data PingPacket
= PingRequest
| PingResponse
deriving (Eq, Read, Show, Generic, Typeable)
instance Binary PingPacket
instance MessagePack PingPacket
instance Arbitrary PingPacket where
arbitrary =
Gen.elements
[ PingRequest
, PingResponse
]
\end{code}