Structured initialization is used a bit more.
There were two kinds of log messages: about failed size calculations and
about failed appends to the message. I "downgraded" the first type to log_debug,
and moved the latter to the caller. This way there should be at most one high-priority
message.
I also changed sizeof(<type>) to sizeof(var) — there is less chance of select-and-paste
error in the second form.
assert(qdisc);
assert(req);
- c = CAKE(qdisc);
+ assert_se(c = CAKE(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "cake");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (c->bandwidth > 0) {
r = sd_netlink_message_append_u64(req, TCA_CAKE_BASE_RATE64, c->bandwidth);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_BASE_RATE64 attribute: %m");
+ return r;
}
if (c->autorate >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_AUTORATE, c->autorate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_AUTORATE attribute: %m");
+ return r;
}
if (c->overhead_set) {
r = sd_netlink_message_append_s32(req, TCA_CAKE_OVERHEAD, c->overhead);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_OVERHEAD attribute: %m");
+ return r;
}
if (c->mpu > 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_MPU, c->mpu);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_MPU attribute: %m");
+ return r;
}
if (c->compensation_mode >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_ATM, c->compensation_mode);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_ATM attribute: %m");
+ return r;
}
if (c->raw > 0) {
/* TCA_CAKE_RAW attribute is mostly a flag, not boolean. */
r = sd_netlink_message_append_u32(req, TCA_CAKE_RAW, 0);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_RAW attribute: %m");
+ return r;
}
if (c->flow_isolation_mode >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_FLOW_MODE, c->flow_isolation_mode);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_FLOW_MODE attribute: %m");
+ return r;
}
if (c->nat >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_NAT, c->nat);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_NAT attribute: %m");
+ return r;
}
if (c->preset >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_DIFFSERV_MODE, c->preset);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_DIFFSERV_MODE attribute: %m");
+ return r;
}
if (c->fwmark > 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_FWMARK, c->fwmark);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_FWMARK attribute: %m");
+ return r;
}
if (c->wash >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_WASH, c->wash);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_WASH attribute: %m");
+ return r;
}
if (c->split_gso >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CAKE_SPLIT_GSO, c->split_gso);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CAKE_SPLIT_GSO attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- cd = CODEL(qdisc);
+ assert_se(cd = CODEL(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "codel");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (cd->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_CODEL_LIMIT, cd->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CODEL_LIMIT attribute: %m");
+ return r;
}
if (cd->interval_usec > 0) {
r = sd_netlink_message_append_u32(req, TCA_CODEL_INTERVAL, cd->interval_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CODEL_INTERVAL attribute: %m");
+ return r;
}
if (cd->target_usec > 0) {
r = sd_netlink_message_append_u32(req, TCA_CODEL_TARGET, cd->target_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CODEL_TARGET attribute: %m");
+ return r;
}
if (cd->ecn >= 0) {
r = sd_netlink_message_append_u32(req, TCA_CODEL_ECN, cd->ecn);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CODEL_ECN attribute: %m");
+ return r;
}
if (cd->ce_threshold_usec != USEC_INFINITY) {
r = sd_netlink_message_append_u32(req, TCA_CODEL_CE_THRESHOLD, cd->ce_threshold_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_CODEL_CE_THRESHOLD attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(tclass);
assert(req);
- drr = TCLASS_TO_DRR(tclass);
+ assert_se(drr = TCLASS_TO_DRR(tclass));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "drr");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (drr->quantum > 0) {
r = sd_netlink_message_append_u32(req, TCA_DRR_QUANTUM, drr->quantum);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_DRR_QUANTUM, attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- ets = ETS(qdisc);
+ assert_se(ets = ETS(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "ets");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
r = sd_netlink_message_append_u8(req, TCA_ETS_NBANDS, ets->n_bands);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_ETS_NBANDS attribute: %m");
+ return r;
if (ets->n_strict > 0) {
r = sd_netlink_message_append_u8(req, TCA_ETS_NSTRICT, ets->n_strict);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_ETS_NSTRICT attribute: %m");
+ return r;
}
if (ets->n_quanta > 0) {
r = sd_netlink_message_open_container(req, TCA_ETS_QUANTA);
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_ETS_QUANTA: %m");
+ return r;
for (unsigned i = 0; i < ets->n_quanta; i++) {
r = sd_netlink_message_append_u32(req, TCA_ETS_QUANTA_BAND, ets->quanta[i]);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_ETS_QUANTA_BAND attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_ETS_QUANTA: %m");
+ return r;
}
if (ets->n_prio > 0) {
r = sd_netlink_message_open_container(req, TCA_ETS_PRIOMAP);
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_ETS_PRIOMAP: %m");
+ return r;
for (unsigned i = 0; i < ets->n_prio; i++) {
r = sd_netlink_message_append_u8(req, TCA_ETS_PRIOMAP_BAND, ets->prio[i]);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_ETS_PRIOMAP_BAND attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_ETS_PRIOMAP: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
#include "string-util.h"
static int fifo_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
- struct tc_fifo_qopt opt = {};
FirstInFirstOut *fifo;
int r;
switch(qdisc->kind) {
case QDISC_KIND_PFIFO:
- fifo = PFIFO(qdisc);
+ assert_se(fifo = PFIFO(qdisc));
break;
case QDISC_KIND_BFIFO:
- fifo = BFIFO(qdisc);
+ assert_se(fifo = BFIFO(qdisc));
break;
case QDISC_KIND_PFIFO_HEAD_DROP:
- fifo = PFIFO_HEAD_DROP(qdisc);
+ assert_se(fifo = PFIFO_HEAD_DROP(qdisc));
break;
default:
assert_not_reached();
}
- opt.limit = fifo->limit;
-
- r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(struct tc_fifo_qopt));
+ const struct tc_fifo_qopt opt = { .limit = fifo->limit };
+ r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_OPTIONS attribute: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- fqcd = FQ_CODEL(qdisc);
+ assert_se(fqcd = FQ_CODEL(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "fq_codel");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (fqcd->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_LIMIT, fqcd->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_LIMIT attribute: %m");
+ return r;
}
if (fqcd->flows > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_FLOWS, fqcd->flows);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_FLOWS attribute: %m");
+ return r;
}
if (fqcd->quantum > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_QUANTUM, fqcd->quantum);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_QUANTUM attribute: %m");
+ return r;
}
if (fqcd->interval_usec > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_INTERVAL, fqcd->interval_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_INTERVAL attribute: %m");
+ return r;
}
if (fqcd->target_usec > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_TARGET, fqcd->target_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_TARGET attribute: %m");
+ return r;
}
if (fqcd->ecn >= 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_ECN, fqcd->ecn);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_ECN attribute: %m");
+ return r;
}
if (fqcd->ce_threshold_usec != USEC_INFINITY) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_CE_THRESHOLD, fqcd->ce_threshold_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_CE_THRESHOLD attribute: %m");
+ return r;
}
if (fqcd->memory_limit != UINT32_MAX) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_MEMORY_LIMIT, fqcd->memory_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_MEMORY_LIMIT attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- fq_pie = FQ_PIE(qdisc);
+ assert_se(fq_pie = FQ_PIE(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "fq_pie");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (fq_pie->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_PIE_LIMIT, fq_pie->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_PIE_PLIMIT attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- fq = FQ(qdisc);
+ assert_se(fq = FQ(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "fq");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (fq->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_PLIMIT, fq->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_PLIMIT attribute: %m");
+ return r;
}
if (fq->flow_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_FLOW_PLIMIT, fq->flow_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_FLOW_PLIMIT attribute: %m");
+ return r;
}
if (fq->quantum > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_QUANTUM, fq->quantum);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_QUANTUM attribute: %m");
+ return r;
}
if (fq->initial_quantum > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_INITIAL_QUANTUM, fq->initial_quantum);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_INITIAL_QUANTUM attribute: %m");
+ return r;
}
if (fq->pacing >= 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_RATE_ENABLE, fq->pacing);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_RATE_ENABLE attribute: %m");
+ return r;
}
if (fq->max_rate > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_FLOW_MAX_RATE, fq->max_rate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_FLOW_MAX_RATE attribute: %m");
+ return r;
}
if (fq->buckets > 0) {
l = log2u(fq->buckets);
r = sd_netlink_message_append_u32(req, TCA_FQ_BUCKETS_LOG, l);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_BUCKETS_LOG attribute: %m");
+ return r;
}
if (fq->orphan_mask > 0) {
r = sd_netlink_message_append_u32(req, TCA_FQ_ORPHAN_MASK, fq->orphan_mask);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_ORPHAN_MASK attribute: %m");
+ return r;
}
if (fq->ce_threshold_usec != USEC_INFINITY) {
r = sd_netlink_message_append_u32(req, TCA_FQ_CE_THRESHOLD, fq->ce_threshold_usec);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_FQ_CE_THRESHOLD attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
static int generic_random_early_detection_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
GenericRandomEarlyDetection *gred;
- struct tc_gred_sopt opt = {};
int r;
assert(link);
assert(qdisc);
assert(req);
- gred = GRED(qdisc);
-
- opt.DPs = gred->virtual_queues;
- opt.def_DP = gred->default_virtual_queue;
+ assert_se(gred = GRED(qdisc));
- if (gred->grio >= 0)
- opt.grio = gred->grio;
+ const struct tc_gred_sopt opt = {
+ .DPs = gred->virtual_queues,
+ .def_DP = gred->default_virtual_queue,
+ .grio = gred->grio,
+ };
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "gred");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
- r = sd_netlink_message_append_data(req, TCA_GRED_DPS, &opt, sizeof(struct tc_gred_sopt));
+ r = sd_netlink_message_append_data(req, TCA_GRED_DPS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_GRED_DPS attribute: %m");
+ return r;
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- hhf = HHF(qdisc);
+ assert_se(hhf = HHF(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "hhf");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (hhf->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_HHF_BACKLOG_LIMIT, hhf->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HHF_BACKLOG_LIMIT attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
static int hierarchy_token_bucket_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
HierarchyTokenBucket *htb;
- struct tc_htb_glob opt = {
- .version = 3,
- };
int r;
assert(link);
assert(qdisc);
assert(req);
- htb = HTB(qdisc);
+ assert_se(htb = HTB(qdisc));
- opt.rate2quantum = htb->rate_to_quantum;
- opt.defcls = htb->default_class;
+ struct tc_htb_glob opt = {
+ .version = 3,
+ .rate2quantum = htb->rate_to_quantum,
+ .defcls = htb->default_class,
+ };
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "htb");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
r = sd_netlink_message_append_data(req, TCA_HTB_INIT, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_INIT attribute: %m");
+ return r;
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
static int hierarchy_token_bucket_class_fill_message(Link *link, TClass *tclass, sd_netlink_message *req) {
HierarchyTokenBucketClass *htb;
- struct tc_htb_opt opt = {};
uint32_t rtab[256], ctab[256];
int r;
assert(tclass);
assert(req);
- htb = TCLASS_TO_HTB(tclass);
+ assert_se(htb = TCLASS_TO_HTB(tclass));
- opt.prio = htb->priority;
- opt.quantum = htb->quantum;
- opt.rate.rate = (htb->rate >= (1ULL << 32)) ? ~0U : htb->rate;
- opt.ceil.rate = (htb->ceil_rate >= (1ULL << 32)) ? ~0U : htb->ceil_rate;
- opt.rate.overhead = htb->overhead;
- opt.ceil.overhead = htb->overhead;
+ struct tc_htb_opt opt = {
+ .prio = htb->priority,
+ .quantum = htb->quantum,
+ .rate.rate = (htb->rate >= (1ULL << 32)) ? ~0U : htb->rate,
+ .ceil.rate = (htb->ceil_rate >= (1ULL << 32)) ? ~0U : htb->ceil_rate,
+ .rate.overhead = htb->overhead,
+ .ceil.overhead = htb->overhead,
+ };
r = tc_transmit_time(htb->rate, htb->buffer, &opt.buffer);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate buffer size: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate buffer size: %m");
r = tc_transmit_time(htb->ceil_rate, htb->ceil_buffer, &opt.cbuffer);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate ceil buffer size: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate ceil buffer size: %m");
r = tc_fill_ratespec_and_table(&opt.rate, rtab, htb->mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate rate table: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate rate table: %m");
r = tc_fill_ratespec_and_table(&opt.ceil, ctab, htb->mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate ceil rate table: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate ceil rate table: %m");
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "htb");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
r = sd_netlink_message_append_data(req, TCA_HTB_PARMS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_PARMS attribute: %m");
+ return r;
if (htb->rate >= (1ULL << 32)) {
r = sd_netlink_message_append_u64(req, TCA_HTB_RATE64, htb->rate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_RATE64 attribute: %m");
+ return r;
}
if (htb->ceil_rate >= (1ULL << 32)) {
r = sd_netlink_message_append_u64(req, TCA_HTB_CEIL64, htb->ceil_rate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_CEIL64 attribute: %m");
+ return r;
}
r = sd_netlink_message_append_data(req, TCA_HTB_RTAB, rtab, sizeof(rtab));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_RTAB attribute: %m");
+ return r;
r = sd_netlink_message_append_data(req, TCA_HTB_CTAB, ctab, sizeof(ctab));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_HTB_CTAB attribute: %m");
+ return r;
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
+
return 0;
}
#include "tc-util.h"
static int network_emulator_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
- struct tc_netem_qopt opt = {
- .limit = 1000,
- };
NetworkEmulator *ne;
int r;
assert(qdisc);
assert(req);
- ne = NETEM(qdisc);
-
- if (ne->limit > 0)
- opt.limit = ne->limit;
+ assert_se(ne = NETEM(qdisc));
- if (ne->loss > 0)
- opt.loss = ne->loss;
-
- if (ne->duplicate > 0)
- opt.duplicate = ne->duplicate;
+ struct tc_netem_qopt opt = {
+ .limit = ne->limit > 0 ? ne->limit : 1000,
+ .loss = ne->loss,
+ .duplicate = ne->duplicate,
+ };
if (ne->delay != USEC_INFINITY) {
r = tc_time_to_tick(ne->delay, &opt.latency);
return log_link_error_errno(link, r, "Failed to calculate jitter in TCA_OPTION: %m");
}
- r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(struct tc_netem_qopt));
+ r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_OPTION attribute: %m");
+ return r;
return 0;
}
assert(qdisc);
assert(req);
- pie = PIE(qdisc);
+ assert_se(pie = PIE(qdisc));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "pie");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (pie->packet_limit > 0) {
r = sd_netlink_message_append_u32(req, TCA_PIE_LIMIT, pie->packet_limit);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_PIE_PLIMIT attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
if (QDISC_VTABLE(qdisc)->fill_message) {
r = QDISC_VTABLE(qdisc)->fill_message(link, qdisc, req);
if (r < 0)
- return r;
+ return log_link_error_errno(link, r, "Could not fill netlink message: %m");
}
} else {
r = sd_netlink_message_append_string(req, TCA_KIND, qdisc->tca_kind);
assert(tclass);
assert(req);
- qfq = TCLASS_TO_QFQ(tclass);
+ assert_se(qfq = TCLASS_TO_QFQ(tclass));
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "qfq");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
if (qfq->weight > 0) {
r = sd_netlink_message_append_u32(req, TCA_QFQ_WEIGHT, qfq->weight);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_QFQ_WEIGHT attribute: %m");
+ return r;
}
if (qfq->max_packet > 0) {
r = sd_netlink_message_append_u32(req, TCA_QFQ_LMAX, qfq->max_packet);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_QFQ_LMAX attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
+
return 0;
}
static int stochastic_fair_blue_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
StochasticFairBlue *sfb;
- struct tc_sfb_qopt opt = {
+ int r;
+
+ assert(link);
+ assert(qdisc);
+ assert(req);
+
+ assert_se(sfb = SFB(qdisc));
+
+ const struct tc_sfb_qopt opt = {
.rehash_interval = 600*1000,
.warmup_time = 60*1000,
.penalty_rate = 10,
.decrement = (SFB_MAX_PROB + 10000) / 20000,
.max = 25,
.bin_size = 20,
+ .limit = sfb->packet_limit,
};
- int r;
-
- assert(link);
- assert(qdisc);
- assert(req);
-
- sfb = SFB(qdisc);
-
- opt.limit = sfb->packet_limit;
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "sfb");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
- r = sd_netlink_message_append_data(req, TCA_SFB_PARMS, &opt, sizeof(struct tc_sfb_qopt));
+ r = sd_netlink_message_append_data(req, TCA_SFB_PARMS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_SFB_PARMS attribute: %m");
+ return r;
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
static int stochastic_fairness_queueing_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
StochasticFairnessQueueing *sfq;
- struct tc_sfq_qopt_v1 opt = {};
int r;
assert(link);
assert(qdisc);
assert(req);
- sfq = SFQ(qdisc);
+ assert_se(sfq = SFQ(qdisc));
- opt.v0.perturb_period = sfq->perturb_period / USEC_PER_SEC;
+ const struct tc_sfq_qopt_v1 opt = {
+ .v0.perturb_period = sfq->perturb_period / USEC_PER_SEC,
+ };
- r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(struct tc_sfq_qopt_v1));
+ r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_OPTIONS attribute: %m");
+ return r;
return 0;
}
static int token_bucket_filter_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
uint32_t rtab[256], ptab[256];
- struct tc_tbf_qopt opt = {};
TokenBucketFilter *tbf;
int r;
assert(qdisc);
assert(req);
- tbf = TBF(qdisc);
+ assert_se(tbf = TBF(qdisc));
- opt.rate.rate = tbf->rate >= (1ULL << 32) ? ~0U : tbf->rate;
- opt.peakrate.rate = tbf->peak_rate >= (1ULL << 32) ? ~0U : tbf->peak_rate;
+ struct tc_tbf_qopt opt = {
+ .rate.rate = tbf->rate >= (1ULL << 32) ? ~0U : tbf->rate,
+ .peakrate.rate = tbf->peak_rate >= (1ULL << 32) ? ~0U : tbf->peak_rate,
+ .rate.mpu = tbf->mpu,
+ };
if (tbf->limit > 0)
opt.limit = tbf->limit;
opt.limit = lim;
}
- opt.rate.mpu = tbf->mpu;
-
r = tc_fill_ratespec_and_table(&opt.rate, rtab, tbf->mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate ratespec: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate ratespec: %m");
r = tc_transmit_time(opt.rate.rate, tbf->burst, &opt.buffer);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate buffer size: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate buffer size: %m");
if (opt.peakrate.rate > 0) {
opt.peakrate.mpu = tbf->mpu;
r = tc_fill_ratespec_and_table(&opt.peakrate, ptab, tbf->mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate ratespec: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate ratespec: %m");
r = tc_transmit_time(opt.peakrate.rate, tbf->mtu, &opt.mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Failed to calculate mtu size: %m");
+ return log_link_debug_errno(link, r, "Failed to calculate mtu size: %m");
}
r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "tbf");
if (r < 0)
- return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+ return r;
- r = sd_netlink_message_append_data(req, TCA_TBF_PARMS, &opt, sizeof(struct tc_tbf_qopt));
+ r = sd_netlink_message_append_data(req, TCA_TBF_PARMS, &opt, sizeof(opt));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_PARMS attribute: %m");
+ return r;
r = sd_netlink_message_append_data(req, TCA_TBF_BURST, &tbf->burst, sizeof(tbf->burst));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_BURST attribute: %m");
+ return r;
if (tbf->rate >= (1ULL << 32)) {
r = sd_netlink_message_append_u64(req, TCA_TBF_RATE64, tbf->rate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_RATE64 attribute: %m");
+ return r;
}
r = sd_netlink_message_append_data(req, TCA_TBF_RTAB, rtab, sizeof(rtab));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_RTAB attribute: %m");
+ return r;
if (opt.peakrate.rate > 0) {
if (tbf->peak_rate >= (1ULL << 32)) {
r = sd_netlink_message_append_u64(req, TCA_TBF_PRATE64, tbf->peak_rate);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_PRATE64 attribute: %m");
+ return r;
}
r = sd_netlink_message_append_u32(req, TCA_TBF_PBURST, tbf->mtu);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_PBURST attribute: %m");
+ return r;
r = sd_netlink_message_append_data(req, TCA_TBF_PTAB, ptab, sizeof(ptab));
if (r < 0)
- return log_link_error_errno(link, r, "Could not append TCA_TBF_PTAB attribute: %m");
+ return r;
}
r = sd_netlink_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+ return r;
return 0;
}
if (TCLASS_VTABLE(tclass)->fill_message) {
r = TCLASS_VTABLE(tclass)->fill_message(link, tclass, req);
if (r < 0)
- return r;
+ return log_link_error_errno(link, r, "Could not fill netlink message: %m");
}
r = netlink_call_async(link->manager->rtnl, NULL, req, tclass_handler, link_netlink_destroy_callback, link);