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/fou.yaml */
4/* YNL-GEN user header */
5
6#ifndef _LINUX_FOU_GEN_H
7#define _LINUX_FOU_GEN_H
8
9#include <stdlib.h>
10#include <string.h>
11#include <linux/types.h>
12#include <linux/fou.h>
13
14struct ynl_sock;
15
16extern const struct ynl_family ynl_fou_family;
17
18/* Enums */
19const char *fou_op_str(int op);
20const char *fou_encap_type_str(int value);
21
22/* Common nested types */
23/* ============== FOU_CMD_ADD ============== */
24/* FOU_CMD_ADD - do */
25struct fou_add_req {
26	struct {
27		__u32 port:1;
28		__u32 ipproto:1;
29		__u32 type:1;
30		__u32 remcsum_nopartial:1;
31		__u32 local_v4:1;
32		__u32 peer_v4:1;
33		__u32 local_v6_len;
34		__u32 peer_v6_len;
35		__u32 peer_port:1;
36		__u32 ifindex:1;
37	} _present;
38
39	__u16 port /* big-endian */;
40	__u8 ipproto;
41	__u8 type;
42	__u32 local_v4;
43	__u32 peer_v4;
44	void *local_v6;
45	void *peer_v6;
46	__u16 peer_port /* big-endian */;
47	__s32 ifindex;
48};
49
50static inline struct fou_add_req *fou_add_req_alloc(void)
51{
52	return calloc(1, sizeof(struct fou_add_req));
53}
54void fou_add_req_free(struct fou_add_req *req);
55
56static inline void
57fou_add_req_set_port(struct fou_add_req *req, __u16 port /* big-endian */)
58{
59	req->_present.port = 1;
60	req->port = port;
61}
62static inline void
63fou_add_req_set_ipproto(struct fou_add_req *req, __u8 ipproto)
64{
65	req->_present.ipproto = 1;
66	req->ipproto = ipproto;
67}
68static inline void fou_add_req_set_type(struct fou_add_req *req, __u8 type)
69{
70	req->_present.type = 1;
71	req->type = type;
72}
73static inline void fou_add_req_set_remcsum_nopartial(struct fou_add_req *req)
74{
75	req->_present.remcsum_nopartial = 1;
76}
77static inline void
78fou_add_req_set_local_v4(struct fou_add_req *req, __u32 local_v4)
79{
80	req->_present.local_v4 = 1;
81	req->local_v4 = local_v4;
82}
83static inline void
84fou_add_req_set_peer_v4(struct fou_add_req *req, __u32 peer_v4)
85{
86	req->_present.peer_v4 = 1;
87	req->peer_v4 = peer_v4;
88}
89static inline void
90fou_add_req_set_local_v6(struct fou_add_req *req, const void *local_v6,
91			 size_t len)
92{
93	free(req->local_v6);
94	req->_present.local_v6_len = len;
95	req->local_v6 = malloc(req->_present.local_v6_len);
96	memcpy(req->local_v6, local_v6, req->_present.local_v6_len);
97}
98static inline void
99fou_add_req_set_peer_v6(struct fou_add_req *req, const void *peer_v6,
100			size_t len)
101{
102	free(req->peer_v6);
103	req->_present.peer_v6_len = len;
104	req->peer_v6 = malloc(req->_present.peer_v6_len);
105	memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len);
106}
107static inline void
108fou_add_req_set_peer_port(struct fou_add_req *req,
109			  __u16 peer_port /* big-endian */)
110{
111	req->_present.peer_port = 1;
112	req->peer_port = peer_port;
113}
114static inline void
115fou_add_req_set_ifindex(struct fou_add_req *req, __s32 ifindex)
116{
117	req->_present.ifindex = 1;
118	req->ifindex = ifindex;
119}
120
121/*
122 * Add port.
123 */
124int fou_add(struct ynl_sock *ys, struct fou_add_req *req);
125
126/* ============== FOU_CMD_DEL ============== */
127/* FOU_CMD_DEL - do */
128struct fou_del_req {
129	struct {
130		__u32 af:1;
131		__u32 ifindex:1;
132		__u32 port:1;
133		__u32 peer_port:1;
134		__u32 local_v4:1;
135		__u32 peer_v4:1;
136		__u32 local_v6_len;
137		__u32 peer_v6_len;
138	} _present;
139
140	__u8 af;
141	__s32 ifindex;
142	__u16 port /* big-endian */;
143	__u16 peer_port /* big-endian */;
144	__u32 local_v4;
145	__u32 peer_v4;
146	void *local_v6;
147	void *peer_v6;
148};
149
150static inline struct fou_del_req *fou_del_req_alloc(void)
151{
152	return calloc(1, sizeof(struct fou_del_req));
153}
154void fou_del_req_free(struct fou_del_req *req);
155
156static inline void fou_del_req_set_af(struct fou_del_req *req, __u8 af)
157{
158	req->_present.af = 1;
159	req->af = af;
160}
161static inline void
162fou_del_req_set_ifindex(struct fou_del_req *req, __s32 ifindex)
163{
164	req->_present.ifindex = 1;
165	req->ifindex = ifindex;
166}
167static inline void
168fou_del_req_set_port(struct fou_del_req *req, __u16 port /* big-endian */)
169{
170	req->_present.port = 1;
171	req->port = port;
172}
173static inline void
174fou_del_req_set_peer_port(struct fou_del_req *req,
175			  __u16 peer_port /* big-endian */)
176{
177	req->_present.peer_port = 1;
178	req->peer_port = peer_port;
179}
180static inline void
181fou_del_req_set_local_v4(struct fou_del_req *req, __u32 local_v4)
182{
183	req->_present.local_v4 = 1;
184	req->local_v4 = local_v4;
185}
186static inline void
187fou_del_req_set_peer_v4(struct fou_del_req *req, __u32 peer_v4)
188{
189	req->_present.peer_v4 = 1;
190	req->peer_v4 = peer_v4;
191}
192static inline void
193fou_del_req_set_local_v6(struct fou_del_req *req, const void *local_v6,
194			 size_t len)
195{
196	free(req->local_v6);
197	req->_present.local_v6_len = len;
198	req->local_v6 = malloc(req->_present.local_v6_len);
199	memcpy(req->local_v6, local_v6, req->_present.local_v6_len);
200}
201static inline void
202fou_del_req_set_peer_v6(struct fou_del_req *req, const void *peer_v6,
203			size_t len)
204{
205	free(req->peer_v6);
206	req->_present.peer_v6_len = len;
207	req->peer_v6 = malloc(req->_present.peer_v6_len);
208	memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len);
209}
210
211/*
212 * Delete port.
213 */
214int fou_del(struct ynl_sock *ys, struct fou_del_req *req);
215
216/* ============== FOU_CMD_GET ============== */
217/* FOU_CMD_GET - do */
218struct fou_get_req {
219	struct {
220		__u32 af:1;
221		__u32 ifindex:1;
222		__u32 port:1;
223		__u32 peer_port:1;
224		__u32 local_v4:1;
225		__u32 peer_v4:1;
226		__u32 local_v6_len;
227		__u32 peer_v6_len;
228	} _present;
229
230	__u8 af;
231	__s32 ifindex;
232	__u16 port /* big-endian */;
233	__u16 peer_port /* big-endian */;
234	__u32 local_v4;
235	__u32 peer_v4;
236	void *local_v6;
237	void *peer_v6;
238};
239
240static inline struct fou_get_req *fou_get_req_alloc(void)
241{
242	return calloc(1, sizeof(struct fou_get_req));
243}
244void fou_get_req_free(struct fou_get_req *req);
245
246static inline void fou_get_req_set_af(struct fou_get_req *req, __u8 af)
247{
248	req->_present.af = 1;
249	req->af = af;
250}
251static inline void
252fou_get_req_set_ifindex(struct fou_get_req *req, __s32 ifindex)
253{
254	req->_present.ifindex = 1;
255	req->ifindex = ifindex;
256}
257static inline void
258fou_get_req_set_port(struct fou_get_req *req, __u16 port /* big-endian */)
259{
260	req->_present.port = 1;
261	req->port = port;
262}
263static inline void
264fou_get_req_set_peer_port(struct fou_get_req *req,
265			  __u16 peer_port /* big-endian */)
266{
267	req->_present.peer_port = 1;
268	req->peer_port = peer_port;
269}
270static inline void
271fou_get_req_set_local_v4(struct fou_get_req *req, __u32 local_v4)
272{
273	req->_present.local_v4 = 1;
274	req->local_v4 = local_v4;
275}
276static inline void
277fou_get_req_set_peer_v4(struct fou_get_req *req, __u32 peer_v4)
278{
279	req->_present.peer_v4 = 1;
280	req->peer_v4 = peer_v4;
281}
282static inline void
283fou_get_req_set_local_v6(struct fou_get_req *req, const void *local_v6,
284			 size_t len)
285{
286	free(req->local_v6);
287	req->_present.local_v6_len = len;
288	req->local_v6 = malloc(req->_present.local_v6_len);
289	memcpy(req->local_v6, local_v6, req->_present.local_v6_len);
290}
291static inline void
292fou_get_req_set_peer_v6(struct fou_get_req *req, const void *peer_v6,
293			size_t len)
294{
295	free(req->peer_v6);
296	req->_present.peer_v6_len = len;
297	req->peer_v6 = malloc(req->_present.peer_v6_len);
298	memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len);
299}
300
301struct fou_get_rsp {
302	struct {
303		__u32 port:1;
304		__u32 ipproto:1;
305		__u32 type:1;
306		__u32 remcsum_nopartial:1;
307		__u32 local_v4:1;
308		__u32 peer_v4:1;
309		__u32 local_v6_len;
310		__u32 peer_v6_len;
311		__u32 peer_port:1;
312		__u32 ifindex:1;
313	} _present;
314
315	__u16 port /* big-endian */;
316	__u8 ipproto;
317	__u8 type;
318	__u32 local_v4;
319	__u32 peer_v4;
320	void *local_v6;
321	void *peer_v6;
322	__u16 peer_port /* big-endian */;
323	__s32 ifindex;
324};
325
326void fou_get_rsp_free(struct fou_get_rsp *rsp);
327
328/*
329 * Get tunnel info.
330 */
331struct fou_get_rsp *fou_get(struct ynl_sock *ys, struct fou_get_req *req);
332
333/* FOU_CMD_GET - dump */
334struct fou_get_list {
335	struct fou_get_list *next;
336	struct fou_get_rsp obj __attribute__ ((aligned (8)));
337};
338
339void fou_get_list_free(struct fou_get_list *rsp);
340
341struct fou_get_list *fou_get_dump(struct ynl_sock *ys);
342
343#endif /* _LINUX_FOU_GEN_H */
344