49 _req_proc(_request.get_request_processor())
53 _cur_buf = request.first_buffer();
54 _req_id = _request.header();
58 Virtio_net_transfer(Virtio_net_transfer
const &) =
delete;
59 Virtio_net_transfer &operator = (Virtio_net_transfer
const &) =
delete;
61 void copy_header(Virtio_net::Hdr *dst_header)
const override
63 memcpy(dst_header, _request.header(),
sizeof(Virtio_net::Hdr));
68 return _cur_buf.
done() && !_req_proc.next(_request.dev()->mem_info(), &_cur_buf);
76 void dump_request(Port_iface *port)
const
78 Dbg debug(Dbg::Request, Dbg::Debug,
"REQ-VIO");
79 if (debug.is_active())
81 debug.printf(
"%s: Next packet: %p:%p - %x bytes\n",
82 port->get_name(), _header, _pkt.pos, _pkt.left);
83 if (_header->flags.raw || _header->gso_type)
85 debug.cprintf(
"flags:\t%x\n\t"
91 "\tnum buffer:\t%x\n",
93 _header->gso_type, _header->hdr_len,
95 _header->csum_start, _header->csum_offset,
96 _header->num_buffers);
109 _queue(other._queue),
110 _head(std::move(other._head)),
111 _req_proc(std::move(other._req_proc)),
112 _header(other._header)
114 _pkt = std::move(other._pkt);
117 other._queue =
nullptr;
126 _queue = other._queue;
127 _head = std::move(other._head);
128 _req_proc = std::move(other._req_proc);
129 _header = other._header;
130 _pkt = std::move(other._pkt);
133 other._queue =
nullptr;
139 L4virtio::Svr::Virtqueue::Request
const &req)
140 : _dev(dev), _queue(queue)
144 _header = (Virtio_net::Hdr *)_pkt.pos;
145 l4_uint32_t skipped = _pkt.skip(
sizeof(Virtio_net::Hdr));
147 if (
L4_UNLIKELY( (skipped !=
sizeof(Virtio_net::Hdr))
148 || (_pkt.done() && !_next_buffer(&_pkt))))
151 Dbg(Dbg::Queue, Dbg::Warn).printf(
"Invalid request\n");
160 {
return _header != 0; }
179 Dbg(Dbg::Request, Dbg::Debug)
180 .printf(
"Dropping incoming packets on monitor port\n");
188 queue->
finish(head, dev, 0);
198 static std::optional<Virtio_net_request>
219 Buffer const &first_buffer()
const
222 Virtio_net::Hdr
const *header()
const
226 {
return _req_proc; }
231 Virtio_net_transfer transfer_src()
const
232 {
return Virtio_net_transfer(*
this); }
252 Virtio_net::Hdr *_header;
254 bool _next_buffer(
Buffer *buf)
265 if (_queue ==
nullptr || !_queue->
ready())
268 Dbg(Dbg::Virtio, Dbg::Trace).printf(
"%s(%p)\n", __PRETTY_FUNCTION__,
this);
269 _queue->
finish(_head, _dev, 0);
void finish(Head_desc &d, QUEUE_OBSERVER *o, l4_uint32_t len=0)
Add a descriptor to the used ring, and notify an observer.