@@ -187,16 +187,30 @@ impl FakeHeaderConfig {
187187 /// Create a random header configuration drawn from the default probability distributions.
188188 ///
189189 /// Includes a header with probability `FAKE_HEADER_PROBABILITY`; if included, a random number
190- /// of U8-random fields are packed to fill a length sampled from
191- /// `[FAKE_HEADER_LENGTH_MIN, FAKE_HEADER_LENGTH_MAX]`; otherwise returns an empty config .
190+ /// of fields are packed to fill a length sampled from `[FAKE_HEADER_LENGTH_MIN, FAKE_HEADER_LENGTH_MAX]`.
191+ /// Each field is independently assigned one of the five `FieldType` variants with equal probability .
192192 pub fn random < AE : AsyncExecutor > ( settings : & Settings < AE > ) -> Self {
193193 let mut rng = get_rng ( ) ;
194194 let header_prob = settings. get ( & keys:: FAKE_HEADER_PROBABILITY ) ;
195195 if rng. r#gen :: < f64 > ( ) < header_prob {
196196 let min_len = settings. get ( & keys:: FAKE_HEADER_LENGTH_MIN ) as usize ;
197197 let max_len = settings. get ( & keys:: FAKE_HEADER_LENGTH_MAX ) as usize ;
198198 let len = if min_len >= max_len { max_len } else { rng. gen_range ( min_len..=max_len) } ;
199- let fields = ( 0 ..len) . map ( |_| FieldTypeHolder :: U8 ( FieldType :: Random ) ) . collect ( ) ;
199+ let fields = ( 0 ..len)
200+ . map ( |_| {
201+ FieldTypeHolder :: U8 ( match rng. gen_range ( 0u8 ..5 ) {
202+ 0 => FieldType :: Random ,
203+ 1 => FieldType :: Constant { value : rng. r#gen :: < u8 > ( ) } ,
204+ 2 => FieldType :: Volatile { value : rng. r#gen :: < u8 > ( ) , change_probability : rng. gen_range ( 0.01 ..=0.20 ) } ,
205+ 3 => {
206+ let switch_timeout = rng. gen_range ( 1_000u64 ..=30_000 ) ;
207+ FieldType :: Switching { value : rng. r#gen :: < u8 > ( ) , next_switch : unix_timestamp_ms ( ) + switch_timeout as u128 , switch_timeout }
208+ }
209+ 4 => FieldType :: Incremental { value : rng. r#gen :: < u8 > ( ) } ,
210+ _ => unreachable ! ( ) ,
211+ } )
212+ } )
213+ . collect ( ) ;
200214 Self :: new ( fields)
201215 } else {
202216 Self :: new ( vec ! [ ] )
@@ -276,46 +290,7 @@ impl FlowConfig {
276290 /// `[FAKE_BODY_LENGTH_MIN, mtu]`.
277291 pub fn random < AE : AsyncExecutor > ( settings : & Settings < AE > ) -> Self {
278292 let mut rng = get_rng ( ) ;
279-
280- let header_prob = settings. get ( & keys:: FAKE_HEADER_PROBABILITY ) ;
281- let fake_header_mode = if rng. r#gen :: < f64 > ( ) < header_prob {
282- let min_len = settings. get ( & keys:: FAKE_HEADER_LENGTH_MIN ) as usize ;
283- let max_len = settings. get ( & keys:: FAKE_HEADER_LENGTH_MAX ) as usize ;
284- let len = if min_len >= max_len {
285- max_len
286- } else {
287- rng. gen_range ( min_len..=max_len)
288- } ;
289- let fields = ( 0 ..len)
290- . map ( |_| {
291- FieldTypeHolder :: U8 ( match rng. gen_range ( 0u8 ..5 ) {
292- 0 => FieldType :: Random ,
293- 1 => FieldType :: Constant {
294- value : rng. r#gen :: < u8 > ( ) ,
295- } ,
296- 2 => FieldType :: Volatile {
297- value : rng. r#gen :: < u8 > ( ) ,
298- change_probability : rng. gen_range ( 0.01 ..=0.20 ) ,
299- } ,
300- 3 => {
301- let switch_timeout = rng. gen_range ( 1_000u64 ..=30_000 ) ;
302- FieldType :: Switching {
303- value : rng. r#gen :: < u8 > ( ) ,
304- next_switch : unix_timestamp_ms ( ) + switch_timeout as u128 ,
305- switch_timeout,
306- }
307- }
308- 4 => FieldType :: Incremental {
309- value : rng. r#gen :: < u8 > ( ) ,
310- } ,
311- _ => unreachable ! ( ) ,
312- } )
313- } )
314- . collect ( ) ;
315- FakeHeaderConfig :: new ( fields)
316- } else {
317- FakeHeaderConfig :: new ( vec ! [ ] )
318- } ;
293+ let fake_header_mode = FakeHeaderConfig :: random ( settings) ;
319294
320295 let min_len = settings. get ( & keys:: FAKE_BODY_LENGTH_MIN ) as usize ;
321296 let max_len = settings. get ( & keys:: FAKE_BODY_LENGTH_MAX ) as usize ;
0 commit comments