netstack3_datagram/
tx_metadata.rs1use derivative::Derivative;
8use net_types::ip::{GenericOverIp, Ip};
9use netstack3_base::{ChecksumOffloadResult, WeakDeviceIdentifier};
10
11use crate::internal::datagram::{DatagramSocketSpec, IpExt};
12
13#[derive(Derivative, GenericOverIp)]
15#[generic_over_ip(I, Ip)]
16#[derivative(Debug(bound = ""))]
17pub struct TxMetadata<I: IpExt, D: WeakDeviceIdentifier, S: DatagramSocketSpec> {
18 socket: S::WeakSocketId<I, D>,
19 send_token: Option<S::SendToken>,
20 checksum_offload_result: Option<ChecksumOffloadResult>,
21}
22
23impl<I: IpExt, D: WeakDeviceIdentifier, S: DatagramSocketSpec> TxMetadata<I, D, S> {
24 pub(crate) fn new(socket: &S::SocketId<I, D>, send_token: S::SendToken) -> Self {
26 Self {
27 socket: S::downgrade_socket_id(socket),
28 send_token: Some(send_token),
29 checksum_offload_result: None,
30 }
31 }
32
33 pub fn socket(&self) -> &S::WeakSocketId<I, D> {
35 &self.socket
36 }
37
38 pub fn checksum_offload_result(&self) -> Option<ChecksumOffloadResult> {
40 self.checksum_offload_result.clone()
41 }
42
43 pub fn set_checksum_offload_result(&mut self, result: Option<ChecksumOffloadResult>) {
45 self.checksum_offload_result = result;
46 }
47
48 pub fn split_for_multiple_frames(self) -> (Self, Self) {
54 let secondary = Self {
55 socket: self.socket.clone(),
56 send_token: None,
57 checksum_offload_result: self.checksum_offload_result.clone(),
58 };
59 let primary = self;
60 (primary, secondary)
61 }
62}
63
64#[cfg(any(test, feature = "testutils"))]
65impl<I: IpExt, D: WeakDeviceIdentifier, S: DatagramSocketSpec> PartialEq for TxMetadata<I, D, S> {
66 fn eq(&self, other: &Self) -> bool {
67 core::ptr::eq(self, other)
71 }
72}