]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: netem: only reseed PRNG when seed is explicitly provided
authorStephen Hemminger <stephen@networkplumber.org>
Sat, 18 Apr 2026 03:19:41 +0000 (20:19 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Apr 2026 00:30:28 +0000 (17:30 -0700)
netem_change() unconditionally reseeds the PRNG on every tc change
command. If TCA_NETEM_PRNG_SEED is not specified, a new random seed
is generated, destroying reproducibility for users who set a
deterministic seed on a previous change.

Move the initial random seed generation to netem_init() and only
reseed in netem_change() when TCA_NETEM_PRNG_SEED is explicitly
provided by the user.

Fixes: 4072d97ddc44 ("netem: add prng attribute to netem_sched_data")
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260418032027.900913-4-stephen@networkplumber.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_netem.c

index d400a730eadd1296289f1bfeb7281f32fdf47055..556f9747f0e73101af74196c002687801887eb32 100644 (file)
@@ -1112,11 +1112,10 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt,
        /* capping jitter to the range acceptable by tabledist() */
        q->jitter = min_t(s64, abs(q->jitter), INT_MAX);
 
-       if (tb[TCA_NETEM_PRNG_SEED])
+       if (tb[TCA_NETEM_PRNG_SEED]) {
                q->prng.seed = nla_get_u64(tb[TCA_NETEM_PRNG_SEED]);
-       else
-               q->prng.seed = get_random_u64();
-       prandom_seed_state(&q->prng.prng_state, q->prng.seed);
+               prandom_seed_state(&q->prng.prng_state, q->prng.seed);
+       }
 
 unlock:
        sch_tree_unlock(sch);
@@ -1139,6 +1138,9 @@ static int netem_init(struct Qdisc *sch, struct nlattr *opt,
                return -EINVAL;
 
        q->loss_model = CLG_RANDOM;
+       q->prng.seed = get_random_u64();
+       prandom_seed_state(&q->prng.prng_state, q->prng.seed);
+
        ret = netem_change(sch, opt, extack);
        if (ret)
                pr_info("netem: change failed\n");