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