1use crate::bitfield::BitfieldU16;
2
3#[repr(C)]
4#[derive(Debug, Clone)]
5#[cfg_attr(feature = "wincode", derive(wincode::SchemaRead, wincode::SchemaWrite))]
6#[cfg_attr(feature = "wincode", wincode(assert_zero_copy))]
7pub struct MacHdr {
8 _bitfield_frame_ctl: BitfieldU16,
9 duration_id: [u8; 2],
10 address1: [u8; 6],
11 address2: [u8; 6],
12 address3: [u8; 6],
13 sequence_ctl: [u8; 2],
14 address4: [u8; 6],
15 qos_ctl: [u8; 2],
16}
17
18impl MacHdr {
19 pub const LEN: usize = core::mem::size_of::<MacHdr>();
20
21 #[inline]
22 pub fn protocol_version(&self) -> u16 {
23 self._bitfield_frame_ctl.get(0, 2) as u16
24 }
25 #[inline]
26 pub fn set_protocol_version(&mut self, val: u16) {
27 self._bitfield_frame_ctl.set(0, 2, val.into())
28 }
29 #[inline]
30 pub fn ty(&self) -> u16 {
31 self._bitfield_frame_ctl.get(2, 4) as u16
32 }
33 #[inline]
34 pub fn set_ty(&mut self, val: u16) {
35 self._bitfield_frame_ctl.set(2, 4, val.into())
36 }
37 #[inline]
38 pub fn sub_ty(&self) -> u16 {
39 self._bitfield_frame_ctl.get(4, 8) as u16
40 }
41 #[inline]
42 pub fn set_sub_ty(&mut self, val: u16) {
43 self._bitfield_frame_ctl.set(4, 8, val.into())
44 }
45 #[inline]
46 pub fn tds(&self) -> u16 {
47 self._bitfield_frame_ctl.get(8, 9) as u16
48 }
49 #[inline]
50 pub fn set_tds(&mut self, val: u16) {
51 self._bitfield_frame_ctl.set(8, 9, val.into())
52 }
53 #[inline]
54 pub fn fds(&self) -> u16 {
55 self._bitfield_frame_ctl.get(9, 10) as u16
56 }
57 #[inline]
59 pub fn set_fds(&mut self, val: u16) {
60 self._bitfield_frame_ctl.set(9, 10, val.into())
61 }
62 #[inline]
63 pub fn mflag(&self) -> u16 {
64 self._bitfield_frame_ctl.get(10, 11) as u16
65 }
66 #[inline]
67 pub fn set_mflag(&mut self, val: u16) {
68 self._bitfield_frame_ctl.set(10, 11, val.into())
69 }
70 #[inline]
71 pub fn retry(&self) -> u16 {
72 self._bitfield_frame_ctl.get(11, 12) as u16
73 }
74 #[inline]
75 pub fn set_retry(&mut self, val: u16) {
76 self._bitfield_frame_ctl.set(11, 12, val.into())
77 }
78 #[inline]
79 pub fn pmgmt(&self) -> u16 {
80 self._bitfield_frame_ctl.get(12, 13) as u16
81 }
82 #[inline]
84 pub fn set_pmgmt(&mut self, val: u16) {
85 self._bitfield_frame_ctl.set(12, 13, val.into())
86 }
87 #[inline]
88 pub fn mdata(&self) -> u16 {
89 self._bitfield_frame_ctl.get(13, 14) as u16
90 }
91 #[inline]
93 pub fn set_mdata(&mut self, val: u16) {
94 self._bitfield_frame_ctl.set(13, 14, val.into())
95 }
96 #[inline]
97 pub fn protected_frame(&self) -> u16 {
98 self._bitfield_frame_ctl.get(14, 15) as u16
99 }
100 #[inline]
101 pub fn set_protected_frame(&mut self, val: u16) {
102 self._bitfield_frame_ctl.set(14, 15, val.into())
103 }
104 #[inline]
105 pub fn order(&self) -> u16 {
106 self._bitfield_frame_ctl.get(15, 16) as u16
107 }
108 #[inline]
109 pub fn set_order(&mut self, val: u16) {
110 self._bitfield_frame_ctl.set(15, 16, val.into())
111 }
112 #[inline]
113 #[expect(clippy::too_many_arguments)]
114 pub fn new_bitfield_frame_ctl(
115 protocol_version: u16,
116 ty: u16,
117 sub_ty: u16,
118 tds: u16,
119 fds: u16,
120 mflag: u16,
121 retry: u16,
122 pmgmt: u16,
123 mdata: u16,
124 protected_frame: u16,
125 order: u16,
126 ) -> BitfieldU16 {
127 let mut bitfield_unit: BitfieldU16 = Default::default();
128 bitfield_unit.set(0, 2, protocol_version.into());
129 bitfield_unit.set(2, 2, ty.into());
130 bitfield_unit.set(4, 4, sub_ty.into());
131 bitfield_unit.set(8, 1, tds.into());
132 bitfield_unit.set(9, 1, fds.into());
133 bitfield_unit.set(10, 1, mflag.into());
134 bitfield_unit.set(11, 1, retry.into());
135 bitfield_unit.set(12, 1, pmgmt.into());
136 bitfield_unit.set(13, 1, mdata.into());
137 bitfield_unit.set(14, 1, protected_frame.into());
138 bitfield_unit.set(15, 1, order.into());
139 bitfield_unit
140 }
141}