#[must_use]
pub fn hw_addr(bytes: &[u8]) -> Option<[u8; 6]> {
let mac: [u8; 6] = bytes.try_into().ok()?;
(mac != [0; 6] && mac[0] & 1 == 0).then_some(mac)
}
#[must_use]
pub fn magic_packet(mac: [u8; 6]) -> [u8; 102] {
let mut packet = [0xff; 102];
for chunk in packet[6..].chunks_exact_mut(6) {
chunk.copy_from_slice(&mac);
}
packet
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn magic_packet_valid_address_repeats_after_sync() {
let mac = [2, 3, 4, 5, 6, 7];
let packet = magic_packet(mac);
assert_eq!(&packet[..6], &[0xff; 6]);
assert_eq!(packet.len(), 102);
assert!(packet[6..].chunks_exact(6).all(|chunk| chunk == mac));
}
#[test]
fn hw_addr_invalid_or_unicast_returns_only_valid_address() {
let cases: &[(&[u8], Option<[u8; 6]>)] = &[
(&[], None),
(&[2; 5], None),
(&[0; 6], None),
(&[1; 6], None),
(&[2; 6], Some([2; 6])),
];
for (bytes, expected) in cases {
let actual = hw_addr(bytes);
assert_eq!(&actual, expected);
}
}
}