Lines Matching refs:netem
2 * lib/route/sch/netem.c Network Emulator Qdisc
14 * @defgroup netem Network Emulator
17 * For further documentation see http://linux-net.osdl.org/index.php/Netem
27 #include <netlink/route/sch/netem.h>
68 struct rtnl_netem *netem;
74 netem = netem_alloc(qdisc);
75 if (!netem)
79 netem->qnm_latency = opts->latency;
80 netem->qnm_limit = opts->limit;
81 netem->qnm_loss = opts->loss;
82 netem->qnm_gap = opts->gap;
83 netem->qnm_duplicate = opts->duplicate;
84 netem->qnm_jitter = opts->jitter;
86 netem->qnm_mask = (SCH_NETEM_ATTR_LATENCY | SCH_NETEM_ATTR_LIMIT |
99 free(netem);
107 netem->qnm_corr.nmc_delay = cor.delay_corr;
108 netem->qnm_corr.nmc_loss = cor.loss_corr;
109 netem->qnm_corr.nmc_duplicate = cor.dup_corr;
111 netem->qnm_mask |= (SCH_NETEM_ATTR_DELAY_CORR |
120 netem->qnm_ro.nmro_probability = ro.probability;
121 netem->qnm_ro.nmro_correlation = ro.correlation;
123 netem->qnm_mask |= (SCH_NETEM_ATTR_RO_PROB |
131 netem->qnm_crpt.nmcr_probability = corrupt.probability;
132 netem->qnm_crpt.nmcr_correlation = corrupt.correlation;
134 netem->qnm_mask |= (SCH_NETEM_ATTR_CORRUPT_PROB |
139 netem->qnm_dist.dist_data = NULL;
140 netem->qnm_dist.dist_size = 0;
148 struct rtnl_netem *netem;
152 netem = netem_qdisc(qdisc);
153 if ( ! netem ) return;
155 if ( netem->qnm_dist.dist_data )
156 free(netem->qnm_dist.dist_data);
158 netem = NULL;
165 struct rtnl_netem *netem = netem_qdisc(qdisc);
167 if (netem)
168 nl_dump(p, "limit %d", netem->qnm_limit);
178 struct rtnl_netem *netem;
188 netem = netem_qdisc(qdisc);
189 if (!netem || !msg)
194 if ( netem->qnm_ro.nmro_probability != 0 ) {
195 if (netem->qnm_latency == 0) {
198 if (netem->qnm_gap == 0) netem->qnm_gap = 1;
200 else if ( netem->qnm_gap ) {
204 if ( netem->qnm_corr.nmc_delay != 0 ) {
205 if ( netem->qnm_latency == 0 || netem->qnm_jitter == 0) {
211 if ( netem->qnm_corr.nmc_loss != 0 ) {
212 if ( netem->qnm_loss == 0 ) {
218 if ( netem->qnm_corr.nmc_duplicate != 0 ) {
219 if ( netem->qnm_duplicate == 0 ) {
225 if ( netem->qnm_ro.nmro_probability != 0 ) set_reorder = 1;
226 else if ( netem->qnm_ro.nmro_correlation != 0 ) {
230 if ( netem->qnm_crpt.nmcr_probability != 0 ) set_corrupt = 1;
231 else if ( netem->qnm_crpt.nmcr_correlation != 0 ) {
235 if ( netem->qnm_dist.dist_data && netem->qnm_dist.dist_size ) {
236 if (netem->qnm_latency == 0 || netem->qnm_jitter == 0) {
241 int new_msg_len = msg->nm_size + netem->qnm_dist.dist_size *
242 sizeof(netem->qnm_dist.dist_data[0]);
252 opts.latency = netem->qnm_latency;
253 opts.limit = netem->qnm_limit ? netem->qnm_limit : 1000;
254 opts.loss = netem->qnm_loss;
255 opts.gap = netem->qnm_gap;
256 opts.duplicate = netem->qnm_duplicate;
257 opts.jitter = netem->qnm_jitter;
262 cor.delay_corr = netem->qnm_corr.nmc_delay;
263 cor.loss_corr = netem->qnm_corr.nmc_loss;
264 cor.dup_corr = netem->qnm_corr.nmc_duplicate;
270 reorder.probability = netem->qnm_ro.nmro_probability;
271 reorder.correlation = netem->qnm_ro.nmro_correlation;
277 corrupt.probability = netem->qnm_crpt.nmcr_probability;
278 corrupt.correlation = netem->qnm_crpt.nmcr_correlation;
285 netem->qnm_dist.dist_size * sizeof(netem->qnm_dist.dist_data[0]),
286 netem->qnm_dist.dist_data);
314 * Set limit of netem qdisc.
315 * @arg qdisc Netem qdisc to be modified.
321 struct rtnl_netem *netem;
323 netem = netem_alloc(qdisc);
324 if (!netem)
327 netem->qnm_limit = limit;
328 netem->qnm_mask |= SCH_NETEM_ATTR_LIMIT;
334 * Get limit of netem qdisc.
335 * @arg qdisc Netem qdisc.
340 struct rtnl_netem *netem;
342 netem = netem_qdisc(qdisc);
343 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_LIMIT))
344 return netem->qnm_limit;
357 * Set re-ordering gap of netem qdisc.
358 * @arg qdisc Netem qdisc to be modified.
364 struct rtnl_netem *netem;
366 netem = netem_alloc(qdisc);
367 if (!netem)
370 netem->qnm_gap = gap;
371 netem->qnm_mask |= SCH_NETEM_ATTR_GAP;
377 * Get re-ordering gap of netem qdisc.
378 * @arg qdisc Netem qdisc.
383 struct rtnl_netem *netem;
385 netem = netem_qdisc(qdisc);
386 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_GAP))
387 return netem->qnm_gap;
393 * Set re-ordering probability of netem qdisc.
394 * @arg qdisc Netem qdisc to be modified.
400 struct rtnl_netem *netem;
402 netem = netem_alloc(qdisc);
403 if (!netem)
406 netem->qnm_ro.nmro_probability = prob;
407 netem->qnm_mask |= SCH_NETEM_ATTR_RO_PROB;
413 * Get re-ordering probability of netem qdisc.
414 * @arg qdisc Netem qdisc.
419 struct rtnl_netem *netem;
421 netem = netem_qdisc(qdisc);
422 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_RO_PROB))
423 return netem->qnm_ro.nmro_probability;
429 * Set re-order correlation probability of netem qdisc.
430 * @arg qdisc Netem qdisc to be modified.
436 struct rtnl_netem *netem;
438 netem = netem_alloc(qdisc);
439 if (!netem)
442 netem->qnm_ro.nmro_correlation = prob;
443 netem->qnm_mask |= SCH_NETEM_ATTR_RO_CORR;
449 * Get re-ordering correlation probability of netem qdisc.
450 * @arg qdisc Netem qdisc.
455 struct rtnl_netem *netem;
457 netem = netem_qdisc(qdisc);
458 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_RO_CORR))
459 return netem->qnm_ro.nmro_correlation;
472 * Set corruption probability of netem qdisc.
473 * @arg qdisc Netem qdisc to be modified.
479 struct rtnl_netem *netem;
481 netem = netem_alloc(qdisc);
482 if (!netem)
485 netem->qnm_crpt.nmcr_probability = prob;
486 netem->qnm_mask |= SCH_NETEM_ATTR_CORRUPT_PROB;
492 * Get corruption probability of netem qdisc.
493 * @arg qdisc Netem qdisc.
498 struct rtnl_netem *netem;
500 netem = netem_qdisc(qdisc);
501 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_CORRUPT_PROB))
502 return netem->qnm_crpt.nmcr_probability;
508 * Set corruption correlation probability of netem qdisc.
509 * @arg qdisc Netem qdisc to be modified.
515 struct rtnl_netem *netem;
517 netem = netem_alloc(qdisc);
518 if (!netem)
521 netem->qnm_crpt.nmcr_correlation = prob;
522 netem->qnm_mask |= SCH_NETEM_ATTR_CORRUPT_CORR;
528 * Get corruption correlation probability of netem qdisc.
529 * @arg qdisc Netem qdisc.
534 struct rtnl_netem *netem;
536 netem = netem_qdisc(qdisc);
537 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_CORRUPT_CORR))
538 return netem->qnm_crpt.nmcr_correlation;
551 * Set packet loss probability of netem qdisc.
552 * @arg qdisc Netem qdisc to be modified.
558 struct rtnl_netem *netem;
560 netem = netem_alloc(qdisc);
561 if (!netem)
564 netem->qnm_loss = prob;
565 netem->qnm_mask |= SCH_NETEM_ATTR_LOSS;
571 * Get packet loss probability of netem qdisc.
572 * @arg qdisc Netem qdisc.
577 struct rtnl_netem *netem;
579 netem = netem_qdisc(qdisc);
580 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_LOSS))
581 return netem->qnm_loss;
587 * Set packet loss correlation probability of netem qdisc.
588 * @arg qdisc Netem qdisc to be modified.
594 struct rtnl_netem *netem;
596 netem = netem_alloc(qdisc);
597 if (!netem)
600 netem->qnm_corr.nmc_loss = prob;
601 netem->qnm_mask |= SCH_NETEM_ATTR_LOSS_CORR;
607 * Get packet loss correlation probability of netem qdisc.
608 * @arg qdisc Netem qdisc.
613 struct rtnl_netem *netem;
615 netem = netem_qdisc(qdisc);
616 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_LOSS_CORR))
617 return netem->qnm_corr.nmc_loss;
630 * Set packet duplication probability of netem qdisc.
631 * @arg qdisc Netem qdisc to be modified.
637 struct rtnl_netem *netem;
639 netem = netem_alloc(qdisc);
640 if (!netem)
643 netem->qnm_duplicate = prob;
644 netem->qnm_mask |= SCH_NETEM_ATTR_DUPLICATE;
650 * Get packet duplication probability of netem qdisc.
651 * @arg qdisc Netem qdisc.
656 struct rtnl_netem *netem;
658 netem = netem_qdisc(qdisc);
659 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_DUPLICATE))
660 return netem->qnm_duplicate;
666 * Set packet duplication correlation probability of netem qdisc.
667 * @arg qdisc Netem qdisc to be modified.
673 struct rtnl_netem *netem;
675 netem = netem_alloc(qdisc);
676 if (!netem)
679 netem->qnm_corr.nmc_duplicate = prob;
680 netem->qnm_mask |= SCH_NETEM_ATTR_DUP_CORR;
686 * Get packet duplication correlation probability of netem qdisc.
687 * @arg qdisc Netem qdisc.
692 struct rtnl_netem *netem;
694 netem = netem_qdisc(qdisc);
695 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_DUP_CORR))
696 return netem->qnm_corr.nmc_duplicate;
709 * Set packet delay of netem qdisc.
710 * @arg qdisc Netem qdisc to be modified.
716 struct rtnl_netem *netem;
718 netem = netem_alloc(qdisc);
719 if (!netem)
722 netem->qnm_latency = nl_us2ticks(delay);
723 netem->qnm_mask |= SCH_NETEM_ATTR_LATENCY;
729 * Get packet delay of netem qdisc.
730 * @arg qdisc Netem qdisc.
735 struct rtnl_netem *netem;
737 netem = netem_qdisc(qdisc);
738 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_LATENCY))
739 return nl_ticks2us(netem->qnm_latency);
745 * Set packet delay jitter of netem qdisc.
746 * @arg qdisc Netem qdisc to be modified.
752 struct rtnl_netem *netem;
754 netem = netem_alloc(qdisc);
755 if (!netem)
758 netem->qnm_jitter = nl_us2ticks(jitter);
759 netem->qnm_mask |= SCH_NETEM_ATTR_JITTER;
765 * Get packet delay jitter of netem qdisc.
766 * @arg qdisc Netem qdisc.
771 struct rtnl_netem *netem;
773 netem = netem_qdisc(qdisc);
774 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_JITTER))
775 return nl_ticks2us(netem->qnm_jitter);
781 * Set packet delay correlation probability of netem qdisc.
782 * @arg qdisc Netem qdisc to be modified.
787 struct rtnl_netem *netem;
789 netem = netem_alloc(qdisc);
790 if (!netem)
793 netem->qnm_corr.nmc_delay = prob;
794 netem->qnm_mask |= SCH_NETEM_ATTR_DELAY_CORR;
800 * Get packet delay correlation probability of netem qdisc.
801 * @arg qdisc Netem qdisc.
806 struct rtnl_netem *netem;
808 netem = netem_qdisc(qdisc);
809 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_DELAY_CORR))
810 return netem->qnm_corr.nmc_delay;
817 * @arg qdisc Netem qdisc.
822 struct rtnl_netem *netem;
824 netem = netem_qdisc(qdisc);
825 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_DIST))
826 return netem->qnm_dist.dist_size;
833 * @arg qdisc Netem qdisc.
839 struct rtnl_netem *netem;
841 netem = netem_qdisc(qdisc);
842 if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_DIST)) {
843 *dist_ptr = netem->qnm_dist.dist_data;
852 * @arg qdisc Netem qdisc.
857 struct rtnl_netem *netem;
859 netem = netem_alloc(qdisc);
860 if (!netem)
886 netem->qnm_dist.dist_data = (int16_t *) calloc (MAXDIST, sizeof(int16_t));
905 netem->qnm_dist.dist_data[n++] = x;
911 netem->qnm_dist.dist_size = n;
912 netem->qnm_mask |= SCH_NETEM_ATTR_DIST;
921 .qo_kind = "netem",