1 /* SPDX-License-Identifier: LGPL-2.1-or-later
2 * Copyright © 2019 VMware, Inc. */
5 #include "conf-parser.h"
6 #include "networkd-util.h"
8 typedef struct Link Link
;
9 typedef struct Manager Manager
;
10 typedef struct Network Network
;
12 typedef enum QDiscKind
{
26 QDISC_KIND_PFIFO_FAST
,
27 QDISC_KIND_PFIFO_HEAD_DROP
,
35 _QDISC_KIND_INVALID
= -EINVAL
,
38 typedef struct QDisc
{
41 ConfigSection
*section
;
42 NetworkConfigSource source
;
43 NetworkConfigState state
;
52 typedef struct QDiscVTable
{
55 /* called in qdisc_new() */
56 int (*init
)(QDisc
*qdisc
);
57 int (*fill_message
)(Link
*link
, QDisc
*qdisc
, sd_netlink_message
*m
);
58 int (*verify
)(QDisc
*qdisc
);
59 int (*is_ready
)(QDisc
*qdisc
, Link
*link
);
62 extern const QDiscVTable
* const qdisc_vtable
[_QDISC_KIND_MAX
];
64 #define QDISC_VTABLE(q) ((q)->kind != _QDISC_KIND_INVALID ? qdisc_vtable[(q)->kind] : NULL)
66 /* For casting a qdisc into the various qdisc kinds */
67 #define DEFINE_QDISC_CAST(UPPERCASE, MixedCase) \
68 static inline MixedCase* UPPERCASE(QDisc *q) { \
69 if (_unlikely_(!q || q->kind != QDISC_KIND_##UPPERCASE)) \
72 return (MixedCase*) q; \
75 DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(QDisc
, qdisc
);
77 QDisc
* qdisc_free(QDisc
*qdisc
);
78 int qdisc_new_static(QDiscKind kind
, Network
*network
, const char *filename
, unsigned section_line
, QDisc
**ret
);
80 int link_find_qdisc(Link
*link
, uint32_t handle
, uint32_t parent
, const char *kind
, QDisc
**qdisc
);
82 int link_request_qdisc(Link
*link
, QDisc
*qdisc
);
84 void network_drop_invalid_qdisc(Network
*network
);
86 int manager_rtnl_process_qdisc(sd_netlink
*rtnl
, sd_netlink_message
*message
, Manager
*m
);
88 DEFINE_SECTION_CLEANUP_FUNCTIONS(QDisc
, qdisc_free
);
90 CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent
);
91 CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle
);