void networkinterface_received(NetworkInterface* interface) { MAGIC_ASSERT(interface); /* we just finished receiving some packets */ interface->flags &= ~NIF_RECEIVING; /* decide how much delay we get to absorb based on the passed time */ SimulationTime now = worker_getCurrentTime(); SimulationTime absorbInterval = now - interface->lastTimeReceived; if(absorbInterval > 0) { /* decide how much delay we get to absorb based on the passed time */ gdouble newConsumed = interface->receiveNanosecondsConsumed - absorbInterval; interface->receiveNanosecondsConsumed = MAX(0, newConsumed); } interface->lastTimeReceived = now; /* now try to receive the next ones */ _networkinterface_scheduleNextReceive(interface); }
void networkinterface_packetArrived(NetworkInterface* interface, Packet* packet) { MAGIC_ASSERT(interface); /* a packet arrived. lets try to receive or buffer it */ guint length = packet_getPayloadLength(packet) + packet_getHeaderSize(packet); gssize space = interface->inBufferSize - interface->inBufferLength; g_assert(space >= 0); if(length <= space) { /* we have space to buffer it */ g_queue_push_tail(interface->inBuffer, packet); interface->inBufferLength += length; /* we need a trigger if we are not currently receiving */ if(!(interface->flags & NIF_RECEIVING)) { _networkinterface_scheduleNextReceive(interface); } } else { /* buffers are full, drop packet */ _networkinterface_dropInboundPacket(interface, packet); } }
void networkinterface_packetArrived(NetworkInterface* interface, Packet* packet) { MAGIC_ASSERT(interface); /* a packet arrived. lets try to receive or buffer it */ guint length = packet_getPayloadLength(packet) + packet_getHeaderSize(packet); gssize space = interface->inBufferSize - interface->inBufferLength; utility_assert(space >= 0); if(length <= space) { /* we have space to buffer it */ packet_ref(packet); g_queue_push_tail(interface->inBuffer, packet); interface->inBufferLength += length; packet_addDeliveryStatus(packet, PDS_RCV_INTERFACE_BUFFERED); /* we need a trigger if we are not currently receiving */ if(!(interface->flags & NIF_RECEIVING)) { _networkinterface_scheduleNextReceive(interface); } } else { /* buffers are full, drop packet */ packet_addDeliveryStatus(packet, PDS_RCV_INTERFACE_DROPPED); } }