S32 LLPacketRing::receivePacket (S32 socket, char *datap) { S32 packet_size = 0; // If using the throttle, simulate a limited size input buffer. if (mUseInThrottle) { BOOL done = FALSE; // push any current net packet (if any) onto delay ring while (!done) { LLPacketBuffer *packetp; packetp = new LLPacketBuffer(socket); if (packetp->getSize()) { mActualBitsIn += packetp->getSize() * 8; // Fake packet loss if (mDropPercentage && (ll_frand(100.f) < mDropPercentage)) { mPacketsToDrop++; } if (mPacketsToDrop) { delete packetp; packetp = NULL; packet_size = 0; mPacketsToDrop--; } } // If we faked packet loss, then we don't have a packet // to use for buffer overflow testing if (packetp) { if (mInBufferLength + packetp->getSize() > mMaxBufferLength) { // Toss it. llwarns << "Throwing away packet, overflowing buffer" << llendl; delete packetp; packetp = NULL; } else if (packetp->getSize()) { mReceiveQueue.push(packetp); mInBufferLength += packetp->getSize(); } else { delete packetp; packetp = NULL; done = true; } } else { // No packetp, keep going? - no packetp == faked packet loss } } // Now, grab data off of the receive queue according to our // throttled bandwidth settings. packet_size = receiveFromRing(socket, datap); } else { // no delay, pull straight from net if (LLSocks::isEnabled()) { proxywrap_t * header; datap = datap-10; header = (proxywrap_t *)datap; packet_size = receive_packet(socket, datap); mLastSender.setAddress(header->addr); mLastSender.setPort(ntohs(header->port)); if (packet_size > 10) { packet_size -= 10; } } else { packet_size = receive_packet(socket, datap); mLastSender = ::get_sender(); } mLastReceivingIF = ::get_receiving_interface(); if (packet_size) // did we actually get a packet? { if (mDropPercentage && (ll_frand(100.f) < mDropPercentage)) { mPacketsToDrop++; } if (mPacketsToDrop) { packet_size = 0; mPacketsToDrop--; } } } return packet_size; }
S32 LLPacketRing::receivePacket (S32 socket, char *datap) { S32 packet_size = 0; // If using the throttle, simulate a limited size input buffer. if (mUseInThrottle) { BOOL done = FALSE; // push any current net packet (if any) onto delay ring while (!done) { LLPacketBuffer *packetp; packetp = new LLPacketBuffer(socket); if (packetp->getSize()) { mActualBitsIn += packetp->getSize() * 8; // Fake packet loss if (mDropPercentage && (ll_frand(100.f) < mDropPercentage)) { mPacketsToDrop++; } if (mPacketsToDrop) { delete packetp; packetp = NULL; packet_size = 0; mPacketsToDrop--; } } // If we faked packet loss, then we don't have a packet // to use for buffer overflow testing if (packetp) { if (mInBufferLength + packetp->getSize() > mMaxBufferLength) { // Toss it. llwarns << "Throwing away packet, overflowing buffer" << llendl; delete packetp; packetp = NULL; } else if (packetp->getSize()) { mReceiveQueue.push(packetp); mInBufferLength += packetp->getSize(); } else { delete packetp; packetp = NULL; done = true; } } else { // No packetp, keep going? - no packetp == faked packet loss } } // Now, grab data off of the receive queue according to our // throttled bandwidth settings. packet_size = receiveFromRing(socket, datap); } else { // no delay, pull straight from net if (LLProxy::isSOCKSProxyEnabled()) { U8 buffer[NET_BUFFER_SIZE + SOCKS_HEADER_SIZE]; packet_size = receive_packet(socket, static_cast<char*>(static_cast<void*>(buffer))); if (packet_size > SOCKS_HEADER_SIZE) { // *FIX We are assuming ATYP is 0x01 (IPv4), not 0x03 (hostname) or 0x04 (IPv6) memcpy(datap, buffer + SOCKS_HEADER_SIZE, packet_size - SOCKS_HEADER_SIZE); proxywrap_t * header = static_cast<proxywrap_t*>(static_cast<void*>(buffer)); mLastSender.setAddress(header->addr); mLastSender.setPort(ntohs(header->port)); packet_size -= SOCKS_HEADER_SIZE; // The unwrapped packet size } else { packet_size = 0; } } else { packet_size = receive_packet(socket, datap); mLastSender = ::get_sender(); } mLastReceivingIF = ::get_receiving_interface(); if (packet_size) // did we actually get a packet? { if (mDropPercentage && (ll_frand(100.f) < mDropPercentage)) { mPacketsToDrop++; } if (mPacketsToDrop) { packet_size = 0; mPacketsToDrop--; } } } return packet_size; }