/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/fou.yaml */ /* YNL-GEN user header */ #ifndef _LINUX_FOU_GEN_H #define _LINUX_FOU_GEN_H #include #include #include #include struct ynl_sock; extern const struct ynl_family ynl_fou_family; /* Enums */ const char *fou_op_str(int op); const char *fou_encap_type_str(int value); /* Common nested types */ /* ============== FOU_CMD_ADD ============== */ /* FOU_CMD_ADD - do */ struct fou_add_req { struct { __u32 port:1; __u32 ipproto:1; __u32 type:1; __u32 remcsum_nopartial:1; __u32 local_v4:1; __u32 peer_v4:1; __u32 local_v6_len; __u32 peer_v6_len; __u32 peer_port:1; __u32 ifindex:1; } _present; __u16 port /* big-endian */; __u8 ipproto; __u8 type; __u32 local_v4; __u32 peer_v4; void *local_v6; void *peer_v6; __u16 peer_port /* big-endian */; __s32 ifindex; }; static inline struct fou_add_req *fou_add_req_alloc(void) { return calloc(1, sizeof(struct fou_add_req)); } void fou_add_req_free(struct fou_add_req *req); static inline void fou_add_req_set_port(struct fou_add_req *req, __u16 port /* big-endian */) { req->_present.port = 1; req->port = port; } static inline void fou_add_req_set_ipproto(struct fou_add_req *req, __u8 ipproto) { req->_present.ipproto = 1; req->ipproto = ipproto; } static inline void fou_add_req_set_type(struct fou_add_req *req, __u8 type) { req->_present.type = 1; req->type = type; } static inline void fou_add_req_set_remcsum_nopartial(struct fou_add_req *req) { req->_present.remcsum_nopartial = 1; } static inline void fou_add_req_set_local_v4(struct fou_add_req *req, __u32 local_v4) { req->_present.local_v4 = 1; req->local_v4 = local_v4; } static inline void fou_add_req_set_peer_v4(struct fou_add_req *req, __u32 peer_v4) { req->_present.peer_v4 = 1; req->peer_v4 = peer_v4; } static inline void fou_add_req_set_local_v6(struct fou_add_req *req, const void *local_v6, size_t len) { free(req->local_v6); req->local_v6 = malloc(req->_present.local_v6_len); memcpy(req->local_v6, local_v6, req->_present.local_v6_len); } static inline void fou_add_req_set_peer_v6(struct fou_add_req *req, const void *peer_v6, size_t len) { free(req->peer_v6); req->peer_v6 = malloc(req->_present.peer_v6_len); memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); } static inline void fou_add_req_set_peer_port(struct fou_add_req *req, __u16 peer_port /* big-endian */) { req->_present.peer_port = 1; req->peer_port = peer_port; } static inline void fou_add_req_set_ifindex(struct fou_add_req *req, __s32 ifindex) { req->_present.ifindex = 1; req->ifindex = ifindex; } /* * Add port. */ int fou_add(struct ynl_sock *ys, struct fou_add_req *req); /* ============== FOU_CMD_DEL ============== */ /* FOU_CMD_DEL - do */ struct fou_del_req { struct { __u32 af:1; __u32 ifindex:1; __u32 port:1; __u32 peer_port:1; __u32 local_v4:1; __u32 peer_v4:1; __u32 local_v6_len; __u32 peer_v6_len; } _present; __u8 af; __s32 ifindex; __u16 port /* big-endian */; __u16 peer_port /* big-endian */; __u32 local_v4; __u32 peer_v4; void *local_v6; void *peer_v6; }; static inline struct fou_del_req *fou_del_req_alloc(void) { return calloc(1, sizeof(struct fou_del_req)); } void fou_del_req_free(struct fou_del_req *req); static inline void fou_del_req_set_af(struct fou_del_req *req, __u8 af) { req->_present.af = 1; req->af = af; } static inline void fou_del_req_set_ifindex(struct fou_del_req *req, __s32 ifindex) { req->_present.ifindex = 1; req->ifindex = ifindex; } static inline void fou_del_req_set_port(struct fou_del_req *req, __u16 port /* big-endian */) { req->_present.port = 1; req->port = port; } static inline void fou_del_req_set_peer_port(struct fou_del_req *req, __u16 peer_port /* big-endian */) { req->_present.peer_port = 1; req->peer_port = peer_port; } static inline void fou_del_req_set_local_v4(struct fou_del_req *req, __u32 local_v4) { req->_present.local_v4 = 1; req->local_v4 = local_v4; } static inline void fou_del_req_set_peer_v4(struct fou_del_req *req, __u32 peer_v4) { req->_present.peer_v4 = 1; req->peer_v4 = peer_v4; } static inline void fou_del_req_set_local_v6(struct fou_del_req *req, const void *local_v6, size_t len) { free(req->local_v6); req->local_v6 = malloc(req->_present.local_v6_len); memcpy(req->local_v6, local_v6, req->_present.local_v6_len); } static inline void fou_del_req_set_peer_v6(struct fou_del_req *req, const void *peer_v6, size_t len) { free(req->peer_v6); req->peer_v6 = malloc(req->_present.peer_v6_len); memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); } /* * Delete port. */ int fou_del(struct ynl_sock *ys, struct fou_del_req *req); /* ============== FOU_CMD_GET ============== */ /* FOU_CMD_GET - do */ struct fou_get_req { struct { __u32 af:1; __u32 ifindex:1; __u32 port:1; __u32 peer_port:1; __u32 local_v4:1; __u32 peer_v4:1; __u32 local_v6_len; __u32 peer_v6_len; } _present; __u8 af; __s32 ifindex; __u16 port /* big-endian */; __u16 peer_port /* big-endian */; __u32 local_v4; __u32 peer_v4; void *local_v6; void *peer_v6; }; static inline struct fou_get_req *fou_get_req_alloc(void) { return calloc(1, sizeof(struct fou_get_req)); } void fou_get_req_free(struct fou_get_req *req); static inline void fou_get_req_set_af(struct fou_get_req *req, __u8 af) { req->_present.af = 1; req->af = af; } static inline void fou_get_req_set_ifindex(struct fou_get_req *req, __s32 ifindex) { req->_present.ifindex = 1; req->ifindex = ifindex; } static inline void fou_get_req_set_port(struct fou_get_req *req, __u16 port /* big-endian */) { req->_present.port = 1; req->port = port; } static inline void fou_get_req_set_peer_port(struct fou_get_req *req, __u16 peer_port /* big-endian */) { req->_present.peer_port = 1; req->peer_port = peer_port; } static inline void fou_get_req_set_local_v4(struct fou_get_req *req, __u32 local_v4) { req->_present.local_v4 = 1; req->local_v4 = local_v4; } static inline void fou_get_req_set_peer_v4(struct fou_get_req *req, __u32 peer_v4) { req->_present.peer_v4 = 1; req->peer_v4 = peer_v4; } static inline void fou_get_req_set_local_v6(struct fou_get_req *req, const void *local_v6, size_t len) { free(req->local_v6); req->local_v6 = malloc(req->_present.local_v6_len); memcpy(req->local_v6, local_v6, req->_present.local_v6_len); } static inline void fou_get_req_set_peer_v6(struct fou_get_req *req, const void *peer_v6, size_t len) { free(req->peer_v6); req->peer_v6 = malloc(req->_present.peer_v6_len); memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); } struct fou_get_rsp { struct { __u32 port:1; __u32 ipproto:1; __u32 type:1; __u32 remcsum_nopartial:1; __u32 local_v4:1; __u32 peer_v4:1; __u32 local_v6_len; __u32 peer_v6_len; __u32 peer_port:1; __u32 ifindex:1; } _present; __u16 port /* big-endian */; __u8 ipproto; __u8 type; __u32 local_v4; __u32 peer_v4; void *local_v6; void *peer_v6; __u16 peer_port /* big-endian */; __s32 ifindex; }; void fou_get_rsp_free(struct fou_get_rsp *rsp); /* * Get tunnel info. */ struct fou_get_rsp *fou_get(struct ynl_sock *ys, struct fou_get_req *req); /* FOU_CMD_GET - dump */ struct fou_get_list { struct fou_get_list *next; struct fou_get_rsp obj __attribute__ ((aligned (8))); }; void fou_get_list_free(struct fou_get_list *rsp); struct fou_get_list *fou_get_dump(struct ynl_sock *ys); #endif /* _LINUX_FOU_GEN_H */