2 // Copyright (c) 2010-2020 Intel Corporation
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
20 #include <sys/queue.h>
22 #include <rte_common.h>
23 #include <rte_sched.h>
24 #include <rte_ether.h>
25 #include "prox_compat.h"
26 #include "task_base.h"
27 #include "prox_globals.h"
29 #include "flow_iter.h"
30 #include "parse_utils.h"
31 #include "prox_compat.h"
36 #if MAX_RINGS_PER_TASK < PROX_MAX_PORTS
37 #error MAX_RINGS_PER_TASK < PROX_MAX_PORTS
40 #define TASK_ARG_DROP 0x01
41 #define TASK_ARG_RX_RING 0x02
42 #define TASK_ARG_RTE_TABLE 0x08
43 #define TASK_ARG_LOCAL_LPM 0x10
44 #define TASK_ARG_QINQ_ACL 0x20
45 #define TASK_ARG_CTRL_RINGS_P 0x40
46 #define TASK_ARG_DST_MAC_SET 0x80
47 #define TASK_ARG_SRC_MAC_SET 0x100
48 #define TASK_ARG_DO_NOT_SET_SRC_MAC 0x200
49 #define TASK_ARG_DO_NOT_SET_DST_MAC 0x400
50 #define TASK_ARG_HW_SRC_MAC 0x800
51 #define TASK_ARG_L3 0x1000
52 #define TASK_ARG_NDP 0x2000
53 #define TASK_ARG_SEND_NA_AT_STARTUP 0x4000
55 #define PROX_MODE_LEN 32
57 enum protocols {IPV4, ARP, IPV6};
60 struct rte_sched_port_params port_params;
61 struct rte_sched_subport_params subport_params[1];
62 struct rte_sched_pipe_params pipe_params[1];
65 enum task_mode {NOT_SET, MASTER, QINQ_DECAP4, QINQ_DECAP6,
66 QINQ_ENCAP4, QINQ_ENCAP6, GRE_DECAP, GRE_ENCAP,CGNAT, ESP_ENC, ESP_DEC, QOS, POLICE
73 char mode_str[PROX_MODE_LEN];
74 char sub_mode_str[PROX_MODE_LEN];
75 void (*early_init)(struct task_args *targ);
76 void (*init)(struct task_base *tbase, struct task_args *targ);
77 int (*handle)(struct task_base *tbase, struct rte_mbuf **mbufs, const uint16_t n_pkts);
78 void (*start)(struct task_base *tbase);
79 void (*stop)(struct task_base *tbase);
80 void (*start_first)(struct task_base *tbase);
81 void (*stop_last)(struct task_base *tbase);
82 int (*thread_x)(struct lcore_cfg* lconf);
83 struct flow_iter flow_iter;
85 uint16_t flag_req_data; /* flags from prox_shared.h */
86 uint64_t flag_features;
87 LIST_ENTRY(task_init) entries;
90 static int task_init_flag_set(struct task_init *task_init, uint64_t flag)
92 return !!(task_init->flag_features & flag);
96 ACT_GREEN = RTE_COLOR_GREEN,
97 ACT_YELLOW = RTE_COLOR_YELLOW,
98 ACT_RED = RTE_COLOR_RED,
111 /* Configuration for task that is only used during startup. */
113 struct task_base *tbase;
114 struct task_init* task_init;
115 struct rte_mempool *pool;
116 char pool_name[MAX_NAME_SIZE];
117 struct lcore_cfg *lconf;
120 uint32_t nb_cache_mbuf;
121 uint8_t nb_slave_threads;
122 uint8_t nb_worker_threads;
123 uint8_t worker_thread_id;
126 struct core_task_set core_task_set[MAX_PROTOCOLS];
127 struct task_args *prev_tasks[MAX_RINGS_PER_TASK];
128 uint32_t n_prev_tasks;
129 uint32_t ring_size; /* default is RX_RING_SIZE */
130 struct qos_cfg qos_conf;
132 uint32_t runtime_flags;
138 uint32_t byte_offset;
139 uint32_t ipv6_router;
140 uint32_t gateway_ipv4;
142 uint32_t remote_ipv4;
143 uint32_t local_prefix;
144 uint32_t reachable_timeout;
145 uint32_t arp_ndp_retransmit_timeout;
146 struct ipv6_addr local_ipv6; /* For IPv6 Tunnel, it's the local tunnel endpoint address */
147 struct ipv6_addr global_ipv6;
148 struct ipv6_addr gateway_ipv6;
149 struct ipv6_addr router_prefix;
150 struct rte_ring *rx_rings[MAX_RINGS_PER_TASK];
151 struct rte_ring *tx_rings[MAX_RINGS_PER_TASK];
152 struct rte_ring *ctrl_plane_ring;
153 uint32_t tot_n_txrings_inited;
154 prox_rte_ether_addr edaddr;
155 prox_rte_ether_addr esaddr;
156 struct port_queue tx_port_queue[PROX_MAX_PORTS];
157 struct port_queue rx_port_queue[PROX_MAX_PORTS];
158 /* Used to set up actual task at initialization time. */
160 /* Destination output position in hw or sw when using mac learned dest port. */
161 uint8_t mapping[PROX_MAX_PORTS];
162 struct rte_table_hash *cpe_table;
163 struct rte_table_hash *qinq_gre_table;
164 struct rte_hash *cpe_gre_hash;
165 struct rte_hash *qinq_gre_hash;
166 struct cpe_data *cpe_data;
167 struct cpe_gre_data *cpe_gre_data;
168 struct qinq_gre_data *qinq_gre_data;
170 struct task_args *tx_opt_ring_task;
173 #ifdef ENABLE_EXTRA_USER_STATISTICS
174 uint32_t n_users; // Number of users in user table.
176 uint32_t n_flows; // Number of flows used in policing
183 enum police_action police_act[3][3];
185 uint32_t n_max_rules;
186 uint32_t random_delay_us;
188 uint32_t cpe_table_timeout_ms;
191 uint32_t tb_rate; /**< Pipe token bucket rate (measured in bytes per second) */
192 uint32_t tb_size; /**< Pipe token bucket size (measured in credits) */
194 uint8_t tunnel_hop_limit; /* IPv6 Tunnel - Hop limit */
195 uint16_t lookup_port_mask; /* Ipv6 Tunnel - Mask applied to UDP/TCP port before lookup */
197 uint8_t lb_friend_core;
198 uint8_t lb_friend_task;
203 uint32_t rand_offset[64];
204 char rand_str[64][64];
205 struct range range[64];
208 uint32_t flow_id_pos;
209 uint32_t packet_id_in_flow_pos;
214 uint32_t packet_id_pos;
215 uint32_t latency_buffer_size;
216 uint32_t bucket_size;
217 uint32_t lat_enabled;
219 uint8_t pkt_inline[MAX_PKT_SIZE];
220 uint32_t probability_no_drop;
221 uint32_t probability_duplicate;
222 uint32_t probability_delay;
225 char route_table[256];
228 char tun_bindings[256];
229 char cpe_table_name[256];
230 char user_table[256];
231 uint32_t n_concur_conn;
233 uint32_t min_bulk_size;
234 uint32_t max_bulk_size;
235 uint32_t max_setup_rate;
238 uint32_t flow_table_size;
239 char dpi_engine_path[256];
240 char dpi_engine_args[16][256];
241 uint32_t n_dpi_engine_args;
242 uint32_t generator_id;
243 uint32_t accuracy_limit_nsec;
245 uint32_t public_ip_count;
246 struct public_ip_config_info *public_ip_config_info;
247 struct public_entry *public_entries;
248 struct private_flow_entry *private_flow_entries;
249 struct rte_hash *public_ip_port_hash;
250 struct rte_hash *private_ip_port_hash;
251 struct rte_hash *private_ip_hash;
252 struct private_ip_info *private_ip_info;
253 struct rte_ring **ctrl_rx_rings;
254 struct rte_ring **ctrl_tx_rings;
257 struct task_base *tmaster;
258 char sub_mode_str[PROX_MODE_LEN];
259 uint32_t igmp_address;
260 uint32_t imix_nb_pkts;
261 uint32_t imix_pkt_sizes[MAX_IMIX_PKTS];
263 uint32_t mirror_size;
265 uint32_t loss_buffer_size;
268 /* Return the first port that is reachable through the task. If the
269 task itself does not send directly to a port, the function will
270 search reachable tasks through each outgoing ring */
271 struct task_args *find_reachable_task_sending_to_port(struct task_args *from);
272 struct prox_port_cfg *find_reachable_port(struct task_args *from);
274 struct task_base *init_task_struct(struct task_args *targ);
275 struct task_init *to_task_init(const char *mode_str, const char *sub_mode_str);
276 void tasks_list(void);
277 int task_is_master(struct task_args *targ);
279 void reg_task(struct task_init* t);
281 #endif /* _TASK_INIT_H_ */