1 /* SPDX-License-Identifier: LGPL-2.1-or-later
2 * Copyright © 2020 VMware, Inc. */
4 #include <linux/pkt_sched.h>
6 #include "alloc-util.h"
7 #include "conf-parser.h"
8 #include "netlink-util.h"
9 #include "parse-util.h"
12 #include "string-util.h"
14 static int stochastic_fair_blue_fill_message(Link
*link
, QDisc
*qdisc
, sd_netlink_message
*req
) {
15 StochasticFairBlue
*sfb
;
22 assert_se(sfb
= SFB(qdisc
));
24 const struct tc_sfb_qopt opt
= {
25 .rehash_interval
= 600*1000,
26 .warmup_time
= 60*1000,
29 .increment
= (SFB_MAX_PROB
+ 1000) / 2000,
30 .decrement
= (SFB_MAX_PROB
+ 10000) / 20000,
33 .limit
= sfb
->packet_limit
,
36 r
= sd_netlink_message_open_container_union(req
, TCA_OPTIONS
, "sfb");
40 r
= sd_netlink_message_append_data(req
, TCA_SFB_PARMS
, &opt
, sizeof(opt
));
44 r
= sd_netlink_message_close_container(req
);
51 int config_parse_stochastic_fair_blue_u32(
56 unsigned section_line
,
63 _cleanup_(qdisc_free_or_set_invalidp
) QDisc
*qdisc
= NULL
;
64 StochasticFairBlue
*sfb
;
65 Network
*network
= data
;
73 r
= qdisc_new_static(QDISC_KIND_SFB
, network
, filename
, section_line
, &qdisc
);
77 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
78 "More than one kind of queueing discipline, ignoring assignment: %m");
84 if (isempty(rvalue
)) {
85 sfb
->packet_limit
= 0;
91 r
= safe_atou32(rvalue
, &sfb
->packet_limit
);
93 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
94 "Failed to parse '%s=', ignoring assignment: %s",
104 const QDiscVTable sfb_vtable
= {
105 .object_size
= sizeof(StochasticFairBlue
),
107 .fill_message
= stochastic_fair_blue_fill_message
,