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"
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 FirstInFirstOut
*fifo
;
21 switch (qdisc
->kind
) {
22 case QDISC_KIND_PFIFO
:
23 assert_se(fifo
= PFIFO(qdisc
));
25 case QDISC_KIND_BFIFO
:
26 assert_se(fifo
= BFIFO(qdisc
));
28 case QDISC_KIND_PFIFO_HEAD_DROP
:
29 assert_se(fifo
= PFIFO_HEAD_DROP(qdisc
));
35 const struct tc_fifo_qopt opt
= { .limit
= fifo
->limit
};
36 r
= sd_netlink_message_append_data(req
, TCA_OPTIONS
, &opt
, sizeof(opt
));
43 int config_parse_pfifo_size(
48 unsigned section_line
,
55 _cleanup_(qdisc_free_or_set_invalidp
) QDisc
*qdisc
= NULL
;
56 Network
*network
= ASSERT_PTR(data
);
57 FirstInFirstOut
*fifo
;
64 r
= qdisc_new_static(ltype
, network
, filename
, section_line
, &qdisc
);
68 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
69 "More than one kind of queueing discipline, ignoring assignment: %m");
73 switch (qdisc
->kind
) {
74 case QDISC_KIND_PFIFO
:
77 case QDISC_KIND_PFIFO_HEAD_DROP
:
78 fifo
= PFIFO_HEAD_DROP(qdisc
);
84 if (isempty(rvalue
)) {
91 r
= safe_atou32(rvalue
, &fifo
->limit
);
93 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
94 "Failed to parse '%s=', ignoring assignment: %s",
103 int config_parse_bfifo_size(
105 const char *filename
,
108 unsigned section_line
,
115 _cleanup_(qdisc_free_or_set_invalidp
) QDisc
*qdisc
= NULL
;
116 Network
*network
= ASSERT_PTR(data
);
117 FirstInFirstOut
*fifo
;
125 r
= qdisc_new_static(QDISC_KIND_BFIFO
, network
, filename
, section_line
, &qdisc
);
129 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
130 "More than one kind of queueing discipline, ignoring assignment: %m");
136 if (isempty(rvalue
)) {
143 r
= parse_size(rvalue
, 1024, &u
);
145 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
146 "Failed to parse '%s=', ignoring assignment: %s",
150 if (u
> UINT32_MAX
) {
151 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0, "Invalid '%s=', ignoring assignment: %s",
156 fifo
->limit
= (uint32_t) u
;
162 const QDiscVTable pfifo_vtable
= {
163 .object_size
= sizeof(FirstInFirstOut
),
165 .fill_message
= fifo_fill_message
,
168 const QDiscVTable bfifo_vtable
= {
169 .object_size
= sizeof(FirstInFirstOut
),
171 .fill_message
= fifo_fill_message
,
174 const QDiscVTable pfifo_head_drop_vtable
= {
175 .object_size
= sizeof(FirstInFirstOut
),
176 .tca_kind
= "pfifo_head_drop",
177 .fill_message
= fifo_fill_message
,
180 const QDiscVTable pfifo_fast_vtable
= {
181 .object_size
= sizeof(FirstInFirstOut
),
182 .tca_kind
= "pfifo_fast",