1#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2pub enum MMTypeCode {
3 REQ = 0b00,
4 CNF = 0b01,
5 IND = 0b10,
6 RSP = 0b11,
7}
8
9#[derive(Copy, Clone, PartialEq, Eq)]
10pub struct MMType(pub u16);
11impl MMType {
12 pub const CC_CCO_APPOINT: MMType = MMType(0x0000);
13 pub const CC_BACKUP_APPOINT: MMType = MMType(0x0004);
14 pub const CC_LINK_INFO: MMType = MMType(0x0008);
15 pub const CC_HANDOVER: MMType = MMType(0x000C);
16 pub const CC_HANDOVER_INFO: MMType = MMType(0x0010);
17 pub const CC_DISCOVER_LIST: MMType = MMType(0x0014);
18 pub const CC_LINK_NEW: MMType = MMType(0x0018);
19 pub const CC_LINK_MOD: MMType = MMType(0x001C);
20 pub const CC_LINK_SQZ: MMType = MMType(0x0020);
21 pub const CC_LINK_REL: MMType = MMType(0x0024);
22 pub const CC_DETECT_REPORT: MMType = MMType(0x0028);
23 pub const CC_WHO_RU: MMType = MMType(0x002C);
24 pub const CC_ASSOC: MMType = MMType(0x0030);
25 pub const CC_LEAVE: MMType = MMType(0x0034);
26 pub const CC_SET_TEI_MAP: MMType = MMType(0x0038);
27 pub const CC_RELAY: MMType = MMType(0x003C);
28 pub const CC_BEACON_RELIABILITY: MMType = MMType(0x0040);
29 pub const CC_ALLOC_MOVE: MMType = MMType(0x0044);
30 pub const CC_ACCESS_NEW: MMType = MMType(0x0048);
31 pub const CC_ACCESS_REL: MMType = MMType(0x004C);
32 pub const CC_DCPPC: MMType = MMType(0x0050);
33 pub const CC_HP1_DET: MMType = MMType(0x0054);
34 pub const CC_BLE_UPDATE: MMType = MMType(0x0058);
35 pub const CC_BCAST_REPEAT: MMType = MMType(0x005C);
36 pub const CC_MH_LINK_NEW: MMType = MMType(0x0060);
37 pub const CC_ISP_DETECTION_REPORT: MMType = MMType(0x0064);
38 pub const CC_ISP_START_RESYNC: MMType = MMType(0x0068);
39 pub const CC_ISP_FINISH_RESYNC: MMType = MMType(0x006C);
40 pub const CC_ISP_RESYNC_DETECTED: MMType = MMType(0x0070);
41 pub const CC_ISP_RESYNC_TRANSMIT: MMType = MMType(0x0074);
42 pub const CC_POWERSAVE: MMType = MMType(0x0078);
43 pub const CC_POWERSAVE_EXIT: MMType = MMType(0x007C);
44 pub const CC_POWERSAVE_LIST: MMType = MMType(0x0080);
45 pub const CC_STOP_POWERSAVE: MMType = MMType(0x0084);
46 pub const CP_PROXY_APPOINT: MMType = MMType(0x2000);
47 pub const PH_PROXY_APPOINT: MMType = MMType(0x2004);
48 pub const CP_PROXY_WAKE: MMType = MMType(0x2008);
49 pub const NN_INL: MMType = MMType(0x4000);
50 pub const NN_NEW_NET: MMType = MMType(0x4004);
51 pub const NN_ADD_ALLOC: MMType = MMType(0x4008);
52 pub const NN_REL_ALLOC: MMType = MMType(0x400C);
53 pub const NN_REL_NET: MMType = MMType(0x4010);
54 pub const CM_UNASSOCIATED_STA: MMType = MMType(0x6000);
55 pub const CM_ENCRYPTED_PAYLOAD: MMType = MMType(0x6004);
56 pub const CM_SET_KEY: MMType = MMType(0x6008);
57 pub const CM_GET_KEY: MMType = MMType(0x600C);
58 pub const CM_SC_JOIN: MMType = MMType(0x6010);
59 pub const CM_CHAN_EST: MMType = MMType(0x6014);
60 pub const CM_TM_UPDATE: MMType = MMType(0x6018);
61 pub const CM_AMP_MAP: MMType = MMType(0x601C);
62 pub const CM_BRG_INFO: MMType = MMType(0x6020);
63 pub const CM_CONN_NEW: MMType = MMType(0x6024);
64 pub const CM_CONN_REL: MMType = MMType(0x6028);
65 pub const CM_CONN_MOD: MMType = MMType(0x602C);
66 pub const CM_CONN_INFO: MMType = MMType(0x6030);
67 pub const CM_STA_CAP: MMType = MMType(0x6034);
68 pub const CM_NW_INFO: MMType = MMType(0x6038);
69 pub const CM_GET_BEACON: MMType = MMType(0x603C);
70 pub const CM_HFID: MMType = MMType(0x6040);
71 pub const CM_MME_ERROR: MMType = MMType(0x6044);
72 pub const CM_NW_STATS: MMType = MMType(0x6048);
73 pub const CM_LINK_STATS: MMType = MMType(0x604C);
74 pub const CM_ROUTE_INFO: MMType = MMType(0x6050);
75 pub const CM_UNREACHABLE: MMType = MMType(0x6054);
76 pub const CM_MH_CONN_NEW: MMType = MMType(0x6058);
77 pub const CM_EXTENDEDTONEMASK: MMType = MMType(0x605C);
78 pub const CM_STA_IDENTIFY: MMType = MMType(0x6060);
79 pub const CM_TRIGGER_ATTEN_CHAR: MMType = MMType(0x6064);
80 pub const CM_START_ATTEN_CHAR: MMType = MMType(0x6068);
81 pub const CM_ATTEN_CHAR: MMType = MMType(0x606C);
82 pub const CM_PKCS_CERT: MMType = MMType(0x6070);
83 pub const CM_MNBC_SOUND: MMType = MMType(0x6074);
84 pub const CM_VALIDATE: MMType = MMType(0x6078);
85 pub const CM_SLAC_MATCH: MMType = MMType(0x607C);
86 pub const CM_SLAC_USER_DATA: MMType = MMType(0x6080);
87 pub const CM_ATTEN_PROFILE: MMType = MMType(0x6084);
88
89 pub const fn from_le_bytes(value: [u8; 2]) -> Self {
90 Self(u16::from_le_bytes(value))
91 }
92 pub fn base(&self) -> Self {
93 Self(self.0 & !0b11)
94 }
95 pub fn code(&self) -> MMTypeCode {
96 match self.0 & 0b11 {
97 0b00 => MMTypeCode::REQ,
98 0b01 => MMTypeCode::CNF,
99 0b10 => MMTypeCode::IND,
100 0b11 => MMTypeCode::RSP,
101 _ => unreachable!(),
102 }
103 }
104 pub const fn req(&self) -> Self {
105 Self(self.0 & !0b11)
106 }
107 pub const fn cnf(&self) -> Self {
108 Self((self.0 & !0b11) + 0b01)
109 }
110 pub const fn ind(&self) -> Self {
111 Self((self.0 & !0b11) + 0b10)
112 }
113 pub const fn rsp(&self) -> Self {
114 Self((self.0 & !0b11) + 0b11)
115 }
116 pub const fn value(&self) -> u16 {
117 self.0
118 }
119 pub const fn to_le_bytes(&self) -> [u8; 2] {
120 self.0.to_le_bytes()
121 }
122 pub const fn is_vendor(&self) -> bool {
123 (self.0 >> 13) & 0b111 == 0b101
124 }
125}
126impl core::fmt::Debug for MMType {
127 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
128 match self.base() {
129 Self::CC_CCO_APPOINT => write!(f, "CC_CCO_APPOINT"),
130 Self::CC_BACKUP_APPOINT => write!(f, "CC_BACKUP_APPOINT"),
131 Self::CC_LINK_INFO => write!(f, "CC_LINK_INFO"),
132 Self::CC_HANDOVER => write!(f, "CC_HANDOVER"),
133 Self::CC_HANDOVER_INFO => write!(f, "CC_HANDOVER_INFO"),
134 Self::CC_DISCOVER_LIST => write!(f, "CC_DISCOVER_LIST"),
135 Self::CC_LINK_NEW => write!(f, "CC_LINK_NEW"),
136 Self::CC_LINK_MOD => write!(f, "CC_LINK_MOD"),
137 Self::CC_LINK_SQZ => write!(f, "CC_LINK_SQZ"),
138 Self::CC_LINK_REL => write!(f, "CC_LINK_REL"),
139 Self::CC_DETECT_REPORT => write!(f, "CC_DETECT_REPORT"),
140 Self::CC_WHO_RU => write!(f, "CC_WHO_RU"),
141 Self::CC_ASSOC => write!(f, "CC_ASSOC"),
142 Self::CC_LEAVE => write!(f, "CC_LEAVE"),
143 Self::CC_SET_TEI_MAP => write!(f, "CC_SET_TEI_MAP"),
144 Self::CC_RELAY => write!(f, "CC_RELAY"),
145 Self::CC_BEACON_RELIABILITY => write!(f, "CC_BEACON_RELIABILITY"),
146 Self::CC_ALLOC_MOVE => write!(f, "CC_ALLOC_MOVE"),
147 Self::CC_ACCESS_NEW => write!(f, "CC_ACCESS_NEW"),
148 Self::CC_ACCESS_REL => write!(f, "CC_ACCESS_REL"),
149 Self::CC_DCPPC => write!(f, "CC_DCPPC"),
150 Self::CC_HP1_DET => write!(f, "CC_HP1_DET"),
151 Self::CC_BLE_UPDATE => write!(f, "CC_BLE_UPDATE"),
152 Self::CC_BCAST_REPEAT => write!(f, "CC_BCAST_REPEAT"),
153 Self::CC_MH_LINK_NEW => write!(f, "CC_MH_LINK_NEW"),
154 Self::CC_ISP_DETECTION_REPORT => write!(f, "CC_ISP_DETECTION_REPORT"),
155 Self::CC_ISP_START_RESYNC => write!(f, "CC_ISP_START_RESYNC"),
156 Self::CC_ISP_FINISH_RESYNC => write!(f, "CC_ISP_FINISH_RESYNC"),
157 Self::CC_ISP_RESYNC_DETECTED => write!(f, "CC_ISP_RESYNC_DETECTED"),
158 Self::CC_ISP_RESYNC_TRANSMIT => write!(f, "CC_ISP_RESYNC_TRANSMIT"),
159 Self::CC_POWERSAVE => write!(f, "CC_POWERSAVE"),
160 Self::CC_POWERSAVE_EXIT => write!(f, "CC_POWERSAVE_EXIT"),
161 Self::CC_POWERSAVE_LIST => write!(f, "CC_POWERSAVE_LIST"),
162 Self::CC_STOP_POWERSAVE => write!(f, "CC_STOP_POWERSAVE"),
163 Self::CP_PROXY_APPOINT => write!(f, "CP_PROXY_APPOINT"),
164 Self::PH_PROXY_APPOINT => write!(f, "PH_PROXY_APPOINT"),
165 Self::CP_PROXY_WAKE => write!(f, "CP_PROXY_WAKE"),
166 Self::NN_INL => write!(f, "NN_INL"),
167 Self::NN_NEW_NET => write!(f, "NN_NEW_NET"),
168 Self::NN_ADD_ALLOC => write!(f, "NN_ADD_ALLOC"),
169 Self::NN_REL_ALLOC => write!(f, "NN_REL_ALLOC"),
170 Self::NN_REL_NET => write!(f, "NN_REL_NET"),
171 Self::CM_UNASSOCIATED_STA => write!(f, "CM_UNASSOCIATED_STA"),
172 Self::CM_ENCRYPTED_PAYLOAD => write!(f, "CM_ENCRYPTED_PAYLOAD"),
173 Self::CM_SET_KEY => write!(f, "CM_SET_KEY"),
174 Self::CM_GET_KEY => write!(f, "CM_GET_KEY"),
175 Self::CM_SC_JOIN => write!(f, "CM_SC_JOIN"),
176 Self::CM_CHAN_EST => write!(f, "CM_CHAN_EST"),
177 Self::CM_TM_UPDATE => write!(f, "CM_TM_UPDATE"),
178 Self::CM_AMP_MAP => write!(f, "CM_AMP_MAP"),
179 Self::CM_BRG_INFO => write!(f, "CM_BRG_INFO"),
180 Self::CM_CONN_NEW => write!(f, "CM_CONN_NEW"),
181 Self::CM_CONN_REL => write!(f, "CM_CONN_REL"),
182 Self::CM_CONN_MOD => write!(f, "CM_CONN_MOD"),
183 Self::CM_CONN_INFO => write!(f, "CM_CONN_INFO"),
184 Self::CM_STA_CAP => write!(f, "CM_STA_CAP"),
185 Self::CM_NW_INFO => write!(f, "CM_NW_INFO"),
186 Self::CM_GET_BEACON => write!(f, "CM_GET_BEACON"),
187 Self::CM_HFID => write!(f, "CM_HFID"),
188 Self::CM_MME_ERROR => write!(f, "CM_MME_ERROR"),
189 Self::CM_NW_STATS => write!(f, "CM_NW_STATS"),
190 Self::CM_LINK_STATS => write!(f, "CM_LINK_STATS"),
191 Self::CM_ROUTE_INFO => write!(f, "CM_ROUTE_INFO"),
192 Self::CM_UNREACHABLE => write!(f, "CM_UNREACHABLE"),
193 Self::CM_MH_CONN_NEW => write!(f, "CM_MH_CONN_NEW"),
194 Self::CM_EXTENDEDTONEMASK => write!(f, "CM_EXTENDEDTONEMASK"),
195 Self::CM_STA_IDENTIFY => write!(f, "CM_STA_IDENTIFY"),
196 Self::CM_TRIGGER_ATTEN_CHAR => write!(f, "CM_TRIGGER_ATTEN_CHAR"),
197 Self::CM_START_ATTEN_CHAR => write!(f, "CM_START_ATTEN_CHAR"),
198 Self::CM_ATTEN_CHAR => write!(f, "CM_ATTEN_CHAR"),
199 Self::CM_PKCS_CERT => write!(f, "CM_PKCS_CERT"),
200 Self::CM_MNBC_SOUND => write!(f, "CM_MNBC_SOUND"),
201 Self::CM_VALIDATE => write!(f, "CM_VALIDATE"),
202 Self::CM_SLAC_MATCH => write!(f, "CM_SLAC_MATCH"),
203 Self::CM_SLAC_USER_DATA => write!(f, "CM_SLAC_USER_DATA"),
204 Self::CM_ATTEN_PROFILE => write!(f, "CM_ATTEN_PROFILE"),
205 _ => match (self.0 >> 13) & 0b111 {
206 0b000 => write!(f, "STA<>CCo{:04x}", self.0),
207 0b001 => write!(f, "Proxy{:04x}", self.0),
208 0b010 => write!(f, "CCo<>CCo{:04x}", self.0),
209 0b011 => write!(f, "STA<>STA{:04x}", self.0),
210 0b100 => write!(f, "Manufacturer{:04x}", self.0),
211 0b101 => write!(f, "Vendor{:04x}", self.0),
212 _ => write!(f, "Unknown"),
213 },
214 }?;
215 write!(f, ".{:?}", self.code())
216 }
217}