#ifndef XDP_SERVER_H
#define XDP_SERVER_H
#include <stdint.h>
#include <xdp/xsk.h>
#include "region-allocator.h"
#define XDP_NUM_FRAMES 8192*2
#define XDP_FRAME_SIZE XSK_UMEM__DEFAULT_FRAME_SIZE
#define XDP_BUFFER_SIZE XDP_NUM_FRAMES * XDP_FRAME_SIZE
#define XDP_RX_BATCH_SIZE 64
#define XDP_INVALID_UMEM_FRAME UINT64_MAX
#define XSK_RING_PROD__NUM_DESCS 8192
#define XSK_RING_CONS__NUM_DESCS 8192
#define XSK_UMEM_FRAME_HEADROOM XSK_UMEM__DEFAULT_FRAME_HEADROOM
#define XSK_UMEM_FLAGS XSK_UMEM__DEFAULT_FLAGS
struct nsd;
struct xsk_umem_info {
struct xsk_ring_prod fq;
struct xsk_ring_cons cq;
struct xsk_umem *umem;
void *buffer;
uint64_t umem_frame_addr[XDP_NUM_FRAMES];
uint32_t umem_frame_free;
};
struct xsk_socket_info {
struct xsk_ring_cons rx;
struct xsk_ring_prod tx;
struct xsk_umem_info *umem;
struct xsk_socket *xsk;
uint32_t outstanding_tx;
};
struct xdp_ip_address {
struct xdp_ip_address *next;
struct sockaddr_storage addr;
};
struct xdp_server {
region_type *region;
char const *interface_name;
char const *bpf_prog_filename;
char const *bpf_bpffs_path;
int bpf_prog_should_load;
int force_copy;
int xsk_map_fd;
int bpf_prog_fd;
uint32_t bpf_prog_id;
struct bpf_map *xsk_map;
struct xdp_program *bpf_prog;
uint32_t interface_index;
uint32_t queue_count;
uint32_t queue_index;
struct xdp_ip_address *ip_addresses;
struct query **queries;
struct nsd *nsd;
struct xsk_umem_info *umems;
struct xsk_socket_info *xsks;
};
void xdp_handle_recv_and_send(struct xdp_server *xdp);
int xdp_server_init(struct xdp_server *xdp);
void xdp_server_cleanup(struct xdp_server *xdp);
#endif