| 332 | ////////////////////////////////////////////////////////////////////////////// |
| 333 | |
| 334 | char* TUdpSocket::NewPacketBuffer(const size_t maxSize) { |
| 335 | Y_ASSERT(!LastReturnedPacketBuffer && "Call AddPacketToQueue after each NewPacketBuffer!"); |
| 336 | Y_ASSERT(maxSize <= UDP_PACKET_BUF_SIZE); |
| 337 | if (GetNumUdpPacketsInQueue() == MaxUdpPacketsInQueue) { // doesn't count small packets! |
| 338 | return nullptr; |
| 339 | } |
| 340 | |
| 341 | // User didn't call ClearPacketsQueue after FlushPacketsQueue with partial sendmmsg. |
| 342 | if (UdpPacketsHeaders.size() == UdpPacketsHeaders.capacity()) { |
| 343 | UdpPacketsHeaders.erase(UdpPacketsHeaders.begin(), UdpPacketsHeaders.begin() + UdpPacketsHeadersBegin); |
| 344 | UdpPacketsHeadersBegin = 0; |
| 345 | } |
| 346 | |
| 347 | LastReturnedPacketBuffer = PacketsDataBuffer.GetContinuousRegion(UDP_LOW_LEVEL_HEADER_SIZE + maxSize); |
| 348 | if (!LastReturnedPacketBuffer) { // may occur is small packet optimization is enabled |
| 349 | return nullptr; |
| 350 | } |
| 351 | LastReturnPacketBufferDataSize = maxSize; |
| 352 | return LastReturnedPacketBuffer + UDP_LOW_LEVEL_HEADER_SIZE; |
| 353 | } |
| 354 | |
| 355 | bool TUdpSocket::TryToApplySmallPacketsOptimization(const TIoVec& v, const TSockAddrPair& addr, ui8 tos, size_t mtu) { |
| 356 | SendStat.Total++; |
no test coverage detected