28 #include <rte_config.h> 29 #include <rte_memcpy.h> 30 #include <rte_ether.h> 31 #include <rte_ethdev.h> 37 struct network_buf_handle;
39 extern uint8_t net_port_id;
40 extern uint16_t rss_reta_size;
43 int network_rx_interrupt_ctl(
struct network_thread *t,
int turnon);
45 int network_scale_up(uint16_t old, uint16_t
new);
46 int network_scale_down(uint16_t old, uint16_t
new);
49 static inline void network_buf_reset(
struct network_buf_handle *bh)
51 struct rte_mbuf *mb = (
struct rte_mbuf *) bh;
55 static inline uint16_t network_buf_off(
struct network_buf_handle *bh)
57 return ((
struct rte_mbuf *) bh)->data_off;
60 static inline uint16_t network_buf_len(
struct network_buf_handle *bh)
62 return ((
struct rte_mbuf *) bh)->data_len;
65 static inline void *network_buf_buf(
struct network_buf_handle *bh)
67 return ((
struct rte_mbuf *) bh)->buf_addr;
70 static inline void *network_buf_bufoff(
struct network_buf_handle *bh)
72 struct rte_mbuf *mb = (
struct rte_mbuf *) bh;
73 return mb->buf_addr + mb->data_off;
76 static inline void network_buf_setoff(
struct network_buf_handle *bh,
79 ((
struct rte_mbuf *) bh)->data_off = off;
82 static inline void network_buf_setlen(
struct network_buf_handle *bh,
85 struct rte_mbuf *mb = (
struct rte_mbuf *) bh;
86 mb->pkt_len = mb->data_len = len;
90 static inline int network_poll(
struct network_thread *t,
unsigned num,
91 struct network_buf_handle **bhs)
93 struct rte_mbuf **mbs = (
struct rte_mbuf **) bhs;
95 num = rte_eth_rx_burst(net_port_id, t->queue_id, mbs, num);
100 #ifdef FLEXNIC_TRACE_TX 102 for (i = 0; i < num; i++) {
103 trace_event(FLEXNIC_TRACE_EV_RXPKT, network_buf_len(bhs[i]),
104 network_buf_bufoff(bhs[i]));
111 static inline int network_send(
struct network_thread *t,
unsigned num,
112 struct network_buf_handle **bhs)
114 struct rte_mbuf **mbs = (
struct rte_mbuf **) bhs;
116 #ifdef FLEXNIC_TRACE_TX 118 for (i = 0; i < num; i++) {
119 trace_event(FLEXNIC_TRACE_EV_TXPKT, network_buf_len(bhs[i]),
120 network_buf_bufoff(bhs[i]));
124 return rte_eth_tx_burst(net_port_id, t->queue_id, mbs, num);
128 static inline int network_buf_alloc(
struct network_thread *t,
unsigned num,
129 struct network_buf_handle **bhs)
131 struct rte_mbuf **mbs = (
struct rte_mbuf **) bhs;
135 if (rte_pktmbuf_alloc_bulk(t->pool, mbs, num) == 0) {
139 for (i = 0; i < num; i++) {
140 if ((mbs[i] = rte_pktmbuf_alloc(t->pool)) == NULL) {
148 static inline void network_free(
unsigned num,
struct network_buf_handle **bufs)
151 for (i = 0; i < num; i++) {
152 rte_pktmbuf_free_seg((
struct rte_mbuf *) bufs[i]);
157 static inline uint16_t network_ip_phdr_xsum(
beui32_t ip_src,
beui32_t ip_dst,
158 uint8_t proto, uint16_t l3_paylen)
162 sum += ip_src.x & 0xffff;
163 sum += (ip_src.x >> 16) & 0xffff;
164 sum += ip_dst.x & 0xffff;
165 sum += (ip_dst .x >> 16) & 0xffff;
166 sum += ((uint16_t) proto) << 8;
167 sum += t_beui16(l3_paylen).x;
169 sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
170 sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
172 return (uint16_t) sum;
175 static inline uint16_t network_buf_tcpxsums(
struct network_buf_handle *bh, uint8_t l2l,
179 struct rte_mbuf * restrict mb = (
struct rte_mbuf *) bh;
180 mb->tx_offload = l2l | ((uint32_t) l3l << 7);
184 mb->ol_flags = PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM;
186 return network_ip_phdr_xsum(ip_s, ip_d, ip_proto, l3_paylen);
189 static inline int network_buf_flowgroup(
struct network_buf_handle *bh,
192 struct rte_mbuf *mb = (
struct rte_mbuf *) bh;
193 if (!(mb->ol_flags & PKT_RX_RSS_HASH)) {
198 *fg = mb->hash.rss & (rss_reta_size - 1);