2020-12-15 16:50:40 -08:00
|
|
|
// Get a unique hash value for a packet
|
|
|
|
// Used in retransmit and shred fetch to prevent dos with same packet data.
|
|
|
|
|
2021-08-12 09:04:01 -07:00
|
|
|
use {
|
|
|
|
ahash::AHasher,
|
|
|
|
rand::{thread_rng, Rng},
|
|
|
|
solana_ledger::shred::Shred,
|
|
|
|
solana_perf::packet::Packet,
|
|
|
|
std::hash::Hasher,
|
|
|
|
};
|
2020-12-15 16:50:40 -08:00
|
|
|
|
|
|
|
#[derive(Clone)]
|
2022-06-21 09:29:27 -07:00
|
|
|
pub(crate) struct PacketHasher {
|
2020-12-15 16:50:40 -08:00
|
|
|
seed1: u128,
|
|
|
|
seed2: u128,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for PacketHasher {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
seed1: thread_rng().gen::<u128>(),
|
|
|
|
seed2: thread_rng().gen::<u128>(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PacketHasher {
|
2021-08-12 09:04:01 -07:00
|
|
|
pub(crate) fn hash_packet(&self, packet: &Packet) -> u64 {
|
2022-06-02 18:05:06 -07:00
|
|
|
self.hash_data(packet.data(..).unwrap_or_default())
|
2021-08-12 09:04:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) fn hash_shred(&self, shred: &Shred) -> u64 {
|
2022-04-25 05:43:22 -07:00
|
|
|
self.hash_data(shred.payload())
|
2021-08-12 09:04:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
fn hash_data(&self, data: &[u8]) -> u64 {
|
2020-12-15 16:50:40 -08:00
|
|
|
let mut hasher = AHasher::new_with_keys(self.seed1, self.seed2);
|
2021-08-12 09:04:01 -07:00
|
|
|
hasher.write(data);
|
2020-12-15 16:50:40 -08:00
|
|
|
hasher.finish()
|
|
|
|
}
|
|
|
|
|
2022-06-21 09:29:27 -07:00
|
|
|
pub(crate) fn reset(&mut self) {
|
2020-12-15 16:50:40 -08:00
|
|
|
*self = Self::default();
|
|
|
|
}
|
|
|
|
}
|