Skip to main content

network_types/
tcp.rs

1use core::mem;
2
3use crate::bitfield::BitfieldU16;
4
5pub const TCP_HDR_LEN: usize = mem::size_of::<TcpHdr>();
6
7/// TCP header, which is present after the IP header.
8#[repr(C)]
9#[derive(Debug, Copy, Clone)]
10#[cfg_attr(feature = "wincode", derive(wincode::SchemaRead, wincode::SchemaWrite))]
11#[cfg_attr(feature = "wincode", wincode(assert_zero_copy))]
12pub struct TcpHdr {
13    pub source: [u8; 2],
14    pub dest: [u8; 2],
15    pub seq: [u8; 4],
16    pub ack_seq: [u8; 4],
17    pub _bitfield_align_1: [u8; 0],
18    pub _bitfield_1: BitfieldU16,
19    pub window: [u8; 2],
20    pub check: [u8; 2],
21    pub urg_ptr: [u8; 2],
22}
23
24impl TcpHdr {
25    pub const LEN: usize = mem::size_of::<TcpHdr>();
26
27    #[inline]
28    pub fn res1(&self) -> u16 {
29        self._bitfield_1.get(0usize, 4u8) as u16
30    }
31    #[inline]
32    pub fn set_res1(&mut self, val: u16) {
33        self._bitfield_1.set(0usize, 4u8, val.into())
34    }
35    #[inline]
36    pub fn doff(&self) -> u16 {
37        self._bitfield_1.get(4usize, 4u8) as u16
38    }
39    #[inline]
40    pub fn set_doff(&mut self, val: u16) {
41        self._bitfield_1.set(4usize, 4u8, val.into())
42    }
43    #[inline]
44    pub fn fin(&self) -> u16 {
45        self._bitfield_1.get(8usize, 1u8) as u16
46    }
47    #[inline]
48    pub fn set_fin(&mut self, val: u16) {
49        self._bitfield_1.set(8usize, 1u8, val.into())
50    }
51    #[inline]
52    pub fn syn(&self) -> u16 {
53        self._bitfield_1.get(9usize, 1u8) as u16
54    }
55    #[inline]
56    pub fn set_syn(&mut self, val: u16) {
57        self._bitfield_1.set(9usize, 1u8, val.into())
58    }
59    #[inline]
60    pub fn rst(&self) -> u16 {
61        self._bitfield_1.get(10usize, 1u8) as u16
62    }
63    #[inline]
64    pub fn set_rst(&mut self, val: u16) {
65        self._bitfield_1.set(10usize, 1u8, val.into())
66    }
67    #[inline]
68    pub fn psh(&self) -> u16 {
69        self._bitfield_1.get(11usize, 1u8) as u16
70    }
71    #[inline]
72    pub fn set_psh(&mut self, val: u16) {
73        self._bitfield_1.set(11usize, 1u8, val.into())
74    }
75    #[inline]
76    pub fn ack(&self) -> u16 {
77        self._bitfield_1.get(12usize, 1u8) as u16
78    }
79    #[inline]
80    pub fn set_ack(&mut self, val: u16) {
81        self._bitfield_1.set(12usize, 1u8, val.into())
82    }
83    #[inline]
84    pub fn urg(&self) -> u16 {
85        self._bitfield_1.get(13usize, 1u8) as u16
86    }
87    #[inline]
88    pub fn set_urg(&mut self, val: u16) {
89        self._bitfield_1.set(13usize, 1u8, val.into())
90    }
91    #[inline]
92    pub fn ece(&self) -> u16 {
93        self._bitfield_1.get(14usize, 1u8) as u16
94    }
95    #[inline]
96    pub fn set_ece(&mut self, val: u16) {
97        self._bitfield_1.set(14usize, 1u8, val.into())
98    }
99    #[inline]
100    pub fn cwr(&self) -> u16 {
101        self._bitfield_1.get(15usize, 1u8) as u16
102    }
103    #[inline]
104    pub fn set_cwr(&mut self, val: u16) {
105        self._bitfield_1.set(15usize, 1u8, val.into())
106    }
107    #[inline]
108    #[expect(clippy::too_many_arguments)]
109    pub fn new_bitfield_1(
110        res1: u16,
111        doff: u16,
112        fin: u16,
113        syn: u16,
114        rst: u16,
115        psh: u16,
116        ack: u16,
117        urg: u16,
118        ece: u16,
119        cwr: u16,
120    ) -> BitfieldU16 {
121        let mut bitfield_unit: BitfieldU16 = Default::default();
122        bitfield_unit.set(0usize, 4u8, res1.into());
123        bitfield_unit.set(4usize, 4u8, doff.into());
124        bitfield_unit.set(8usize, 1u8, fin.into());
125        bitfield_unit.set(9usize, 1u8, syn.into());
126        bitfield_unit.set(10usize, 1u8, rst.into());
127        bitfield_unit.set(11usize, 1u8, psh.into());
128        bitfield_unit.set(12usize, 1u8, ack.into());
129        bitfield_unit.set(13usize, 1u8, urg.into());
130        bitfield_unit.set(14usize, 1u8, ece.into());
131        bitfield_unit.set(15usize, 1u8, cwr.into());
132        bitfield_unit
133    }
134}