powerline/homeplug/
mmtype.rs

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}