MCPcopy Create free account
hub / github.com/F-Stack/f-stack / virtio_net_ctrl_pop

Function virtio_net_ctrl_pop

dpdk/lib/vhost/virtio_net_ctrl.c:26–185  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

24};
25
26static int
27virtio_net_ctrl_pop(struct virtio_net *dev, struct vhost_virtqueue *cvq,
28 struct virtio_net_ctrl_elem *ctrl_elem)
29 __rte_shared_locks_required(&cvq->iotlb_lock)
30{
31 uint16_t avail_idx, desc_idx, n_descs = 0;
32 uint64_t desc_len, desc_addr, desc_iova, data_len = 0;
33 uint8_t *ctrl_req;
34 struct vring_desc *descs;
35
36 avail_idx = rte_atomic_load_explicit((unsigned short __rte_atomic *)&cvq->avail->idx,
37 rte_memory_order_acquire);
38 if (avail_idx == cvq->last_avail_idx) {
39 VHOST_LOG_CONFIG(dev->ifname, DEBUG, "Control queue empty\n");
40 return 0;
41 }
42
43 desc_idx = cvq->avail->ring[cvq->last_avail_idx & (cvq->size - 1)];
44 if (desc_idx >= cvq->size) {
45 VHOST_LOG_CONFIG(dev->ifname, ERR, "Out of range desc index, dropping\n");
46 goto err;
47 }
48
49 ctrl_elem->head_idx = desc_idx;
50
51 if (cvq->desc[desc_idx].flags & VRING_DESC_F_INDIRECT) {
52 desc_len = cvq->desc[desc_idx].len;
53 desc_iova = cvq->desc[desc_idx].addr;
54
55 descs = (struct vring_desc *)(uintptr_t)vhost_iova_to_vva(dev, cvq,
56 desc_iova, &desc_len, VHOST_ACCESS_RO);
57 if (!descs || desc_len != cvq->desc[desc_idx].len) {
58 VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to map ctrl indirect descs\n");
59 goto err;
60 }
61
62 desc_idx = 0;
63 } else {
64 descs = cvq->desc;
65 }
66
67 while (1) {
68 desc_len = descs[desc_idx].len;
69 desc_iova = descs[desc_idx].addr;
70
71 n_descs++;
72
73 if (descs[desc_idx].flags & VRING_DESC_F_WRITE) {
74 if (ctrl_elem->desc_ack) {
75 VHOST_LOG_CONFIG(dev->ifname, ERR,
76 "Unexpected ctrl chain layout\n");
77 goto err;
78 }
79
80 if (desc_len != sizeof(uint8_t)) {
81 VHOST_LOG_CONFIG(dev->ifname, ERR,
82 "Invalid ack size for ctrl req, dropping\n");
83 goto err;

Callers 1

virtio_net_ctrl_handleFunction · 0.85

Calls 3

mallocFunction · 0.85
memcpyFunction · 0.50
freeFunction · 0.50

Tested by

no test coverage detected