GNU Linux-libre 4.9.309-gnu1
[releases.git] / net / sched / sch_netem.c
1 /*
2  * net/sched/sch_netem.c        Network emulator
3  *
4  *              This program is free software; you can redistribute it and/or
5  *              modify it under the terms of the GNU General Public License
6  *              as published by the Free Software Foundation; either version
7  *              2 of the License.
8  *
9  *              Many of the algorithms and ideas for this came from
10  *              NIST Net which is not copyrighted.
11  *
12  * Authors:     Stephen Hemminger <shemminger@osdl.org>
13  *              Catalin(ux aka Dino) BOIE <catab at umbrella dot ro>
14  */
15
16 #include <linux/mm.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/types.h>
20 #include <linux/kernel.h>
21 #include <linux/errno.h>
22 #include <linux/skbuff.h>
23 #include <linux/vmalloc.h>
24 #include <linux/rtnetlink.h>
25 #include <linux/reciprocal_div.h>
26 #include <linux/rbtree.h>
27
28 #include <net/netlink.h>
29 #include <net/pkt_sched.h>
30 #include <net/inet_ecn.h>
31
32 #define VERSION "1.3"
33
34 /*      Network Emulation Queuing algorithm.
35         ====================================
36
37         Sources: [1] Mark Carson, Darrin Santay, "NIST Net - A Linux-based
38                  Network Emulation Tool
39                  [2] Luigi Rizzo, DummyNet for FreeBSD
40
41          ----------------------------------------------------------------
42
43          This started out as a simple way to delay outgoing packets to
44          test TCP but has grown to include most of the functionality
45          of a full blown network emulator like NISTnet. It can delay
46          packets and add random jitter (and correlation). The random
47          distribution can be loaded from a table as well to provide
48          normal, Pareto, or experimental curves. Packet loss,
49          duplication, and reordering can also be emulated.
50
51          This qdisc does not do classification that can be handled in
52          layering other disciplines.  It does not need to do bandwidth
53          control either since that can be handled by using token
54          bucket or other rate control.
55
56      Correlated Loss Generator models
57
58         Added generation of correlated loss according to the
59         "Gilbert-Elliot" model, a 4-state markov model.
60
61         References:
62         [1] NetemCLG Home http://netgroup.uniroma2.it/NetemCLG
63         [2] S. Salsano, F. Ludovici, A. Ordine, "Definition of a general
64         and intuitive loss model for packet networks and its implementation
65         in the Netem module in the Linux kernel", available in [1]
66
67         Authors: Stefano Salsano <stefano.salsano at uniroma2.it
68                  Fabio Ludovici <fabio.ludovici at yahoo.it>
69 */
70
71 struct netem_sched_data {
72         /* internal t(ime)fifo qdisc uses t_root and sch->limit */
73         struct rb_root t_root;
74
75         /* optional qdisc for classful handling (NULL at netem init) */
76         struct Qdisc    *qdisc;
77
78         struct qdisc_watchdog watchdog;
79
80         psched_tdiff_t latency;
81         psched_tdiff_t jitter;
82
83         u32 loss;
84         u32 ecn;
85         u32 limit;
86         u32 counter;
87         u32 gap;
88         u32 duplicate;
89         u32 reorder;
90         u32 corrupt;
91         u64 rate;
92         s32 packet_overhead;
93         u32 cell_size;
94         struct reciprocal_value cell_size_reciprocal;
95         s32 cell_overhead;
96
97         struct crndstate {
98                 u32 last;
99                 u32 rho;
100         } delay_cor, loss_cor, dup_cor, reorder_cor, corrupt_cor;
101
102         struct disttable {
103                 u32  size;
104                 s16 table[0];
105         } *delay_dist;
106
107         enum  {
108                 CLG_RANDOM,
109                 CLG_4_STATES,
110                 CLG_GILB_ELL,
111         } loss_model;
112
113         enum {
114                 TX_IN_GAP_PERIOD = 1,
115                 TX_IN_BURST_PERIOD,
116                 LOST_IN_GAP_PERIOD,
117                 LOST_IN_BURST_PERIOD,
118         } _4_state_model;
119
120         enum {
121                 GOOD_STATE = 1,
122                 BAD_STATE,
123         } GE_state_model;
124
125         /* Correlated Loss Generation models */
126         struct clgstate {
127                 /* state of the Markov chain */
128                 u8 state;
129
130                 /* 4-states and Gilbert-Elliot models */
131                 u32 a1; /* p13 for 4-states or p for GE */
132                 u32 a2; /* p31 for 4-states or r for GE */
133                 u32 a3; /* p32 for 4-states or h for GE */
134                 u32 a4; /* p14 for 4-states or 1-k for GE */
135                 u32 a5; /* p23 used only in 4-states */
136         } clg;
137
138 };
139
140 /* Time stamp put into socket buffer control block
141  * Only valid when skbs are in our internal t(ime)fifo queue.
142  *
143  * As skb->rbnode uses same storage than skb->next, skb->prev and skb->tstamp,
144  * and skb->next & skb->prev are scratch space for a qdisc,
145  * we save skb->tstamp value in skb->cb[] before destroying it.
146  */
147 struct netem_skb_cb {
148         psched_time_t   time_to_send;
149         ktime_t         tstamp_save;
150 };
151
152
153 static struct sk_buff *netem_rb_to_skb(struct rb_node *rb)
154 {
155         return container_of(rb, struct sk_buff, rbnode);
156 }
157
158 static inline struct netem_skb_cb *netem_skb_cb(struct sk_buff *skb)
159 {
160         /* we assume we can use skb next/prev/tstamp as storage for rb_node */
161         qdisc_cb_private_validate(skb, sizeof(struct netem_skb_cb));
162         return (struct netem_skb_cb *)qdisc_skb_cb(skb)->data;
163 }
164
165 /* init_crandom - initialize correlated random number generator
166  * Use entropy source for initial seed.
167  */
168 static void init_crandom(struct crndstate *state, unsigned long rho)
169 {
170         state->rho = rho;
171         state->last = prandom_u32();
172 }
173
174 /* get_crandom - correlated random number generator
175  * Next number depends on last value.
176  * rho is scaled to avoid floating point.
177  */
178 static u32 get_crandom(struct crndstate *state)
179 {
180         u64 value, rho;
181         unsigned long answer;
182
183         if (state->rho == 0)    /* no correlation */
184                 return prandom_u32();
185
186         value = prandom_u32();
187         rho = (u64)state->rho + 1;
188         answer = (value * ((1ull<<32) - rho) + state->last * rho) >> 32;
189         state->last = answer;
190         return answer;
191 }
192
193 /* loss_4state - 4-state model loss generator
194  * Generates losses according to the 4-state Markov chain adopted in
195  * the GI (General and Intuitive) loss model.
196  */
197 static bool loss_4state(struct netem_sched_data *q)
198 {
199         struct clgstate *clg = &q->clg;
200         u32 rnd = prandom_u32();
201
202         /*
203          * Makes a comparison between rnd and the transition
204          * probabilities outgoing from the current state, then decides the
205          * next state and if the next packet has to be transmitted or lost.
206          * The four states correspond to:
207          *   TX_IN_GAP_PERIOD => successfully transmitted packets within a gap period
208          *   LOST_IN_BURST_PERIOD => isolated losses within a gap period
209          *   LOST_IN_GAP_PERIOD => lost packets within a burst period
210          *   TX_IN_GAP_PERIOD => successfully transmitted packets within a burst period
211          */
212         switch (clg->state) {
213         case TX_IN_GAP_PERIOD:
214                 if (rnd < clg->a4) {
215                         clg->state = LOST_IN_BURST_PERIOD;
216                         return true;
217                 } else if (clg->a4 < rnd && rnd < clg->a1 + clg->a4) {
218                         clg->state = LOST_IN_GAP_PERIOD;
219                         return true;
220                 } else if (clg->a1 + clg->a4 < rnd) {
221                         clg->state = TX_IN_GAP_PERIOD;
222                 }
223
224                 break;
225         case TX_IN_BURST_PERIOD:
226                 if (rnd < clg->a5) {
227                         clg->state = LOST_IN_GAP_PERIOD;
228                         return true;
229                 } else {
230                         clg->state = TX_IN_BURST_PERIOD;
231                 }
232
233                 break;
234         case LOST_IN_GAP_PERIOD:
235                 if (rnd < clg->a3)
236                         clg->state = TX_IN_BURST_PERIOD;
237                 else if (clg->a3 < rnd && rnd < clg->a2 + clg->a3) {
238                         clg->state = TX_IN_GAP_PERIOD;
239                 } else if (clg->a2 + clg->a3 < rnd) {
240                         clg->state = LOST_IN_GAP_PERIOD;
241                         return true;
242                 }
243                 break;
244         case LOST_IN_BURST_PERIOD:
245                 clg->state = TX_IN_GAP_PERIOD;
246                 break;
247         }
248
249         return false;
250 }
251
252 /* loss_gilb_ell - Gilbert-Elliot model loss generator
253  * Generates losses according to the Gilbert-Elliot loss model or
254  * its special cases  (Gilbert or Simple Gilbert)
255  *
256  * Makes a comparison between random number and the transition
257  * probabilities outgoing from the current state, then decides the
258  * next state. A second random number is extracted and the comparison
259  * with the loss probability of the current state decides if the next
260  * packet will be transmitted or lost.
261  */
262 static bool loss_gilb_ell(struct netem_sched_data *q)
263 {
264         struct clgstate *clg = &q->clg;
265
266         switch (clg->state) {
267         case GOOD_STATE:
268                 if (prandom_u32() < clg->a1)
269                         clg->state = BAD_STATE;
270                 if (prandom_u32() < clg->a4)
271                         return true;
272                 break;
273         case BAD_STATE:
274                 if (prandom_u32() < clg->a2)
275                         clg->state = GOOD_STATE;
276                 if (prandom_u32() > clg->a3)
277                         return true;
278         }
279
280         return false;
281 }
282
283 static bool loss_event(struct netem_sched_data *q)
284 {
285         switch (q->loss_model) {
286         case CLG_RANDOM:
287                 /* Random packet drop 0 => none, ~0 => all */
288                 return q->loss && q->loss >= get_crandom(&q->loss_cor);
289
290         case CLG_4_STATES:
291                 /* 4state loss model algorithm (used also for GI model)
292                 * Extracts a value from the markov 4 state loss generator,
293                 * if it is 1 drops a packet and if needed writes the event in
294                 * the kernel logs
295                 */
296                 return loss_4state(q);
297
298         case CLG_GILB_ELL:
299                 /* Gilbert-Elliot loss model algorithm
300                 * Extracts a value from the Gilbert-Elliot loss generator,
301                 * if it is 1 drops a packet and if needed writes the event in
302                 * the kernel logs
303                 */
304                 return loss_gilb_ell(q);
305         }
306
307         return false;   /* not reached */
308 }
309
310
311 /* tabledist - return a pseudo-randomly distributed value with mean mu and
312  * std deviation sigma.  Uses table lookup to approximate the desired
313  * distribution, and a uniformly-distributed pseudo-random source.
314  */
315 static psched_tdiff_t tabledist(psched_tdiff_t mu, psched_tdiff_t sigma,
316                                 struct crndstate *state,
317                                 const struct disttable *dist)
318 {
319         psched_tdiff_t x;
320         long t;
321         u32 rnd;
322
323         if (sigma == 0)
324                 return mu;
325
326         rnd = get_crandom(state);
327
328         /* default uniform distribution */
329         if (dist == NULL)
330                 return (rnd % (2*sigma)) - sigma + mu;
331
332         t = dist->table[rnd % dist->size];
333         x = (sigma % NETEM_DIST_SCALE) * t;
334         if (x >= 0)
335                 x += NETEM_DIST_SCALE/2;
336         else
337                 x -= NETEM_DIST_SCALE/2;
338
339         return  x / NETEM_DIST_SCALE + (sigma / NETEM_DIST_SCALE) * t + mu;
340 }
341
342 static psched_time_t packet_len_2_sched_time(unsigned int len, struct netem_sched_data *q)
343 {
344         u64 ticks;
345
346         len += q->packet_overhead;
347
348         if (q->cell_size) {
349                 u32 cells = reciprocal_divide(len, q->cell_size_reciprocal);
350
351                 if (len > cells * q->cell_size) /* extra cell needed for remainder */
352                         cells++;
353                 len = cells * (q->cell_size + q->cell_overhead);
354         }
355
356         ticks = (u64)len * NSEC_PER_SEC;
357
358         do_div(ticks, q->rate);
359         return PSCHED_NS2TICKS(ticks);
360 }
361
362 static void tfifo_reset(struct Qdisc *sch)
363 {
364         struct netem_sched_data *q = qdisc_priv(sch);
365         struct rb_node *p;
366
367         while ((p = rb_first(&q->t_root))) {
368                 struct sk_buff *skb = netem_rb_to_skb(p);
369
370                 rb_erase(p, &q->t_root);
371                 rtnl_kfree_skbs(skb, skb);
372         }
373 }
374
375 static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch)
376 {
377         struct netem_sched_data *q = qdisc_priv(sch);
378         psched_time_t tnext = netem_skb_cb(nskb)->time_to_send;
379         struct rb_node **p = &q->t_root.rb_node, *parent = NULL;
380
381         while (*p) {
382                 struct sk_buff *skb;
383
384                 parent = *p;
385                 skb = netem_rb_to_skb(parent);
386                 if (tnext >= netem_skb_cb(skb)->time_to_send)
387                         p = &parent->rb_right;
388                 else
389                         p = &parent->rb_left;
390         }
391         rb_link_node(&nskb->rbnode, parent, p);
392         rb_insert_color(&nskb->rbnode, &q->t_root);
393         sch->q.qlen++;
394 }
395
396 /* netem can't properly corrupt a megapacket (like we get from GSO), so instead
397  * when we statistically choose to corrupt one, we instead segment it, returning
398  * the first packet to be corrupted, and re-enqueue the remaining frames
399  */
400 static struct sk_buff *netem_segment(struct sk_buff *skb, struct Qdisc *sch,
401                                      struct sk_buff **to_free)
402 {
403         struct sk_buff *segs;
404         netdev_features_t features = netif_skb_features(skb);
405
406         segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
407
408         if (IS_ERR_OR_NULL(segs)) {
409                 qdisc_drop(skb, sch, to_free);
410                 return NULL;
411         }
412         consume_skb(skb);
413         return segs;
414 }
415
416 static void netem_enqueue_skb_head(struct qdisc_skb_head *qh, struct sk_buff *skb)
417 {
418         skb->next = qh->head;
419
420         if (!qh->head)
421                 qh->tail = skb;
422         qh->head = skb;
423         qh->qlen++;
424 }
425
426 /*
427  * Insert one skb into qdisc.
428  * Note: parent depends on return value to account for queue length.
429  *      NET_XMIT_DROP: queue length didn't change.
430  *      NET_XMIT_SUCCESS: one skb was queued.
431  */
432 static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
433                          struct sk_buff **to_free)
434 {
435         struct netem_sched_data *q = qdisc_priv(sch);
436         /* We don't fill cb now as skb_unshare() may invalidate it */
437         struct netem_skb_cb *cb;
438         struct sk_buff *skb2;
439         struct sk_buff *segs = NULL;
440         unsigned int prev_len = qdisc_pkt_len(skb);
441         int count = 1;
442         int rc = NET_XMIT_SUCCESS;
443         int rc_drop = NET_XMIT_DROP;
444
445         /* Do not fool qdisc_drop_all() */
446         skb->prev = NULL;
447
448         /* Random duplication */
449         if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor))
450                 ++count;
451
452         /* Drop packet? */
453         if (loss_event(q)) {
454                 if (q->ecn && INET_ECN_set_ce(skb))
455                         qdisc_qstats_drop(sch); /* mark packet */
456                 else
457                         --count;
458         }
459         if (count == 0) {
460                 qdisc_qstats_drop(sch);
461                 __qdisc_drop(skb, to_free);
462                 return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
463         }
464
465         /* If a delay is expected, orphan the skb. (orphaning usually takes
466          * place at TX completion time, so _before_ the link transit delay)
467          */
468         if (q->latency || q->jitter || q->rate)
469                 skb_orphan_partial(skb);
470
471         /*
472          * If we need to duplicate packet, then re-insert at top of the
473          * qdisc tree, since parent queuer expects that only one
474          * skb will be queued.
475          */
476         if (count > 1 && (skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) {
477                 struct Qdisc *rootq = qdisc_root_bh(sch);
478                 u32 dupsave = q->duplicate; /* prevent duplicating a dup... */
479
480                 q->duplicate = 0;
481                 rootq->enqueue(skb2, rootq, to_free);
482                 q->duplicate = dupsave;
483                 rc_drop = NET_XMIT_SUCCESS;
484         }
485
486         /*
487          * Randomized packet corruption.
488          * Make copy if needed since we are modifying
489          * If packet is going to be hardware checksummed, then
490          * do it now in software before we mangle it.
491          */
492         if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) {
493                 if (skb_is_gso(skb)) {
494                         segs = netem_segment(skb, sch, to_free);
495                         if (!segs)
496                                 return rc_drop;
497                         qdisc_skb_cb(segs)->pkt_len = segs->len;
498                 } else {
499                         segs = skb;
500                 }
501
502                 skb = segs;
503                 segs = segs->next;
504
505                 skb = skb_unshare(skb, GFP_ATOMIC);
506                 if (unlikely(!skb)) {
507                         qdisc_qstats_drop(sch);
508                         goto finish_segs;
509                 }
510                 if (skb->ip_summed == CHECKSUM_PARTIAL &&
511                     skb_checksum_help(skb)) {
512                         qdisc_drop(skb, sch, to_free);
513                         skb = NULL;
514                         goto finish_segs;
515                 }
516
517                 skb->data[prandom_u32() % skb_headlen(skb)] ^=
518                         1<<(prandom_u32() % 8);
519         }
520
521         if (unlikely(sch->q.qlen >= sch->limit)) {
522                 qdisc_drop_all(skb, sch, to_free);
523                 return rc_drop;
524         }
525
526         qdisc_qstats_backlog_inc(sch, skb);
527
528         cb = netem_skb_cb(skb);
529         if (q->gap == 0 ||              /* not doing reordering */
530             q->counter < q->gap - 1 ||  /* inside last reordering gap */
531             q->reorder < get_crandom(&q->reorder_cor)) {
532                 psched_time_t now;
533                 psched_tdiff_t delay;
534
535                 delay = tabledist(q->latency, q->jitter,
536                                   &q->delay_cor, q->delay_dist);
537
538                 now = psched_get_time();
539
540                 if (q->rate) {
541                         struct netem_skb_cb *last = NULL;
542
543                         if (sch->q.tail)
544                                 last = netem_skb_cb(sch->q.tail);
545                         if (q->t_root.rb_node) {
546                                 struct sk_buff *t_skb;
547                                 struct netem_skb_cb *t_last;
548
549                                 t_skb = netem_rb_to_skb(rb_last(&q->t_root));
550                                 t_last = netem_skb_cb(t_skb);
551                                 if (!last ||
552                                     t_last->time_to_send > last->time_to_send) {
553                                         last = t_last;
554                                 }
555                         }
556
557                         if (last) {
558                                 /*
559                                  * Last packet in queue is reference point (now),
560                                  * calculate this time bonus and subtract
561                                  * from delay.
562                                  */
563                                 delay -= last->time_to_send - now;
564                                 delay = max_t(psched_tdiff_t, 0, delay);
565                                 now = last->time_to_send;
566                         }
567
568                         delay += packet_len_2_sched_time(qdisc_pkt_len(skb), q);
569                 }
570
571                 cb->time_to_send = now + delay;
572                 cb->tstamp_save = skb->tstamp;
573                 ++q->counter;
574                 tfifo_enqueue(skb, sch);
575         } else {
576                 /*
577                  * Do re-ordering by putting one out of N packets at the front
578                  * of the queue.
579                  */
580                 cb->time_to_send = psched_get_time();
581                 q->counter = 0;
582
583                 netem_enqueue_skb_head(&sch->q, skb);
584                 sch->qstats.requeues++;
585         }
586
587 finish_segs:
588         if (segs) {
589                 unsigned int len, last_len;
590                 int nb;
591
592                 len = skb ? skb->len : 0;
593                 nb = skb ? 1 : 0;
594
595                 while (segs) {
596                         skb2 = segs->next;
597                         segs->next = NULL;
598                         qdisc_skb_cb(segs)->pkt_len = segs->len;
599                         last_len = segs->len;
600                         rc = qdisc_enqueue(segs, sch, to_free);
601                         if (rc != NET_XMIT_SUCCESS) {
602                                 if (net_xmit_drop_count(rc))
603                                         qdisc_qstats_drop(sch);
604                         } else {
605                                 nb++;
606                                 len += last_len;
607                         }
608                         segs = skb2;
609                 }
610                 /* Parent qdiscs accounted for 1 skb of size @prev_len */
611                 qdisc_tree_reduce_backlog(sch, -(nb - 1), -(len - prev_len));
612         } else if (!skb) {
613                 return NET_XMIT_DROP;
614         }
615         return NET_XMIT_SUCCESS;
616 }
617
618 static struct sk_buff *netem_dequeue(struct Qdisc *sch)
619 {
620         struct netem_sched_data *q = qdisc_priv(sch);
621         struct sk_buff *skb;
622         struct rb_node *p;
623
624 tfifo_dequeue:
625         skb = __qdisc_dequeue_head(&sch->q);
626         if (skb) {
627                 qdisc_qstats_backlog_dec(sch, skb);
628 deliver:
629                 qdisc_bstats_update(sch, skb);
630                 return skb;
631         }
632         p = rb_first(&q->t_root);
633         if (p) {
634                 psched_time_t time_to_send;
635
636                 skb = netem_rb_to_skb(p);
637
638                 /* if more time remaining? */
639                 time_to_send = netem_skb_cb(skb)->time_to_send;
640                 if (time_to_send <= psched_get_time()) {
641                         rb_erase(p, &q->t_root);
642
643                         sch->q.qlen--;
644                         qdisc_qstats_backlog_dec(sch, skb);
645                         skb->next = NULL;
646                         skb->prev = NULL;
647                         skb->tstamp = netem_skb_cb(skb)->tstamp_save;
648
649 #ifdef CONFIG_NET_CLS_ACT
650                         /*
651                          * If it's at ingress let's pretend the delay is
652                          * from the network (tstamp will be updated).
653                          */
654                         if (G_TC_FROM(skb->tc_verd) & AT_INGRESS)
655                                 skb->tstamp.tv64 = 0;
656 #endif
657
658                         if (q->qdisc) {
659                                 unsigned int pkt_len = qdisc_pkt_len(skb);
660                                 struct sk_buff *to_free = NULL;
661                                 int err;
662
663                                 err = qdisc_enqueue(skb, q->qdisc, &to_free);
664                                 kfree_skb_list(to_free);
665                                 if (err != NET_XMIT_SUCCESS &&
666                                     net_xmit_drop_count(err)) {
667                                         qdisc_qstats_drop(sch);
668                                         qdisc_tree_reduce_backlog(sch, 1,
669                                                                   pkt_len);
670                                 }
671                                 goto tfifo_dequeue;
672                         }
673                         goto deliver;
674                 }
675
676                 if (q->qdisc) {
677                         skb = q->qdisc->ops->dequeue(q->qdisc);
678                         if (skb)
679                                 goto deliver;
680                 }
681                 qdisc_watchdog_schedule(&q->watchdog, time_to_send);
682         }
683
684         if (q->qdisc) {
685                 skb = q->qdisc->ops->dequeue(q->qdisc);
686                 if (skb)
687                         goto deliver;
688         }
689         return NULL;
690 }
691
692 static void netem_reset(struct Qdisc *sch)
693 {
694         struct netem_sched_data *q = qdisc_priv(sch);
695
696         qdisc_reset_queue(sch);
697         tfifo_reset(sch);
698         if (q->qdisc)
699                 qdisc_reset(q->qdisc);
700         qdisc_watchdog_cancel(&q->watchdog);
701 }
702
703 static void dist_free(struct disttable *d)
704 {
705         kvfree(d);
706 }
707
708 /*
709  * Distribution data is a variable size payload containing
710  * signed 16 bit values.
711  */
712 static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr)
713 {
714         struct netem_sched_data *q = qdisc_priv(sch);
715         size_t n = nla_len(attr)/sizeof(__s16);
716         const __s16 *data = nla_data(attr);
717         spinlock_t *root_lock;
718         struct disttable *d;
719         int i;
720         size_t s;
721
722         if (!n || n > NETEM_DIST_MAX)
723                 return -EINVAL;
724
725         s = sizeof(struct disttable) + n * sizeof(s16);
726         d = kmalloc(s, GFP_KERNEL | __GFP_NOWARN);
727         if (!d)
728                 d = vmalloc(s);
729         if (!d)
730                 return -ENOMEM;
731
732         d->size = n;
733         for (i = 0; i < n; i++)
734                 d->table[i] = data[i];
735
736         root_lock = qdisc_root_sleeping_lock(sch);
737
738         spin_lock_bh(root_lock);
739         swap(q->delay_dist, d);
740         spin_unlock_bh(root_lock);
741
742         dist_free(d);
743         return 0;
744 }
745
746 static void get_correlation(struct netem_sched_data *q, const struct nlattr *attr)
747 {
748         const struct tc_netem_corr *c = nla_data(attr);
749
750         init_crandom(&q->delay_cor, c->delay_corr);
751         init_crandom(&q->loss_cor, c->loss_corr);
752         init_crandom(&q->dup_cor, c->dup_corr);
753 }
754
755 static void get_reorder(struct netem_sched_data *q, const struct nlattr *attr)
756 {
757         const struct tc_netem_reorder *r = nla_data(attr);
758
759         q->reorder = r->probability;
760         init_crandom(&q->reorder_cor, r->correlation);
761 }
762
763 static void get_corrupt(struct netem_sched_data *q, const struct nlattr *attr)
764 {
765         const struct tc_netem_corrupt *r = nla_data(attr);
766
767         q->corrupt = r->probability;
768         init_crandom(&q->corrupt_cor, r->correlation);
769 }
770
771 static void get_rate(struct netem_sched_data *q, const struct nlattr *attr)
772 {
773         const struct tc_netem_rate *r = nla_data(attr);
774
775         q->rate = r->rate;
776         q->packet_overhead = r->packet_overhead;
777         q->cell_size = r->cell_size;
778         q->cell_overhead = r->cell_overhead;
779         if (q->cell_size)
780                 q->cell_size_reciprocal = reciprocal_value(q->cell_size);
781         else
782                 q->cell_size_reciprocal = (struct reciprocal_value) { 0 };
783 }
784
785 static int get_loss_clg(struct netem_sched_data *q, const struct nlattr *attr)
786 {
787         const struct nlattr *la;
788         int rem;
789
790         nla_for_each_nested(la, attr, rem) {
791                 u16 type = nla_type(la);
792
793                 switch (type) {
794                 case NETEM_LOSS_GI: {
795                         const struct tc_netem_gimodel *gi = nla_data(la);
796
797                         if (nla_len(la) < sizeof(struct tc_netem_gimodel)) {
798                                 pr_info("netem: incorrect gi model size\n");
799                                 return -EINVAL;
800                         }
801
802                         q->loss_model = CLG_4_STATES;
803
804                         q->clg.state = TX_IN_GAP_PERIOD;
805                         q->clg.a1 = gi->p13;
806                         q->clg.a2 = gi->p31;
807                         q->clg.a3 = gi->p32;
808                         q->clg.a4 = gi->p14;
809                         q->clg.a5 = gi->p23;
810                         break;
811                 }
812
813                 case NETEM_LOSS_GE: {
814                         const struct tc_netem_gemodel *ge = nla_data(la);
815
816                         if (nla_len(la) < sizeof(struct tc_netem_gemodel)) {
817                                 pr_info("netem: incorrect ge model size\n");
818                                 return -EINVAL;
819                         }
820
821                         q->loss_model = CLG_GILB_ELL;
822                         q->clg.state = GOOD_STATE;
823                         q->clg.a1 = ge->p;
824                         q->clg.a2 = ge->r;
825                         q->clg.a3 = ge->h;
826                         q->clg.a4 = ge->k1;
827                         break;
828                 }
829
830                 default:
831                         pr_info("netem: unknown loss type %u\n", type);
832                         return -EINVAL;
833                 }
834         }
835
836         return 0;
837 }
838
839 static const struct nla_policy netem_policy[TCA_NETEM_MAX + 1] = {
840         [TCA_NETEM_CORR]        = { .len = sizeof(struct tc_netem_corr) },
841         [TCA_NETEM_REORDER]     = { .len = sizeof(struct tc_netem_reorder) },
842         [TCA_NETEM_CORRUPT]     = { .len = sizeof(struct tc_netem_corrupt) },
843         [TCA_NETEM_RATE]        = { .len = sizeof(struct tc_netem_rate) },
844         [TCA_NETEM_LOSS]        = { .type = NLA_NESTED },
845         [TCA_NETEM_ECN]         = { .type = NLA_U32 },
846         [TCA_NETEM_RATE64]      = { .type = NLA_U64 },
847 };
848
849 static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
850                       const struct nla_policy *policy, int len)
851 {
852         int nested_len = nla_len(nla) - NLA_ALIGN(len);
853
854         if (nested_len < 0) {
855                 pr_info("netem: invalid attributes len %d\n", nested_len);
856                 return -EINVAL;
857         }
858
859         if (nested_len >= nla_attr_size(0))
860                 return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len),
861                                  nested_len, policy);
862
863         memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
864         return 0;
865 }
866
867 /* Parse netlink message to set options */
868 static int netem_change(struct Qdisc *sch, struct nlattr *opt)
869 {
870         struct netem_sched_data *q = qdisc_priv(sch);
871         struct nlattr *tb[TCA_NETEM_MAX + 1];
872         struct tc_netem_qopt *qopt;
873         struct clgstate old_clg;
874         int old_loss_model = CLG_RANDOM;
875         int ret;
876
877         if (opt == NULL)
878                 return -EINVAL;
879
880         qopt = nla_data(opt);
881         ret = parse_attr(tb, TCA_NETEM_MAX, opt, netem_policy, sizeof(*qopt));
882         if (ret < 0)
883                 return ret;
884
885         /* backup q->clg and q->loss_model */
886         old_clg = q->clg;
887         old_loss_model = q->loss_model;
888
889         if (tb[TCA_NETEM_LOSS]) {
890                 ret = get_loss_clg(q, tb[TCA_NETEM_LOSS]);
891                 if (ret) {
892                         q->loss_model = old_loss_model;
893                         return ret;
894                 }
895         } else {
896                 q->loss_model = CLG_RANDOM;
897         }
898
899         if (tb[TCA_NETEM_DELAY_DIST]) {
900                 ret = get_dist_table(sch, tb[TCA_NETEM_DELAY_DIST]);
901                 if (ret) {
902                         /* recover clg and loss_model, in case of
903                          * q->clg and q->loss_model were modified
904                          * in get_loss_clg()
905                          */
906                         q->clg = old_clg;
907                         q->loss_model = old_loss_model;
908                         return ret;
909                 }
910         }
911
912         sch->limit = qopt->limit;
913
914         q->latency = qopt->latency;
915         q->jitter = qopt->jitter;
916         q->limit = qopt->limit;
917         q->gap = qopt->gap;
918         q->counter = 0;
919         q->loss = qopt->loss;
920         q->duplicate = qopt->duplicate;
921
922         /* for compatibility with earlier versions.
923          * if gap is set, need to assume 100% probability
924          */
925         if (q->gap)
926                 q->reorder = ~0;
927
928         if (tb[TCA_NETEM_CORR])
929                 get_correlation(q, tb[TCA_NETEM_CORR]);
930
931         if (tb[TCA_NETEM_REORDER])
932                 get_reorder(q, tb[TCA_NETEM_REORDER]);
933
934         if (tb[TCA_NETEM_CORRUPT])
935                 get_corrupt(q, tb[TCA_NETEM_CORRUPT]);
936
937         if (tb[TCA_NETEM_RATE])
938                 get_rate(q, tb[TCA_NETEM_RATE]);
939
940         if (tb[TCA_NETEM_RATE64])
941                 q->rate = max_t(u64, q->rate,
942                                 nla_get_u64(tb[TCA_NETEM_RATE64]));
943
944         if (tb[TCA_NETEM_ECN])
945                 q->ecn = nla_get_u32(tb[TCA_NETEM_ECN]);
946
947         return ret;
948 }
949
950 static int netem_init(struct Qdisc *sch, struct nlattr *opt)
951 {
952         struct netem_sched_data *q = qdisc_priv(sch);
953         int ret;
954
955         qdisc_watchdog_init(&q->watchdog, sch);
956
957         if (!opt)
958                 return -EINVAL;
959
960         q->loss_model = CLG_RANDOM;
961         ret = netem_change(sch, opt);
962         if (ret)
963                 pr_info("netem: change failed\n");
964         return ret;
965 }
966
967 static void netem_destroy(struct Qdisc *sch)
968 {
969         struct netem_sched_data *q = qdisc_priv(sch);
970
971         qdisc_watchdog_cancel(&q->watchdog);
972         if (q->qdisc)
973                 qdisc_destroy(q->qdisc);
974         dist_free(q->delay_dist);
975 }
976
977 static int dump_loss_model(const struct netem_sched_data *q,
978                            struct sk_buff *skb)
979 {
980         struct nlattr *nest;
981
982         nest = nla_nest_start(skb, TCA_NETEM_LOSS);
983         if (nest == NULL)
984                 goto nla_put_failure;
985
986         switch (q->loss_model) {
987         case CLG_RANDOM:
988                 /* legacy loss model */
989                 nla_nest_cancel(skb, nest);
990                 return 0;       /* no data */
991
992         case CLG_4_STATES: {
993                 struct tc_netem_gimodel gi = {
994                         .p13 = q->clg.a1,
995                         .p31 = q->clg.a2,
996                         .p32 = q->clg.a3,
997                         .p14 = q->clg.a4,
998                         .p23 = q->clg.a5,
999                 };
1000
1001                 if (nla_put(skb, NETEM_LOSS_GI, sizeof(gi), &gi))
1002                         goto nla_put_failure;
1003                 break;
1004         }
1005         case CLG_GILB_ELL: {
1006                 struct tc_netem_gemodel ge = {
1007                         .p = q->clg.a1,
1008                         .r = q->clg.a2,
1009                         .h = q->clg.a3,
1010                         .k1 = q->clg.a4,
1011                 };
1012
1013                 if (nla_put(skb, NETEM_LOSS_GE, sizeof(ge), &ge))
1014                         goto nla_put_failure;
1015                 break;
1016         }
1017         }
1018
1019         nla_nest_end(skb, nest);
1020         return 0;
1021
1022 nla_put_failure:
1023         nla_nest_cancel(skb, nest);
1024         return -1;
1025 }
1026
1027 static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
1028 {
1029         const struct netem_sched_data *q = qdisc_priv(sch);
1030         struct nlattr *nla = (struct nlattr *) skb_tail_pointer(skb);
1031         struct tc_netem_qopt qopt;
1032         struct tc_netem_corr cor;
1033         struct tc_netem_reorder reorder;
1034         struct tc_netem_corrupt corrupt;
1035         struct tc_netem_rate rate;
1036
1037         qopt.latency = q->latency;
1038         qopt.jitter = q->jitter;
1039         qopt.limit = q->limit;
1040         qopt.loss = q->loss;
1041         qopt.gap = q->gap;
1042         qopt.duplicate = q->duplicate;
1043         if (nla_put(skb, TCA_OPTIONS, sizeof(qopt), &qopt))
1044                 goto nla_put_failure;
1045
1046         cor.delay_corr = q->delay_cor.rho;
1047         cor.loss_corr = q->loss_cor.rho;
1048         cor.dup_corr = q->dup_cor.rho;
1049         if (nla_put(skb, TCA_NETEM_CORR, sizeof(cor), &cor))
1050                 goto nla_put_failure;
1051
1052         reorder.probability = q->reorder;
1053         reorder.correlation = q->reorder_cor.rho;
1054         if (nla_put(skb, TCA_NETEM_REORDER, sizeof(reorder), &reorder))
1055                 goto nla_put_failure;
1056
1057         corrupt.probability = q->corrupt;
1058         corrupt.correlation = q->corrupt_cor.rho;
1059         if (nla_put(skb, TCA_NETEM_CORRUPT, sizeof(corrupt), &corrupt))
1060                 goto nla_put_failure;
1061
1062         if (q->rate >= (1ULL << 32)) {
1063                 if (nla_put_u64_64bit(skb, TCA_NETEM_RATE64, q->rate,
1064                                       TCA_NETEM_PAD))
1065                         goto nla_put_failure;
1066                 rate.rate = ~0U;
1067         } else {
1068                 rate.rate = q->rate;
1069         }
1070         rate.packet_overhead = q->packet_overhead;
1071         rate.cell_size = q->cell_size;
1072         rate.cell_overhead = q->cell_overhead;
1073         if (nla_put(skb, TCA_NETEM_RATE, sizeof(rate), &rate))
1074                 goto nla_put_failure;
1075
1076         if (q->ecn && nla_put_u32(skb, TCA_NETEM_ECN, q->ecn))
1077                 goto nla_put_failure;
1078
1079         if (dump_loss_model(q, skb) != 0)
1080                 goto nla_put_failure;
1081
1082         return nla_nest_end(skb, nla);
1083
1084 nla_put_failure:
1085         nlmsg_trim(skb, nla);
1086         return -1;
1087 }
1088
1089 static int netem_dump_class(struct Qdisc *sch, unsigned long cl,
1090                           struct sk_buff *skb, struct tcmsg *tcm)
1091 {
1092         struct netem_sched_data *q = qdisc_priv(sch);
1093
1094         if (cl != 1 || !q->qdisc)       /* only one class */
1095                 return -ENOENT;
1096
1097         tcm->tcm_handle |= TC_H_MIN(1);
1098         tcm->tcm_info = q->qdisc->handle;
1099
1100         return 0;
1101 }
1102
1103 static int netem_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
1104                      struct Qdisc **old)
1105 {
1106         struct netem_sched_data *q = qdisc_priv(sch);
1107
1108         *old = qdisc_replace(sch, new, &q->qdisc);
1109         return 0;
1110 }
1111
1112 static struct Qdisc *netem_leaf(struct Qdisc *sch, unsigned long arg)
1113 {
1114         struct netem_sched_data *q = qdisc_priv(sch);
1115         return q->qdisc;
1116 }
1117
1118 static unsigned long netem_get(struct Qdisc *sch, u32 classid)
1119 {
1120         return 1;
1121 }
1122
1123 static void netem_put(struct Qdisc *sch, unsigned long arg)
1124 {
1125 }
1126
1127 static void netem_walk(struct Qdisc *sch, struct qdisc_walker *walker)
1128 {
1129         if (!walker->stop) {
1130                 if (walker->count >= walker->skip)
1131                         if (walker->fn(sch, 1, walker) < 0) {
1132                                 walker->stop = 1;
1133                                 return;
1134                         }
1135                 walker->count++;
1136         }
1137 }
1138
1139 static const struct Qdisc_class_ops netem_class_ops = {
1140         .graft          =       netem_graft,
1141         .leaf           =       netem_leaf,
1142         .get            =       netem_get,
1143         .put            =       netem_put,
1144         .walk           =       netem_walk,
1145         .dump           =       netem_dump_class,
1146 };
1147
1148 static struct Qdisc_ops netem_qdisc_ops __read_mostly = {
1149         .id             =       "netem",
1150         .cl_ops         =       &netem_class_ops,
1151         .priv_size      =       sizeof(struct netem_sched_data),
1152         .enqueue        =       netem_enqueue,
1153         .dequeue        =       netem_dequeue,
1154         .peek           =       qdisc_peek_dequeued,
1155         .init           =       netem_init,
1156         .reset          =       netem_reset,
1157         .destroy        =       netem_destroy,
1158         .change         =       netem_change,
1159         .dump           =       netem_dump,
1160         .owner          =       THIS_MODULE,
1161 };
1162
1163
1164 static int __init netem_module_init(void)
1165 {
1166         pr_info("netem: version " VERSION "\n");
1167         return register_qdisc(&netem_qdisc_ops);
1168 }
1169 static void __exit netem_module_exit(void)
1170 {
1171         unregister_qdisc(&netem_qdisc_ops);
1172 }
1173 module_init(netem_module_init)
1174 module_exit(netem_module_exit)
1175 MODULE_LICENSE("GPL");