File: xdp-server.h

package info (click to toggle)
nsd 4.14.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,188 kB
  • sloc: ansic: 64,639; sh: 4,523; python: 2,085; yacc: 1,344; makefile: 688
file content (109 lines) | stat: -rw-r--r-- 2,503 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * xdp-server.h -- integration of AF_XDP into nsd
 *
 * Copyright (c) 2024, NLnet Labs. All rights reserved.
 *
 * See LICENSE for the license.
 *
 */

#ifndef XDP_SERVER_H
#define XDP_SERVER_H

#include <stdint.h>
#include <xdp/xsk.h>

#include "region-allocator.h"

/* TODO: check if number is sensible */
#define XDP_NUM_FRAMES 8192*2
#define XDP_FRAME_SIZE XSK_UMEM__DEFAULT_FRAME_SIZE // 4096 bytes as of Oct 2024
#define XDP_BUFFER_SIZE XDP_NUM_FRAMES * XDP_FRAME_SIZE
#define XDP_RX_BATCH_SIZE 64
#define XDP_INVALID_UMEM_FRAME UINT64_MAX
/* ring sizes need tweeking */
#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; /* avoid recursive header include */

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 {
	/* NSD global settings */
	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;

	/* track bpf objects and file descriptors */
	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;

	/* these items/arrays are shared between processes */
	/* the number of sockets corresponds to the queue_count */
	/* these are allocated using mmap and are automatically unmapped on exit */
	struct xsk_umem_info *umems;
	struct xsk_socket_info *xsks;
};

/*
 * Handle reading and writing packets via XDP
 */
void xdp_handle_recv_and_send(struct xdp_server *xdp);

/*
 * Initialize NSD global XDP settings
 *
 *	- load XDP program if configured
 *	- set limits
 */
int xdp_server_init(struct xdp_server *xdp);

/*
 * Cleanup NSD global XDP settings
 *
 *	- unload XDP program if loaded by NSD
 *	- unpin BPF map if pinned and loaded by NSD
 */
void xdp_server_cleanup(struct xdp_server *xdp);

#endif /* XDP_SERVER_H */