1use core::mem;
2
3use crate::bitfield::BitfieldU16;
4
5pub const TCP_HDR_LEN: usize = mem::size_of::<TcpHdr>();
6
7#[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}