Skip to main content

network_types/
mac.rs

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    // set to from_ds
58    #[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    // set to power_mgmt
83    #[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    // set to power_mgmt
92    #[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}