public static void process_ack(uint ack, uint ack_bits, ref PacketQueue pending_ack_queue, ref PacketQueue acked_queue, ref List <uint> acks, uint acked_packets, float rtt, uint max_sequence) { if (pending_ack_queue.Count == 0) { return; } var node = pending_ack_queue.First; while (node != null) { var nextnode = node.Next; bool acked = false; if (node.Value.sequence == ack) { acked = true; } else if (!sequence_more_recent(node.Value.sequence, ack, max_sequence)) { uint bit_index = bit_index_for_sequence(node.Value.sequence, ack, max_sequence); if (bit_index <= 31) { acked = System.Convert.ToBoolean((ack_bits >> (int)bit_index) & 1); } } if (acked) { rtt += (node.Value.time - rtt) * 0.1f; acked_queue.insert_sorted(node.Value, max_sequence); acks.Add(node.Value.sequence); acked_packets++; pending_ack_queue.Remove(node); node = nextnode; } else { node = nextnode; } } }