// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Manages the packet entropy calculation for both sent and received packets
// for a connection.
#ifndef NET_QUIC_QUIC_SENT_ENTROPY_MANAGER_H_
#define NET_QUIC_QUIC_SENT_ENTROPY_MANAGER_H_
#include "net/base/linked_hash_map.h"
#include "net/quic/quic_framer.h"
#include "net/quic/quic_protocol.h"
namespace net {
// Records all sent packets by a connection to track the cumulative entropy of
// sent packets. It is used by the connection to validate an ack
// frame sent by the peer as a preventive measure against the optimistic ack
// attack.
class NET_EXPORT_PRIVATE QuicSentEntropyManager {
public:
QuicSentEntropyManager();
virtual ~QuicSentEntropyManager();
// Record |entropy_hash| for sent packet corresponding to |sequence_number|.
void RecordPacketEntropyHash(QuicPacketSequenceNumber sequence_number,
QuicPacketEntropyHash entropy_hash);
QuicPacketEntropyHash EntropyHash(
QuicPacketSequenceNumber sequence_number) const;
// Returns true if |entropy_hash| matches the expected sent entropy hash
// up to |sequence_number| removing sequence numbers from |missing_packets|.
bool IsValidEntropy(QuicPacketSequenceNumber sequence_number,
const SequenceNumberSet& missing_packets,
QuicPacketEntropyHash entropy_hash) const;
// Removes not required entries from |packets_entropy_| before
// |sequence_number|.
void ClearEntropyBefore(QuicPacketSequenceNumber sequence_number);
private:
typedef linked_hash_map<QuicPacketSequenceNumber,
std::pair<QuicPacketEntropyHash,
QuicPacketEntropyHash> > SentEntropyMap;
// Linked hash map from sequence numbers to the sent entropy hash up to the
// sequence number in the key.
SentEntropyMap packets_entropy_;
// Cumulative hash of entropy of all sent packets.
QuicPacketEntropyHash packets_entropy_hash_;
DISALLOW_COPY_AND_ASSIGN(QuicSentEntropyManager);
};
} // namespace net
#endif // NET_QUIC_QUIC_SENT_ENTROPY_MANAGER_H_