xref: /dpdk/examples/l2fwd-event/l2fwd_common.h (revision 92e68d9c97730ede6539d8f4c5748065aae96134)
14ff45798SPavan Nikhilesh /* SPDX-License-Identifier: BSD-3-Clause
24ff45798SPavan Nikhilesh  * Copyright(C) 2019 Marvell International Ltd.
34ff45798SPavan Nikhilesh  */
44ff45798SPavan Nikhilesh 
54ff45798SPavan Nikhilesh #ifndef __L2FWD_COMMON_H__
64ff45798SPavan Nikhilesh #define __L2FWD_COMMON_H__
74ff45798SPavan Nikhilesh 
84ff45798SPavan Nikhilesh #include <stdio.h>
94ff45798SPavan Nikhilesh #include <stdlib.h>
104ff45798SPavan Nikhilesh #include <string.h>
114ff45798SPavan Nikhilesh #include <stdint.h>
124ff45798SPavan Nikhilesh #include <inttypes.h>
134ff45798SPavan Nikhilesh #include <sys/types.h>
144ff45798SPavan Nikhilesh #include <sys/queue.h>
154ff45798SPavan Nikhilesh #include <netinet/in.h>
164ff45798SPavan Nikhilesh #include <setjmp.h>
174ff45798SPavan Nikhilesh #include <stdarg.h>
184ff45798SPavan Nikhilesh #include <ctype.h>
194ff45798SPavan Nikhilesh #include <errno.h>
204ff45798SPavan Nikhilesh #include <getopt.h>
214ff45798SPavan Nikhilesh #include <signal.h>
224ff45798SPavan Nikhilesh #include <stdbool.h>
234ff45798SPavan Nikhilesh 
244ff45798SPavan Nikhilesh #include <rte_common.h>
254ff45798SPavan Nikhilesh #include <rte_malloc.h>
264ff45798SPavan Nikhilesh #include <rte_memory.h>
274ff45798SPavan Nikhilesh #include <rte_memcpy.h>
284ff45798SPavan Nikhilesh #include <rte_eal.h>
294ff45798SPavan Nikhilesh #include <rte_launch.h>
304ff45798SPavan Nikhilesh #include <rte_cycles.h>
314ff45798SPavan Nikhilesh #include <rte_prefetch.h>
324ff45798SPavan Nikhilesh #include <rte_lcore.h>
334ff45798SPavan Nikhilesh #include <rte_per_lcore.h>
344ff45798SPavan Nikhilesh #include <rte_branch_prediction.h>
354ff45798SPavan Nikhilesh #include <rte_interrupts.h>
364ff45798SPavan Nikhilesh #include <rte_random.h>
374ff45798SPavan Nikhilesh #include <rte_debug.h>
384ff45798SPavan Nikhilesh #include <rte_ether.h>
394ff45798SPavan Nikhilesh #include <rte_ethdev.h>
404ff45798SPavan Nikhilesh #include <rte_eventdev.h>
414ff45798SPavan Nikhilesh #include <rte_mempool.h>
424ff45798SPavan Nikhilesh #include <rte_mbuf.h>
434ff45798SPavan Nikhilesh #include <rte_spinlock.h>
444ff45798SPavan Nikhilesh 
454ff45798SPavan Nikhilesh #define MAX_PKT_BURST 32
464ff45798SPavan Nikhilesh #define MAX_RX_QUEUE_PER_LCORE 16
474ff45798SPavan Nikhilesh #define MAX_TX_QUEUE_PER_PORT 16
484ff45798SPavan Nikhilesh 
494ed89049SDavid Marchand #define RX_DESC_DEFAULT 1024
504ed89049SDavid Marchand #define TX_DESC_DEFAULT 1024
514ff45798SPavan Nikhilesh 
524ff45798SPavan Nikhilesh #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
534ff45798SPavan Nikhilesh #define MEMPOOL_CACHE_SIZE 256
544ff45798SPavan Nikhilesh 
554ff45798SPavan Nikhilesh #define DEFAULT_TIMER_PERIOD	10 /* default period is 10 seconds */
564ff45798SPavan Nikhilesh #define MAX_TIMER_PERIOD	86400 /* 1 day max */
574ff45798SPavan Nikhilesh 
58796b07e9SShijith Thotton #define VECTOR_SIZE_DEFAULT   MAX_PKT_BURST
59796b07e9SShijith Thotton #define VECTOR_TMO_NS_DEFAULT 1E6 /* 1ms */
60796b07e9SShijith Thotton 
614ff45798SPavan Nikhilesh /* Per-port statistics struct */
627e06c0deSTyler Retzlaff struct __rte_cache_aligned l2fwd_port_statistics {
634ff45798SPavan Nikhilesh 	uint64_t dropped;
64*92e68d9cSTyler Retzlaff 	RTE_ATOMIC(uint64_t) tx;
65*92e68d9cSTyler Retzlaff 	RTE_ATOMIC(uint64_t) rx;
667e06c0deSTyler Retzlaff };
674ff45798SPavan Nikhilesh 
68796b07e9SShijith Thotton /* Event vector attributes */
69796b07e9SShijith Thotton struct l2fwd_event_vector_params {
70796b07e9SShijith Thotton 	uint8_t enabled;
71796b07e9SShijith Thotton 	uint16_t size;
72796b07e9SShijith Thotton 	uint64_t timeout_ns;
73796b07e9SShijith Thotton };
74796b07e9SShijith Thotton 
757e06c0deSTyler Retzlaff struct __rte_cache_aligned l2fwd_resources {
764ff45798SPavan Nikhilesh 	volatile uint8_t force_quit;
771b2143aaSPavan Nikhilesh 	uint8_t event_mode;
781b2143aaSPavan Nikhilesh 	uint8_t sched_type;
794ff45798SPavan Nikhilesh 	uint8_t mac_updating;
804ff45798SPavan Nikhilesh 	uint8_t rx_queue_per_lcore;
81092454d9SPavan Nikhilesh 	bool port_pairs;
824ff45798SPavan Nikhilesh 	uint16_t nb_rxd;
834ff45798SPavan Nikhilesh 	uint16_t nb_txd;
844ff45798SPavan Nikhilesh 	uint32_t enabled_port_mask;
854ff45798SPavan Nikhilesh 	uint64_t timer_period;
864ff45798SPavan Nikhilesh 	struct rte_mempool *pktmbuf_pool;
87796b07e9SShijith Thotton 	struct rte_mempool *evt_vec_pool;
884ff45798SPavan Nikhilesh 	uint32_t dst_ports[RTE_MAX_ETHPORTS];
894ff45798SPavan Nikhilesh 	struct rte_ether_addr eth_addr[RTE_MAX_ETHPORTS];
904ff45798SPavan Nikhilesh 	struct l2fwd_port_statistics port_stats[RTE_MAX_ETHPORTS];
91796b07e9SShijith Thotton 	struct l2fwd_event_vector_params evt_vec;
921b2143aaSPavan Nikhilesh 	void *evt_rsrc;
934ff45798SPavan Nikhilesh 	void *poll_rsrc;
947e06c0deSTyler Retzlaff };
954ff45798SPavan Nikhilesh 
964ff45798SPavan Nikhilesh static __rte_always_inline void
l2fwd_mac_updating(struct rte_mbuf * m,uint32_t dest_port_id,struct rte_ether_addr * addr)974ff45798SPavan Nikhilesh l2fwd_mac_updating(struct rte_mbuf *m, uint32_t dest_port_id,
984ff45798SPavan Nikhilesh 		   struct rte_ether_addr *addr)
994ff45798SPavan Nikhilesh {
1004ff45798SPavan Nikhilesh 	struct rte_ether_hdr *eth;
1014ff45798SPavan Nikhilesh 	void *tmp;
1024ff45798SPavan Nikhilesh 
1034ff45798SPavan Nikhilesh 	eth = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
1044ff45798SPavan Nikhilesh 
1054ff45798SPavan Nikhilesh 	/* 02:00:00:00:00:xx */
10604d43857SDmitry Kozlyuk 	tmp = &eth->dst_addr.addr_bytes[0];
1074ff45798SPavan Nikhilesh 	*((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_port_id << 40);
1084ff45798SPavan Nikhilesh 
1094ff45798SPavan Nikhilesh 	/* src addr */
11004d43857SDmitry Kozlyuk 	rte_ether_addr_copy(addr, &eth->src_addr);
1114ff45798SPavan Nikhilesh }
1124ff45798SPavan Nikhilesh 
1134ff45798SPavan Nikhilesh static __rte_always_inline struct l2fwd_resources *
l2fwd_get_rsrc(void)1144ff45798SPavan Nikhilesh l2fwd_get_rsrc(void)
1154ff45798SPavan Nikhilesh {
1164ff45798SPavan Nikhilesh 	static const char name[RTE_MEMZONE_NAMESIZE] = "rsrc";
1174ff45798SPavan Nikhilesh 	const struct rte_memzone *mz;
1184ff45798SPavan Nikhilesh 
1194ff45798SPavan Nikhilesh 	mz = rte_memzone_lookup(name);
1204ff45798SPavan Nikhilesh 	if (mz != NULL)
1214ff45798SPavan Nikhilesh 		return mz->addr;
1224ff45798SPavan Nikhilesh 
1234ff45798SPavan Nikhilesh 	mz = rte_memzone_reserve(name, sizeof(struct l2fwd_resources), 0, 0);
1244ff45798SPavan Nikhilesh 	if (mz != NULL) {
1254ff45798SPavan Nikhilesh 		struct l2fwd_resources *rsrc = mz->addr;
1264ff45798SPavan Nikhilesh 
1274ff45798SPavan Nikhilesh 		memset(rsrc, 0, sizeof(struct l2fwd_resources));
1284ff45798SPavan Nikhilesh 		rsrc->mac_updating = true;
129080f57bcSPavan Nikhilesh 		rsrc->event_mode = true;
1304ff45798SPavan Nikhilesh 		rsrc->rx_queue_per_lcore = 1;
1311b2143aaSPavan Nikhilesh 		rsrc->sched_type = RTE_SCHED_TYPE_ATOMIC;
1324ff45798SPavan Nikhilesh 		rsrc->timer_period = 10 * rte_get_timer_hz();
1334ff45798SPavan Nikhilesh 
1344ff45798SPavan Nikhilesh 		return mz->addr;
1354ff45798SPavan Nikhilesh 	}
1364ff45798SPavan Nikhilesh 
1374ff45798SPavan Nikhilesh 	rte_panic("Unable to allocate memory for l2fwd resources\n");
1384ff45798SPavan Nikhilesh 
1394ff45798SPavan Nikhilesh 	return NULL;
1404ff45798SPavan Nikhilesh }
1414ff45798SPavan Nikhilesh 
1424ff45798SPavan Nikhilesh int l2fwd_event_init_ports(struct l2fwd_resources *rsrc);
143622ebb6bSPavan Nikhilesh void l2fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t port_id,
144622ebb6bSPavan Nikhilesh 				struct rte_event events[], uint16_t nb_enq,
145622ebb6bSPavan Nikhilesh 				uint16_t nb_deq, uint8_t is_vector);
1464ff45798SPavan Nikhilesh 
1474ff45798SPavan Nikhilesh #endif /* __L2FWD_COMMON_H__ */
148