vmm/utils/net/
ipv4addr.rs

1// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::net::Ipv4Addr;
5
6/// Checks if an IPv4 address is RFC 3927 compliant.
7pub fn is_link_local_valid(ipv4_addr: Ipv4Addr) -> bool {
8    match ipv4_addr.octets() {
9        [169, 254, 0, _] => false,
10        [169, 254, 255, _] => false,
11        [169, 254, _, _] => true,
12        _ => false,
13    }
14}
15
16#[cfg(test)]
17mod tests {
18    use std::net::Ipv4Addr;
19
20    use super::*;
21
22    #[test]
23    fn test_is_link_local_valid() {
24        // Outside link-local IPv4 address range (169.254.0.0/16 - 169.254.255.255/16).
25        let mut ipv4_addr = Ipv4Addr::new(1, 1, 1, 1);
26        assert!(!is_link_local_valid(ipv4_addr));
27
28        // First 256 addresses can not be used, per RFC 3927.
29        ipv4_addr = Ipv4Addr::new(169, 254, 0, 0);
30        assert!(!is_link_local_valid(ipv4_addr));
31        ipv4_addr = Ipv4Addr::new(169, 254, 0, 10);
32        assert!(!is_link_local_valid(ipv4_addr));
33        ipv4_addr = Ipv4Addr::new(169, 254, 0, 255);
34        assert!(!is_link_local_valid(ipv4_addr));
35
36        // Last 256 addresses can not be used, per RFC 3927.
37        ipv4_addr = Ipv4Addr::new(169, 254, 255, 0);
38        assert!(!is_link_local_valid(ipv4_addr));
39        ipv4_addr = Ipv4Addr::new(169, 254, 255, 194);
40        assert!(!is_link_local_valid(ipv4_addr));
41        ipv4_addr = Ipv4Addr::new(169, 254, 255, 255);
42        assert!(!is_link_local_valid(ipv4_addr));
43
44        // First valid IPv4 link-local address.
45        ipv4_addr = Ipv4Addr::new(169, 254, 1, 0);
46        assert!(is_link_local_valid(ipv4_addr));
47
48        // Last valid IPv4 link-local address.
49        ipv4_addr = Ipv4Addr::new(169, 254, 254, 255);
50        assert!(is_link_local_valid(ipv4_addr));
51
52        // In between valid IPv4 link-local address.
53        ipv4_addr = Ipv4Addr::new(169, 254, 170, 2);
54        assert!(is_link_local_valid(ipv4_addr));
55    }
56}