7b74f92b3fab71e279c6380c5067895f0ab534eb
[dpdk.git] / examples / l2fwd-event / l2fwd_common.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #ifndef __L2FWD_COMMON_H__
6 #define __L2FWD_COMMON_H__
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <stdint.h>
12 #include <inttypes.h>
13 #include <sys/types.h>
14 #include <sys/queue.h>
15 #include <netinet/in.h>
16 #include <setjmp.h>
17 #include <stdarg.h>
18 #include <ctype.h>
19 #include <errno.h>
20 #include <getopt.h>
21 #include <signal.h>
22 #include <stdbool.h>
23
24 #include <rte_common.h>
25 #include <rte_malloc.h>
26 #include <rte_memory.h>
27 #include <rte_memcpy.h>
28 #include <rte_eal.h>
29 #include <rte_launch.h>
30 #include <rte_atomic.h>
31 #include <rte_cycles.h>
32 #include <rte_prefetch.h>
33 #include <rte_lcore.h>
34 #include <rte_per_lcore.h>
35 #include <rte_branch_prediction.h>
36 #include <rte_interrupts.h>
37 #include <rte_random.h>
38 #include <rte_debug.h>
39 #include <rte_ether.h>
40 #include <rte_ethdev.h>
41 #include <rte_eventdev.h>
42 #include <rte_mempool.h>
43 #include <rte_mbuf.h>
44 #include <rte_spinlock.h>
45
46 #define MAX_PKT_BURST 32
47 #define MAX_RX_QUEUE_PER_LCORE 16
48 #define MAX_TX_QUEUE_PER_PORT 16
49
50 #define RTE_TEST_RX_DESC_DEFAULT 1024
51 #define RTE_TEST_TX_DESC_DEFAULT 1024
52
53 #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
54 #define MEMPOOL_CACHE_SIZE 256
55
56 #define DEFAULT_TIMER_PERIOD    10 /* default period is 10 seconds */
57 #define MAX_TIMER_PERIOD        86400 /* 1 day max */
58
59 /* Per-port statistics struct */
60 struct l2fwd_port_statistics {
61         uint64_t dropped;
62         uint64_t tx;
63         uint64_t rx;
64 } __rte_cache_aligned;
65
66 struct l2fwd_resources {
67         volatile uint8_t force_quit;
68         uint8_t mac_updating;
69         uint8_t rx_queue_per_lcore;
70         uint16_t nb_rxd;
71         uint16_t nb_txd;
72         uint32_t enabled_port_mask;
73         uint64_t timer_period;
74         struct rte_mempool *pktmbuf_pool;
75         uint32_t dst_ports[RTE_MAX_ETHPORTS];
76         struct rte_ether_addr eth_addr[RTE_MAX_ETHPORTS];
77         struct l2fwd_port_statistics port_stats[RTE_MAX_ETHPORTS];
78         void *poll_rsrc;
79 } __rte_cache_aligned;
80
81 static __rte_always_inline void
82 l2fwd_mac_updating(struct rte_mbuf *m, uint32_t dest_port_id,
83                    struct rte_ether_addr *addr)
84 {
85         struct rte_ether_hdr *eth;
86         void *tmp;
87
88         eth = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
89
90         /* 02:00:00:00:00:xx */
91         tmp = &eth->d_addr.addr_bytes[0];
92         *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_port_id << 40);
93
94         /* src addr */
95         rte_ether_addr_copy(addr, &eth->s_addr);
96 }
97
98 static __rte_always_inline struct l2fwd_resources *
99 l2fwd_get_rsrc(void)
100 {
101         static const char name[RTE_MEMZONE_NAMESIZE] = "rsrc";
102         const struct rte_memzone *mz;
103
104         mz = rte_memzone_lookup(name);
105         if (mz != NULL)
106                 return mz->addr;
107
108         mz = rte_memzone_reserve(name, sizeof(struct l2fwd_resources), 0, 0);
109         if (mz != NULL) {
110                 struct l2fwd_resources *rsrc = mz->addr;
111
112                 memset(rsrc, 0, sizeof(struct l2fwd_resources));
113                 rsrc->mac_updating = true;
114                 rsrc->rx_queue_per_lcore = 1;
115                 rsrc->timer_period = 10 * rte_get_timer_hz();
116
117                 return mz->addr;
118         }
119
120         rte_panic("Unable to allocate memory for l2fwd resources\n");
121
122         return NULL;
123 }
124
125 int l2fwd_event_init_ports(struct l2fwd_resources *rsrc);
126
127 #endif /* __L2FWD_COMMON_H__ */