Coverage Report

Created: 2025-11-16 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/rustix-1.0.7/src/net/netdevice.rs
Line
Count
Source
1
//! Low-level Linux network device access
2
//!
3
//! The methods in this module take a socket's file descriptor to communicate
4
//! with the kernel in their ioctl call:
5
//!  - glibc uses an `AF_UNIX`, `AF_INET`, or `AF_INET6` socket. The address
6
//!    family itself does not matter and glibc tries the next address family if
7
//!    socket creation with one fails.
8
//!  - Android (bionic) uses an `AF_INET` socket.
9
//!  - Both create the socket with `SOCK_DGRAM|SOCK_CLOEXEC` type/flag.
10
//!  - The [manual pages] specify that the ioctl calls “can be used on any
11
//!    socket's file descriptor regardless of the family or type”.
12
//!
13
//! # References
14
//!  - [Linux]
15
//!
16
//! [manual pages]: https://man7.org/linux/man-pages/man7/netdevice.7.html
17
//! [Linux]: https://man7.org/linux/man-pages/man7/netdevice.7.html
18
19
use crate::fd::AsFd;
20
use crate::io;
21
#[cfg(feature = "alloc")]
22
use alloc::string::String;
23
24
/// `ioctl(fd, SIOCGIFINDEX, ifreq)`—Returns the interface index for a given
25
/// name.
26
///
27
/// See the [module-level documentation] for information about `fd` usage.
28
///
29
/// # References
30
///  - [Linux]
31
///
32
/// [module-level documentation]: self
33
/// [Linux]: https://man7.org/linux/man-pages/man7/netdevice.7.html
34
#[inline]
35
#[doc(alias = "SIOCGIFINDEX")]
36
0
pub fn name_to_index<Fd: AsFd>(fd: Fd, if_name: &str) -> io::Result<u32> {
37
0
    crate::backend::net::netdevice::name_to_index(fd.as_fd(), if_name)
38
0
}
39
40
/// `ioctl(fd, SIOCGIFNAME, ifreq)`—Returns the interface name for a given
41
/// index.
42
///
43
/// See the [module-level documentation] for information about `fd` usage.
44
///
45
/// # References
46
///  - [Linux]
47
///
48
/// [module-level documentation]: self
49
/// [Linux]: https://man7.org/linux/man-pages/man7/netdevice.7.html
50
#[inline]
51
#[doc(alias = "SIOCGIFNAME")]
52
#[cfg(feature = "alloc")]
53
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
54
0
pub fn index_to_name<Fd: AsFd>(fd: Fd, index: u32) -> io::Result<String> {
55
0
    crate::backend::net::netdevice::index_to_name(fd.as_fd(), index)
56
0
}
57
58
#[cfg(test)]
59
mod tests {
60
    use crate::backend::net::netdevice::{index_to_name, name_to_index};
61
    use crate::fd::AsFd;
62
    use crate::net::{AddressFamily, SocketFlags, SocketType};
63
64
    #[test]
65
    fn test_name_to_index() {
66
        let fd = crate::net::socket_with(
67
            AddressFamily::INET,
68
            SocketType::DGRAM,
69
            SocketFlags::CLOEXEC,
70
            None,
71
        )
72
        .unwrap();
73
74
        let loopback_index = std::fs::read_to_string("/sys/class/net/lo/ifindex")
75
            .unwrap()
76
            .as_str()
77
            .split_at(1)
78
            .0
79
            .parse::<u32>()
80
            .unwrap();
81
        assert_eq!(Ok(loopback_index), name_to_index(fd.as_fd(), "lo"));
82
    }
83
84
    #[test]
85
    #[cfg(feature = "alloc")]
86
    fn test_index_to_name() {
87
        let fd = crate::net::socket_with(
88
            AddressFamily::INET,
89
            SocketType::DGRAM,
90
            SocketFlags::CLOEXEC,
91
            None,
92
        )
93
        .unwrap();
94
95
        let loopback_index = std::fs::read_to_string("/sys/class/net/lo/ifindex")
96
            .unwrap()
97
            .as_str()
98
            .split_at(1)
99
            .0
100
            .parse::<u32>()
101
            .unwrap();
102
        assert_eq!(
103
            Ok("lo".to_owned()),
104
            index_to_name(fd.as_fd(), loopback_index)
105
        );
106
    }
107
}