| 407 | } |
| 408 | |
| 409 | void TUdpSocket::AddPacketToQueue(size_t size, const TSockAddrPair& addr, ui8 tos, size_t mtu) { |
| 410 | Y_ASSERT(LastReturnedPacketBuffer); |
| 411 | Y_ASSERT(size < LastReturnPacketBufferDataSize); |
| 412 | |
| 413 | char* packet = LastReturnedPacketBuffer; |
| 414 | LastReturnedPacketBuffer = nullptr; |
| 415 | |
| 416 | const size_t packetSize = size + UDP_LOW_LEVEL_HEADER_SIZE; |
| 417 | Y_ASSERT(packetSize <= UDP_MAX_PACKET_SIZE); |
| 418 | |
| 419 | WritePacketHeader(packet, packetSize, addr.RemoteAddr); |
| 420 | |
| 421 | #ifdef SIMULATE_NETWORK_FAILURES |
| 422 | // can't simulate packet loss - we must add packet to PacketsHeaders because we already allocated space in PacketsDataBuffer. |
| 423 | if ((RandomNumber<size_t>() % 3) == 0) |
| 424 | packet[RandomNumber<size_t>() % packetSize] += RandomNumber<size_t>(); // packet broken |
| 425 | #endif |
| 426 | |
| 427 | // Trying to append this packet to already existing in packet queue. |
| 428 | const TIoVec iovValue = CreateIoVec(packet, packetSize); |
| 429 | if (TryToApplySmallPacketsOptimization(iovValue, addr, tos, mtu)) { |
| 430 | return; |
| 431 | } |
| 432 | |
| 433 | // OK, creating new packet. |
| 434 | LastUdpPacketSize = packetSize; |
| 435 | |
| 436 | TIoVec& iov = *PacketsIoVecs.PushBack(iovValue); |
| 437 | |
| 438 | Y_ASSERT(!UdpPacketsAddresses.Full()); |
| 439 | sockaddr_in6& name = *UdpPacketsAddresses.PushBack(addr.RemoteAddr); |
| 440 | |
| 441 | char* ctrlBuffer = UdpPacketsAuxData.GetContinuousRegion(CTRL_BUFFER_SIZE); |
| 442 | |
| 443 | UdpPacketsHeaders.resize(UdpPacketsHeaders.size() + 1); |
| 444 | TMsgHdr& hdr = UdpPacketsHeaders.back().msg_hdr; |
| 445 | |
| 446 | hdr = CreateNl12SendMsgHdr(name, addr.MyAddr, iov, tos, ctrlBuffer, CTRL_BUFFER_SIZE); |
| 447 | } |
| 448 | |
| 449 | void TUdpSocket::ForgetHeadUdpPackets(const size_t numPackets) { |
| 450 | // necessary for TCircularPodBuffer::EraseBefore |
no test coverage detected