コード例 #1
0
ファイル: netem.c プロジェクト: michael-dev/libnl
static void netem_dump_details(struct rtnl_tc *tc, void *data,
                               struct nl_dump_params *p)
{
	struct rtnl_netem *netem = data;
	char buf[32];

	if (netem) {
		if (netem->qnm_mask & SCH_NETEM_ATTR_LATENCY && netem->qnm_latency > 0) {
			nl_msec2str(nl_ticks2us(netem->qnm_latency) / 1000, buf, sizeof(buf));
			nl_dump(p, " latency %s", buf);

			if (netem->qnm_mask & SCH_NETEM_ATTR_JITTER && netem->qnm_jitter > 0) {
				nl_msec2str(nl_ticks2us(netem->qnm_jitter) / 1000, buf, sizeof(buf));
				nl_dump(p, " jitter %s", buf);

				if (netem->qnm_mask & SCH_NETEM_ATTR_DELAY_CORR && netem->qnm_corr.nmc_delay > 0)
					nl_dump(p, " %d%", netem->qnm_corr.nmc_delay);
			}
		}

		if (netem->qnm_mask & SCH_NETEM_ATTR_LOSS && netem->qnm_loss > 0) {
			nl_dump(p, " loss %d%", netem->qnm_loss);

			if (netem->qnm_mask & SCH_NETEM_ATTR_LOSS_CORR && netem->qnm_corr.nmc_loss > 0)
				nl_dump(p, " %d%", netem->qnm_corr.nmc_loss);
		}

		if (netem->qnm_mask & SCH_NETEM_ATTR_DUPLICATE && netem->qnm_duplicate > 0) {
			nl_dump(p, " duplicate %d%", netem->qnm_duplicate);

			if (netem->qnm_mask & SCH_NETEM_ATTR_DUP_CORR && netem->qnm_corr.nmc_duplicate > 0)
				nl_dump(p, " %d%", netem->qnm_corr.nmc_duplicate);
		}

		if (netem->qnm_mask & SCH_NETEM_ATTR_RO_PROB && netem->qnm_ro.nmro_probability > 0) {
			nl_dump(p, " reorder %d%", netem->qnm_ro.nmro_probability);

			if (netem->qnm_mask & SCH_NETEM_ATTR_RO_CORR && netem->qnm_ro.nmro_correlation > 0)
				nl_dump(p, " %d%", netem->qnm_ro.nmro_correlation);

			if (netem->qnm_mask & SCH_NETEM_ATTR_GAP && netem->qnm_gap > 0)
				nl_dump(p, " gap %d", netem->qnm_gap);
		}

		if (netem->qnm_mask & SCH_NETEM_ATTR_CORRUPT_PROB && netem->qnm_crpt.nmcr_probability > 0) {
			nl_dump(p, " reorder %d%", netem->qnm_crpt.nmcr_probability);

			if (netem->qnm_mask & SCH_NETEM_ATTR_CORRUPT_CORR && netem->qnm_crpt.nmcr_correlation > 0)
				nl_dump(p, " %d%", netem->qnm_crpt.nmcr_correlation);
		}
	}
}
コード例 #2
0
ファイル: netem.c プロジェクト: DELUXx/android-wpasupplicant
/**
 * Get packet delay jitter of netem qdisc.
 * @arg qdisc		Netem qdisc.
 * @return Packet delay jitter in micro seconds or a negative error code.
 */
int rtnl_netem_get_jitter(struct rtnl_qdisc *qdisc)
{
	struct rtnl_netem *netem;

	netem = netem_qdisc(qdisc);
	if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_JITTER))
		return nl_ticks2us(netem->qnm_jitter);
	else
		return -NLE_NOATTR;
}
コード例 #3
0
ファイル: netem.c プロジェクト: DELUXx/android-wpasupplicant
/**
 * Get packet delay of netem qdisc.
 * @arg qdisc		Netem qdisc.
 * @return Packet delay in micro seconds or a negative error code.
 */
int rtnl_netem_get_delay(struct rtnl_qdisc *qdisc)
{
	struct rtnl_netem *netem;

	netem = netem_qdisc(qdisc);
	if (netem && (netem->qnm_mask & SCH_NETEM_ATTR_LATENCY))
		return nl_ticks2us(netem->qnm_latency);
	else
		return -NLE_NOATTR;
}
コード例 #4
0
static int sfq_dump_brief(struct rtnl_qdisc *qdisc, struct nl_dump_params *p,
			  int line)
{
	struct rtnl_sfq *sfq = sfq_qdisc(qdisc);

	if (sfq)
		dp_dump(p, " quantum %u perturb %us",
			sfq->qs_quantum,
			nl_ticks2us(sfq->qs_perturb * nl_get_hz()));

	return line;
}
コード例 #5
0
ファイル: netem.c プロジェクト: Alenevod/libnl
/**
 * Get packet delay jitter of netem qdisc.
 * @arg qdisc		Netem qdisc.
 * @return Packet delay jitter in micro seconds or a negative error code.
 */
int rtnl_netem_get_jitter(struct rtnl_qdisc *qdisc)
{
	struct rtnl_netem *netem;

	if (!(netem = rtnl_tc_data(TC_CAST(qdisc))))
		BUG();

	if (netem->qnm_mask & SCH_NETEM_ATTR_JITTER)
		return nl_ticks2us(netem->qnm_jitter);
	else
		return -NLE_NOATTR;
}
コード例 #6
0
ファイル: netem.c プロジェクト: Alenevod/libnl
/**
 * Get packet delay of netem qdisc.
 * @arg qdisc		Netem qdisc.
 * @return Packet delay in micro seconds or a negative error code.
 */
