projects/linux·blob master · refs

283 lines · 9.2 KiB

1// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2/* Do not edit directly, auto-generated from: */
3/* Documentation/netlink/specs/netdev.yaml */
4/* YNL-GEN kernel source */
5/* To regenerate run: tools/net/ynl/ynl-regen.sh */
6
7#include <net/netlink.h>
8#include <net/genetlink.h>
9
10#include "netdev-genl-gen.h"
11
12#include <uapi/linux/netdev.h>
13#include <net/netdev_netlink.h>
14#include <asm/page.h>
15
16/* Integer value ranges */
17static const struct netlink_range_validation netdev_a_page_pool_id_range = {
18 .min = 1ULL,
19 .max = U32_MAX,
20};
21
22static const struct netlink_range_validation netdev_a_page_pool_ifindex_range = {
23 .min = 1ULL,
24 .max = S32_MAX,
25};
26
27static const struct netlink_range_validation netdev_a_napi_defer_hard_irqs_range = {
28 .max = S32_MAX,
29};
30
31static const struct netlink_range_validation netdev_a_dmabuf_rx_page_size_range = {
32 .min = PAGE_SIZE,
33 .max = U32_MAX,
34};
35
36/* Common nested types */
37const struct nla_policy netdev_lease_nl_policy[NETDEV_A_LEASE_NETNS_ID + 1] = {
38 [NETDEV_A_LEASE_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
39 [NETDEV_A_LEASE_QUEUE] = NLA_POLICY_NESTED(netdev_queue_id_nl_policy),
40 [NETDEV_A_LEASE_NETNS_ID] = NLA_POLICY_MIN(NLA_S32, 0),
41};
42
43const struct nla_policy netdev_page_pool_info_nl_policy[NETDEV_A_PAGE_POOL_IFINDEX + 1] = {
44 [NETDEV_A_PAGE_POOL_ID] = NLA_POLICY_FULL_RANGE(NLA_UINT, &netdev_a_page_pool_id_range),
45 [NETDEV_A_PAGE_POOL_IFINDEX] = NLA_POLICY_FULL_RANGE(NLA_U32, &netdev_a_page_pool_ifindex_range),
46};
47
48const struct nla_policy netdev_queue_id_nl_policy[NETDEV_A_QUEUE_TYPE + 1] = {
49 [NETDEV_A_QUEUE_ID] = { .type = NLA_U32, },
50 [NETDEV_A_QUEUE_TYPE] = NLA_POLICY_MAX(NLA_U32, 1),
51};
52
53/* NETDEV_CMD_DEV_GET - do */
54static const struct nla_policy netdev_dev_get_nl_policy[NETDEV_A_DEV_IFINDEX + 1] = {
55 [NETDEV_A_DEV_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
56};
57
58/* NETDEV_CMD_PAGE_POOL_GET - do */
59#ifdef CONFIG_PAGE_POOL
60static const struct nla_policy netdev_page_pool_get_do_nl_policy[NETDEV_A_PAGE_POOL_ID + 1] = {
61 [NETDEV_A_PAGE_POOL_ID] = NLA_POLICY_FULL_RANGE(NLA_UINT, &netdev_a_page_pool_id_range),
62};
63#endif /* CONFIG_PAGE_POOL */
64
65/* NETDEV_CMD_PAGE_POOL_GET - dump */
66#ifdef CONFIG_PAGE_POOL
67static const struct nla_policy netdev_page_pool_get_dump_nl_policy[NETDEV_A_PAGE_POOL_IFINDEX + 1] = {
68 [NETDEV_A_PAGE_POOL_IFINDEX] = NLA_POLICY_FULL_RANGE(NLA_U32, &netdev_a_page_pool_ifindex_range),
69};
70#endif /* CONFIG_PAGE_POOL */
71
72/* NETDEV_CMD_PAGE_POOL_STATS_GET - do */
73#ifdef CONFIG_PAGE_POOL_STATS
74static const struct nla_policy netdev_page_pool_stats_get_do_nl_policy[NETDEV_A_PAGE_POOL_STATS_INFO + 1] = {
75 [NETDEV_A_PAGE_POOL_STATS_INFO] = NLA_POLICY_NESTED(netdev_page_pool_info_nl_policy),
76};
77#endif /* CONFIG_PAGE_POOL_STATS */
78
79/* NETDEV_CMD_PAGE_POOL_STATS_GET - dump */
80#ifdef CONFIG_PAGE_POOL_STATS
81static const struct nla_policy netdev_page_pool_stats_get_dump_nl_policy[NETDEV_A_PAGE_POOL_STATS_INFO + 1] = {
82 [NETDEV_A_PAGE_POOL_STATS_INFO] = NLA_POLICY_NESTED(netdev_page_pool_info_nl_policy),
83};
84#endif /* CONFIG_PAGE_POOL_STATS */
85
86/* NETDEV_CMD_QUEUE_GET - do */
87static const struct nla_policy netdev_queue_get_do_nl_policy[NETDEV_A_QUEUE_TYPE + 1] = {
88 [NETDEV_A_QUEUE_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
89 [NETDEV_A_QUEUE_TYPE] = NLA_POLICY_MAX(NLA_U32, 1),
90 [NETDEV_A_QUEUE_ID] = { .type = NLA_U32, },
91};
92
93/* NETDEV_CMD_QUEUE_GET - dump */
94static const struct nla_policy netdev_queue_get_dump_nl_policy[NETDEV_A_QUEUE_IFINDEX + 1] = {
95 [NETDEV_A_QUEUE_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
96};
97
98/* NETDEV_CMD_NAPI_GET - do */
99static const struct nla_policy netdev_napi_get_do_nl_policy[NETDEV_A_NAPI_ID + 1] = {
100 [NETDEV_A_NAPI_ID] = { .type = NLA_U32, },
101};
102
103/* NETDEV_CMD_NAPI_GET - dump */
104static const struct nla_policy netdev_napi_get_dump_nl_policy[NETDEV_A_NAPI_IFINDEX + 1] = {
105 [NETDEV_A_NAPI_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
106};
107
108/* NETDEV_CMD_QSTATS_GET - dump */
109static const struct nla_policy netdev_qstats_get_nl_policy[NETDEV_A_QSTATS_SCOPE + 1] = {
110 [NETDEV_A_QSTATS_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
111 [NETDEV_A_QSTATS_SCOPE] = NLA_POLICY_MASK(NLA_UINT, 0x1),
112};
113
114/* NETDEV_CMD_BIND_RX - do */
115static const struct nla_policy netdev_bind_rx_nl_policy[NETDEV_A_DMABUF_RX_PAGE_SIZE + 1] = {
116 [NETDEV_A_DMABUF_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
117 [NETDEV_A_DMABUF_FD] = { .type = NLA_U32, },
118 [NETDEV_A_DMABUF_QUEUES] = NLA_POLICY_NESTED(netdev_queue_id_nl_policy),
119 [NETDEV_A_DMABUF_RX_PAGE_SIZE] = NLA_POLICY_FULL_RANGE(NLA_U32, &netdev_a_dmabuf_rx_page_size_range),
120};
121
122/* NETDEV_CMD_NAPI_SET - do */
123static const struct nla_policy netdev_napi_set_nl_policy[NETDEV_A_NAPI_THREADED + 1] = {
124 [NETDEV_A_NAPI_ID] = { .type = NLA_U32, },
125 [NETDEV_A_NAPI_DEFER_HARD_IRQS] = NLA_POLICY_FULL_RANGE(NLA_U32, &netdev_a_napi_defer_hard_irqs_range),
126 [NETDEV_A_NAPI_GRO_FLUSH_TIMEOUT] = { .type = NLA_UINT, },
127 [NETDEV_A_NAPI_IRQ_SUSPEND_TIMEOUT] = { .type = NLA_UINT, },
128 [NETDEV_A_NAPI_THREADED] = NLA_POLICY_MAX(NLA_U32, 2),
129};
130
131/* NETDEV_CMD_BIND_TX - do */
132static const struct nla_policy netdev_bind_tx_nl_policy[NETDEV_A_DMABUF_FD + 1] = {
133 [NETDEV_A_DMABUF_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
134 [NETDEV_A_DMABUF_FD] = { .type = NLA_U32, },
135};
136
137/* NETDEV_CMD_QUEUE_CREATE - do */
138static const struct nla_policy netdev_queue_create_nl_policy[NETDEV_A_QUEUE_LEASE + 1] = {
139 [NETDEV_A_QUEUE_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
140 [NETDEV_A_QUEUE_TYPE] = NLA_POLICY_MAX(NLA_U32, 1),
141 [NETDEV_A_QUEUE_LEASE] = NLA_POLICY_NESTED(netdev_lease_nl_policy),
142};
143
144/* Ops table for netdev */
145static const struct genl_split_ops netdev_nl_ops[] = {
146 {
147 .cmd = NETDEV_CMD_DEV_GET,
148 .doit = netdev_nl_dev_get_doit,
149 .policy = netdev_dev_get_nl_policy,
150 .maxattr = NETDEV_A_DEV_IFINDEX,
151 .flags = GENL_CMD_CAP_DO,
152 },
153 {
154 .cmd = NETDEV_CMD_DEV_GET,
155 .dumpit = netdev_nl_dev_get_dumpit,
156 .flags = GENL_CMD_CAP_DUMP,
157 },
158#ifdef CONFIG_PAGE_POOL
159 {
160 .cmd = NETDEV_CMD_PAGE_POOL_GET,
161 .doit = netdev_nl_page_pool_get_doit,
162 .policy = netdev_page_pool_get_do_nl_policy,
163 .maxattr = NETDEV_A_PAGE_POOL_ID,
164 .flags = GENL_CMD_CAP_DO,
165 },
166 {
167 .cmd = NETDEV_CMD_PAGE_POOL_GET,
168 .dumpit = netdev_nl_page_pool_get_dumpit,
169 .policy = netdev_page_pool_get_dump_nl_policy,
170 .maxattr = NETDEV_A_PAGE_POOL_IFINDEX,
171 .flags = GENL_CMD_CAP_DUMP,
172 },
173#endif /* CONFIG_PAGE_POOL */
174#ifdef CONFIG_PAGE_POOL_STATS
175 {
176 .cmd = NETDEV_CMD_PAGE_POOL_STATS_GET,
177 .doit = netdev_nl_page_pool_stats_get_doit,
178 .policy = netdev_page_pool_stats_get_do_nl_policy,
179 .maxattr = NETDEV_A_PAGE_POOL_STATS_INFO,
180 .flags = GENL_CMD_CAP_DO,
181 },
182 {
183 .cmd = NETDEV_CMD_PAGE_POOL_STATS_GET,
184 .dumpit = netdev_nl_page_pool_stats_get_dumpit,
185 .policy = netdev_page_pool_stats_get_dump_nl_policy,
186 .maxattr = NETDEV_A_PAGE_POOL_STATS_INFO,
187 .flags = GENL_CMD_CAP_DUMP,
188 },
189#endif /* CONFIG_PAGE_POOL_STATS */
190 {
191 .cmd = NETDEV_CMD_QUEUE_GET,
192 .doit = netdev_nl_queue_get_doit,
193 .policy = netdev_queue_get_do_nl_policy,
194 .maxattr = NETDEV_A_QUEUE_TYPE,
195 .flags = GENL_CMD_CAP_DO,
196 },
197 {
198 .cmd = NETDEV_CMD_QUEUE_GET,
199 .dumpit = netdev_nl_queue_get_dumpit,
200 .policy = netdev_queue_get_dump_nl_policy,
201 .maxattr = NETDEV_A_QUEUE_IFINDEX,
202 .flags = GENL_CMD_CAP_DUMP,
203 },
204 {
205 .cmd = NETDEV_CMD_NAPI_GET,
206 .doit = netdev_nl_napi_get_doit,
207 .policy = netdev_napi_get_do_nl_policy,
208 .maxattr = NETDEV_A_NAPI_ID,
209 .flags = GENL_CMD_CAP_DO,
210 },
211 {
212 .cmd = NETDEV_CMD_NAPI_GET,
213 .dumpit = netdev_nl_napi_get_dumpit,
214 .policy = netdev_napi_get_dump_nl_policy,
215 .maxattr = NETDEV_A_NAPI_IFINDEX,
216 .flags = GENL_CMD_CAP_DUMP,
217 },
218 {
219 .cmd = NETDEV_CMD_QSTATS_GET,
220 .dumpit = netdev_nl_qstats_get_dumpit,
221 .policy = netdev_qstats_get_nl_policy,
222 .maxattr = NETDEV_A_QSTATS_SCOPE,
223 .flags = GENL_CMD_CAP_DUMP,
224 },
225 {
226 .cmd = NETDEV_CMD_BIND_RX,
227 .doit = netdev_nl_bind_rx_doit,
228 .policy = netdev_bind_rx_nl_policy,
229 .maxattr = NETDEV_A_DMABUF_RX_PAGE_SIZE,
230 .flags = GENL_UNS_ADMIN_PERM | GENL_CMD_CAP_DO,
231 },
232 {
233 .cmd = NETDEV_CMD_NAPI_SET,
234 .doit = netdev_nl_napi_set_doit,
235 .policy = netdev_napi_set_nl_policy,
236 .maxattr = NETDEV_A_NAPI_THREADED,
237 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
238 },
239 {
240 .cmd = NETDEV_CMD_BIND_TX,
241 .doit = netdev_nl_bind_tx_doit,
242 .policy = netdev_bind_tx_nl_policy,
243 .maxattr = NETDEV_A_DMABUF_FD,
244 .flags = GENL_CMD_CAP_DO,
245 },
246 {
247 .cmd = NETDEV_CMD_QUEUE_CREATE,
248 .doit = netdev_nl_queue_create_doit,
249 .policy = netdev_queue_create_nl_policy,
250 .maxattr = NETDEV_A_QUEUE_LEASE,
251 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
252 },
253};
254
255static const struct genl_multicast_group netdev_nl_mcgrps[] = {
256 [NETDEV_NLGRP_MGMT] = { "mgmt", },
257 [NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
258};
259
260static void __netdev_nl_sock_priv_init(void *priv)
261{
262 netdev_nl_sock_priv_init(priv);
263}
264
265static void __netdev_nl_sock_priv_destroy(void *priv)
266{
267 netdev_nl_sock_priv_destroy(priv);
268}
269
270struct genl_family netdev_nl_family __ro_after_init = {
271 .name = NETDEV_FAMILY_NAME,
272 .version = NETDEV_FAMILY_VERSION,
273 .netnsok = true,
274 .parallel_ops = true,
275 .module = THIS_MODULE,
276 .split_ops = netdev_nl_ops,
277 .n_split_ops = ARRAY_SIZE(netdev_nl_ops),
278 .mcgrps = netdev_nl_mcgrps,
279 .n_mcgrps = ARRAY_SIZE(netdev_nl_mcgrps),
280 .sock_priv_size = sizeof(struct netdev_nl_sock),
281 .sock_priv_init = __netdev_nl_sock_priv_init,
282 .sock_priv_destroy = __netdev_nl_sock_priv_destroy,
283};