| 1275 | } |
| 1276 | |
| 1277 | bool TUdpHost::ProcessAcksPacket(const EUdpCmd cmd, const char* pktData, const char* pktEnd, |
| 1278 | const TTransfer& transfer, const bool thatSideHasChanged) { |
| 1279 | Y_ASSERT(IsAckCmd(cmd)); |
| 1280 | |
| 1281 | TConnection* connection = CheckedCast<TConnection*>(transfer.Connection.Get()); |
| 1282 | TUdpOutTransfer* xferPtr = connection->GetSendQueue().Get(transfer.Id); |
| 1283 | if (!xferPtr) { |
| 1284 | return true; |
| 1285 | } |
| 1286 | TUdpOutTransfer& xfer = *xferPtr; |
| 1287 | |
| 1288 | if (!ReadAckPacketHeader(cmd, &pktData, pktEnd)) { |
| 1289 | Y_ASSERT(false); |
| 1290 | return false; |
| 1291 | } |
| 1292 | |
| 1293 | NHPTimer::STime tCopy = CurrentT; |
| 1294 | float deltaT = (float)NHPTimer::GetTimePassed(&tCopy); |
| 1295 | deltaT = ClampVal(deltaT, 0.0f, UdpTransferTimeout / 3); |
| 1296 | |
| 1297 | //printf("ack (%d) transferId = %" PRIu64 "\n", (int)cmd, transfer.Id); |
| 1298 | |
| 1299 | switch (cmd) { |
| 1300 | case ACK: { |
| 1301 | if (thatSideHasChanged) { |
| 1302 | return true; |
| 1303 | } |
| 1304 | return ReadAndSetAcks(pktData, pktEnd, deltaT, &xfer.AckTracker); |
| 1305 | } |
| 1306 | case ACK_COMPLETE: |
| 1307 | case ACK_CANCELED: { |
| 1308 | int lastPacketId; |
| 1309 | if (!ReadAckCompleteAndCanceledTails(pktData, pktEnd, &lastPacketId)) { |
| 1310 | Y_ASSERT(false); |
| 1311 | return false; |
| 1312 | } |
| 1313 | |
| 1314 | if (!thatSideHasChanged && lastPacketId != -1) { |
| 1315 | xfer.AckTracker.Ack(lastPacketId, deltaT, true); // update RTT |
| 1316 | } |
| 1317 | xfer.AckTracker.AckAll(); // acking packets is required, otherwise they will be treated as lost (look AckTracker destructor) |
| 1318 | |
| 1319 | if (cmd == ACK_COMPLETE) { |
| 1320 | SuccessfulSend(transfer); |
| 1321 | } else { |
| 1322 | CanceledSend(transfer); |
| 1323 | } |
| 1324 | |
| 1325 | return true; |
| 1326 | } |
| 1327 | case ACK_RESEND_NOSHMEM: { |
| 1328 | // abort execution here |
| 1329 | // failed to open shmem on recv side, need to transmit data without using shmem |
| 1330 | Y_ABORT_UNLESS(0, "not implemented yet"); |
| 1331 | return true; |
| 1332 | } |
| 1333 | default: |
| 1334 | break; |
nothing calls this directly
no test coverage detected