Front Haul Interface Library first seed code contribution
[o-du/phy.git] / fhi_lib / lib / ethernet / ethernet.h
1 /******************************************************************************
2 *
3 *   Copyright (c) 2019 Intel.
4 *
5 *   Licensed under the Apache License, Version 2.0 (the "License");
6 *   you may not use this file except in compliance with the License.
7 *   You may obtain a copy of the License at
8 *
9 *       http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *   Unless required by applicable law or agreed to in writing, software
12 *   distributed under the License is distributed on an "AS IS" BASIS,
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *   See the License for the specific language governing permissions and
15 *   limitations under the License.
16 *
17 *******************************************************************************/
18
19
20 /**
21  * @brief This file has all definitions for the Ethernet Data Interface Layer
22  * @file ethernet.h
23  * @ingroup group_lte_source_auxlib
24  * @author Intel Corporation
25  **/
26
27 #ifndef AUXLIB_ETHERNET_H
28 #define AUXLIB_ETHERNET_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include <rte_config.h>
35 #include <rte_ether.h>
36 #include <rte_mbuf.h>
37
38 #define BURST_SIZE 64
39
40 //#define VLAN_SUPPORT
41 #define FLEXRAN_UP_VLAN_TAG 2
42 #define ETHER_TYPE_ETHDI ETHER_TYPE_IPv4    /* hack needed for jumbo frames */
43 #define ETHER_TYPE_ECPRI 0xAEFE
44 #define ETHER_TYPE_SYNC 0xBEFE
45 #define ETHER_TYPE_START_TX 0xCEFE
46
47 #define NUM_MBUFS 262144
48 #define MBUF_CACHE 256
49
50 #define MBUF_POOL_ELM_SMALL 1500 /* regular ethernet MTU, most compatible */
51 #define MBUF_POOL_ELEMENT MAX_RX_LEN
52
53 #define MAX_RX_LEN 9600
54 #define MAX_TX_LEN (MAX_RX_LEN - 14) /* headroom for rx driver */
55 #define MAX_DATA_SIZE (MAX_TX_LEN - sizeof(struct ether_hdr) - \
56     sizeof(struct ethdi_hdr) - sizeof(struct burst_hdr))
57
58 /* Looks like mbuf size is limited to 16 bits - see the buf_len field. */
59 #define MBUF_POOL_ELM_BIG USHRT_MAX
60 #define NUM_MBUFS_BIG 64
61
62 #define DEFAULT_DUMP_LENGTH 96
63
64 extern struct rte_mempool *_eth_mbuf_pool;
65 extern struct rte_mempool *_eth_mbuf_pool_small;
66 extern struct rte_mempool *_eth_mbuf_pool_big;
67
68 /* Do NOT change the order of this enum and below
69  * - need to be in sync with the table of handlers in testue.c */
70 enum pkt_type
71 {
72     PKT_ZERO,
73     PKT_EMPTY,
74     PKT_DISCOVER_REQUEST,
75     PKT_PING,
76     PKT_PONG,
77     PKT_DISCOVER_REPLY,
78     PKT_LTE_DATA,
79     PKT_LTE_CONTROL,
80     PKT_BURST,
81     PKT_DATATEST,
82     PKT_ADD_ETHDEV,
83     PKT_SYNC_START,
84     PKT_LAST,
85 };
86
87 /* Do NOT change the order. */
88 static char * const xran_pkt_descriptions[PKT_LAST + 1] = {
89     "ZERO",
90     "empty packet",
91     "discovery request packet",
92     "ping packet",
93     "pong packet",
94     "discovery reply packet",
95     "LTE data packet",
96     "LTE control packet",
97     "BURST packet",
98     "DATATEST packet",
99     "Add ethernet port command packet",
100     "SYNC-START packet",
101     "LAST packet",
102 };
103
104 struct burst_hdr {
105     int8_t pkt_idx;
106     int8_t total_pkts;
107     int8_t original_type;
108     int8_t data[];
109 };
110
111 struct ethdi_hdr {
112     uint8_t pkt_type;
113     uint8_t source_id;
114     uint8_t dest_id;
115     int8_t data[];    /* original raw data starts here! */
116 };
117
118
119 void xran_init_mbuf_pool(void);
120
121 void xran_init_port(int port, struct ether_addr *p_lls_cu_addr);
122
123 void xran_add_eth_hdr_vlan(struct ether_addr *dst, uint16_t ethertype, struct rte_mbuf *mb, uint16_t vlan_tci);
124 int xran_send_mbuf(struct ether_addr *dst, struct rte_mbuf *mb);
125
126 int xran_send_message_burst(int dst_id, int pkt_type, void *body, int len);
127
128 void xran_memdump(void *addr, int len);
129
130 /*
131  * Print a message after all critical processing done.
132  * Mt-safe. 4 variants - normal, warning, error and debug log.
133  */
134
135 #define nlog(m, ...) 
136 #define delayed_message     /* this is the old alias for this function */
137 #define wlog(m, ...) 
138 #define elog(m, ...) 
139 #ifdef DEBUG
140 # define dlog(m, ...) 
141 #else
142 # define dlog(m, ...)
143 #endif
144
145 #define PANIC_ON(x, m, ...) do { if (unlikely(x)) \
146     rte_panic("%s: " m "\n", #x, ##__VA_ARGS__); } while (0)
147
148 /* Add mbuf to the TX ring. */
149 static inline int xran_enqueue_mbuf(struct rte_mbuf *mb, struct rte_ring *r)
150 {
151     if (rte_ring_enqueue(r, mb) == 0) {
152         return 1;   /* success */
153     }
154
155     rte_pktmbuf_free(mb);
156     wlog("failed to enqueue packet on port %d (ring full)", mb->port);
157
158     return 0;   /* fail */
159 }
160
161 #ifdef __cplusplus
162 }
163 #endif
164
165 #endif /* AUXLIB_ETHERNET_H */