162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __NETWORK_HELPERS_H
362306a36Sopenharmony_ci#define __NETWORK_HELPERS_H
462306a36Sopenharmony_ci#include <sys/socket.h>
562306a36Sopenharmony_ci#include <sys/types.h>
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_citypedef __u16 __sum16;
862306a36Sopenharmony_ci#include <linux/if_ether.h>
962306a36Sopenharmony_ci#include <linux/if_packet.h>
1062306a36Sopenharmony_ci#include <linux/ip.h>
1162306a36Sopenharmony_ci#include <linux/ipv6.h>
1262306a36Sopenharmony_ci#include <netinet/tcp.h>
1362306a36Sopenharmony_ci#include <bpf/bpf_endian.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define MAGIC_VAL 0x1234
1662306a36Sopenharmony_ci#define NUM_ITER 100000
1762306a36Sopenharmony_ci#define VIP_NUM 5
1862306a36Sopenharmony_ci#define MAGIC_BYTES 123
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct network_helper_opts {
2162306a36Sopenharmony_ci	const char *cc;
2262306a36Sopenharmony_ci	int timeout_ms;
2362306a36Sopenharmony_ci	bool must_fail;
2462306a36Sopenharmony_ci	bool noconnect;
2562306a36Sopenharmony_ci	int type;
2662306a36Sopenharmony_ci	int proto;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* ipv4 test vector */
3062306a36Sopenharmony_cistruct ipv4_packet {
3162306a36Sopenharmony_ci	struct ethhdr eth;
3262306a36Sopenharmony_ci	struct iphdr iph;
3362306a36Sopenharmony_ci	struct tcphdr tcp;
3462306a36Sopenharmony_ci} __packed;
3562306a36Sopenharmony_ciextern struct ipv4_packet pkt_v4;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* ipv6 test vector */
3862306a36Sopenharmony_cistruct ipv6_packet {
3962306a36Sopenharmony_ci	struct ethhdr eth;
4062306a36Sopenharmony_ci	struct ipv6hdr iph;
4162306a36Sopenharmony_ci	struct tcphdr tcp;
4262306a36Sopenharmony_ci} __packed;
4362306a36Sopenharmony_ciextern struct ipv6_packet pkt_v6;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciint settimeo(int fd, int timeout_ms);
4662306a36Sopenharmony_ciint start_server(int family, int type, const char *addr, __u16 port,
4762306a36Sopenharmony_ci		 int timeout_ms);
4862306a36Sopenharmony_ciint start_mptcp_server(int family, const char *addr, __u16 port,
4962306a36Sopenharmony_ci		       int timeout_ms);
5062306a36Sopenharmony_ciint *start_reuseport_server(int family, int type, const char *addr_str,
5162306a36Sopenharmony_ci			    __u16 port, int timeout_ms,
5262306a36Sopenharmony_ci			    unsigned int nr_listens);
5362306a36Sopenharmony_civoid free_fds(int *fds, unsigned int nr_close_fds);
5462306a36Sopenharmony_ciint connect_to_fd(int server_fd, int timeout_ms);
5562306a36Sopenharmony_ciint connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts);
5662306a36Sopenharmony_ciint connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms);
5762306a36Sopenharmony_ciint fastopen_connect(int server_fd, const char *data, unsigned int data_len,
5862306a36Sopenharmony_ci		     int timeout_ms);
5962306a36Sopenharmony_ciint make_sockaddr(int family, const char *addr_str, __u16 port,
6062306a36Sopenharmony_ci		  struct sockaddr_storage *addr, socklen_t *len);
6162306a36Sopenharmony_cichar *ping_command(int family);
6262306a36Sopenharmony_ciint get_socket_local_port(int sock_fd);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct nstoken;
6562306a36Sopenharmony_ci/**
6662306a36Sopenharmony_ci * open_netns() - Switch to specified network namespace by name.
6762306a36Sopenharmony_ci *
6862306a36Sopenharmony_ci * Returns token with which to restore the original namespace
6962306a36Sopenharmony_ci * using close_netns().
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_cistruct nstoken *open_netns(const char *name);
7262306a36Sopenharmony_civoid close_netns(struct nstoken *token);
7362306a36Sopenharmony_ci#endif
74