162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __UM_VECTOR_USER_H 762306a36Sopenharmony_ci#define __UM_VECTOR_USER_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define MAXVARGS 20 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define TOKEN_IFNAME "ifname" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define TRANS_RAW "raw" 1462306a36Sopenharmony_ci#define TRANS_RAW_LEN strlen(TRANS_RAW) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define TRANS_TAP "tap" 1762306a36Sopenharmony_ci#define TRANS_TAP_LEN strlen(TRANS_TAP) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define TRANS_GRE "gre" 2062306a36Sopenharmony_ci#define TRANS_GRE_LEN strlen(TRANS_GRE) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define TRANS_L2TPV3 "l2tpv3" 2362306a36Sopenharmony_ci#define TRANS_L2TPV3_LEN strlen(TRANS_L2TPV3) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define TRANS_HYBRID "hybrid" 2662306a36Sopenharmony_ci#define TRANS_HYBRID_LEN strlen(TRANS_HYBRID) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define TRANS_BESS "bess" 2962306a36Sopenharmony_ci#define TRANS_BESS_LEN strlen(TRANS_BESS) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define DEFAULT_BPF_LEN 6 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#ifndef IPPROTO_GRE 3462306a36Sopenharmony_ci#define IPPROTO_GRE 0x2F 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define GRE_MODE_CHECKSUM cpu_to_be16(8 << 12) /* checksum */ 3862306a36Sopenharmony_ci#define GRE_MODE_RESERVED cpu_to_be16(4 << 12) /* unused */ 3962306a36Sopenharmony_ci#define GRE_MODE_KEY cpu_to_be16(2 << 12) /* KEY present */ 4062306a36Sopenharmony_ci#define GRE_MODE_SEQUENCE cpu_to_be16(1 << 12) /* sequence */ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define GRE_IRB cpu_to_be16(0x6558) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define L2TPV3_DATA_PACKET 0x30000 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* IANA-assigned IP protocol ID for L2TPv3 */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#ifndef IPPROTO_L2TP 4962306a36Sopenharmony_ci#define IPPROTO_L2TP 0x73 5062306a36Sopenharmony_ci#endif 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct arglist { 5362306a36Sopenharmony_ci int numargs; 5462306a36Sopenharmony_ci char *tokens[MAXVARGS]; 5562306a36Sopenharmony_ci char *values[MAXVARGS]; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* Separating read and write FDs allows us to have different 5962306a36Sopenharmony_ci * rx and tx method. Example - read tap via raw socket using 6062306a36Sopenharmony_ci * recvmmsg, write using legacy tap write calls 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct vector_fds { 6462306a36Sopenharmony_ci int rx_fd; 6562306a36Sopenharmony_ci int tx_fd; 6662306a36Sopenharmony_ci void *remote_addr; 6762306a36Sopenharmony_ci int remote_addr_size; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define VECTOR_READ 1 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciextern struct arglist *uml_parse_vector_ifspec(char *arg); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ciextern struct vector_fds *uml_vector_user_open( 7562306a36Sopenharmony_ci int unit, 7662306a36Sopenharmony_ci struct arglist *parsed 7762306a36Sopenharmony_ci); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciextern char *uml_vector_fetch_arg( 8062306a36Sopenharmony_ci struct arglist *ifspec, 8162306a36Sopenharmony_ci char *token 8262306a36Sopenharmony_ci); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciextern int uml_vector_recvmsg(int fd, void *hdr, int flags); 8562306a36Sopenharmony_ciextern int uml_vector_sendmsg(int fd, void *hdr, int flags); 8662306a36Sopenharmony_ciextern int uml_vector_writev(int fd, void *hdr, int iovcount); 8762306a36Sopenharmony_ciextern int uml_vector_sendmmsg( 8862306a36Sopenharmony_ci int fd, void *msgvec, 8962306a36Sopenharmony_ci unsigned int vlen, 9062306a36Sopenharmony_ci unsigned int flags 9162306a36Sopenharmony_ci); 9262306a36Sopenharmony_ciextern int uml_vector_recvmmsg( 9362306a36Sopenharmony_ci int fd, 9462306a36Sopenharmony_ci void *msgvec, 9562306a36Sopenharmony_ci unsigned int vlen, 9662306a36Sopenharmony_ci unsigned int flags 9762306a36Sopenharmony_ci); 9862306a36Sopenharmony_ciextern void *uml_vector_default_bpf(const void *mac); 9962306a36Sopenharmony_ciextern void *uml_vector_user_bpf(char *filename); 10062306a36Sopenharmony_ciextern int uml_vector_attach_bpf(int fd, void *bpf); 10162306a36Sopenharmony_ciextern int uml_vector_detach_bpf(int fd, void *bpf); 10262306a36Sopenharmony_ciextern bool uml_raw_enable_qdisc_bypass(int fd); 10362306a36Sopenharmony_ciextern bool uml_raw_enable_vnet_headers(int fd); 10462306a36Sopenharmony_ciextern bool uml_tap_enable_vnet_headers(int fd); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#endif 108