DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
WIBEthPacketBuilder.hpp
Go to the documentation of this file.
1
8#ifndef DPDKLIBS_INCLUDE_DPDKLIBS_WIBETH_WIBETHPACKETBUILDER_HPP_
9#define DPDKLIBS_INCLUDE_DPDKLIBS_WIBETH_WIBETHPACKETBUILDER_HPP_
10
14
15#include <rte_byteorder.h>
16#include <rte_ether.h>
17#include <rte_ip.h>
18#include <rte_udp.h>
19
20#include <cstddef>
21#include <cstdint>
22#include <string>
23
25
26constexpr std::size_t kEthernetHeaderBytes = sizeof(rte_ether_hdr);
27constexpr std::size_t kIPv4HeaderBytes = sizeof(rte_ipv4_hdr);
28constexpr std::size_t kUDPHeaderBytes = sizeof(rte_udp_hdr);
32constexpr std::size_t kEthernetPacketBytes =
36constexpr std::uint16_t kWIBEthBlockLength =
37 static_cast<std::uint16_t>((kWIBEthFrameBytes / sizeof(std::uint64_t)) - 1);
38constexpr std::uint64_t kDefaultTimestampStep = 2048;
39constexpr double kDefaultRateHz = 62500000.0 / static_cast<double>(kDefaultTimestampStep);
40
41static_assert(kEthernetHeaderBytes == 14, "Unexpected Ethernet header size");
42static_assert(kIPv4HeaderBytes == 20, "Unexpected IPv4 header size");
43static_assert(kUDPHeaderBytes == 8, "Unexpected UDP header size");
44static_assert(kPacketHeaderBytes == 42, "Unexpected Ethernet/IPv4/UDP header size");
45static_assert(kDAQEthHeaderBytes == 16, "Unexpected DAQEthHeader size");
46static_assert(kWIBEthFrameBytes == 7200, "Unexpected WIBEthFrame size");
47static_assert(kEthernetPacketBytes == 7242, "Unexpected complete Ethernet packet size");
48static_assert(kIPv4TotalBytes == 7228, "Unexpected IPv4 total length");
49static_assert(kUDPDatagramBytes == 7208, "Unexpected UDP datagram length");
50static_assert(kWIBEthBlockLength == 899, "Unexpected DAQEthHeader block_length");
51
53{
54 rte_ether_addr dst_mac{};
55 rte_ether_addr src_mac{};
56 rte_be32_t src_ip = 0;
57 rte_be32_t dst_ip = 0;
58 std::uint16_t src_port = 55677;
59 std::uint16_t dst_port = 55678;
60 std::uint16_t packet_id = 0;
61};
62
64{
65 bool set_det_id = false;
66 std::uint64_t det_id = 0;
67 bool set_seq_id = false;
68 std::uint64_t seq_id = 0;
69 bool force_block_length = true;
70};
71
72// Throws std::runtime_error if addr is not a dotted-quad IPv4 address.
73rte_be32_t
74parse_ipv4_addr(const std::string& addr);
75
76// Rewrites the DAQEthHeader fields selected by patch, in place. wibeth_frame
77// may have any alignment.
78void
79patch_daq_header(void* wibeth_frame, const HeaderPatch& patch);
80
81// Writes kEthernetPacketBytes to ethernet_packet: the 42-byte
82// Ethernet/IPv4/UDP header, then the WIBEthFrame, then the header patch.
83// ethernet_packet may have any alignment.
84void
85construct_packet(void* ethernet_packet,
86 const void* wibeth_frame,
87 const PacketConfig& cfg,
88 const HeaderPatch& patch = {});
89
90} // namespace dunedaq::dpdklibs::wibeth
91
92#endif // DPDKLIBS_INCLUDE_DPDKLIBS_WIBETH_WIBETHPACKETBUILDER_HPP_
constexpr std::size_t kWIBEthFrameBytes
void construct_packet(void *ethernet_packet, const void *wibeth_frame, const PacketConfig &cfg, const HeaderPatch &patch={})
constexpr std::size_t kDAQEthHeaderBytes
constexpr std::size_t kPacketHeaderBytes
void patch_daq_header(void *wibeth_frame, const HeaderPatch &patch)
constexpr std::size_t kIPv4HeaderBytes
rte_be32_t parse_ipv4_addr(const std::string &addr)
constexpr std::size_t kUDPHeaderBytes
constexpr std::size_t kIPv4TotalBytes
constexpr std::uint64_t kDefaultTimestampStep
constexpr std::uint16_t kWIBEthBlockLength
constexpr std::size_t kUDPDatagramBytes
constexpr std::size_t kEthernetPacketBytes
constexpr std::size_t kEthernetHeaderBytes
DAQEthHeader is a versioned and unified structure for every FE electronics.
struct for accessing raw WIB eth frames, as used in ProtoDUNE-II