Packet Processing - zeroKilo/GROBackendWV GitHub Wiki
Packet Processing
In the lowest layer, packets are received via UDP. From there they are first processed by their stream type
Stream Handlers
From Quazal::TransportStreamManager::DemuxIncomingPacket
one of 2 stream handlers is called:
- NAT handler (type 5)
- DO/RMC handler (type 1/3)
Type 5 (NAT)
This is just used for the NAT detection:
-> Quazal::HighLevelStream::ReceiveIncomingPacket
-> Quazal::NATTraversalStream::ReceiveIncomingMsg
-> Quazal::NATTraversalEngine::ReceiveMessage
...
Type 1 (DO), Type 3 (RMC)
These packets are put into a job with a handler and dispatched for execution later:
-> ???
-> Quazal::PRUDPStream::ReceiveIncomingPacket
-> Quazal::PRUDPEndPoint::ServiceIncomingPacket
-> Quazal::PRUDPEndPoint::Dispatch
-> Quazal::PRUDPEndPoint::HandlerDispatch
-> Quazal::ClientStreamManager::Receive (job gets scheduled here)
Job Processing
After a DATA packet has been processed, a job is dispatched to handle its content:
YETI
-> ???
-> sub_84FD60
-> sub_84D990
-> sub_86C0D0
-> sub_6AB200
-> sub_6B56A0
OSDK
-> Quazal::Scheduler::DispatchAll
-> Quazal::Scheduler::Dispatch
-> Quazal::Scheduler::DispatchUnlocked
-> Quazal::Scheduler::DispatchImpl
-> Quazal::Scheduler::ProcessJob
From here one of 2 DATA handlers is called - RMC (for RDV Backend) or DO (for Dedicated Game Server).
DATA Handler
RMC
-> Quazal::JobProcessProtocolMessage::Execute
-> Quazal::ClientProtocolRequestBroker::ProcessMessage
-> Quazal::ClientProtocolRequestBroker::ProcessMessageCore
-> Quazal::ClientProtocolRequestBroker::ProcessCallResponse
-> Quazal::ClientProtocol::ProcessResponse
Response's RMC protocol is processed and the user data extracted in protocol-specific RMC packet processor.
DO
-> Quazal::ObjDupProtocol::Dispatch
-> Quazal::ObjDupProtocol::DispatchExtractMessageType
-> Quazal::ObjDupProtocol::DispatchTrace
-> Quazal::ObjDupProtocol::ParseSpecificMessage