* Next number depends on last value.
  * rho is scaled to avoid floating point.
  */
-static u32 get_crandom(struct crndstate *state)
+static u32 get_crandom(struct crndstate *state, struct prng *p)
 {
        u64 value, rho;
        unsigned long answer;
+       struct rnd_state *s = &p->prng_state;
 
        if (!state || state->rho == 0)  /* no correlation */
-               return get_random_u32();
+               return prandom_u32_state(s);
 
-       value = get_random_u32();
+       value = prandom_u32_state(s);
        rho = (u64)state->rho + 1;
        answer = (value * ((1ull<<32) - rho) + state->last * rho) >> 32;
        state->last = answer;
        switch (q->loss_model) {
        case CLG_RANDOM:
                /* Random packet drop 0 => none, ~0 => all */
-               return q->loss && q->loss >= get_crandom(&q->loss_cor);
+               return q->loss && q->loss >= get_crandom(&q->loss_cor, &q->prng);
 
        case CLG_4_STATES:
                /* 4state loss model algorithm (used also for GI model)
  */
 static s64 tabledist(s64 mu, s32 sigma,
                     struct crndstate *state,
+                    struct prng *prng,
                     const struct disttable *dist)
 {
        s64 x;
        if (sigma == 0)
                return mu;
 
-       rnd = get_crandom(state);
+       rnd = get_crandom(state, prng);
 
        /* default uniform distribution */
        if (dist == NULL)
        skb->prev = NULL;
 
        /* Random duplication */
-       if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor))
+       if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor, &q->prng))
                ++count;
 
        /* Drop packet? */
         * If packet is going to be hardware checksummed, then
         * do it now in software before we mangle it.
         */
-       if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) {
+       if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor, &q->prng)) {
                if (skb_is_gso(skb)) {
                        skb = netem_segment(skb, sch, to_free);
                        if (!skb)
        cb = netem_skb_cb(skb);
        if (q->gap == 0 ||              /* not doing reordering */
            q->counter < q->gap - 1 ||  /* inside last reordering gap */
-           q->reorder < get_crandom(&q->reorder_cor)) {
+           q->reorder < get_crandom(&q->reorder_cor, &q->prng)) {
                u64 now;
                s64 delay;
 
                delay = tabledist(q->latency, q->jitter,
-                                 &q->delay_cor, q->delay_dist);
+                                 &q->delay_cor, &q->prng, q->delay_dist);
 
                now = ktime_get_ns();
 
        else
                next_delay = tabledist(q->slot_config.dist_delay,
                                       (s32)(q->slot_config.dist_jitter),
-                                      NULL, q->slot_dist);
+                                      NULL, &q->prng, q->slot_dist);
 
        q->slot.slot_next = now + next_delay;
        q->slot.packets_left = q->slot_config.max_packets;