-
Notifications
You must be signed in to change notification settings - Fork 2
/
geneve_demo.h
155 lines (113 loc) · 3.83 KB
/
geneve_demo.h
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
* Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES, ALL RIGHTS RESERVED.
*
* This software product is a proprietary product of NVIDIA CORPORATION &
* AFFILIATES (the "Company") and all right, title, and interest in and to the
* software product, including all associated intellectual property rights, are
* and shall remain exclusively with the Company.
*
* This software product is governed by the End User License Agreement
* provided with the software product.
*
*/
#pragma once
#include <inttypes.h>
#include <rte_byteorder.h>
#include <rte_ether.h>
#include <dpdk_utils.h>
#include <doca_flow.h>
#define KEY_LEN 256
struct vnet_config_t;
struct vnet_host_t;
typedef uint8_t ipv6_addr_t[16];
typedef uint8_t crypto_key_t[KEY_LEN / 8];
extern volatile bool force_quit;
union ip_addr
{
rte_be32_t ipv4;
ipv6_addr_t ipv6;
};
enum sample_direction_indicator {
SAMPLE_DIRECTION_EGRESS = 1234,
SAMPLE_DIRECTION_INGRESS = 4321,
};
enum { max_num_pf = 8, max_vf_per_pf = 2, max_num_ports = max_num_pf * max_vf_per_pf };
struct flows_and_stats
{
struct doca_flow_port *pf_port;
uint16_t uplink_port_id;
uint16_t vf_port_id;
struct doca_flow_pipe_entry *sampling_entry_list[4];
struct doca_flow_pipe *rss_pipe;
struct doca_flow_pipe *fwd_to_uplink_pipe;
struct doca_flow_pipe *decap_pipe;
struct doca_flow_pipe *ingr_sampl_pipe;
struct doca_flow_pipe *egr_sampl_pipe;
struct doca_flow_pipe *encap_pipe;
struct doca_flow_pipe_entry **root_pipe_entry_list;
struct doca_flow_pipe_entry *arp_response_entry_list[2];
int64_t prev_root_pipe_total_count;
int64_t prev_arp_resp_pipe_total_count;
int64_t prev_sampling_total_count;
};
typedef uint64_t session_id_t;
struct geneve_demo_config
{
struct application_dpdk_config dpdk_config;
uint32_t num_pfs;
struct doca_flow_port *ports[max_num_ports];
bool port_is_pf[max_num_ports];
struct doca_dev *pf_dev[max_num_ports];
uint32_t mirror_id_ingress_to_rss[max_num_pf];
uint32_t mirror_id_egress_to_rss[max_num_pf];
uint32_t sample_mask; // 0 for 1:1 sampling, UINT32_MAX to disable
const char *vnet_config_file;
session_id_t next_session_id;
struct vnet_config_t *vnet_config;
const struct vnet_host_t *self[max_num_pf];
uint32_t arp_response_meta_flag;
bool enable_uplink_icmp_handling;
struct flows_and_stats flows[max_num_pf];
};
struct session_def
{
session_id_t session_id;
uint16_t pf_port_id;
uint16_t vf_port_id;
uint16_t vnet_id_ingress;
uint16_t vnet_id_egress;
struct rte_ether_addr outer_smac;
struct rte_ether_addr outer_dmac;
union ip_addr outer_local_ip;
union ip_addr outer_remote_ip;
// decap_smac will be the mac addr of the port representor
struct rte_ether_addr decap_dmac;
union ip_addr virt_local_ip;
union ip_addr virt_remote_ip;
struct doca_flow_pipe_entry *encap_entry;
struct doca_flow_pipe_entry *decap_entry;
};
/* user context struct that will be used in entries process callback */
struct entries_status {
bool failure; /* will be set to true if some entry status will not be success */
int nb_processed; /* number of entries that was already processed */
int entries_in_queue; /* number of entries in queue that is waiting to process */
};
int lcore_pkt_proc_func(void *lcore_args);
// Prepares argc,argv for parsing by DPDK by first removing all
// -a arguments, so that DOCA can create the verbs device before
// opening the port, as required by switch mode.
int disable_dpdk_accept_args(
int argc,
char *argv[],
char *dpdk_argv[],
char *pci_addr_arg[max_num_pf]);
void geneve_demo_register_argp_params(void);
struct rte_hash;
int load_vnet_conf_sessions(
struct geneve_demo_config *demo_config,
uint32_t uplink_port_id,
uint32_t vf_port_id,
struct rte_hash *session_ht,
struct doca_flow_pipe *encap_pipe,
struct doca_flow_pipe *decap_pipe);