capsules_extra/net/
util.rs1pub fn verify_prefix_len(prefix: &[u8], prefix_len: u8) -> bool {
14 let full_bytes = (prefix_len / 8) as usize;
15 let remaining_bits = prefix_len % 8;
16 let bytes = full_bytes + usize::from(remaining_bits != 0);
17
18 if bytes > prefix.len() {
19 return false;
20 }
21
22 if remaining_bits != 0 {
24 let last_byte_mask = 0xff >> remaining_bits;
25 if prefix[full_bytes] & last_byte_mask != 0 {
26 return false;
27 }
28 }
29
30 prefix[bytes..].iter().all(|&b| b == 0)
32}
33
34pub fn matches_prefix(buf1: &[u8], buf2: &[u8], prefix_len: u8) -> bool {
37 let full_bytes = (prefix_len / 8) as usize;
38 let remaining_bits = prefix_len % 8;
39 let bytes = full_bytes + usize::from(remaining_bits != 0);
40
41 if bytes > buf1.len() || bytes > buf2.len() {
42 return false;
43 }
44
45 if remaining_bits != 0 {
47 let last_byte_mask = 0xff << (8 - remaining_bits);
48 if (buf1[full_bytes] ^ buf2[full_bytes]) & last_byte_mask != 0 {
49 return false;
50 }
51 }
52
53 buf1[..full_bytes].iter().eq(buf2[..full_bytes].iter())
55}
56
57pub fn network_slice_to_u16(buf: &[u8]) -> u16 {
59 ((buf[0] as u16) << 8) | (buf[1] as u16)
60}
61
62pub fn host_slice_to_u16(buf: &[u8]) -> u16 {
64 ((buf[1] as u16) << 8) | (buf[0] as u16)
65}
66
67pub fn u16_to_network_slice(short: u16, slice: &mut [u8]) {
68 slice[0] = (short >> 8) as u8;
69 slice[1] = (short & 0xff) as u8;
70}