L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
request_ixl.h
1/*
2 * Copyright (C) 2024 Kernkonzept GmbH.
3 * Author(s): Georg Kotheimer <georg.kotheimer@kernkonzept.com>
4 *
5 * License: see LICENSE.spdx (in this directory or the directories above)
6 */
7#pragma once
8
9#include "port.h"
10#include "request.h"
11
12#include <l4/ixl/memory.h>
13
14#include <utility>
15
21class Ixl_net_request final : public Net_request
22{
23public:
24 class Ixl_net_transfer final : public Net_transfer
25 {
26 public:
27 explicit Ixl_net_transfer(Ixl_net_request const &request)
28 : _request(request)
29 {
30 _cur_buf = Buffer(reinterpret_cast<char *>(request.buf()->data),
31 request.buf()->size);
32 _req_id = _request.buf();
33 }
34
35 // delete copy constructor and copy assignment operator
36 Ixl_net_transfer(Ixl_net_transfer const &) = delete;
37 Ixl_net_transfer &operator = (Ixl_net_transfer const &) = delete;
38
39 void copy_header(Virtio_net::Hdr *dst_header) const override
40 {
41 dst_header->flags.data_valid() = 0;
42 dst_header->flags.need_csum() = 0;
43 dst_header->gso_type = 0; // GSO_NONE
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;
49 }
50
51 bool done() override { return _cur_buf.done(); }
52
53 private:
54 Ixl_net_request const &_request;
55 };
56
57 void dump_request(Port_iface *port) const
58 {
59 Dbg debug(Dbg::Request, Dbg::Debug, "REQ-IXL");
60 if (debug.is_active())
61 {
62 debug.printf("%s: Next packet: %p - %x bytes\n",
63 port->get_name(), _pkt.pos, _pkt.left);
64 }
65 dump_pkt();
66 }
67
68 explicit Ixl_net_request(Ixl::pkt_buf *buf) : _buf(buf)
69 {
70 _pkt = Buffer(reinterpret_cast<char *>(buf->data), buf->size);
71 }
72
73 // delete copy constructor and copy assignment operator
74 Ixl_net_request(Ixl_net_request const &) = delete;
75 Ixl_net_request &operator=(Ixl_net_request const &) = delete;
76
77 // define move constructor and copy assignment operator
78 Ixl_net_request(Ixl_net_request &&other)
79 : _buf(other._buf)
80 {
81 _pkt = std::move(other._pkt);
82
83 // Invalidate other.
84 other._buf = nullptr;
85 }
86
87 Ixl_net_request &operator=(Ixl_net_request &&other)
88 {
89 // Invalidate self.
90 if (_buf != nullptr)
91 Ixl::pkt_buf_free(_buf);
92
93 _buf = other._buf;
94 _pkt = std::move(other._pkt);
95
96 // Invalidate other.
97 other._buf = nullptr;
98
99 return *this;
100 }
101
102 ~Ixl_net_request()
103 {
104 if (_buf != nullptr)
105 {
106 Ixl::pkt_buf_free(_buf);
107 _buf = nullptr;
108 }
109 }
110
111 Ixl::pkt_buf *buf() const { return _buf; }
112
113 Ixl_net_transfer transfer_src() const
114 { return Ixl_net_transfer(*this); }
115
116private:
117 Ixl::pkt_buf *_buf;
118};
119
A network request to only a single destination.
Definition request.h:34
Data buffer used to transfer packets.
bool done() const
Check if there are no more bytes left in the buffer.
Definition virtio:388