12#include <l4/ixl/memory.h>
21class Ixl_net_request final :
public Net_request
24 class Ixl_net_transfer final :
public Net_transfer
27 explicit Ixl_net_transfer(Ixl_net_request
const &request)
30 _cur_buf = Buffer(
reinterpret_cast<char *
>(request.buf()->data),
32 _req_id = _request.buf();
36 Ixl_net_transfer(Ixl_net_transfer
const &) =
delete;
37 Ixl_net_transfer &operator = (Ixl_net_transfer
const &) =
delete;
39 void copy_header(Virtio_net::Hdr *dst_header)
const override
41 dst_header->flags.data_valid() = 0;
42 dst_header->flags.need_csum() = 0;
43 dst_header->gso_type = 0;
44 dst_header->hdr_len =
sizeof(Virtio_net::Hdr);
45 dst_header->gso_size = 0;
46 dst_header->csum_start = 0;
47 dst_header->csum_offset = 0;
48 dst_header->num_buffers = 1;
51 bool done()
override {
return _cur_buf.done(); }
54 Ixl_net_request
const &_request;
57 void dump_request(Port_iface *port)
const
59 Dbg debug(Dbg::Request, Dbg::Debug,
"REQ-IXL");
60 if (debug.is_active())
62 debug.printf(
"%s: Next packet: %p - %x bytes\n",
63 port->get_name(), _pkt.pos, _pkt.left);
68 explicit Ixl_net_request(Ixl::pkt_buf *buf) : _buf(buf)
70 _pkt = Buffer(
reinterpret_cast<char *
>(buf->data), buf->size);
74 Ixl_net_request(Ixl_net_request
const &) =
delete;
75 Ixl_net_request &operator=(Ixl_net_request
const &) =
delete;
78 Ixl_net_request(Ixl_net_request &&other)
81 _pkt = std::move(other._pkt);
87 Ixl_net_request &operator=(Ixl_net_request &&other)
91 Ixl::pkt_buf_free(_buf);
94 _pkt = std::move(other._pkt);
106 Ixl::pkt_buf_free(_buf);
112 Mac_addr dst_mac()
const
114 return (_pkt.pos && _pkt.left >= Mac_addr::Addr_length)
115 ? Mac_addr::from_uncached(_pkt.pos)
116 : Mac_addr(Mac_addr::Addr_unknown);
120 Mac_addr src_mac()
const
122 return (_pkt.pos && _pkt.left >= Mac_addr::Addr_length * 2)
123 ? Mac_addr::from_uncached(_pkt.pos + Mac_addr::Addr_length)
124 : Mac_addr(Mac_addr::Addr_unknown);
127 Ixl::pkt_buf *buf()
const {
return _buf; }
129 Ixl_net_transfer transfer_src()
const
130 {
return Ixl_net_transfer(*
this); }
virtual bool done()=0
Check whether the transfer has been completed, i.e.