25#include <seastar/core/deleter.hh>
26#include <seastar/core/queue.hh>
27#include <seastar/core/stream.hh>
29#include <seastar/net/toeplitz.hh>
30#include <seastar/net/ethernet.hh>
31#include <seastar/net/packet.hh>
32#include <seastar/net/const.hh>
33#include <seastar/util/assert.hh>
34#include <unordered_map>
59 void push_back(uint8_t b) {
60 SEASTAR_ASSERT(end_idx <
sizeof(data));
63 void push_back(uint16_t b) {
64 push_back(uint8_t(b));
65 push_back(uint8_t(b >> 8));
67 void push_back(uint32_t b) {
68 push_back(uint16_t(b));
69 push_back(uint16_t(b >> 16));
71 const uint8_t& operator[](
size_t idx)
const {
78 bool tx_csum_ip_offload =
false;
80 bool tx_csum_l4_offload =
false;
82 bool rx_csum_offload =
false;
92 uint16_t max_packet_len = ip_packet_len_max - eth_hdr_len;
98 eth_protocol_num proto_num;
102 using packet_provider_type = std::function<std::optional<l3packet> ()>;
105 eth_protocol_num _proto_num;
116 struct l3_rx_stream {
120 l3_rx_stream(std::function<
bool (
forward_hash&,
packet&,
size_t)>&& fw) : ready(packet_stream.started()), forward(fw) {}
122 std::unordered_map<uint16_t, l3_rx_stream> _proto_map;
123 std::shared_ptr<device> _dev;
126 std::vector<l3_protocol::packet_provider_type> _pkt_providers;
130 explicit interface(std::shared_ptr<device> dev);
133 future<> register_l3(eth_protocol_num proto_num,
136 void forward(
unsigned cpuid,
packet p);
137 unsigned hash2cpu(uint32_t hash);
138 void register_packet_provider(l3_protocol::packet_provider_type func) {
139 _pkt_providers.push_back(std::move(func));
141 uint16_t hw_queues_count();
142 rss_key_type rss_key()
const;
167 copy_frags += nr_frags;
197 void inc_csum_err() {
220 using packet_provider_type = std::function<std::optional<packet> ()>;
221 std::vector<packet_provider_type> _pkt_providers;
222 std::optional<std::array<uint8_t, 128>> _sw_reta;
225 std::unique_ptr<internal::poller> _tx_poller;
229 const std::string _stats_plugin_name;
230 const std::string _queue_name;
235 qp(
bool register_copy_stats =
false,
236 const std::string stats_plugin_name = std::string(
"network"),
244 (void)send(std::move(p.front()));
250 virtual void rx_start() {};
251 void configure_proxies(
const std::map<unsigned, float>& cpu_weights);
253 void build_sw_reta(
const std::map<unsigned, float>& cpu_weights);
254 void proxy_send(
packet p) {
255 _proxy_packetq.push_back(std::move(p));
257 void register_packet_provider(packet_provider_type func) {
258 _pkt_providers.push_back(std::move(func));
266 std::unique_ptr<qp*[]> _queues;
267 size_t _rss_table_bits = 0;
270 _queues = std::make_unique<qp*[]>(smp::count);
273 qp& queue_for_cpu(
unsigned cpu) {
return *_queues[cpu]; }
275 void l2receive(
packet p) {
277 (void)_queues[
this_shard_id()]->_rx_stream.produce(std::move(p));
282 virtual rss_key_type rss_key()
const {
return default_rsskey_40bytes; }
283 virtual uint16_t hw_queues_count() {
return 1; }
284 virtual future<> link_ready() {
return make_ready_future<>(); }
286 virtual unsigned hash2qid(uint32_t hash) {
287 return hash % hw_queues_count();
289 void set_local_queue(std::unique_ptr<qp> dev);
290 template <
typename Func>
291 unsigned forward_dst(
unsigned src_cpuid, Func&& hashfn) {
292 auto&
qp = queue_for_cpu(src_cpuid);
296 auto hash = hashfn() >> _rss_table_bits;
297 auto& reta = *
qp._sw_reta;
298 return reta[hash % reta.size()];
300 virtual unsigned hash2cpu(uint32_t hash) {
303 return forward_dst(hash2qid(hash), [hash] {
return hash; });
Definition: circular_buffer.hh:63
A representation of a possibly not-yet-computed value.
Definition: future.hh:1197
holds the metric definition.
Definition: metrics_registration.hh:94
Definition: program-options.hh:293
holds the metric_groups definition needed by class that reports metrics
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
shard_id this_shard_id() noexcept
Returns shard_id of the of the current shard.
Definition: shard_id.hh:52
Definition: ethernet.hh:37
void update_frags_stats(uint64_t nfrags, uint64_t nbytes)
Definition: net.hh:177
void update_copy_stats(uint64_t nr_frags, uint64_t bytes)
Definition: net.hh:166
void update_pkts_bunch(uint64_t count)
Definition: net.hh:154