1 /* SPDX-License-Identifier: LGPL-2.1+
2 * Copyright © 2020 VMware, Inc. */
4 #include <linux/pkt_sched.h>
6 #include "alloc-util.h"
7 #include "conf-parser.h"
9 #include "netlink-util.h"
10 #include "parse-util.h"
11 #include "string-util.h"
13 static int fifo_fill_message(Link
*link
, QDisc
*qdisc
, sd_netlink_message
*req
) {
14 struct tc_fifo_qopt opt
= {};
15 FirstInFirstOut
*fifo
;
23 case QDISC_KIND_PFIFO
:
26 case QDISC_KIND_BFIFO
:
29 case QDISC_KIND_PFIFO_HEAD_DROP
:
30 fifo
= PFIFO_HEAD_DROP(qdisc
);
33 assert_not_reached("Invalid QDisc kind.");
36 opt
.limit
= fifo
->limit
;
38 r
= sd_netlink_message_append_data(req
, TCA_OPTIONS
, &opt
, sizeof(struct tc_fifo_qopt
));
40 return log_link_error_errno(link
, r
, "Could not append TCA_OPTIONS attribute: %m");
45 int config_parse_pfifo_size(
50 unsigned section_line
,
57 _cleanup_(qdisc_free_or_set_invalidp
) QDisc
*qdisc
= NULL
;
58 Network
*network
= data
;
59 FirstInFirstOut
*fifo
;
67 r
= qdisc_new_static(ltype
, network
, filename
, section_line
, &qdisc
);
71 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
72 "More than one kind of queueing discipline, ignoring assignment: %m");
77 case QDISC_KIND_PFIFO
:
80 case QDISC_KIND_PFIFO_HEAD_DROP
:
81 fifo
= PFIFO_HEAD_DROP(qdisc
);
84 assert_not_reached("Invalid QDisc kind.");
87 if (isempty(rvalue
)) {
94 r
= safe_atou32(rvalue
, &fifo
->limit
);
96 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
97 "Failed to parse '%s=', ignoring assignment: %s",
106 int config_parse_bfifo_size(
108 const char *filename
,
111 unsigned section_line
,
118 _cleanup_(qdisc_free_or_set_invalidp
) QDisc
*qdisc
= NULL
;
119 Network
*network
= data
;
120 FirstInFirstOut
*fifo
;
129 r
= qdisc_new_static(QDISC_KIND_BFIFO
, network
, filename
, section_line
, &qdisc
);
133 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
134 "More than one kind of queueing discipline, ignoring assignment: %m");
140 if (isempty(rvalue
)) {
147 r
= parse_size(rvalue
, 1024, &u
);
149 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
150 "Failed to parse '%s=', ignoring assignment: %s",
154 if (u
> UINT32_MAX
) {
155 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0, "Invalid '%s=', ignoring assignment: %s",
160 fifo
->limit
= (uint32_t) u
;
166 const QDiscVTable pfifo_vtable
= {
167 .object_size
= sizeof(FirstInFirstOut
),
169 .fill_message
= fifo_fill_message
,
172 const QDiscVTable bfifo_vtable
= {
173 .object_size
= sizeof(FirstInFirstOut
),
175 .fill_message
= fifo_fill_message
,
178 const QDiscVTable pfifo_head_drop_vtable
= {
179 .object_size
= sizeof(FirstInFirstOut
),
180 .tca_kind
= "pfifo_head_drop",
181 .fill_message
= fifo_fill_message
,
184 const QDiscVTable pfifo_fast_vtable
= {
185 .object_size
= sizeof(FirstInFirstOut
),
186 .tca_kind
= "pfifo_fast",