@@ -73,6 +73,7 @@ FluxProcessResults NetFluxUdp::processReorder(Client& client,
73
73
74
74
if (stat == PacketReorderer::Stats::RETRIEVABLE)
75
75
{
76
+ packet->markAsLocallyReordered ();
76
77
return FluxProcessResults::USER_RETRIEVABLE;
77
78
}
78
79
@@ -331,7 +332,25 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
331
332
return this ->processMTUDiscoveredClient (*refClientData, packet);
332
333
}
333
334
334
- if (!packet->checkFlags (FGE_NET_HEADER_DO_NOT_REORDER_FLAG) && !packet->isMarkedAsLocallyReordered ())
335
+ auto const stat =
336
+ PacketReorderer::checkStat (packet, refClient->getClientPacketCounter (), refClient->getCurrentRealm ());
337
+
338
+ if (!packet->checkFlags (FGE_NET_HEADER_DO_NOT_DISCARD_FLAG))
339
+ {
340
+ if (stat == PacketReorderer::Stats::OLD_COUNTER)
341
+ {
342
+ auto const packetCounter = packet->retrieveCounter ().value ();
343
+ auto const packetRealm = packet->retrieveRealm ().value ();
344
+ auto const currentCounter = refClient->getClientPacketCounter ();
345
+ FGE_DEBUG_PRINT (" Packet is old, discarding it packetCounter: {}, packetRealm: {}, currentCounter: {}" ,
346
+ packetCounter, packetRealm, currentCounter);
347
+ refClient->advanceLostPacketCount ();
348
+ return FluxProcessResults::INTERNALLY_DISCARDED;
349
+ }
350
+ }
351
+
352
+ bool const doNotReorder = packet->checkFlags (FGE_NET_HEADER_DO_NOT_REORDER_FLAG);
353
+ if (!doNotReorder && !packet->isMarkedAsLocallyReordered ())
335
354
{
336
355
auto reorderResult = this ->processReorder (*refClient, packet, refClient->getClientPacketCounter (), true );
337
356
if (reorderResult != FluxProcessResults::USER_RETRIEVABLE)
@@ -343,28 +362,25 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
343
362
// Verify the realm
344
363
if (!this ->verifyRealm (refClient, packet))
345
364
{
365
+ FGE_DEBUG_PRINT (" Packet bad realm, discarding it" );
346
366
return FluxProcessResults::INTERNALLY_DISCARDED;
347
367
}
348
368
349
- auto const stat =
350
- PacketReorderer::checkStat (packet, refClient->getClientPacketCounter (), refClient->getCurrentRealm ());
351
-
352
- if (!packet->checkFlags (FGE_NET_HEADER_DO_NOT_DISCARD_FLAG))
353
- {
354
- if (stat == PacketReorderer::Stats::OLD_COUNTER)
355
- {
356
- refClient->advanceLostPacketCount ();
357
- return FluxProcessResults::INTERNALLY_DISCARDED;
358
- }
359
- }
360
-
361
369
if (stat == PacketReorderer::Stats::WAITING_NEXT_REALM || stat == PacketReorderer::Stats::WAITING_NEXT_COUNTER)
362
370
{
371
+ auto const packetCounter = packet->retrieveCounter ().value ();
372
+ auto const packetRealm = packet->retrieveRealm ().value ();
373
+ auto const currentCounter = refClient->getClientPacketCounter ();
374
+ FGE_DEBUG_PRINT (" We lose a packet packetCounter: {}, packetRealm: {}, currentCounter: {}" , packetCounter,
375
+ packetRealm, currentCounter);
363
376
refClient->advanceLostPacketCount (); // We are missing a packet
364
377
}
365
378
366
- auto const countId = packet->retrieveCounter ().value ();
367
- refClient->setClientPacketCounter (countId);
379
+ if (!doNotReorder)
380
+ {
381
+ auto const countId = packet->retrieveCounter ().value ();
382
+ refClient->setClientPacketCounter (countId);
383
+ }
368
384
369
385
// Check if the packet is a return packet, and if so, handle it
370
386
if (packet->retrieveHeaderId ().value () == NET_INTERNAL_ID_RETURN_PACKET)
@@ -468,12 +484,16 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
468
484
packet->packet () >> label._counter >> label._realm ;
469
485
if (!packet->isValid ())
470
486
{
487
+ FGE_DEBUG_PRINT (" received bad label" );
471
488
return FluxProcessResults::INTERNALLY_DISCARDED;
472
489
}
473
490
acknowledgedPackets[i] = label;
474
491
}
475
- refClient->getPacketCache ().acknowledgeReception (acknowledgedPackets);
476
- FGE_DEBUG_PRINT (" Acknowledged packets: {}" , acknowledgedPacketsSize);
492
+
493
+ {
494
+ auto const packetCache = refClient->getPacketCache ();
495
+ packetCache.first ->acknowledgeReception (acknowledgedPackets);
496
+ }
477
497
478
498
this ->_onClientReturnPacket .call (refClient, packet->getIdentity (), packet);
479
499
@@ -709,6 +729,7 @@ FluxProcessResults ServerNetFluxUdp::processMTUDiscoveredClient(ClientList::Data
709
729
refClient->getStatus ().setNetworkStatus (ClientStatus::NetworkStatus::CONNECTED);
710
730
refClient->getStatus ().setTimeout (FGE_NET_STATUS_DEFAULT_CONNECTED_TIMEOUT);
711
731
refClient->setClientPacketCounter (0 );
732
+ refClient->setCurrentPacketCounter (0 );
712
733
this ->_onClientConnected .call (refClient, packet->getIdentity ());
713
734
return FluxProcessResults::INTERNALLY_HANDLED;
714
735
}
@@ -1079,14 +1100,19 @@ void ServerSideNetUdp::threadTransmission()
1079
1100
auto & client = itClient->second ._client ;
1080
1101
1081
1102
// check cache
1082
- auto const clientLatency =
1083
- client->getPacketReturnRate () * 1 .5f +
1084
- std::chrono::milliseconds (client->_latencyPlanner .getRoundTripTime ().value_or (1 ));
1085
- while (client->getPacketCache ().check (
1086
- timePoint, std::chrono::duration_cast<std::chrono::milliseconds>(clientLatency)))
1087
1103
{
1088
- FGE_DEBUG_PRINT (" re-transmit packet as client didn't acknowledge it" );
1089
- client->pushForcedFrontPacket (client->getPacketCache ().pop ());
1104
+ auto const packetCache = client->getPacketCache ();
1105
+
1106
+ auto const clientLatency =
1107
+ client->getPacketReturnRate () * 1 .5f +
1108
+ std::chrono::milliseconds (client->_latencyPlanner .getRoundTripTime ().value_or (1 ));
1109
+
1110
+ while (packetCache.first ->check (
1111
+ timePoint, std::chrono::duration_cast<std::chrono::milliseconds>(clientLatency)))
1112
+ {
1113
+ FGE_DEBUG_PRINT (" re-transmit packet as client didn't acknowledge it" );
1114
+ client->pushForcedFrontPacket (packetCache.first ->pop ());
1115
+ }
1090
1116
}
1091
1117
1092
1118
if (client->isPendingPacketsEmpty ())
@@ -1111,7 +1137,8 @@ void ServerSideNetUdp::threadTransmission()
1111
1137
{
1112
1138
continue ;
1113
1139
}
1114
- client->getPacketCache ().push (transmissionPacket);
1140
+ auto const packetCache = client->getPacketCache ();
1141
+ packetCache.first ->push (transmissionPacket);
1115
1142
}
1116
1143
else
1117
1144
{
@@ -1403,14 +1430,9 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
1403
1430
}
1404
1431
--this ->_g_remainingPackets ;
1405
1432
1406
- if (!packet->checkFlags (FGE_NET_HEADER_DO_NOT_REORDER_FLAG) && !packet-> isMarkedAsLocallyReordered ())
1433
+ if (!packet->isMarkedAsLocallyReordered ())
1407
1434
{
1408
- auto reorderResult =
1409
- this ->processReorder (this ->_client , packet, this ->_client .getCurrentPacketCounter (), false );
1410
- if (reorderResult != FluxProcessResults::USER_RETRIEVABLE)
1411
- {
1412
- return reorderResult;
1413
- }
1435
+ this ->_client .acknowledgeReception (packet);
1414
1436
}
1415
1437
1416
1438
auto const stat = PacketReorderer::checkStat (packet, this ->_client .getCurrentPacketCounter (),
@@ -1420,11 +1442,27 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
1420
1442
{
1421
1443
if (stat == PacketReorderer::Stats::OLD_REALM || stat == PacketReorderer::Stats::OLD_COUNTER)
1422
1444
{
1445
+ auto const packetCounter = packet->retrieveCounter ().value ();
1446
+ auto const packetRealm = packet->retrieveRealm ().value ();
1447
+ auto const currentCounter = this ->_client .getCurrentPacketCounter ();
1448
+ FGE_DEBUG_PRINT (" Packet is old, discarding it packetCounter: {}, packetRealm: {}, currentCounter: {}" ,
1449
+ packetCounter, packetRealm, currentCounter);
1423
1450
this ->_client .advanceLostPacketCount ();
1424
1451
return FluxProcessResults::INTERNALLY_DISCARDED;
1425
1452
}
1426
1453
}
1427
1454
1455
+ bool const doNotReorder = packet->checkFlags (FGE_NET_HEADER_DO_NOT_REORDER_FLAG);
1456
+ if (!doNotReorder && !packet->isMarkedAsLocallyReordered ())
1457
+ {
1458
+ auto reorderResult =
1459
+ this ->processReorder (this ->_client , packet, this ->_client .getCurrentPacketCounter (), false );
1460
+ if (reorderResult != FluxProcessResults::USER_RETRIEVABLE)
1461
+ {
1462
+ return reorderResult;
1463
+ }
1464
+ }
1465
+
1428
1466
if (packet->retrieveHeaderId ().value () == NET_INTERNAL_ID_DISCONNECT)
1429
1467
{
1430
1468
this ->_client .getStatus ().setNetworkStatus (ClientStatus::NetworkStatus::DISCONNECTED);
@@ -1436,13 +1474,20 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
1436
1474
1437
1475
if (stat == PacketReorderer::Stats::WAITING_NEXT_REALM || stat == PacketReorderer::Stats::WAITING_NEXT_COUNTER)
1438
1476
{
1477
+ auto const packetCounter = packet->retrieveCounter ().value ();
1478
+ auto const packetRealm = packet->retrieveRealm ().value ();
1479
+ auto const currentCounter = this ->_client .getCurrentPacketCounter ();
1480
+ FGE_DEBUG_PRINT (" We lose a packet packetCounter: {}, packetRealm: {}, currentCounter: {}" , packetCounter,
1481
+ packetRealm, currentCounter);
1439
1482
this ->_client .advanceLostPacketCount (); // We are missing a packet
1440
1483
}
1441
1484
1485
+ if (!doNotReorder)
1486
+ {
1487
+ auto const serverCountId = packet->retrieveCounter ().value ();
1488
+ this ->_client .setCurrentPacketCounter (serverCountId);
1489
+ }
1442
1490
auto const serverRealm = packet->retrieveRealm ().value ();
1443
- auto const serverCountId = packet->retrieveCounter ().value ();
1444
-
1445
- this ->_client .setCurrentPacketCounter (serverCountId);
1446
1491
this ->_client .setCurrentRealm (serverRealm);
1447
1492
1448
1493
return FluxProcessResults::USER_RETRIEVABLE;
0 commit comments