31 return rte_be_to_cpu_16(udp_hdr->dgram_len) -
sizeof(
struct rte_udp_hdr);
37 return rte_be_to_cpu_16(ipv4_udp_hdr->
udp_hdr.dgram_len) -
sizeof(
struct rte_udp_hdr);
43 rte_le32_t ip_address = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
44 return rte_cpu_to_be_32(ip_address);
51 memcpy(&addr, &binary_ipv4_address,
sizeof(rte_le32_t));
58 std::ostringstream ostrs;
75 char* payload = (
char*)(udp_packet + 1);
103 ostrs << std::setfill(
fill) << std::setw(digits) << std::hex << value << std::dec << separator;
111 std::ostringstream ostrs;
112 ostrs <<
"\n------ start of packet ----- \n";
113 ostrs <<
"dst mac addr: ";
120 ostrs <<
"src mac addr: ";
127 ostrs <<
"ethtype: " << (unsigned)pkt->
eth_hdr.ether_type <<
'\n';
129 ostrs <<
"------ IP header ----- \n";
130 ostrs <<
"ipv4 version: " << (unsigned)pkt->
ipv4_hdr.version_ihl <<
'\n';
131 ostrs <<
"ipv4 type_of_service: " << (unsigned)pkt->
ipv4_hdr.type_of_service <<
'\n';
132 ostrs <<
"ipv4 total lenght: " << (unsigned)rte_be_to_cpu_16(pkt->
ipv4_hdr.total_length) <<
'\n';
133 ostrs <<
"ipv4 packet_id: " << (unsigned)pkt->
ipv4_hdr.packet_id <<
'\n';
134 ostrs <<
"ipv4 fragment_offset: " << (unsigned)pkt->
ipv4_hdr.fragment_offset <<
'\n';
135 ostrs <<
"ipv4 time_to_live: " << (unsigned)pkt->
ipv4_hdr.time_to_live <<
'\n';
136 ostrs <<
"ipv4 next_proto_id: " << (unsigned)pkt->
ipv4_hdr.next_proto_id <<
'\n';
137 ostrs <<
"ipv4 checksum: " << (unsigned)rte_be_to_cpu_16(pkt->
ipv4_hdr.hdr_checksum) <<
'\n';
140 ostrs <<
"src_addr: " << srcaddr <<
'\n';
141 ostrs <<
"dst_addr: " << dstaddr <<
'\n';
143 ostrs <<
"------ UDP header ----- \n";
144 ostrs <<
"UDP src_port: " << (unsigned)rte_be_to_cpu_16(pkt->
udp_hdr.src_port) <<
'\n';
145 ostrs <<
"UDP dst_port: " << (unsigned)rte_be_to_cpu_16(pkt->
udp_hdr.dst_port) <<
'\n';
146 ostrs <<
"UDP len: " << (unsigned)rte_be_to_cpu_16(pkt->
udp_hdr.dgram_len) <<
'\n';
147 ostrs <<
"UDP checksum: " << (unsigned)rte_be_to_cpu_16(pkt->
udp_hdr.dgram_cksum) <<
'\n';
156 char* payload = (
char*)(pkt);
157 std::ostringstream ostrs;
159 for (
byte = 0;
byte < rte_be_to_cpu_16(pkt->
udp_hdr.dgram_len);
byte++) {
173 std::ifstream packetfile;
174 packetfile.open(
filename, std::ios::binary);
180 while (packetfile.get(
byte)) {
181 buffervec.push_back(
byte);
187std::vector<std::pair<const void*, int>>
191 std::vector<std::pair<const void*, int>> ethernet_packets;
192 const std::vector<uint16_t> allowed_ethertypes{ 0x0800, 0x0806 };
194 for (
int byte_index = 0; byte_index < buffervec.size();) {
195 const auto buf_ptr = &buffervec.at(byte_index);
200 for (
auto allowed_ethertype : allowed_ethertypes) {
201 if (hdr->eth_hdr.ether_type == rte_be_to_cpu_16(allowed_ethertype)) {
208 std::stringstream msgstr;
209 msgstr <<
"Ether type in ethernet header (value " << std::hex << rte_be_to_cpu_16(hdr->eth_hdr.ether_type) << std::dec <<
") either unknown or unsupported";
210 throw dunedaq::dpdklibs::BadPacketHeaderIssue(
ERS_HERE, msgstr.str());
213 int ipv4_packet_size = rte_be_to_cpu_16(hdr->ipv4_hdr.total_length);
214 constexpr int min_packet_size =
sizeof(rte_ipv4_hdr) +
sizeof(rte_udp_hdr);
215 constexpr int max_packet_size = 10000;
217 if (ipv4_packet_size < min_packet_size || ipv4_packet_size > max_packet_size) {
218 std::stringstream msgstr;
219 msgstr <<
"Calculated IPv4 packet size of " << ipv4_packet_size <<
" bytes is out of the required range of (" << min_packet_size <<
", " << max_packet_size <<
") bytes";
220 throw dunedaq::dpdklibs::BadPacketHeaderIssue(
ERS_HERE, msgstr.str());
223 int ethernet_packet_size =
sizeof(rte_ether_hdr) + ipv4_packet_size;
224 ethernet_packets.emplace_back(std::pair<const void*, int>{ buf_ptr, ethernet_packet_size });
225 byte_index += ethernet_packet_size;
228 return ethernet_packets;
234 daqethheader_obj.version = 0;
235 daqethheader_obj.det_id = 1;
236 daqethheader_obj.crate_id = 2;
237 daqethheader_obj.slot_id = 3;
238 daqethheader_obj.stream_id = 4;
239 daqethheader_obj.reserved = 5;
240 daqethheader_obj.seq_id = 6;
241 daqethheader_obj.block_length = 7;
242 daqethheader_obj.timestamp = 8;
248 std::stringstream ss;
250 ss <<
"\nrte_mbuf info:";
251 ss <<
"\npkt_len: " << mbuf->pkt_len;
252 ss <<
"\ndata_len: " << mbuf->data_len;
253 ss <<
"\nBuffer address: " << std::hex << mbuf->buf_addr;
254 ss <<
"\nRef count: " << std::dec << rte_mbuf_refcnt_read(mbuf);
255 ss <<
"\nport: " << mbuf->port;
256 ss <<
"\nol_flags: " << std::hex << mbuf->ol_flags;
257 ss <<
"\npacket_type: " << std::dec << mbuf->packet_type;
258 ss <<
"\nl2 type: " <<
static_cast<int>(mbuf->l2_type);
259 ss <<
"\nl3 type: " <<
static_cast<int>(mbuf->l3_type);
260 ss <<
"\nl4 type: " <<
static_cast<int>(mbuf->l4_type);
261 ss <<
"\ntunnel type: " <<
static_cast<int>(mbuf->tun_type);
262 ss <<
"\nInner l2 type: " <<
static_cast<int>(mbuf->inner_l2_type);
263 ss <<
"\nInner l3 type: " <<
static_cast<int>(mbuf->inner_l3_type);
264 ss <<
"\nInner l4 type: " <<
static_cast<int>(mbuf->inner_l4_type);
265 ss <<
"\nbuf_len: " << mbuf->buf_len;
266 ss <<
"\nl2_len: " << mbuf->l2_len;
267 ss <<
"\nl3_len: " << mbuf->l3_len;
268 ss <<
"\nl4_len: " << mbuf->l4_len;
269 ss <<
"\nouter_l2_len: " << mbuf->outer_l2_len;
270 ss <<
"\nouter_l3_len: " << mbuf->outer_l3_len;
279 std::stringstream opmonstr;
280 opmonstr <<
"det" << sid.det_id <<
"_crt" << sid.crate_id <<
"_slt" << sid.slot_id <<
"_str" << sid.stream_id;
281 return opmonstr.str();
static void fill(const ResourceSet &rs, std::vector< const ResourceSetOR * > &rs_or, std::vector< const ResourceSetAND * > &rs_and, TestCircularDependency &cd_fuse)
rte_be32_t ip_address_dotdecimal_to_binary(std::uint8_t byte1, std::uint8_t byte2, std::uint8_t byte3, std::uint8_t byte4)
std::uint16_t get_payload_size(struct ipv4_udp_packet_hdr *ipv4_udp_hdr)
std::string get_udp_packet_str(struct rte_mbuf *mbuf)
void hex_digits_to_stream(std::ostringstream &ostrs, int value, char separator=':', char fill='0', int digits=2)
std::vector< std::pair< const void *, int > > get_ethernet_packets(const std::vector< char > &buffervec)
char * get_udp_payload(const rte_mbuf *mbuf)
std::string get_ipv4_decimal_addr_str(struct ipaddr ipv4_address)
std::string get_opmon_string(const StreamUID &sid)
std::string get_udp_header_str(struct rte_mbuf *mbuf)
struct ipaddr ip_address_binary_to_dotdecimal(rte_le32_t binary_ipv4_address)
void add_file_contents_to_vector(const std::string &filename, std::vector< char > &buffervec)
std::uint16_t get_payload_size_udp_hdr(struct rte_udp_hdr *udp_hdr)
std::string get_rte_mbuf_str(const rte_mbuf *mbuf) noexcept
void set_daqethheader_test_values(detdataformats::DAQEthHeader &daqethheader_obj) noexcept
struct rte_udp_hdr udp_hdr
struct rte_ipv4_hdr ipv4_hdr
struct rte_ether_hdr eth_hdr