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