Skip to main content

aha_misc/observers/
packet.rs

1//! PacketObserver
2
3use std::borrow::Cow;
4
5use libafl::{Error, observers::Observer};
6use libafl_bolts::Named;
7use serde::{Deserialize, Serialize};
8
9/// PacketObserver gets the latest packet.
10#[derive(Debug, Serialize, Deserialize)]
11pub struct PacketObserver {
12    /// Observer Name
13    name: Cow<'static, str>,
14    /// Last packet, None if not received
15    last_packet: Option<Vec<u8>>,
16}
17
18impl PacketObserver {
19    /// Create a new PacketObserver
20    pub fn new<S>(name: S) -> Self
21    where
22        S: Into<Cow<'static, str>>,
23    {
24        Self {
25            name: name.into(),
26            last_packet: None,
27        }
28    }
29
30    /// Clear status by Executor
31    pub fn clear(&mut self) {
32        self.last_packet = None;
33    }
34
35    /// Set packet by Executor
36    pub fn set_packet(&mut self, packet: Vec<u8>) {
37        self.last_packet = Some(packet);
38    }
39
40    /// Get last packet
41    pub fn last_packet(&self) -> Option<&Vec<u8>> {
42        self.last_packet.as_ref()
43    }
44}
45
46impl Named for PacketObserver {
47    fn name(&self) -> &Cow<'static, str> {
48        &self.name
49    }
50}
51
52impl<I, S> Observer<I, S> for PacketObserver {
53    fn post_exec(
54        &mut self,
55        _state: &mut S,
56        _input: &I,
57        _exit_kind: &libafl::executors::ExitKind,
58    ) -> Result<(), Error> {
59        Ok(())
60    }
61}