Enum nix::sys::socket::ControlMessageOwned

source ·
#[non_exhaustive]
pub enum ControlMessageOwned {
Show 18 variants ScmRights(Vec<RawFd>), ScmCredentials(UnixCredentials), ScmTimestamp(TimeVal), ScmTimestampsns(Timestamps), ScmTimestampns(TimeSpec), Ipv4PacketInfo(in_pktinfo), Ipv6PacketInfo(in6_pktinfo), Ipv4OrigDstAddr(sockaddr_in), Ipv6OrigDstAddr(sockaddr_in6), Ipv4Ttl(i32), Ipv6HopLimit(i32), Ipv4Tos(u8), Ipv6TClass(i32), UdpGroSegments(i32), RxqOvfl(u32), Ipv4RecvErr(sock_extended_err, Option<sockaddr_in>), Ipv6RecvErr(sock_extended_err, Option<sockaddr_in6>), TlsGetRecordType(TlsGetRecordType),
}
Expand description

A type-safe wrapper around a single control message, as used with recvmsg.

Further reading

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

ScmRights(Vec<RawFd>)

Received version of ControlMessage::ScmRights

§

ScmCredentials(UnixCredentials)

Received version of ControlMessage::ScmCredentials

§

ScmTimestamp(TimeVal)

A message of type SCM_TIMESTAMP, containing the time the packet was received by the kernel.

See the kernel’s explanation in “SO_TIMESTAMP” of networking/timestamping.

§Examples

// Set up
let message = "Ohayō!".as_bytes();
let in_socket = socket(
    AddressFamily::Inet,
    SockType::Datagram,
    SockFlag::empty(),
    None).unwrap();
setsockopt(&in_socket, sockopt::ReceiveTimestamp, &true).unwrap();
let localhost = SockaddrIn::from_str("127.0.0.1:0").unwrap();
bind(in_socket.as_raw_fd(), &localhost).unwrap();
let address: SockaddrIn = getsockname(in_socket.as_raw_fd()).unwrap();
// Get initial time
let time0 = SystemTime::now();
// Send the message
let iov = [IoSlice::new(message)];
let flags = MsgFlags::empty();
let l = sendmsg(in_socket.as_raw_fd(), &iov, &[], flags, Some(&address)).unwrap();
assert_eq!(message.len(), l);
// Receive the message
let mut buffer = vec![0u8; message.len()];
let mut cmsgspace = cmsg_space!(TimeVal);
let mut iov = [IoSliceMut::new(&mut buffer)];
let r = recvmsg::<SockaddrIn>(in_socket.as_raw_fd(), &mut iov, Some(&mut cmsgspace), flags)
    .unwrap();
let rtime = match r.cmsgs().unwrap().next() {
    Some(ControlMessageOwned::ScmTimestamp(rtime)) => rtime,
    Some(_) => panic!("Unexpected control message"),
    None => panic!("No control message")
};
// Check the final time
let time1 = SystemTime::now();
// the packet's received timestamp should lie in-between the two system
// times, unless the system clock was adjusted in the meantime.
let rduration = Duration::new(rtime.tv_sec() as u64,
                              rtime.tv_usec() as u32 * 1000);
assert!(time0.duration_since(UNIX_EPOCH).unwrap() <= rduration);
assert!(rduration <= time1.duration_since(UNIX_EPOCH).unwrap());
// Close socket
§

ScmTimestampsns(Timestamps)

A set of nanosecond resolution timestamps

Further reading

§

ScmTimestampns(TimeSpec)

Nanoseconds resolution timestamp

Further reading

§

Ipv4PacketInfo(in_pktinfo)

§

Ipv6PacketInfo(in6_pktinfo)

§

Ipv4OrigDstAddr(sockaddr_in)

§

Ipv6OrigDstAddr(sockaddr_in6)

§

Ipv4Ttl(i32)

Time-to-Live (TTL) header field of the incoming IPv4 packet.

Further reading

§

Ipv6HopLimit(i32)

Hop Limit header field of the incoming IPv6 packet.

Further reading for Linux Further reading for FreeBSD

§

Ipv4Tos(u8)

Retrieve the DSCP (ToS) header field of the incoming IPv4 packet.

§

Ipv6TClass(i32)

Retrieve the DSCP (Traffic Class) header field of the incoming IPv6 packet.

§

UdpGroSegments(i32)

UDP Generic Receive Offload (GRO) allows receiving multiple UDP packets from a single sender. Fixed-size payloads are following one by one in a receive buffer. This Control Message indicates the size of all smaller packets, except, maybe, the last one.

UdpGroSegment socket option should be enabled on a socket to allow receiving GRO packets.

§

RxqOvfl(u32)

SO_RXQ_OVFL indicates that an unsigned 32 bit value ancilliary msg (cmsg) should be attached to recieved skbs indicating the number of packets dropped by the socket between the last recieved packet and this received packet.

RxqOvfl socket option should be enabled on a socket to allow receiving the drop counter.

§

Ipv4RecvErr(sock_extended_err, Option<sockaddr_in>)

Socket error queue control messages read with the MSG_ERRQUEUE flag.

§

Ipv6RecvErr(sock_extended_err, Option<sockaddr_in6>)

Socket error queue control messages read with the MSG_ERRQUEUE flag.

§

TlsGetRecordType(TlsGetRecordType)

SOL_TLS messages of type TLS_GET_RECORD_TYPE

Trait Implementations§

source§

impl Clone for ControlMessageOwned

source§

fn clone(&self) -> ControlMessageOwned

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ControlMessageOwned

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for ControlMessageOwned

source§

fn eq(&self, other: &ControlMessageOwned) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Eq for ControlMessageOwned

source§

impl StructuralPartialEq for ControlMessageOwned

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.