void ReliabilitySystem::process_ack( unsigned int ack, unsigned int ack_bits, PacketQueue & pending_ack_queue, PacketQueue & acked_queue, std::vector<unsigned int> & acks, unsigned int & acked_packets, float & rtt, unsigned int max_sequence ) { if ( pending_ack_queue.empty() ) { return; } PacketQueue::iterator itor = pending_ack_queue.begin(); while ( itor != pending_ack_queue.end() ) { bool acked = false; if ( itor->sequence == ack ) { acked = true; } else if ( !sequence_more_recent( itor->sequence, ack, max_sequence ) ) { int bit_index = bit_index_for_sequence( itor->sequence, ack, max_sequence ); if ( bit_index <= 31 ) { acked = ( ack_bits >> bit_index ) & 1; } }
void ReliabilitySystem::process_ack(unsigned int ack, unsigned int ack_bits, PacketQueue & pending_ack_queue, PacketQueue & acked_queue, std::vector<unsigned int> & acks, unsigned int & acked_packets, float & rtt, unsigned int max_sequence) { if (pending_ack_queue.empty()) return; PacketQueue::iterator itor = pending_ack_queue.begin(); while (itor != pending_ack_queue.end()) { bool acked = false; if (itor->sequence == ack) { acked = true; } else if (!sequence_more_recent(itor->sequence, ack, max_sequence)) { int bit_index = bit_index_for_sequence(itor->sequence, ack, max_sequence); if (bit_index <= 31) acked = (ack_bits >> bit_index) & 1; } if (acked) { rtt += (itor->time - rtt) * 0.1f; acked_queue.insert_sorted(*itor, max_sequence); acks.push_back(itor->sequence); acked_packets++; itor = pending_ack_queue.erase(itor); } else { ++itor; } }
unsigned int ReliabilitySystem::generate_ack_bits(unsigned int ack, const PacketQueue & received_queue, unsigned int max_sequence) { unsigned int ack_bits = 0; for (PacketQueue::const_iterator itor = received_queue.begin(); itor != received_queue.end(); itor++) { if (itor->sequence == ack || sequence_more_recent(itor->sequence, ack, max_sequence)) break; int bit_index = bit_index_for_sequence(itor->sequence, ack, max_sequence); if (bit_index <= 31) ack_bits |= 1 << bit_index; } return ack_bits; }
static u32 generate_ack_bits(u32 ack, PacketData *recv_queue, u32 max_sequence) { u32 ack_bits = 0; for (PacketData *node = recv_queue->next; node != recv_queue; node = node->next) { if (node->sequence == ack || sequence_more_recent(node->sequence, ack, max_sequence)) { break; } i32 bit_index = bit_index_for_sequence(node->sequence, ack, max_sequence); if (bit_index <= 31) { ack_bits |= 1 << bit_index; } } return ack_bits; }
static void process_ack(NetworkState *net, u32 ack, u32 ack_bits) { if (!packet_data_empty(net->pending_ack_queue)) { PacketData *node = net->pending_ack_queue->next; while (node != net->pending_ack_queue) { b32 acked = false; if (node->sequence == ack) { acked = true; } else if (!sequence_more_recent(node->sequence, ack, net->max_sequence)) { i32 bit_index = bit_index_for_sequence(node->sequence, ack, net->max_sequence); if (bit_index <= 31) { acked = (ack_bits >> bit_index) & 1; } }