blob: 418c41828d8177e07a81d817d309059585841940 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_WLAN_LIB_MLME_CPP_INCLUDE_WLAN_MLME_MESH_DEDUPLICATOR_H_
#define SRC_CONNECTIVITY_WLAN_LIB_MLME_CPP_INCLUDE_WLAN_MLME_MESH_DEDUPLICATOR_H_
#include <wlan/common/buffer_reader.h>
#include <wlan/common/parse_mac_header.h>
#include <wlan/mlme/device_interface.h>
#include <wlan/mlme/mac_header_writer.h>
#include <wlan/mlme/mesh/hwmp.h>
#include <wlan/mlme/mesh/path_table.h>
#include <wlan/mlme/mlme.h>
#include <queue>
#include <unordered_set>
namespace wlan {
class DeDuplicator {
public:
explicit DeDuplicator(size_t cache_size) { cache_size_ = cache_size; }
// Function to check if this packet has been seen before.
bool DeDuplicate(const common::MacAddr& addr, uint32_t seq);
private:
typedef std::pair<common::MacAddr, uint32_t> MacAddrSeqPair;
struct addr_seq_hash {
// This hash function combines a 6-byte mac address and 4-byte
// sequence number into an 8-byte hash by putting mac address
// in the top 6 bytes and the lower 2 bytes of sequence number
// in the last 2 bytes.
inline std::size_t operator()(const MacAddrSeqPair& pkt) const {
return pkt.first.ToU64() + pkt.second;
}
};
// The queue is used to limit the size of the cache
std::queue<MacAddrSeqPair> queue_of_received_packets_;
size_t cache_size_;
// The unordered_set is used to cache the received packets for duplicate
// detection
std::unordered_set<MacAddrSeqPair, addr_seq_hash> cache_of_received_packets_;
};
} // namespace wlan
#endif // SRC_CONNECTIVITY_WLAN_LIB_MLME_CPP_INCLUDE_WLAN_MLME_MESH_DEDUPLICATOR_H_