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 */
17 static const struct netlink_range_validation netdev_a_page_pool_id_range = {
18 .min = 1ULL,
19 .max = U32_MAX,
20 };
21
22 static const struct netlink_range_validation netdev_a_page_pool_ifindex_range = {
23 .min = 1ULL,
24 .max = S32_MAX,
25 };
26
27 static const struct netlink_range_validation netdev_a_napi_defer_hard_irqs_range = {
28 .max = S32_MAX,
29 };
30
31 static 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 */
37 const 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
43 const 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
48 const 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 */
54 static 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
60 static 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
67 static 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
74 static 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
81 static 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 */
87 static 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 */
94 static 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 */
99 static 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 */
104 static 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 */
109 static 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 */
115 static 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 */
123 static 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 */
132 static 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 */
138 static 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 */
145 static 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
255 static const struct genl_multicast_group netdev_nl_mcgrps[] = {
256 [NETDEV_NLGRP_MGMT] = { "mgmt", },
257 [NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
258 };
259
__netdev_nl_sock_priv_init(void * priv)260 static void __netdev_nl_sock_priv_init(void *priv)
261 {
262 netdev_nl_sock_priv_init(priv);
263 }
264
__netdev_nl_sock_priv_destroy(void * priv)265 static void __netdev_nl_sock_priv_destroy(void *priv)
266 {
267 netdev_nl_sock_priv_destroy(priv);
268 }
269
270 struct 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 };
284