13395610eSKonstantin Ananyev/*
23395610eSKonstantin Ananyev * Copyright (c) 2016  Intel Corporation.
33395610eSKonstantin Ananyev * Licensed under the Apache License, Version 2.0 (the "License");
43395610eSKonstantin Ananyev * you may not use this file except in compliance with the License.
53395610eSKonstantin Ananyev * You may obtain a copy of the License at:
63395610eSKonstantin Ananyev *
73395610eSKonstantin Ananyev *     http://www.apache.org/licenses/LICENSE-2.0
83395610eSKonstantin Ananyev *
93395610eSKonstantin Ananyev * Unless required by applicable law or agreed to in writing, software
103395610eSKonstantin Ananyev * distributed under the License is distributed on an "AS IS" BASIS,
113395610eSKonstantin Ananyev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123395610eSKonstantin Ananyev * See the License for the specific language governing permissions and
133395610eSKonstantin Ananyev * limitations under the License.
143395610eSKonstantin Ananyev */
153395610eSKonstantin Ananyev
163395610eSKonstantin Ananyev#ifndef __NETBE_H__
173395610eSKonstantin Ananyev#define __NETBE_H__
183395610eSKonstantin Ananyev
193395610eSKonstantin Ananyev#include <stdint.h>
203395610eSKonstantin Ananyev#include <stddef.h>
213395610eSKonstantin Ananyev#include <inttypes.h>
223395610eSKonstantin Ananyev#include <getopt.h>
233395610eSKonstantin Ananyev#include <arpa/inet.h>
243395610eSKonstantin Ananyev#include <assert.h>
253395610eSKonstantin Ananyev#include <signal.h>
263395610eSKonstantin Ananyev
273395610eSKonstantin Ananyev#include <rte_config.h>
283395610eSKonstantin Ananyev#include <rte_common.h>
293395610eSKonstantin Ananyev#include <rte_eal.h>
303395610eSKonstantin Ananyev#include <rte_lcore.h>
313395610eSKonstantin Ananyev#include <rte_ethdev.h>
323395610eSKonstantin Ananyev#include <rte_kvargs.h>
333395610eSKonstantin Ananyev#include <rte_errno.h>
343395610eSKonstantin Ananyev#include <rte_malloc.h>
353395610eSKonstantin Ananyev#include <rte_cycles.h>
363395610eSKonstantin Ananyev#include <rte_lpm.h>
373395610eSKonstantin Ananyev#include <rte_lpm6.h>
383395610eSKonstantin Ananyev#include <rte_hash.h>
393395610eSKonstantin Ananyev#include <rte_ip.h>
403395610eSKonstantin Ananyev#include <rte_ip_frag.h>
41aa97dd1cSKonstantin Ananyev#include <rte_tcp.h>
423395610eSKonstantin Ananyev#include <rte_udp.h>
43aa97dd1cSKonstantin Ananyev#include <tle_tcp.h>
44aa97dd1cSKonstantin Ananyev#include <tle_udp.h>
453395610eSKonstantin Ananyev#include <tle_event.h>
463395610eSKonstantin Ananyev
47e151ee29SRemy Horton#define TLE_DEFAULT_MSS 536
48e151ee29SRemy Horton
493395610eSKonstantin Ananyev#define	MAX_PKT_BURST	0x20
503395610eSKonstantin Ananyev
518ae38dfbSMohammad Abdul Awal/* Used to allocate the memory for hash key. */
528ae38dfbSMohammad Abdul Awal#define RSS_HASH_KEY_LENGTH 64
538ae38dfbSMohammad Abdul Awal
54aa97dd1cSKonstantin Ananyev/*
55aa97dd1cSKonstantin Ananyev * global variables
56aa97dd1cSKonstantin Ananyev */
57aa97dd1cSKonstantin Ananyev
58aa97dd1cSKonstantin Ananyevenum {
59aa97dd1cSKonstantin Ananyev	VERBOSE_NONE = 0,
60aa97dd1cSKonstantin Ananyev	VERBOSE_NUM = 9
61aa97dd1cSKonstantin Ananyev};
62aa97dd1cSKonstantin Ananyev
63aa97dd1cSKonstantin Ananyevextern int verbose;
64aa97dd1cSKonstantin Ananyev
653395610eSKonstantin Ananyev/*
663395610eSKonstantin Ananyev * BE related structures.
673395610eSKonstantin Ananyev */
683395610eSKonstantin Ananyev
693395610eSKonstantin Ananyevstruct netbe_port {
703395610eSKonstantin Ananyev	uint32_t id;
718ae38dfbSMohammad Abdul Awal	uint32_t nb_lcore;
72aa97dd1cSKonstantin Ananyev	uint32_t *lcore_id;
733395610eSKonstantin Ananyev	uint32_t mtu;
745c795f7bSKonstantin Ananyev	uint64_t rx_offload;
755c795f7bSKonstantin Ananyev	uint64_t tx_offload;
763395610eSKonstantin Ananyev	uint32_t ipv4;
773395610eSKonstantin Ananyev	struct in6_addr ipv6;
783395610eSKonstantin Ananyev	struct ether_addr mac;
798ae38dfbSMohammad Abdul Awal	uint32_t hash_key_size;
808ae38dfbSMohammad Abdul Awal	uint8_t hash_key[RSS_HASH_KEY_LENGTH];
813395610eSKonstantin Ananyev};
823395610eSKonstantin Ananyev
833395610eSKonstantin Ananyevstruct netbe_dest {
843395610eSKonstantin Ananyev	uint32_t line;
853395610eSKonstantin Ananyev	uint32_t port;
863395610eSKonstantin Ananyev	uint32_t mtu;
873395610eSKonstantin Ananyev	uint32_t prfx;
883395610eSKonstantin Ananyev	uint16_t family;
893395610eSKonstantin Ananyev	union {
903395610eSKonstantin Ananyev		struct in_addr ipv4;
913395610eSKonstantin Ananyev		struct in6_addr ipv6;
923395610eSKonstantin Ananyev	};
933395610eSKonstantin Ananyev	struct ether_addr mac;
943395610eSKonstantin Ananyev};
953395610eSKonstantin Ananyev
963395610eSKonstantin Ananyevstruct netbe_dest_prm {
973395610eSKonstantin Ananyev	uint32_t nb_dest;
983395610eSKonstantin Ananyev	struct netbe_dest *dest;
993395610eSKonstantin Ananyev};
1003395610eSKonstantin Ananyev
1013395610eSKonstantin Ananyevstruct pkt_buf {
1023395610eSKonstantin Ananyev	uint32_t num;
1033395610eSKonstantin Ananyev	struct rte_mbuf *pkt[2 * MAX_PKT_BURST];
1043395610eSKonstantin Ananyev};
1053395610eSKonstantin Ananyev
1063395610eSKonstantin Ananyevstruct netbe_dev {
1073395610eSKonstantin Ananyev	uint16_t rxqid;
1083395610eSKonstantin Ananyev	uint16_t txqid;
1093395610eSKonstantin Ananyev	struct netbe_port port;
110aa97dd1cSKonstantin Ananyev	struct tle_dev *dev;
1113395610eSKonstantin Ananyev	struct {
1123395610eSKonstantin Ananyev		uint64_t in;
1133395610eSKonstantin Ananyev		uint64_t up;
1143395610eSKonstantin Ananyev		uint64_t drop;
1153395610eSKonstantin Ananyev	} rx_stat;
1163395610eSKonstantin Ananyev	struct {
1173395610eSKonstantin Ananyev		uint64_t down;
1183395610eSKonstantin Ananyev		uint64_t out;
1193395610eSKonstantin Ananyev		uint64_t drop;
1203395610eSKonstantin Ananyev	} tx_stat;
1213395610eSKonstantin Ananyev	struct pkt_buf tx_buf;
122aa97dd1cSKonstantin Ananyev	struct pkt_buf arp_buf;
1233395610eSKonstantin Ananyev};
1243395610eSKonstantin Ananyev
1253395610eSKonstantin Ananyev/* 8 bit LPM user data. */
1263395610eSKonstantin Ananyev#define	LCORE_MAX_DST	(UINT8_MAX + 1)
1273395610eSKonstantin Ananyev
1283395610eSKonstantin Ananyevstruct netbe_lcore {
1293395610eSKonstantin Ananyev	uint32_t id;
130aa97dd1cSKonstantin Ananyev	uint32_t proto; /**< L4 proto to handle. */
1313395610eSKonstantin Ananyev	struct rte_lpm *lpm4;
1323395610eSKonstantin Ananyev	struct rte_lpm6 *lpm6;
1333395610eSKonstantin Ananyev	struct rte_ip_frag_tbl *ftbl;
134aa97dd1cSKonstantin Ananyev	struct tle_ctx *ctx;
1358ae38dfbSMohammad Abdul Awal	uint32_t prtq_num;
1363395610eSKonstantin Ananyev	uint32_t dst4_num;
1373395610eSKonstantin Ananyev	uint32_t dst6_num;
138258f299aSMohammad Abdul Awal	struct netbe_dev *prtq;
139aa97dd1cSKonstantin Ananyev	struct tle_dest dst4[LCORE_MAX_DST];
140aa97dd1cSKonstantin Ananyev	struct tle_dest dst6[LCORE_MAX_DST];
1413395610eSKonstantin Ananyev	struct rte_ip_frag_death_row death_row;
142aa97dd1cSKonstantin Ananyev	struct {
143aa97dd1cSKonstantin Ananyev		uint64_t flags[UINT8_MAX + 1];
144aa97dd1cSKonstantin Ananyev	} tcp_stat;
1453395610eSKonstantin Ananyev};
1463395610eSKonstantin Ananyev
1473395610eSKonstantin Ananyevstruct netbe_cfg {
1483395610eSKonstantin Ananyev	uint32_t promisc;
149aa97dd1cSKonstantin Ananyev	uint32_t proto;
150aa97dd1cSKonstantin Ananyev	uint32_t server;
151aa97dd1cSKonstantin Ananyev	uint32_t arp;
1523395610eSKonstantin Ananyev	uint32_t prt_num;
1533395610eSKonstantin Ananyev	uint32_t cpu_num;
15474a56517SMariusz Drost	uint32_t mpool_buf_num;
155258f299aSMohammad Abdul Awal	struct netbe_port *prt;
156258f299aSMohammad Abdul Awal	struct netbe_lcore *cpu;
1573395610eSKonstantin Ananyev};
1583395610eSKonstantin Ananyev
1593395610eSKonstantin Ananyev/*
1603395610eSKonstantin Ananyev * FE related structures.
1613395610eSKonstantin Ananyev */
1623395610eSKonstantin Ananyev
1633395610eSKonstantin Ananyevenum {
1643395610eSKonstantin Ananyev	RXONLY,
1653395610eSKonstantin Ananyev	TXONLY,
1663395610eSKonstantin Ananyev	RXTX,
167e151ee29SRemy Horton	ECHO,
1683395610eSKonstantin Ananyev	FWD,
1693395610eSKonstantin Ananyev};
1703395610eSKonstantin Ananyev
1713395610eSKonstantin Ananyevstruct netfe_sprm {
1723395610eSKonstantin Ananyev	uint32_t bidx;  /* BE index to use. */
173aa97dd1cSKonstantin Ananyev	struct sockaddr_storage local_addr;  /**< stream local address. */
174aa97dd1cSKonstantin Ananyev	struct sockaddr_storage remote_addr; /**< stream remote address. */
1753395610eSKonstantin Ananyev};
1763395610eSKonstantin Ananyev
1773395610eSKonstantin Ananyevstruct netfe_stream_prm {
1783395610eSKonstantin Ananyev	uint32_t lcore;
179aa97dd1cSKonstantin Ananyev	uint32_t belcore;
180aa97dd1cSKonstantin Ananyev	uint16_t line;
1813395610eSKonstantin Ananyev	uint16_t op;
182e151ee29SRemy Horton	uint32_t txlen; /* valid/used only for TXONLY op. */
183e151ee29SRemy Horton	uint32_t rxlen; /* Used by RXTX */
1843395610eSKonstantin Ananyev	struct netfe_sprm sprm;
1853395610eSKonstantin Ananyev	struct netfe_sprm fprm;  /* valid/used only for FWD op. */
1863395610eSKonstantin Ananyev};
1873395610eSKonstantin Ananyev
1883395610eSKonstantin Ananyevstruct netfe_lcore_prm {
1893395610eSKonstantin Ananyev	uint32_t max_streams;
1903395610eSKonstantin Ananyev	uint32_t nb_streams;
1913395610eSKonstantin Ananyev	struct netfe_stream_prm *stream;
1923395610eSKonstantin Ananyev};
1933395610eSKonstantin Ananyev
1943395610eSKonstantin Ananyevstruct netfe_stream {
195aa97dd1cSKonstantin Ananyev	struct tle_stream *s;
196aa97dd1cSKonstantin Ananyev	struct tle_event *erev;
1973395610eSKonstantin Ananyev	struct tle_event *rxev;
1983395610eSKonstantin Ananyev	struct tle_event *txev;
1993395610eSKonstantin Ananyev	uint16_t op;
200aa97dd1cSKonstantin Ananyev	uint16_t proto;
2013395610eSKonstantin Ananyev	uint16_t family;
202e151ee29SRemy Horton	uint32_t txlen;
203e151ee29SRemy Horton	uint32_t rxlen;
204e151ee29SRemy Horton	uint16_t reply_count;
205e151ee29SRemy Horton	uint32_t rx_run_len;
20621e7392fSKonstantin Ananyev	uint16_t posterr; /* # of time error event handling was postponed */
2073395610eSKonstantin Ananyev	struct {
2083395610eSKonstantin Ananyev		uint64_t rxp;
209aa97dd1cSKonstantin Ananyev		uint64_t rxb;
2103395610eSKonstantin Ananyev		uint64_t txp;
211aa97dd1cSKonstantin Ananyev		uint64_t txb;
2123395610eSKonstantin Ananyev		uint64_t fwp;
2133395610eSKonstantin Ananyev		uint64_t drops;
2143395610eSKonstantin Ananyev		uint64_t rxev[TLE_SEV_NUM];
2153395610eSKonstantin Ananyev		uint64_t txev[TLE_SEV_NUM];
216aa97dd1cSKonstantin Ananyev		uint64_t erev[TLE_SEV_NUM];
2173395610eSKonstantin Ananyev	} stat;
2183395610eSKonstantin Ananyev	struct pkt_buf pbuf;
219aa97dd1cSKonstantin Ananyev	struct sockaddr_storage laddr;
2203395610eSKonstantin Ananyev	struct sockaddr_storage raddr;
2213395610eSKonstantin Ananyev	struct netfe_sprm fwdprm;
222aa97dd1cSKonstantin Ananyev	struct netfe_stream *fwds;
223aa97dd1cSKonstantin Ananyev	LIST_ENTRY(netfe_stream) link;
224aa97dd1cSKonstantin Ananyev};
225aa97dd1cSKonstantin Ananyev
226aa97dd1cSKonstantin Ananyevstruct netfe_stream_list {
227aa97dd1cSKonstantin Ananyev	uint32_t num;
228aa97dd1cSKonstantin Ananyev	LIST_HEAD(, netfe_stream) head;
2293395610eSKonstantin Ananyev};
2303395610eSKonstantin Ananyev
2313395610eSKonstantin Ananyevstruct netfe_lcore {
2323395610eSKonstantin Ananyev	uint32_t snum;  /* max number of streams */
233aa97dd1cSKonstantin Ananyev	struct tle_evq *syneq;
234aa97dd1cSKonstantin Ananyev	struct tle_evq *ereq;
2353395610eSKonstantin Ananyev	struct tle_evq *rxeq;
2363395610eSKonstantin Ananyev	struct tle_evq *txeq;
2373395610eSKonstantin Ananyev	struct rte_hash *fw4h;
2383395610eSKonstantin Ananyev	struct rte_hash *fw6h;
239aa97dd1cSKonstantin Ananyev	struct {
240aa97dd1cSKonstantin Ananyev		uint64_t acc;
241aa97dd1cSKonstantin Ananyev		uint64_t rej;
242aa97dd1cSKonstantin Ananyev		uint64_t ter;
243aa97dd1cSKonstantin Ananyev	} tcp_stat;
244aa97dd1cSKonstantin Ananyev	struct netfe_stream_list free;
245aa97dd1cSKonstantin Ananyev	struct netfe_stream_list use;
2463395610eSKonstantin Ananyev};
2473395610eSKonstantin Ananyev
24850926229SKonstantin Ananyevstruct lcore_prm {
24950926229SKonstantin Ananyev	struct {
25050926229SKonstantin Ananyev		struct netbe_lcore *lc;
25150926229SKonstantin Ananyev	} be;
25250926229SKonstantin Ananyev	struct netfe_lcore_prm fe;
25350926229SKonstantin Ananyev};
25450926229SKonstantin Ananyev
2553726dc50SKonstantin Ananyevstruct tx_content {
2563726dc50SKonstantin Ananyev	size_t sz;
2573726dc50SKonstantin Ananyev	uint8_t *data;
2583726dc50SKonstantin Ananyev};
2593726dc50SKonstantin Ananyev
2603726dc50SKonstantin Ananyevextern struct tx_content tx_content;
2613726dc50SKonstantin Ananyev
2623395610eSKonstantin Ananyev/*
2633395610eSKonstantin Ananyev * debug/trace macros.
2643395610eSKonstantin Ananyev */
2653395610eSKonstantin Ananyev
2663395610eSKonstantin Ananyev#define	DUMMY_MACRO	do {} while (0)
2673395610eSKonstantin Ananyev
2683395610eSKonstantin Ananyev#ifdef NETFE_DEBUG
2693395610eSKonstantin Ananyev#define	NETFE_TRACE(fmt, arg...)	printf(fmt, ##arg)
2703395610eSKonstantin Ananyev#define	NETFE_PKT_DUMP(p)		rte_pktmbuf_dump(stdout, (p), 64)
2713395610eSKonstantin Ananyev#else
2723395610eSKonstantin Ananyev#define	NETFE_TRACE(fmt, arg...)	DUMMY_MACRO
2733395610eSKonstantin Ananyev#define	NETFE_PKT_DUMP(p)		DUMMY_MACRO
2743395610eSKonstantin Ananyev#endif
2753395610eSKonstantin Ananyev
2763395610eSKonstantin Ananyev#ifdef NETBE_DEBUG
2773395610eSKonstantin Ananyev#define	NETBE_TRACE(fmt, arg...)	printf(fmt, ##arg)
2783395610eSKonstantin Ananyev#define	NETBE_PKT_DUMP(p)		rte_pktmbuf_dump(stdout, (p), 64)
2793395610eSKonstantin Ananyev#else
2803395610eSKonstantin Ananyev#define	NETBE_TRACE(fmt, arg...)	DUMMY_MACRO
2813395610eSKonstantin Ananyev#define	NETBE_PKT_DUMP(p)		DUMMY_MACRO
2823395610eSKonstantin Ananyev#endif
2833395610eSKonstantin Ananyev
2843395610eSKonstantin Ananyev#define FUNC_STAT(v, c) do { \
2853395610eSKonstantin Ananyev	static uint64_t nb_call, nb_data; \
2863395610eSKonstantin Ananyev	nb_call++; \
2873395610eSKonstantin Ananyev	nb_data += (v); \
2883395610eSKonstantin Ananyev	if ((nb_call & ((c) - 1)) == 0) { \
2893395610eSKonstantin Ananyev		printf("%s#%d@%u: nb_call=%lu, avg(" #v ")=%#Lf\n", \
2903395610eSKonstantin Ananyev			__func__, __LINE__, rte_lcore_id(), nb_call, \
2913395610eSKonstantin Ananyev			(long double)nb_data / nb_call); \
2923395610eSKonstantin Ananyev		nb_call = 0; \
2933395610eSKonstantin Ananyev		nb_data = 0; \
2943395610eSKonstantin Ananyev	} \
2953395610eSKonstantin Ananyev} while (0)
2963395610eSKonstantin Ananyev
2973395610eSKonstantin Ananyev#define FUNC_TM_STAT(v, c) do { \
2983395610eSKonstantin Ananyev	static uint64_t nb_call, nb_data; \
2993395610eSKonstantin Ananyev	static uint64_t cts, pts, sts; \
3003395610eSKonstantin Ananyev	cts = rte_rdtsc(); \
3013395610eSKonstantin Ananyev	if (pts != 0) \
3023395610eSKonstantin Ananyev		sts += cts - pts; \
3033395610eSKonstantin Ananyev	pts = cts; \
3043395610eSKonstantin Ananyev	nb_call++; \
3053395610eSKonstantin Ananyev	nb_data += (v); \
3063395610eSKonstantin Ananyev	if ((nb_call & ((c) - 1)) == 0) { \
3073395610eSKonstantin Ananyev		printf("%s#%d@%u: nb_call=%lu, " \
3083395610eSKonstantin Ananyev			"avg(" #v ")=%#Lf, " \
3093395610eSKonstantin Ananyev			"avg(cycles)=%#Lf, " \
3103395610eSKonstantin Ananyev			"avg(cycles/" #v ")=%#Lf\n", \
3113395610eSKonstantin Ananyev			__func__, __LINE__, rte_lcore_id(), nb_call, \
3123395610eSKonstantin Ananyev			(long double)nb_data / nb_call, \
3133395610eSKonstantin Ananyev			(long double)sts / nb_call, \
3143395610eSKonstantin Ananyev			(long double)sts / nb_data); \
3153395610eSKonstantin Ananyev		nb_call = 0; \
3163395610eSKonstantin Ananyev		nb_data = 0; \
3173395610eSKonstantin Ananyev		sts = 0; \
3183395610eSKonstantin Ananyev	} \
3193395610eSKonstantin Ananyev} while (0)
3203395610eSKonstantin Ananyev
3218ae38dfbSMohammad Abdul Awalint setup_rx_cb(const struct netbe_port *uprt, struct netbe_lcore *lc,
322aa97dd1cSKonstantin Ananyev	uint16_t qid, uint32_t arp);
323aa97dd1cSKonstantin Ananyev
324aa97dd1cSKonstantin Ananyev/*
325aa97dd1cSKonstantin Ananyev * application function pointers
326aa97dd1cSKonstantin Ananyev */
327aa97dd1cSKonstantin Ananyev
328aa97dd1cSKonstantin Ananyevtypedef int (*LCORE_MAIN_FUNCTYPE)(void *arg);
329aa97dd1cSKonstantin Ananyev
330aa97dd1cSKonstantin Ananyev/*
331aa97dd1cSKonstantin Ananyev * tle_l4p lib function pointers
332aa97dd1cSKonstantin Ananyev */
333aa97dd1cSKonstantin Ananyev
334aa97dd1cSKonstantin Ananyevtypedef uint16_t (*TLE_RX_BULK_FUNCTYPE)
335aa97dd1cSKonstantin Ananyev	(struct tle_dev *dev, struct rte_mbuf *pkt[],
336aa97dd1cSKonstantin Ananyev	struct rte_mbuf *rp[], int32_t rc[], uint16_t num);
337aa97dd1cSKonstantin Ananyev
338aa97dd1cSKonstantin Ananyevtypedef uint16_t (*TLE_TX_BULK_FUNCTYPE)
339aa97dd1cSKonstantin Ananyev	(struct tle_dev *dev, struct rte_mbuf *pkt[], uint16_t num);
340aa97dd1cSKonstantin Ananyev
341aa97dd1cSKonstantin Ananyevtypedef uint16_t (*TLE_STREAM_RECV_FUNCTYPE)
342aa97dd1cSKonstantin Ananyev	(struct tle_stream *ts, struct rte_mbuf *pkt[], uint16_t num);
343aa97dd1cSKonstantin Ananyev
344aa97dd1cSKonstantin Ananyevtypedef int (*TLE_STREAM_CLOSE_FUNCTYPE)(struct tle_stream *s);
3453395610eSKonstantin Ananyev
3463395610eSKonstantin Ananyev#endif /* __NETBE_H__ */
347