net: add rte prefix to ether structures
[dpdk.git] / app / test / virtual_pmd.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4
5 #include <rte_mbuf.h>
6 #include <rte_ethdev.h>
7 #include <rte_ethdev_driver.h>
8 #include <rte_pci.h>
9 #include <rte_bus_pci.h>
10 #include <rte_malloc.h>
11 #include <rte_memcpy.h>
12 #include <rte_memory.h>
13 #include <rte_ring.h>
14
15 #include "virtual_pmd.h"
16
17 #define MAX_PKT_BURST 512
18
19 static const char *virtual_ethdev_driver_name = "Virtual PMD";
20
21 struct virtual_ethdev_private {
22         struct eth_dev_ops dev_ops;
23         struct rte_eth_stats eth_stats;
24
25         struct rte_ring *rx_queue;
26         struct rte_ring *tx_queue;
27
28         int tx_burst_fail_count;
29 };
30
31 struct virtual_ethdev_queue {
32         int port_id;
33         int queue_id;
34 };
35
36 static int
37 virtual_ethdev_start_success(struct rte_eth_dev *eth_dev __rte_unused)
38 {
39         eth_dev->data->dev_started = 1;
40
41         return 0;
42 }
43
44 static int
45 virtual_ethdev_start_fail(struct rte_eth_dev *eth_dev __rte_unused)
46 {
47         eth_dev->data->dev_started = 0;
48
49         return -1;
50 }
51 static void  virtual_ethdev_stop(struct rte_eth_dev *eth_dev __rte_unused)
52 {
53         void *pkt = NULL;
54         struct virtual_ethdev_private *prv = eth_dev->data->dev_private;
55
56         eth_dev->data->dev_link.link_status = ETH_LINK_DOWN;
57         eth_dev->data->dev_started = 0;
58         while (rte_ring_dequeue(prv->rx_queue, &pkt) != -ENOENT)
59                 rte_pktmbuf_free(pkt);
60
61         while (rte_ring_dequeue(prv->tx_queue, &pkt) != -ENOENT)
62                 rte_pktmbuf_free(pkt);
63 }
64
65 static void
66 virtual_ethdev_close(struct rte_eth_dev *dev __rte_unused)
67 {}
68
69 static int
70 virtual_ethdev_configure_success(struct rte_eth_dev *dev __rte_unused)
71 {
72         return 0;
73 }
74
75 static int
76 virtual_ethdev_configure_fail(struct rte_eth_dev *dev __rte_unused)
77 {
78         return -1;
79 }
80
81 static void
82 virtual_ethdev_info_get(struct rte_eth_dev *dev __rte_unused,
83                 struct rte_eth_dev_info *dev_info)
84 {
85         dev_info->driver_name = virtual_ethdev_driver_name;
86         dev_info->max_mac_addrs = 1;
87
88         dev_info->max_rx_pktlen = (uint32_t)2048;
89
90         dev_info->max_rx_queues = (uint16_t)128;
91         dev_info->max_tx_queues = (uint16_t)512;
92
93         dev_info->min_rx_bufsize = 0;
94 }
95
96 static int
97 virtual_ethdev_rx_queue_setup_success(struct rte_eth_dev *dev,
98                 uint16_t rx_queue_id, uint16_t nb_rx_desc __rte_unused,
99                 unsigned int socket_id,
100                 const struct rte_eth_rxconf *rx_conf __rte_unused,
101                 struct rte_mempool *mb_pool __rte_unused)
102 {
103         struct virtual_ethdev_queue *rx_q;
104
105         rx_q = (struct virtual_ethdev_queue *)rte_zmalloc_socket(NULL,
106                         sizeof(struct virtual_ethdev_queue), 0, socket_id);
107
108         if (rx_q == NULL)
109                 return -1;
110
111         rx_q->port_id = dev->data->port_id;
112         rx_q->queue_id = rx_queue_id;
113
114         dev->data->rx_queues[rx_queue_id] = rx_q;
115
116         return 0;
117 }
118
119 static int
120 virtual_ethdev_rx_queue_setup_fail(struct rte_eth_dev *dev __rte_unused,
121                 uint16_t rx_queue_id __rte_unused, uint16_t nb_rx_desc __rte_unused,
122                 unsigned int socket_id __rte_unused,
123                 const struct rte_eth_rxconf *rx_conf __rte_unused,
124                 struct rte_mempool *mb_pool __rte_unused)
125 {
126         return -1;
127 }
128
129 static int
130 virtual_ethdev_tx_queue_setup_success(struct rte_eth_dev *dev,
131                 uint16_t tx_queue_id, uint16_t nb_tx_desc __rte_unused,
132                 unsigned int socket_id,
133                 const struct rte_eth_txconf *tx_conf __rte_unused)
134 {
135         struct virtual_ethdev_queue *tx_q;
136
137         tx_q = (struct virtual_ethdev_queue *)rte_zmalloc_socket(NULL,
138                         sizeof(struct virtual_ethdev_queue), 0, socket_id);
139
140         if (tx_q == NULL)
141                 return -1;
142
143         tx_q->port_id = dev->data->port_id;
144         tx_q->queue_id = tx_queue_id;
145
146         dev->data->tx_queues[tx_queue_id] = tx_q;
147
148         return 0;
149 }
150
151 static int
152 virtual_ethdev_tx_queue_setup_fail(struct rte_eth_dev *dev __rte_unused,
153                 uint16_t tx_queue_id __rte_unused, uint16_t nb_tx_desc __rte_unused,
154                 unsigned int socket_id __rte_unused,
155                 const struct rte_eth_txconf *tx_conf __rte_unused)
156 {
157         return -1;
158 }
159
160 static void
161 virtual_ethdev_rx_queue_release(void *q __rte_unused)
162 {
163 }
164
165 static void
166 virtual_ethdev_tx_queue_release(void *q __rte_unused)
167 {
168 }
169
170 static int
171 virtual_ethdev_link_update_success(struct rte_eth_dev *bonded_eth_dev,
172                 int wait_to_complete __rte_unused)
173 {
174         if (!bonded_eth_dev->data->dev_started)
175                 bonded_eth_dev->data->dev_link.link_status = ETH_LINK_DOWN;
176
177         return 0;
178 }
179
180 static int
181 virtual_ethdev_link_update_fail(struct rte_eth_dev *bonded_eth_dev __rte_unused,
182                 int wait_to_complete __rte_unused)
183 {
184         return -1;
185 }
186
187 static int
188 virtual_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
189 {
190         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
191
192         if (stats)
193                 rte_memcpy(stats, &dev_private->eth_stats, sizeof(*stats));
194
195         return 0;
196 }
197
198 static void
199 virtual_ethdev_stats_reset(struct rte_eth_dev *dev)
200 {
201         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
202         void *pkt = NULL;
203
204         while (rte_ring_dequeue(dev_private->tx_queue, &pkt) == -ENOBUFS)
205                         rte_pktmbuf_free(pkt);
206
207         /* Reset internal statistics */
208         memset(&dev_private->eth_stats, 0, sizeof(dev_private->eth_stats));
209 }
210
211 static void
212 virtual_ethdev_promiscuous_mode_enable(struct rte_eth_dev *dev __rte_unused)
213 {}
214
215 static void
216 virtual_ethdev_promiscuous_mode_disable(struct rte_eth_dev *dev __rte_unused)
217 {}
218
219 static int
220 virtual_ethdev_mac_address_set(__rte_unused struct rte_eth_dev *dev,
221                                __rte_unused struct rte_ether_addr *addr)
222 {
223         return 0;
224 }
225
226 static const struct eth_dev_ops virtual_ethdev_default_dev_ops = {
227         .dev_configure = virtual_ethdev_configure_success,
228         .dev_start = virtual_ethdev_start_success,
229         .dev_stop = virtual_ethdev_stop,
230         .dev_close = virtual_ethdev_close,
231         .dev_infos_get = virtual_ethdev_info_get,
232         .rx_queue_setup = virtual_ethdev_rx_queue_setup_success,
233         .tx_queue_setup = virtual_ethdev_tx_queue_setup_success,
234         .rx_queue_release = virtual_ethdev_rx_queue_release,
235         .tx_queue_release = virtual_ethdev_tx_queue_release,
236         .link_update = virtual_ethdev_link_update_success,
237         .mac_addr_set = virtual_ethdev_mac_address_set,
238         .stats_get = virtual_ethdev_stats_get,
239         .stats_reset = virtual_ethdev_stats_reset,
240         .promiscuous_enable = virtual_ethdev_promiscuous_mode_enable,
241         .promiscuous_disable = virtual_ethdev_promiscuous_mode_disable
242 };
243
244 void
245 virtual_ethdev_start_fn_set_success(uint16_t port_id, uint8_t success)
246 {
247         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
248         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
249         struct eth_dev_ops *dev_ops = &dev_private->dev_ops;
250
251         if (success)
252                 dev_ops->dev_start = virtual_ethdev_start_success;
253         else
254                 dev_ops->dev_start = virtual_ethdev_start_fail;
255
256 }
257
258 void
259 virtual_ethdev_configure_fn_set_success(uint16_t port_id, uint8_t success)
260 {
261         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
262         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
263         struct eth_dev_ops *dev_ops = &dev_private->dev_ops;
264
265         if (success)
266                 dev_ops->dev_configure = virtual_ethdev_configure_success;
267         else
268                 dev_ops->dev_configure = virtual_ethdev_configure_fail;
269 }
270
271 void
272 virtual_ethdev_rx_queue_setup_fn_set_success(uint16_t port_id, uint8_t success)
273 {
274         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
275         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
276         struct eth_dev_ops *dev_ops = &dev_private->dev_ops;
277
278         if (success)
279                 dev_ops->rx_queue_setup = virtual_ethdev_rx_queue_setup_success;
280         else
281                 dev_ops->rx_queue_setup = virtual_ethdev_rx_queue_setup_fail;
282 }
283
284 void
285 virtual_ethdev_tx_queue_setup_fn_set_success(uint16_t port_id, uint8_t success)
286 {
287         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
288         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
289         struct eth_dev_ops *dev_ops = &dev_private->dev_ops;
290
291         if (success)
292                 dev_ops->tx_queue_setup = virtual_ethdev_tx_queue_setup_success;
293         else
294                 dev_ops->tx_queue_setup = virtual_ethdev_tx_queue_setup_fail;
295 }
296
297 void
298 virtual_ethdev_link_update_fn_set_success(uint16_t port_id, uint8_t success)
299 {
300         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
301         struct virtual_ethdev_private *dev_private = dev->data->dev_private;
302         struct eth_dev_ops *dev_ops = &dev_private->dev_ops;
303
304         if (success)
305                 dev_ops->link_update = virtual_ethdev_link_update_success;
306         else
307                 dev_ops->link_update = virtual_ethdev_link_update_fail;
308 }
309
310
311 static uint16_t
312 virtual_ethdev_rx_burst_success(void *queue __rte_unused,
313                                                          struct rte_mbuf **bufs,
314                                                          uint16_t nb_pkts)
315 {
316         struct rte_eth_dev *vrtl_eth_dev;
317         struct virtual_ethdev_queue *pq_map;
318         struct virtual_ethdev_private *dev_private;
319
320         int rx_count, i;
321
322         pq_map = (struct virtual_ethdev_queue *)queue;
323         vrtl_eth_dev = &rte_eth_devices[pq_map->port_id];
324         dev_private = vrtl_eth_dev->data->dev_private;
325
326         rx_count = rte_ring_dequeue_burst(dev_private->rx_queue, (void **) bufs,
327                         nb_pkts, NULL);
328
329         /* increments ipackets count */
330         dev_private->eth_stats.ipackets += rx_count;
331
332         /* increments ibytes count */
333         for (i = 0; i < rx_count; i++)
334                 dev_private->eth_stats.ibytes += rte_pktmbuf_pkt_len(bufs[i]);
335
336         return rx_count;
337 }
338
339 static uint16_t
340 virtual_ethdev_rx_burst_fail(void *queue __rte_unused,
341                                                          struct rte_mbuf **bufs __rte_unused,
342                                                          uint16_t nb_pkts __rte_unused)
343 {
344         return 0;
345 }
346
347 static uint16_t
348 virtual_ethdev_tx_burst_success(void *queue, struct rte_mbuf **bufs,
349                 uint16_t nb_pkts)
350 {
351         struct virtual_ethdev_queue *tx_q = queue;
352
353         struct rte_eth_dev *vrtl_eth_dev;
354         struct virtual_ethdev_private *dev_private;
355
356         int i;
357
358         vrtl_eth_dev = &rte_eth_devices[tx_q->port_id];
359         dev_private = vrtl_eth_dev->data->dev_private;
360
361         if (!vrtl_eth_dev->data->dev_link.link_status)
362                 nb_pkts = 0;
363         else
364                 nb_pkts = rte_ring_enqueue_burst(dev_private->tx_queue, (void **)bufs,
365                                 nb_pkts, NULL);
366
367         /* increment opacket count */
368         dev_private->eth_stats.opackets += nb_pkts;
369
370         /* increment obytes count */
371         for (i = 0; i < nb_pkts; i++)
372                 dev_private->eth_stats.obytes += rte_pktmbuf_pkt_len(bufs[i]);
373
374         return nb_pkts;
375 }
376
377 static uint16_t
378 virtual_ethdev_tx_burst_fail(void *queue, struct rte_mbuf **bufs,
379                 uint16_t nb_pkts)
380 {
381         struct rte_eth_dev *vrtl_eth_dev = NULL;
382         struct virtual_ethdev_queue *tx_q = NULL;
383         struct virtual_ethdev_private *dev_private = NULL;
384
385         int i;
386
387         tx_q = queue;
388         vrtl_eth_dev = &rte_eth_devices[tx_q->port_id];
389         dev_private = vrtl_eth_dev->data->dev_private;
390
391         if (dev_private->tx_burst_fail_count < nb_pkts) {
392                 int successfully_txd = nb_pkts - dev_private->tx_burst_fail_count;
393
394                 /* increment opacket count */
395                 dev_private->eth_stats.opackets += successfully_txd;
396
397                 /* free packets in burst */
398                 for (i = 0; i < successfully_txd; i++) {
399                         /* free packets in burst */
400                         if (bufs[i] != NULL)
401                                 rte_pktmbuf_free(bufs[i]);
402
403                         bufs[i] = NULL;
404                 }
405
406                 return successfully_txd;
407         }
408
409         return 0;
410 }
411
412
413 void
414 virtual_ethdev_rx_burst_fn_set_success(uint16_t port_id, uint8_t success)
415 {
416         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
417
418         if (success)
419                 vrtl_eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
420         else
421                 vrtl_eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_fail;
422 }
423
424
425 void
426 virtual_ethdev_tx_burst_fn_set_success(uint16_t port_id, uint8_t success)
427 {
428         struct virtual_ethdev_private *dev_private = NULL;
429         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
430
431         dev_private = vrtl_eth_dev->data->dev_private;
432
433         if (success)
434                 vrtl_eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
435         else
436                 vrtl_eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_fail;
437
438         dev_private->tx_burst_fail_count = 0;
439 }
440
441 void
442 virtual_ethdev_tx_burst_fn_set_tx_pkt_fail_count(uint16_t port_id,
443                 uint8_t packet_fail_count)
444 {
445         struct virtual_ethdev_private *dev_private = NULL;
446         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
447
448
449         dev_private = vrtl_eth_dev->data->dev_private;
450         dev_private->tx_burst_fail_count = packet_fail_count;
451 }
452
453 void
454 virtual_ethdev_set_link_status(uint16_t port_id, uint8_t link_status)
455 {
456         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
457
458         vrtl_eth_dev->data->dev_link.link_status = link_status;
459 }
460
461 void
462 virtual_ethdev_simulate_link_status_interrupt(uint16_t port_id,
463                 uint8_t link_status)
464 {
465         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
466
467         vrtl_eth_dev->data->dev_link.link_status = link_status;
468
469         _rte_eth_dev_callback_process(vrtl_eth_dev, RTE_ETH_EVENT_INTR_LSC,
470                                       NULL);
471 }
472
473 int
474 virtual_ethdev_add_mbufs_to_rx_queue(uint16_t port_id,
475                 struct rte_mbuf **pkt_burst, int burst_length)
476 {
477         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
478         struct virtual_ethdev_private *dev_private =
479                         vrtl_eth_dev->data->dev_private;
480
481         return rte_ring_enqueue_burst(dev_private->rx_queue, (void **)pkt_burst,
482                         burst_length, NULL);
483 }
484
485 int
486 virtual_ethdev_get_mbufs_from_tx_queue(uint16_t port_id,
487                 struct rte_mbuf **pkt_burst, int burst_length)
488 {
489         struct virtual_ethdev_private *dev_private;
490         struct rte_eth_dev *vrtl_eth_dev = &rte_eth_devices[port_id];
491
492         dev_private = vrtl_eth_dev->data->dev_private;
493         return rte_ring_dequeue_burst(dev_private->tx_queue, (void **)pkt_burst,
494                 burst_length, NULL);
495 }
496
497
498 int
499 virtual_ethdev_create(const char *name, struct rte_ether_addr *mac_addr,
500                 uint8_t socket_id, uint8_t isr_support)
501 {
502         struct rte_pci_device *pci_dev = NULL;
503         struct rte_eth_dev *eth_dev = NULL;
504         struct rte_pci_driver *pci_drv = NULL;
505         struct rte_pci_id *id_table = NULL;
506         struct virtual_ethdev_private *dev_private = NULL;
507         char name_buf[RTE_RING_NAMESIZE];
508
509
510         /* now do all data allocation - for eth_dev structure, dummy pci driver
511          * and internal (dev_private) data
512          */
513
514         pci_dev = rte_zmalloc_socket(name, sizeof(*pci_dev), 0, socket_id);
515         if (pci_dev == NULL)
516                 goto err;
517
518         pci_drv = rte_zmalloc_socket(name, sizeof(*pci_drv), 0, socket_id);
519         if (pci_drv == NULL)
520                 goto err;
521
522         id_table = rte_zmalloc_socket(name, sizeof(*id_table), 0, socket_id);
523         if (id_table == NULL)
524                 goto err;
525         id_table->device_id = 0xBEEF;
526
527         dev_private = rte_zmalloc_socket(name, sizeof(*dev_private), 0, socket_id);
528         if (dev_private == NULL)
529                 goto err;
530
531         snprintf(name_buf, sizeof(name_buf), "%s_rxQ", name);
532         dev_private->rx_queue = rte_ring_create(name_buf, MAX_PKT_BURST, socket_id,
533                         0);
534         if (dev_private->rx_queue == NULL)
535                 goto err;
536
537         snprintf(name_buf, sizeof(name_buf), "%s_txQ", name);
538         dev_private->tx_queue = rte_ring_create(name_buf, MAX_PKT_BURST, socket_id,
539                         0);
540         if (dev_private->tx_queue == NULL)
541                 goto err;
542
543         /* reserve an ethdev entry */
544         eth_dev = rte_eth_dev_allocate(name);
545         if (eth_dev == NULL)
546                 goto err;
547
548         pci_dev->device.numa_node = socket_id;
549         pci_dev->device.name = eth_dev->data->name;
550         pci_drv->driver.name = virtual_ethdev_driver_name;
551         pci_drv->id_table = id_table;
552
553         if (isr_support)
554                 pci_drv->drv_flags |= RTE_PCI_DRV_INTR_LSC;
555         else
556                 pci_drv->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
557
558
559         eth_dev->device = &pci_dev->device;
560         eth_dev->device->driver = &pci_drv->driver;
561
562         eth_dev->data->nb_rx_queues = (uint16_t)1;
563         eth_dev->data->nb_tx_queues = (uint16_t)1;
564
565         eth_dev->data->dev_link.link_status = ETH_LINK_DOWN;
566         eth_dev->data->dev_link.link_speed = ETH_SPEED_NUM_10G;
567         eth_dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
568
569         eth_dev->data->mac_addrs = rte_zmalloc(name, ETHER_ADDR_LEN, 0);
570         if (eth_dev->data->mac_addrs == NULL)
571                 goto err;
572
573         memcpy(eth_dev->data->mac_addrs, mac_addr,
574                         sizeof(*eth_dev->data->mac_addrs));
575
576         eth_dev->data->dev_started = 0;
577         eth_dev->data->promiscuous = 0;
578         eth_dev->data->scattered_rx = 0;
579         eth_dev->data->all_multicast = 0;
580
581         eth_dev->data->dev_private = dev_private;
582
583         /* Copy default device operation functions */
584         dev_private->dev_ops = virtual_ethdev_default_dev_ops;
585         eth_dev->dev_ops = &dev_private->dev_ops;
586
587         pci_dev->device.driver = &pci_drv->driver;
588         eth_dev->device = &pci_dev->device;
589
590         eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
591         eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
592
593         rte_eth_dev_probing_finish(eth_dev);
594
595         return eth_dev->data->port_id;
596
597 err:
598         rte_free(pci_dev);
599         rte_free(pci_drv);
600         rte_free(id_table);
601         rte_free(dev_private);
602
603         return -1;
604 }