int rtnl_netem_get_delay(struct rtnl_qdisc *qdisc)
{
	struct rtnl_netem *netem;

	if (!(netem = rtnl_tc_data(TC_CAST(qdisc))))
		BUG();

	if (netem->qnm_mask & SCH_NETEM_ATTR_LATENCY)
		return nl_ticks2us(netem->qnm_latency);
	else
		return -NLE_NOATTR;
}
コード例 #7
0
ファイル: tbf.c プロジェクト: ShubhamShah/batphone
static int tbf_msg_parser(struct rtnl_qdisc *q)
{
    int err;
    struct nlattr *tb[TCA_TBF_MAX + 1];
    struct rtnl_tbf *tbf;

    err = tca_parse(tb, TCA_TBF_MAX, (struct rtnl_tca *) q, tbf_policy);
    if (err < 0)
        return err;

    tbf = tbf_qdisc(q);
    if (!tbf)
        return nl_errno(ENOMEM);

    if (tb[TCA_TBF_PARMS]) {
        struct tc_tbf_qopt opts;
        int bufsize;

        nla_memcpy(&opts, tb[TCA_TBF_PARMS], sizeof(opts));
        tbf->qt_limit = opts.limit;
        tbf->qt_mpu = opts.rate.mpu;

        rtnl_copy_ratespec(&tbf->qt_rate, &opts.rate);
        tbf->qt_rate_txtime = opts.buffer;
        bufsize = rtnl_tc_calc_bufsize(nl_ticks2us(opts.buffer),
                                       opts.rate.rate);
        tbf->qt_rate_bucket = bufsize;

        rtnl_copy_ratespec(&tbf->qt_peakrate, &opts.peakrate);
        tbf->qt_peakrate_txtime = opts.mtu;
        bufsize = rtnl_tc_calc_bufsize(nl_ticks2us(opts.mtu),
                                       opts.peakrate.rate);
        tbf->qt_peakrate_bucket = bufsize;

        tbf->qt_mask = (TBF_ATTR_LIMIT | TBF_ATTR_MPU | TBF_ATTR_RATE |
                        TBF_ATTR_PEAKRATE);
    }

    return 0;
}
コード例 #8
0
ファイル: tbf.c プロジェクト: BorodaZizitopa/libnl
static int tbf_msg_parser(struct rtnl_tc *tc, void *data)
{
	struct nlattr *tb[TCA_TBF_MAX + 1];
	struct rtnl_tbf *tbf = data;
	int err;

	if ((err = tca_parse(tb, TCA_TBF_MAX, tc, tbf_policy)) < 0)
		return err;
	
	if (tb[TCA_TBF_PARMS]) {
		struct tc_tbf_qopt opts;
		int bufsize;

		nla_memcpy(&opts, tb[TCA_TBF_PARMS], sizeof(opts));
		tbf->qt_limit = opts.limit;
	
		rtnl_copy_ratespec(&tbf->qt_rate, &opts.rate);
		tbf->qt_rate_txtime = opts.buffer;
		bufsize = rtnl_tc_calc_bufsize(nl_ticks2us(opts.buffer),
					       opts.rate.rate);
		tbf->qt_rate_bucket = bufsize;

		rtnl_copy_ratespec(&tbf->qt_peakrate, &opts.peakrate);
		tbf->qt_peakrate_txtime = opts.mtu;
		bufsize = rtnl_tc_calc_bufsize(nl_ticks2us(opts.mtu),
					       opts.peakrate.rate);
		tbf->qt_peakrate_bucket = bufsize;

		rtnl_tc_set_mpu(tc, tbf->qt_rate.rs_mpu);
		rtnl_tc_set_overhead(tc, tbf->qt_rate.rs_overhead);

		tbf->qt_mask = (TBF_ATTR_LIMIT | TBF_ATTR_RATE | TBF_ATTR_PEAKRATE);
	}

	return 0;
}
コード例 #9
0
ファイル: cbq.c プロジェクト: ebichu/dd-wrt
static void cbq_dump_full(struct nl_cache *c, struct rtnl_tca *g, FILE *fd)
{
	double w;
	char *unit, ovl[32], split[32], p[32];
	uint32_t el;
	struct rtnl_cbq *q = (struct rtnl_cbq *) g->tc_subdata;

	if (NULL == q)
		return;

	w = nl_sumup_bit((8 * q->cbq_wrr.weight), &unit);

	fprintf(fd, "avgpkt %u mpu %u cell %u allot %u weight %.0f%s\n",
		q->cbq_lss.avpkt,
		q->cbq_rate.mpu,
		1 << q->cbq_rate.cell_log,
		q->cbq_wrr.allot, w, unit);

	el = q->cbq_lss.ewma_log;

	fprintf(fd, "%s    minidle %uus maxidle %uus offtime %uus level %u " \
		"ewma_log %u\n", nl_get_dump_prefix(),
		nl_ticks2us(q->cbq_lss.minidle >> el),
		nl_ticks2us(q->cbq_lss.maxidle >> el),
		nl_ticks2us(q->cbq_lss.offtime >> el),
		q->cbq_lss.level,
		q->cbq_lss.ewma_log);

	nl_handle2str_r(q->cbq_fopt.split, split, sizeof(split));

	fprintf(fd, "%s    penalty %uus strategy %s split %s defmap 0x%08x " \
		"police %s", nl_get_dump_prefix(),
		nl_ticks2us(q->cbq_ovl.penalty),
		nl_ovl_strategy2str_r(q->cbq_ovl.strategy, ovl, sizeof(ovl)),
		split, q->cbq_fopt.defmap,
		nl_police2str_r(q->cbq_police.police, p, sizeof(p)));
}