summaryrefslogtreecommitdiffstats
path: root/lib/route/sch/tbf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/route/sch/tbf.c')
-rw-r--r--lib/route/sch/tbf.c65
1 files changed, 32 insertions, 33 deletions
diff --git a/lib/route/sch/tbf.c b/lib/route/sch/tbf.c
index 04d1689..eccaf70 100644
--- a/lib/route/sch/tbf.c
+++ b/lib/route/sch/tbf.c
@@ -6,7 +6,7 @@
* License as published by the Free Software Foundation version 2.1
* of the License.
*
- * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
+ * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
*/
/**
@@ -62,9 +62,9 @@ static int tbf_msg_parser(struct rtnl_qdisc *q)
if (err < 0)
return err;
- tbf = tbf_qdisc(q);
+ tbf = tbf_alloc(q);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
if (tb[TCA_TBF_PARMS]) {
struct tc_tbf_qopt opts;
@@ -93,34 +93,34 @@ static int tbf_msg_parser(struct rtnl_qdisc *q)
return 0;
}
-static int tbf_dump_brief(struct rtnl_qdisc *qdisc, struct nl_dump_params *p,
- int line)
+static void tbf_free_data(struct rtnl_qdisc *qdisc)
+{
+ free(qdisc->q_subdata);
+}
+
+static void tbf_dump_line(struct rtnl_qdisc *qdisc, struct nl_dump_params *p)
{
double r, rbit, lim;
char *ru, *rubit, *limu;
struct rtnl_tbf *tbf = tbf_qdisc(qdisc);
if (!tbf)
- goto ignore;
+ return;
r = nl_cancel_down_bytes(tbf->qt_rate.rs_rate, &ru);
rbit = nl_cancel_down_bits(tbf->qt_rate.rs_rate*8, &rubit);
lim = nl_cancel_down_bytes(tbf->qt_limit, &limu);
- dp_dump(p, " rate %.2f%s/s (%.0f%s) limit %.2f%s",
+ nl_dump(p, " rate %.2f%s/s (%.0f%s) limit %.2f%s",
r, ru, rbit, rubit, lim, limu);
-
-ignore:
- return line;
}
-static int tbf_dump_full(struct rtnl_qdisc *qdisc, struct nl_dump_params *p,
- int line)
+static void tbf_dump_details(struct rtnl_qdisc *qdisc, struct nl_dump_params *p)
{
struct rtnl_tbf *tbf = tbf_qdisc(qdisc);
if (!tbf)
- goto ignore;
+ return;
if (1) {
char *bu, *cu;
@@ -128,7 +128,7 @@ static int tbf_dump_full(struct rtnl_qdisc *qdisc, struct nl_dump_params *p,
double cl = nl_cancel_down_bytes(1 << tbf->qt_rate.rs_cell_log,
&cu);
- dp_dump(p, "mpu %u rate-bucket-size %1.f%s "
+ nl_dump(p, "mpu %u rate-bucket-size %1.f%s "
"rate-cell-size %.1f%s\n",
tbf->qt_mpu, bs, bu, cl, cu);
@@ -144,14 +144,11 @@ static int tbf_dump_full(struct rtnl_qdisc *qdisc, struct nl_dump_params *p,
cl = nl_cancel_down_bits(1 << tbf->qt_peakrate.rs_cell_log,
&clu);
- dp_dump_line(p, line++, " peak-rate %.2f%s/s (%.0f%s) "
- "bucket-size %.1f%s cell-size %.1f%s",
- "latency %.1f%s",
+ nl_dump_line(p, " peak-rate %.2f%s/s (%.0f%s) "
+ "bucket-size %.1f%s cell-size %.1f%s"
+ "latency %.1f%s",
pr, pru, prb, prbu, bs, bsu, cl, clu);
}
-
-ignore:
- return line;
}
static struct nl_msg *tbf_get_opts(struct rtnl_qdisc *qdisc)
@@ -226,7 +223,7 @@ int rtnl_qdisc_tbf_set_limit(struct rtnl_qdisc *qdisc, int limit)
tbf = tbf_alloc(qdisc);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
tbf->qt_limit = limit;
tbf->qt_mask |= TBF_ATTR_LIMIT;
@@ -270,11 +267,10 @@ int rtnl_qdisc_tbf_set_limit_by_latency(struct rtnl_qdisc *qdisc, int latency)
tbf = tbf_alloc(qdisc);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
if (!(tbf->qt_mask & TBF_ATTR_RATE))
- return nl_error(EINVAL, "The rate must be specified before "
- "limit can be calculated based on latency.");
+ return -NLE_MISSING_ATTR;
limit = calc_limit(&tbf->qt_rate, latency, tbf->qt_rate_bucket);
@@ -301,8 +297,8 @@ int rtnl_qdisc_tbf_get_limit(struct rtnl_qdisc *qdisc)
tbf = tbf_qdisc(qdisc);
if (tbf && (tbf->qt_mask & TBF_ATTR_LIMIT))
return tbf->qt_limit;
- return
- nl_errno(ENOENT);
+ else
+ return -NLE_NOATTR;
}
/**
@@ -317,7 +313,7 @@ int rtnl_qdisc_tbf_set_mpu(struct rtnl_qdisc *qdisc, int mpu)
tbf = tbf_alloc(qdisc);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
tbf->qt_mpu = mpu;
tbf->qt_mask |= TBF_ATTR_MPU;
@@ -337,8 +333,8 @@ int rtnl_qdisc_tbf_get_mpu(struct rtnl_qdisc *qdisc)
tbf = tbf_qdisc(qdisc);
if (tbf && (tbf->qt_mask & TBF_ATTR_MPU))
return tbf->qt_mpu;
- return
- nl_errno(ENOENT);
+ else
+ return -NLE_NOATTR;
}
static inline int calc_cell_log(int cell, int bucket)
@@ -374,7 +370,7 @@ int rtnl_qdisc_tbf_set_rate(struct rtnl_qdisc *qdisc, int rate, int bucket,
tbf = tbf_alloc(qdisc);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
cell_log = calc_cell_log(cell, bucket);
if (cell_log < 0)
@@ -453,7 +449,7 @@ int rtnl_qdisc_tbf_set_peakrate(struct rtnl_qdisc *qdisc, int rate, int bucket,
tbf = tbf_alloc(qdisc);
if (!tbf)
- return nl_errno(ENOMEM);
+ return -NLE_NOMEM;
cell_log = calc_cell_log(cell, bucket);
if (cell_log < 0)
@@ -522,8 +518,11 @@ int rtnl_qdisc_tbf_get_peakrate_cell(struct rtnl_qdisc *qdisc)
static struct rtnl_qdisc_ops tbf_qdisc_ops = {
.qo_kind = "tbf",
.qo_msg_parser = tbf_msg_parser,
- .qo_dump[NL_DUMP_BRIEF] = tbf_dump_brief,
- .qo_dump[NL_DUMP_FULL] = tbf_dump_full,
+ .qo_dump = {
+ [NL_DUMP_LINE] = tbf_dump_line,
+ [NL_DUMP_DETAILS] = tbf_dump_details,
+ },
+ .qo_free_data = tbf_free_data,
.qo_get_opts = tbf_get_opts,
};