diff --git a/receiver/host/HLSSimulatedDevice.cpp b/receiver/host/HLSSimulatedDevice.cpp index 5d7f76d9..65d89d35 100644 --- a/receiver/host/HLSSimulatedDevice.cpp +++ b/receiver/host/HLSSimulatedDevice.cpp @@ -98,14 +98,14 @@ void HLSSimulatedDevice::CreatePacketJF(const DiffractionExperiment& experiment, packet->udp_length = htons(8248); // JF headers are little endian - packet->timestamp = 0xABCDEF0000FEDCBAL; - packet->bunchid = 0x1234567898765431L; - packet->framenum = frame_number; - packet->packetnum = eth_packet % 64; - if (trigger) packet->debug = 1<<31; + packet->jf.timestamp = 0xABCDEF0000FEDCBAL; + packet->jf.bunchid = 0x1234567898765431L; + packet->jf.framenum = frame_number; + packet->jf.packetnum = eth_packet % 64; + if (trigger) packet->jf.debug = 1<<31; if (data != nullptr) { for (int i = 0; i < 4096; i++) - packet->data[i] = data[i]; + packet->jf.data[i] = data[i]; } packet->udp_checksum = htons(checksum( (uint16_t *) (buff+42), 8192+48)); diff --git a/receiver/host/ProcessRawPacket.cpp b/receiver/host/ProcessRawPacket.cpp index 1793f576..5454ce3b 100644 --- a/receiver/host/ProcessRawPacket.cpp +++ b/receiver/host/ProcessRawPacket.cpp @@ -24,19 +24,14 @@ ProcessRawPacket::~ProcessRawPacket() { } } -bool ProcessRawPacket::ProcessPacket(void *ptr, size_t size) { - if (size != sizeof(RawJFUDPacket)) - return false; - - auto packet = (RawJFUDPacket *) ptr; - - if (packet->framenum == 0) +bool ProcessRawPacket::ProcessPacket(jf_payload &datagram, uint32_t src_ip) { + if (datagram.framenum == 0) throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, "Frame number cannot be zero"); - uint64_t frame_number = packet->framenum - 1; - uint32_t ipv4_src_addr_host = (packet->ipv4_header_sour_ip) >> 24; + uint64_t frame_number = datagram.framenum - 1; + uint32_t ipv4_src_addr_host = src_ip >> 24; uint64_t module_number = (ipv4_src_addr_host % 32) / 2; bool second_half_module = (ipv4_src_addr_host % 2 == 1); - uint32_t packetnum = packet->packetnum | (second_half_module ? 64 : 0); + uint32_t packetnum = datagram.packetnum | (second_half_module ? 64 : 0); uint64_t counter = (module_number * 2) | (frame_number % 2); if (counter > module_info.size()) @@ -50,9 +45,9 @@ bool ProcessRawPacket::ProcessPacket(void *ptr, size_t size) { module_info[counter].c.type = Completion::Type::Image; module_info[counter].c.frame_number = frame_number; - module_info[counter].c.timestamp = packet->timestamp; - module_info[counter].c.bunchid = packet->bunchid; - module_info[counter].c.debug = packet->debug; + module_info[counter].c.timestamp = datagram.timestamp; + module_info[counter].c.bunchid = datagram.bunchid; + module_info[counter].c.debug = datagram.debug; module_info[counter].c.packet_mask[0] = 0; module_info[counter].c.packet_mask[1] = 0; module_info[counter].c.packet_count = 0; @@ -67,10 +62,10 @@ bool ProcessRawPacket::ProcessPacket(void *ptr, size_t size) { module_info[counter].c.packet_mask[packetnum >= 64 ? 1 : 0] |= (1LU << (packetnum % 64)); if (conversion) - conversion->ConvertPacket( (int16_t *) (module_info[counter].ptr + 4096 * packetnum), packet->data, + conversion->ConvertPacket( (int16_t *) (module_info[counter].ptr + 4096 * packetnum), datagram.data, packetnum); else - memcpy((int16_t *) (module_info[counter].ptr + 4096 * packetnum), packet->data, + memcpy((int16_t *) (module_info[counter].ptr + 4096 * packetnum), datagram.data, 4096 * sizeof(uint16_t)); return true; diff --git a/receiver/host/ProcessRawPacket.h b/receiver/host/ProcessRawPacket.h index aeceac3f..4540a483 100644 --- a/receiver/host/ProcessRawPacket.h +++ b/receiver/host/ProcessRawPacket.h @@ -7,6 +7,7 @@ #include "../../common/ThreadSafeFIFO.h" #include "Completion.h" #include "../../jungfrau/JFConversion.h" +#include "RawJFUDPPacket.h" struct ProcessWorkRequest { uint16_t *ptr; @@ -27,7 +28,7 @@ public: ProcessRawPacket(ThreadSafeFIFO &c, ThreadSafeFIFO &wr, uint32_t nmodules, JFConversion *conversion = nullptr); ~ProcessRawPacket(); - bool ProcessPacket(void *ptr, size_t size); + bool ProcessPacket(jf_payload &datagram, uint32_t src_ip); }; diff --git a/receiver/host/RawJFUDPPacket.h b/receiver/host/RawJFUDPPacket.h index 6cab1aab..a37461dc 100644 --- a/receiver/host/RawJFUDPPacket.h +++ b/receiver/host/RawJFUDPPacket.h @@ -6,10 +6,24 @@ #include -// full JF packet - for simulation -#pragma pack(push) -#pragma pack(2) -struct RawJFUDPacket { +struct __attribute__((packed, aligned(2))) jf_payload { + uint64_t framenum; + uint32_t exptime; // x 1e-7 sec + uint32_t packetnum; + uint64_t bunchid; + uint64_t timestamp; + uint16_t moduleID; + uint16_t xCoord; + uint16_t yCoord; + uint16_t zCoord; + uint32_t debug; + uint16_t roundRobin; + uint8_t detectortype; + uint8_t headerVersion; + uint16_t data[4096]; +}; + +struct __attribute__((packed, aligned(2))) RawJFUDPacket { char dest_mac[6]; char sour_mac[6]; uint16_t ether_type; @@ -25,24 +39,7 @@ struct RawJFUDPacket { uint16_t udp_dest_port; uint16_t udp_length; uint16_t udp_checksum; - // 42 bytes - uint64_t framenum; - uint32_t exptime; // x 1e-7 sec - uint32_t packetnum; - uint64_t bunchid; - uint64_t timestamp; - uint16_t moduleID; - uint16_t xCoord; - uint16_t yCoord; - uint16_t zCoord; - uint32_t debug; - uint16_t roundRobin; - uint8_t detectortype; - uint8_t headerVersion; - // 48 + 42 = 90 bytes - uint16_t data[4096]; - // 96 + 8192 = 8282 bytes + jf_payload jf; }; -#pragma pack(pop) #endif //JUNGFRAUJOCH_RAWJFUDPPACKET_H diff --git a/tests/FPGANetworkTest.cpp b/tests/FPGANetworkTest.cpp index d9cef895..1e839644 100644 --- a/tests/FPGANetworkTest.cpp +++ b/tests/FPGANetworkTest.cpp @@ -68,7 +68,7 @@ TEST_CASE("HLS_Network_UDP") { jf_packet->ipv4_header_sour_ip = htonl(0x12345640); jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(129); - jf_packet->framenum = 123456; + jf_packet->jf.framenum = 123456; STREAM_512 udp_in; STREAM_512 udp_out; @@ -92,7 +92,7 @@ TEST_CASE("HLS_Network_UDP") { packet_512_t packet_out; udp_out.read(packet_out); - REQUIRE(packet_out.data(63,0) == jf_packet->framenum); + REQUIRE(packet_out.data(63,0) == jf_packet->jf.framenum); ap_uint udp_metadata_out; udp_metadata.read(udp_metadata_out); @@ -110,7 +110,7 @@ TEST_CASE("HLS_Network_UDP_EthErr") { jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(129); - jf_packet->framenum = 123456; + jf_packet->jf.framenum = 123456; STREAM_512 udp_in; STREAM_512 udp_out; @@ -134,7 +134,7 @@ TEST_CASE("HLS_Network_UDP_EthErr") { packet_512_t packet_out; udp_out.read(packet_out); - REQUIRE(packet_out.data(63,0) == jf_packet->framenum); + REQUIRE(packet_out.data(63,0) == jf_packet->jf.framenum); ap_uint udp_metadata_out; udp_metadata.read(udp_metadata_out); @@ -151,7 +151,7 @@ TEST_CASE("HLS_Network_UDP_LenErr") { jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(129); - jf_packet->framenum = 123456; + jf_packet->jf.framenum = 123456; uint64_t packet_counter; ap_uint<1> clear_counter = 0; @@ -176,7 +176,7 @@ TEST_CASE("HLS_Network_UDP_LenErr") { packet_512_t packet_out; udp_out.read(packet_out); - REQUIRE(packet_out.data(63,0) == jf_packet->framenum); + REQUIRE(packet_out.data(63,0) == jf_packet->jf.framenum); ap_uint udp_metadata_out; udp_metadata.read(udp_metadata_out); @@ -193,11 +193,11 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_1") { jf_packet->ipv4_header_sour_ip = htonl(32+5); jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(128 + 5); - jf_packet->framenum = 123456; - jf_packet->packetnum = 60; + jf_packet->jf.framenum = 123456; + jf_packet->jf.packetnum = 60; for (int i = 0; i < 4096; i++) - jf_packet->data[i] = i; + jf_packet->jf.data[i] = i; STREAM_512 udp_in; STREAM_512 udp_out; @@ -234,13 +234,13 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_1") { for (int i = 0; i < 128; i++) { auto packet_out = raw_out.read(); - REQUIRE(memcmp(&(packet_out.data), jf_packet->data + 32 * i, 64) == 0); + REQUIRE(memcmp(&(packet_out.data), jf_packet->jf.data + 32 * i, 64) == 0); } auto addr = addr0.read(); - REQUIRE(addr_frame_number(addr) == jf_packet->framenum); + REQUIRE(addr_frame_number(addr) == jf_packet->jf.framenum); REQUIRE(addr_module(addr) == 5 / 2); - REQUIRE(addr_eth_packet(addr) == (jf_packet->packetnum | 64)); + REQUIRE(addr_eth_packet(addr) == (jf_packet->jf.packetnum | 64)); } TEST_CASE("HLS_Network_UDP_SLS_detector_2") { @@ -251,11 +251,11 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_2") { jf_packet->udp_length = htons(8248); jf_packet->ipv4_header_sour_ip = htonl(32+4); - jf_packet->framenum = UINT64_MAX - 300; - jf_packet->packetnum = 35; + jf_packet->jf.framenum = UINT64_MAX - 300; + jf_packet->jf.packetnum = 35; for (int i = 0; i < 4096; i++) - jf_packet->data[i] = i; + jf_packet->jf.data[i] = i; STREAM_512 udp_in; STREAM_512 udp_out; @@ -292,13 +292,13 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_2") { for (int i = 0; i < 128; i++) { auto packet_out = raw_out.read(); - REQUIRE(memcmp(&(packet_out.data), jf_packet->data + 32 * i, 64) == 0); + REQUIRE(memcmp(&(packet_out.data), jf_packet->jf.data + 32 * i, 64) == 0); } auto addr = addr0.read(); - REQUIRE(addr_frame_number(addr) == jf_packet->framenum); + REQUIRE(addr_frame_number(addr) == jf_packet->jf.framenum); REQUIRE(addr_module(addr) == 2); - REQUIRE(addr_eth_packet(addr) == jf_packet->packetnum); + REQUIRE(addr_eth_packet(addr) == jf_packet->jf.packetnum); } TEST_CASE("HLS_Network_UDP_SLS_detector_2_packets") { @@ -309,11 +309,11 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_2_packets") { jf_packet->ipv4_header_sour_ip = htonl(192+2); jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(128 + 2); - jf_packet->framenum = UINT64_MAX - 300; - jf_packet->packetnum = 35; + jf_packet->jf.framenum = UINT64_MAX - 300; + jf_packet->jf.packetnum = 35; for (int i = 0; i < 4096; i++) - jf_packet->data[i] = i; + jf_packet->jf.data[i] = i; STREAM_512 udp_in; STREAM_512 udp_out; @@ -361,13 +361,13 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_2_packets") { for (int j = 0; j < 2; j++) { for (int i = 0; i < 128; i++) { auto packet_out = raw_out.read(); - REQUIRE(memcmp(&(packet_out.data), jf_packet->data + 32 * i, 64) == 0); + REQUIRE(memcmp(&(packet_out.data), jf_packet->jf.data + 32 * i, 64) == 0); } auto addr = addr0.read(); - REQUIRE(addr_frame_number(addr) == jf_packet->framenum); + REQUIRE(addr_frame_number(addr) == jf_packet->jf.framenum); REQUIRE(addr_module(addr) == 1); - REQUIRE(addr_eth_packet(addr) == jf_packet->packetnum); + REQUIRE(addr_eth_packet(addr) == jf_packet->jf.packetnum); } } @@ -379,11 +379,11 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_packets_err") { jf_packet->ipv4_header_sour_ip = htonl(32+4); jf_packet->udp_length = htons(8248); jf_packet->udp_dest_port = htons(128 + 4); - jf_packet->framenum = UINT64_MAX - 300; - jf_packet->packetnum = 35; + jf_packet->jf.framenum = UINT64_MAX - 300; + jf_packet->jf.packetnum = 35; for (int i = 0; i < 4096; i++) - jf_packet->data[i] = i; + jf_packet->jf.data[i] = i; STREAM_512 udp_in; STREAM_512 udp_out; @@ -452,13 +452,13 @@ TEST_CASE("HLS_Network_UDP_SLS_detector_packets_err") { for (int i = 0; i < 128; i++) { auto packet_out = raw_out.read(); - REQUIRE(memcmp(&(packet_out.data), jf_packet->data + 32 * i, 64) == 0); + REQUIRE(memcmp(&(packet_out.data), jf_packet->jf.data + 32 * i, 64) == 0); } auto addr = addr0.read(); - REQUIRE(addr_frame_number(addr) == jf_packet->framenum); + REQUIRE(addr_frame_number(addr) == jf_packet->jf.framenum); REQUIRE(addr_module(addr) == 2); - REQUIRE(addr_eth_packet(addr) == jf_packet->packetnum); + REQUIRE(addr_eth_packet(addr) == jf_packet->jf.packetnum); REQUIRE(udp_packet_counter == 4); REQUIRE(sls_packet_counter == 1); diff --git a/tests/ProcessRawPacketTest.cpp b/tests/ProcessRawPacketTest.cpp index 7a3264a5..deff137c 100644 --- a/tests/ProcessRawPacketTest.cpp +++ b/tests/ProcessRawPacketTest.cpp @@ -31,27 +31,25 @@ TEST_CASE("ProcessRawPacketTest") { { ProcessRawPacket process(c_fifo, wr_fifo, 4); - RawJFUDPacket packet; - packet.ipv4_header_sour_ip = experiment.GetSrcIPv4Address(0, 4); - packet.packetnum = 36; - packet.framenum = 1; - packet.bunchid = 84; - packet.data[0] = 6789; - process.ProcessPacket(&packet, sizeof(RawJFUDPacket)); + jf_payload datagram; - packet.ipv4_header_sour_ip = experiment.GetSrcIPv4Address(0, 5); - packet.packetnum = 36; - packet.framenum = 2; - packet.bunchid = 84; - packet.data[0] = 6345; - process.ProcessPacket(&packet, sizeof(RawJFUDPacket)); + datagram.packetnum = 36; + datagram.framenum = 1; + datagram.bunchid = 84; + datagram.data[0] = 6789; + process.ProcessPacket(datagram, experiment.GetSrcIPv4Address(0, 4)); - packet.ipv4_header_sour_ip = experiment.GetSrcIPv4Address(1, 7); // using different data stream => should not cause issues here - packet.packetnum = 16; - packet.framenum = 3; - packet.bunchid = 84; - packet.data[0] = 6346; - process.ProcessPacket(&packet, sizeof(RawJFUDPacket)); + datagram.packetnum = 36; + datagram.framenum = 2; + datagram.bunchid = 84; + datagram.data[0] = 6345; + process.ProcessPacket(datagram, experiment.GetSrcIPv4Address(0, 5)); + + datagram.packetnum = 16; + datagram.framenum = 3; + datagram.bunchid = 84; + datagram.data[0] = 6346; + process.ProcessPacket(datagram, experiment.GetSrcIPv4Address(1,7)); }