1
2
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
54#define MEMPOOL_CACHE_SIZE 256
55
56#define DEFAULT_TIMER_PERIOD 10
57#define MAX_TIMER_PERIOD 86400
58
59
60struct l2fwd_port_statistics {
61 uint64_t dropped;
62 uint64_t tx;
63 uint64_t rx;
64} __rte_cache_aligned;
65
66struct l2fwd_resources {
67 volatile uint8_t force_quit;
68 uint8_t event_mode;
69 uint8_t sched_type;
70 uint8_t mac_updating;
71 uint8_t rx_queue_per_lcore;
72 bool port_pairs;
73 uint16_t nb_rxd;
74 uint16_t nb_txd;
75 uint32_t enabled_port_mask;
76 uint64_t timer_period;
77 struct rte_mempool *pktmbuf_pool;
78 uint32_t dst_ports[RTE_MAX_ETHPORTS];
79 struct rte_ether_addr eth_addr[RTE_MAX_ETHPORTS];
80 struct l2fwd_port_statistics port_stats[RTE_MAX_ETHPORTS];
81 void *evt_rsrc;
82 void *poll_rsrc;
83} __rte_cache_aligned;
84
85static __rte_always_inline void
86l2fwd_mac_updating(struct rte_mbuf *m, uint32_t dest_port_id,
87 struct rte_ether_addr *addr)
88{
89 struct rte_ether_hdr *eth;
90 void *tmp;
91
92 eth = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
93
94
95 tmp = ð->d_addr.addr_bytes[0];
96 *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_port_id << 40);
97
98
99 rte_ether_addr_copy(addr, ð->s_addr);
100}
101
102static __rte_always_inline struct l2fwd_resources *
103l2fwd_get_rsrc(void)
104{
105 static const char name[RTE_MEMZONE_NAMESIZE] = "rsrc";
106 const struct rte_memzone *mz;
107
108 mz = rte_memzone_lookup(name);
109 if (mz != NULL)
110 return mz->addr;
111
112 mz = rte_memzone_reserve(name, sizeof(struct l2fwd_resources), 0, 0);
113 if (mz != NULL) {
114 struct l2fwd_resources *rsrc = mz->addr;
115
116 memset(rsrc, 0, sizeof(struct l2fwd_resources));
117 rsrc->mac_updating = true;
118 rsrc->event_mode = true;
119 rsrc->rx_queue_per_lcore = 1;
120 rsrc->sched_type = RTE_SCHED_TYPE_ATOMIC;
121 rsrc->timer_period = 10 * rte_get_timer_hz();
122
123 return mz->addr;
124 }
125
126 rte_panic("Unable to allocate memory for l2fwd resources\n");
127
128 return NULL;
129}
130
131int l2fwd_event_init_ports(struct l2fwd_resources *rsrc);
132
133#endif
134