use rand::Rng;
use rand::seq::SliceRandom;
use super::{CanFrame, mutate};
pub fn can_random(rng: &mut impl Rng) -> CanFrame {
CanFrame::random(rng)
}
pub fn canfd_random(rng: &mut impl Rng) -> CanFrame {
let arb_id: u32 = rng.gen_range(0..0x1FFF_FFFF);
let len: usize = rng.gen_range(1..=64);
let data: Vec<u8> = (0..len).map(|_| rng.gen()).collect();
CanFrame { arb_id, extended: true, data }
}
pub const UDS_SERVICES: &[u8] = &[
0x10, 0x11, 0x14, 0x19, 0x22, 0x23, 0x27, 0x28, 0x2A, 0x2C, 0x2E, 0x2F, 0x31, 0x34, 0x35, 0x36, 0x37, 0x3D, 0x3E, 0x85, 0x86, 0x87, ];
pub fn uds_request(target: u32, rng: &mut impl Rng) -> CanFrame {
let service = *UDS_SERVICES.choose(rng).unwrap();
let mut data = vec![service];
let extra = rng.gen_range(0..=6usize);
for _ in 0..extra {
data.push(rng.gen());
}
let len = data.len() as u8;
let mut frame_data = vec![len];
frame_data.extend_from_slice(&data);
frame_data.truncate(8);
CanFrame::new(target, frame_data)
}
pub fn uds_security_access_seed(target: u32) -> CanFrame {
CanFrame::new(target, vec![0x02, 0x27, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00])
}
pub fn uds_mutate(frame: &CanFrame, rng: &mut impl Rng) -> CanFrame {
CanFrame::new(frame.arb_id, mutate(&frame.data, rng))
}
pub const OBD_MODES: &[u8] = &[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, ];
pub fn obd_request(rng: &mut impl Rng) -> CanFrame {
let mode = *OBD_MODES.choose(rng).unwrap();
let pid: u8 = rng.gen();
CanFrame::new(0x7DF, vec![0x02, mode, pid, 0x00, 0x00, 0x00, 0x00, 0x00])
}
pub const DOIP_PAYLOAD_TYPES: &[u16] = &[
0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x4001, 0x4002, 0x4003, 0x0501, 0x0502, ];
pub fn doip_frame(rng: &mut impl Rng) -> Vec<u8> {
let payload_type = *DOIP_PAYLOAD_TYPES.choose(rng).unwrap();
let payload_len = rng.gen_range(0u32..=64);
let payload: Vec<u8> = (0..payload_len).map(|_| rng.gen()).collect();
let mut frame = vec![
0x02, 0xFD, ((payload_type >> 8) & 0xFF) as u8,
(payload_type & 0xFF) as u8,
((payload_len >> 24) & 0xFF) as u8,
((payload_len >> 16) & 0xFF) as u8,
((payload_len >> 8) & 0xFF) as u8,
(payload_len & 0xFF) as u8,
];
frame.extend_from_slice(&payload);
frame
}
pub fn j1939_random(rng: &mut impl Rng) -> CanFrame {
let priority: u32 = rng.gen_range(0u32..8) << 26;
let pgn: u32 = rng.gen_range(0u32..0xFFFF) << 8;
let sa: u32 = rng.gen_range(0u32..0xFF);
let arb_id = priority | pgn | sa;
let len = rng.gen_range(1..=8);
let data: Vec<u8> = (0..len).map(|_| rng.gen()).collect();
CanFrame { arb_id, extended: true, data }
}