@@ -172,11 +172,11 @@ impl Emitable for Nl80211Element {
172
172
v. as_slice ( ) . iter ( ) . map ( |v| u8:: from ( * v) ) . collect ( ) ;
173
173
payload. copy_from_slice ( raw. as_slice ( ) ) ;
174
174
}
175
- Self :: Channel ( v) => buffer [ 0 ] = * v,
176
- Self :: Country ( v) => v. emit ( buffer ) ,
177
- Self :: Rsn ( v) => v. emit ( buffer ) ,
178
- Self :: Vendor ( v) => buffer [ ..v. len ( ) ] . copy_from_slice ( v. as_slice ( ) ) ,
179
- Self :: HtCapability ( v) => v. emit ( buffer ) ,
175
+ Self :: Channel ( v) => payload [ 0 ] = * v,
176
+ Self :: Country ( v) => v. emit ( payload ) ,
177
+ Self :: Rsn ( v) => v. emit ( payload ) ,
178
+ Self :: Vendor ( v) => payload [ ..v. len ( ) ] . copy_from_slice ( v. as_slice ( ) ) ,
179
+ Self :: HtCapability ( v) => v. emit ( payload ) ,
180
180
Self :: Other ( _, data) => {
181
181
payload. copy_from_slice ( data. as_slice ( ) ) ;
182
182
}
@@ -193,9 +193,10 @@ const BSS_MEMBERSHIP_SELECTOR_HT_PHY: u8 = 127;
193
193
#[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
194
194
#[ non_exhaustive]
195
195
pub enum Nl80211RateAndSelector {
196
- /// BSS basic rate set in Mb/s.
196
+ /// BSS basic rate in units of 500 kb/s, if necessary rounded up to the
197
+ /// next 500 kbs.
197
198
BssBasicRateSet ( u8 ) ,
198
- /// Rate in Mb/s .
199
+ /// Rate in units of 500 kb/s, if necessary rounded up to the next 500 kbs .
199
200
Rate ( u8 ) ,
200
201
SelectorHt ,
201
202
SelectorVht ,
@@ -216,43 +217,45 @@ pub enum Nl80211RateAndSelector {
216
217
217
218
impl From < u8 > for Nl80211RateAndSelector {
218
219
fn from ( d : u8 ) -> Self {
219
- let msb: bool = ( d & 1 << 7 ) > 0 ;
220
- let value = d & 0b01111111 ;
220
+ const MSB_MASK : u8 = 0b1000_0000 ;
221
+ let msb: bool = ( d & MSB_MASK ) == MSB_MASK ;
222
+ let value = d & !MSB_MASK ;
221
223
if msb {
222
224
match value {
223
225
BSS_MEMBERSHIP_SELECTOR_SAE_HASH => Self :: SelectorSaeHash ,
224
226
BSS_MEMBERSHIP_SELECTOR_EPD => Self :: SelectorEpd ,
225
227
BSS_MEMBERSHIP_SELECTOR_GLK => Self :: SelectorGlk ,
226
228
BSS_MEMBERSHIP_SELECTOR_VHT_PHY => Self :: SelectorVht ,
227
229
BSS_MEMBERSHIP_SELECTOR_HT_PHY => Self :: SelectorHt ,
228
- _ => Self :: BssBasicRateSet ( value / 2 ) ,
230
+ _ => Self :: BssBasicRateSet ( value) ,
229
231
}
230
232
} else {
231
- Self :: Rate ( value / 2 )
233
+ Self :: Rate ( value)
232
234
}
233
235
}
234
236
}
235
237
236
238
impl From < Nl80211RateAndSelector > for u8 {
237
239
fn from ( v : Nl80211RateAndSelector ) -> u8 {
240
+ const MSB : u8 = 0b1000_0000 ;
238
241
match v {
239
- Nl80211RateAndSelector :: BssBasicRateSet ( r) => ( r * 2 ) & 1 << 7 ,
242
+ Nl80211RateAndSelector :: BssBasicRateSet ( r) => r & ! MSB | MSB ,
240
243
Nl80211RateAndSelector :: SelectorHt => {
241
- BSS_MEMBERSHIP_SELECTOR_HT_PHY & 1 << 7
244
+ BSS_MEMBERSHIP_SELECTOR_HT_PHY | MSB
242
245
}
243
246
Nl80211RateAndSelector :: SelectorVht => {
244
- BSS_MEMBERSHIP_SELECTOR_VHT_PHY & 1 << 7
247
+ BSS_MEMBERSHIP_SELECTOR_VHT_PHY | MSB
245
248
}
246
249
Nl80211RateAndSelector :: SelectorGlk => {
247
- BSS_MEMBERSHIP_SELECTOR_GLK & 1 << 7
250
+ BSS_MEMBERSHIP_SELECTOR_GLK | MSB
248
251
}
249
252
Nl80211RateAndSelector :: SelectorEpd => {
250
- BSS_MEMBERSHIP_SELECTOR_EPD & 1 << 7
253
+ BSS_MEMBERSHIP_SELECTOR_EPD | MSB
251
254
}
252
255
Nl80211RateAndSelector :: SelectorSaeHash => {
253
- BSS_MEMBERSHIP_SELECTOR_SAE_HASH & 1 << 7
256
+ BSS_MEMBERSHIP_SELECTOR_SAE_HASH | MSB
254
257
}
255
- Nl80211RateAndSelector :: Rate ( r) => r * 2 ,
258
+ Nl80211RateAndSelector :: Rate ( r) => r,
256
259
}
257
260
}
258
261
}
@@ -312,7 +315,7 @@ impl Emitable for Nl80211ElementCountry {
312
315
buffer[ 0 ] = self . country . as_bytes ( ) [ 0 ] ;
313
316
buffer[ 1 ] = self . country . as_bytes ( ) [ 1 ] ;
314
317
}
315
- buffer[ 3 ] = self . environment . into ( ) ;
318
+ buffer[ 2 ] = self . environment . into ( ) ;
316
319
for ( i, triplet) in self . triplets . as_slice ( ) . iter ( ) . enumerate ( ) {
317
320
triplet. emit ( & mut buffer[ ( i + 1 ) * 3 ..( i + 2 ) * 3 ] ) ;
318
321
}
@@ -991,3 +994,46 @@ impl Nl80211Pmkid {
991
994
}
992
995
}
993
996
}
997
+
998
+ #[ cfg( test) ]
999
+ mod test {
1000
+ use super :: * ;
1001
+ use crate :: macros:: test:: roundtrip_emit_parse_test;
1002
+
1003
+ roundtrip_emit_parse_test ! (
1004
+ ssid,
1005
+ Nl80211Element ,
1006
+ Nl80211Element :: Ssid ( "test-ssid" . to_owned( ) ) ,
1007
+ ) ;
1008
+ roundtrip_emit_parse_test ! (
1009
+ rates_and_selectors,
1010
+ Nl80211Element ,
1011
+ Nl80211Element :: SupportedRatesAndSelectors ( vec![
1012
+ Nl80211RateAndSelector :: BssBasicRateSet ( 1 ) ,
1013
+ Nl80211RateAndSelector :: Rate ( 1 ) ,
1014
+ Nl80211RateAndSelector :: SelectorHt ,
1015
+ Nl80211RateAndSelector :: SelectorVht ,
1016
+ Nl80211RateAndSelector :: SelectorGlk ,
1017
+ ] )
1018
+ ) ;
1019
+ roundtrip_emit_parse_test ! (
1020
+ channel,
1021
+ Nl80211Element ,
1022
+ Nl80211Element :: Channel ( 7 )
1023
+ ) ;
1024
+ roundtrip_emit_parse_test ! (
1025
+ country,
1026
+ Nl80211Element ,
1027
+ Nl80211Element :: Country ( Nl80211ElementCountry {
1028
+ country: "DE" . to_owned( ) ,
1029
+ environment: Nl80211ElementCountryEnvironment :: IndoorAndOutdoor ,
1030
+ triplets: vec![ Nl80211ElementCountryTriplet :: Subband (
1031
+ Nl80211ElementSubBand {
1032
+ channel_start: 1 ,
1033
+ channel_count: 13 ,
1034
+ max_power_level: 20 ,
1035
+ }
1036
+ ) ] ,
1037
+ } ) ,
1038
+ ) ;
1039
+ }
0 commit comments