socket_priority/
socket_priority_linux.rs

1use crate::dscp::set_dscp_for_priority;
2use crate::Priority;
3use libc::{c_int, c_void, setsockopt, socklen_t, SOL_SOCKET};
4use std::io::Error;
5use std::mem::size_of_val;
6use std::os::unix::io::RawFd;
7
8const SO_PRIORITY: c_int = 12;
9
10pub fn set_priority(fd: RawFd, prio: Priority) -> Result<(), Error> {
11    let linux_prio: c_int = match prio {
12        Priority::Interactive => 6,
13        Priority::Default => 0,
14        Priority::InteractiveBulk => 4,
15        Priority::Bulk => 2,
16    };
17    match unsafe {
18        setsockopt(
19            fd as c_int,
20            SOL_SOCKET,
21            SO_PRIORITY,
22            &linux_prio as *const _ as *const c_void,
23            size_of_val(&linux_prio) as socklen_t,
24        )
25    } {
26        0 => Ok(()),
27        _ => Err(Error::last_os_error()),
28    }?;
29    set_dscp_for_priority(fd, prio)
30}