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