From: hadaq Date: Fri, 31 Oct 2025 10:13:31 +0000 (+0100) Subject: commit tests for large ethernet into new branch large_ethernet X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=b299794aebaf91e7ae376b13c228096302d311d9;p=trbnettools.git commit tests for large ethernet into new branch large_ethernet --- diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index 9477d43..f27b90e 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -25,6 +25,9 @@ const char trbnet_version[] = "Revision " TRBNET_VERSION " UNKNOWN, i.e. ERROR"; #include #include +//#define TRB_DEBUGGER 1 + + /* Used by trb_register_modify and trb_nettrace */ #define TMP_DATA_SIZE (1024 * 2) static uint32_t tmpData[TMP_DATA_SIZE]; @@ -59,6 +62,7 @@ static uint16_t udpBufferS[1 + 32768]; /* One UDP Package + Header */ static uint16_t* udpBuffer = udpBufferS + 1; static uint16_t dataBufferR[1 + 4096 * 1024]; /* UDP Receive buffer + Header */ static uint16_t* dataBuffer = dataBufferR + 1; + static unsigned int dataBufferSize = 0; /* Size of dataBuffer in 16Bit words */ static uint8_t udp_command_index = 0; static int trb3_sockfd = -1; @@ -430,57 +434,155 @@ static int getUDPPackage() } /* Read Data */ - status = recvfrom(trb3_sockfd, - (void*)dataBufferR, + + uint8_t command_index_type = 2; + uint8_t command_index_ret; + + dataBufferSize = 0; + + uint8_t pkt_nr = 0; + + static uint16_t dataBufferTemp[32768 * 2]; // temporary buffer for multi-packet responses + +// gk this fragment rewritten to support multi-packet responses + while(1) { + + status = recvfrom(trb3_sockfd, + (void*)dataBufferTemp, 65536, - MSG_DONTWAIT, + //MSG_DONTWAIT, + MSG_WAITALL, //MSG_DONTWAIT, (struct sockaddr*)&in_addr, &in_addr_len); - - if (status == -1) { - trb_errno = TRB_TRB3_SOCKET_ERROR; - return -1; - } - - dataBufferSize = status / 2; - if (trb_debug > 2) { - fprintf(stderr, "udp received: %d\n", status); - } - - /* Adjust endianess ... */ - for (i = 0; i < status / 2; i++) { - dataBufferR[i] = ntohs(dataBufferR[i]); - if (trb_debug > 2) { - fprintf(stderr, "%d 0x%04x\n", i, dataBufferR[i]); - } - } - - /* Check returned udp_command_index */ - if (trb3_udp_version == 2) { - uint8_t command_index_type = (uint8_t)(dataBufferR[0] >> 8); - uint8_t command_index_ret = (uint8_t)(dataBufferR[0] & 0x00ff); - if (command_index_type != 2) { - if (trb_debug > 1) { - fprintf(stderr, "getUDPPackage: invalid command_index_type: %d\n", - command_index_type); - } - trb_errno = TRB_TRB3_INVALID_UDP_HEADER; - return -1; - } + + if (trb_debug > 2) + fprintf(stderr, "Received %d bytes\n", status); + + if (status == -1) { + trb_errno = TRB_TRB3_SOCKET_ERROR; + return -1; + } + + if (trb_debug > 2) { + fprintf(stderr, "udp received: %d\n", status); + } - if (command_index_ret != udp_command_index) { - if (trb_debug > 1) { - fprintf(stderr, - "getUDPPackage: invalid : udp_command_index: " - "0x%02x != 0x%02x\n", - command_index_ret, udp_command_index); - } - trb_errno = TRB_TRB3_INVALID_UDP_HEADER; - return -1; - } - } - - return status; +// fprintf(stderr, "dataBufferSize %d status %d pkt_nr %d\n", dataBufferSize, status, pkt_nr); + +// for (i = 0; i < status / 2; i+= 2) +// fprintf(stdout, "%d: %04x %04x\n", i, (unsigned int) dataBufferTemp[i], (unsigned int) dataBufferTemp[i+1]); + + // workaround for minimal successive packet + //if (pkt_nr > 1 && status == 12) { + // dataBufferSize -= 1; + //} + + + /* Adjust endianess ... */ + for (i = 0; i < (status - (pkt_nr == 0 ? 0 : 2)) / 2; i++) { + dataBufferR[dataBufferSize + i] = ntohs(dataBufferTemp[i + (pkt_nr == 0 ? 0 : 1)]); + if (trb_debug > 2) { + fprintf(stderr, "%d 0x%04x\n", i, dataBufferR[i]); + } + } + + dataBufferSize += status / 2 - (pkt_nr == 0 ? 0 : 1); + + + /* Check returned udp_command_index */ + if (trb3_udp_version == 2) { + command_index_type = (uint8_t)(dataBufferTemp[0] & 0x00ff); + command_index_ret = (uint8_t)(dataBufferTemp[0] >> 8); + + //fprintf(stderr, "index_type %d index_ret %d %d\n", command_index_type, command_index_ret, udp_command_index); + + if (command_index_type != 2 && command_index_type != 3 && command_index_type != 4) { + if (trb_debug > 1) { + fprintf(stderr, "getUDPPackage: invalid command_index_type: %d\n", + command_index_type); + } + trb_errno = TRB_TRB3_INVALID_UDP_HEADER; + fprintf(stderr, "exiting because of the command type"); + return -1; + } + + /*if (command_index_ret != udp_command_index) { + if (trb_debug > 1) { + fprintf(stderr, + "getUDPPackage: invalid : udp_command_index: " + "0x%02x != 0x%02x\n", + command_index_ret, udp_command_index); + } + trb_errno = TRB_TRB3_INVALID_UDP_HEADER; + return -1; + }*/ + + + if (command_index_type == 2) { + //fprintf(stderr, "getUDPPackage: received standard packet\n"); + break; + } + else if (command_index_type == 3) { + //fprintf(stderr, "getUDPPackage: received multi-packet flag\n"); + pkt_nr++; + } + else if (command_index_type == 4) { + //fprintf(stderr, "getUDPPackage: received end-of-response flag\n"); + break; + } + + } + else { + //fprintf(stderr, "trb3_udp_version %d\n", trb3_udp_version); + break; + } + } + //fprintf(stdout, "Total size: %d\n", dataBufferSize); + +// for (i = 0; i < dataBufferSize; i+=2) + // fprintf(stdout, "%d: %04x %04x \n", i, (unsigned int) dataBufferR[i], (unsigned int) dataBufferR[i+1]); + +// for (i = 3; i < dataBufferSize; i++) { +// if (dataBufferR[i] == 0x8300) { +// if (dataBufferR[i + 1] != 0x0000 || dataBufferR[i + 2] != 0x0000 || dataBufferR[i - 1] != 0x0038) { +// fprintf(stderr, "data format error at %d\n", i); +// } +// } +// } + + + +// for (i = 0; i < dataBufferSize; i++) { +// fprintf(stderr, "%04X\n", dataBufferR[i]); +// } + +// fprintf(stderr, "TESTING:\n"); + unsigned int prev_d2 = 0; + unsigned int prev_d3 = 0; + for (i = 6; i < dataBufferSize; i += 5) { + //d = i(d << 16) | dataBufferR[i]; + //if (i % 2 == 0) fprintf(stderr, "%08X\n", d); + unsigned int d1 = dataBufferR[i] << 16 | dataBufferR[i+1]; + unsigned int d2 = dataBufferR[i+2] << 16 | dataBufferR[i+3]; + unsigned int d3 = dataBufferR[i+4]; +// fprintf(stderr, "%08X %08X %04X\n", d1, d2, d3); + if (prev_d2 != 0 && d2 - prev_d2 != 1 && d1 == 0x00388315) + fprintf(stderr, "ERROR in counter sequence %d\n", i); +// if (d1 != 0x00388315 && d2 != 0x00000001) +// fprintf(stdout, "ERROR in fixed d1 values %d\n", i); +// if (prev_d3 != 0 && d3 != prev_d3 && d2 != 0x00000001) +// fprintf(stdout, "ERROR in fixed d3 value %d\n", i); + + + prev_d2 = d2; + prev_d3 = d3; + } + +// fprintf(stderr, "TEST END\n"); + + +//fprintf(stderr, "return size %d\n", dataBufferSize * 2); + return dataBufferSize * 2; } static int sendTrbPackage(size_t size) @@ -531,13 +633,18 @@ static int sendTrbPackage(size_t size) /* GetData */ status = getUDPPackage(); + +//fprintf(stderr, "status %d\n", status); + if (status > 0) break; /* Success */ if (trb_errno == TRB_TRB3_SOCKET_ERROR) return -1; /* UDP Error */ + /* UDP Timeout, resend request */ timeoutCtr++; } - + + return status; } @@ -785,7 +892,6 @@ static int trb_fifo_read(uint8_t channel, uint32_t data[], unsigned int dsize) { - #ifdef ETRAX static uint32_t dataBuffer = 0; uint32_t* tmp = &dataBuffer; @@ -813,6 +919,9 @@ static int trb_fifo_read(uint8_t channel, uint32_t memLen = 0; /* used by FIFO_MODE_REG_READ_MEM and FIFO_MODE_IPU_DATA Mode */ + +//fprintf(stderr, "gk: %u %u\n", dataBufferSize, dsize); + #ifdef ETRAX /* Determin FIFO-Address */ if (channel >= 4) { @@ -946,7 +1055,7 @@ static int trb_fifo_read(uint8_t channel, /* Determine H0 HeaderType */ headerType = (package.H0 & MASK_HEADER_TYPE) >> SHIFT_HEADER_TYPE; - +//fprintf(stderr, "gk %x\n", package.H0); /* DEBUG INFO */ if (trb_debug > 0) { TRB_Package_dump(&package); @@ -1108,7 +1217,9 @@ static int trb_fifo_read(uint8_t channel, break; case FIFO_MODE_REG_READ_MEM: +//fprintf(stderr, "gk %d %d %d\n", headerType, dataCtr, dsize); switch (headerType) { + case HEADER_HDR: if (dataCtr < dsize) { if (lastHeader != NULL) { @@ -1132,7 +1243,7 @@ static int trb_fifo_read(uint8_t channel, ((uint32_t)package.F2)); #ifdef TRB_DEBUGGER fprintf(stderr, - "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]); + "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]); #endif memLen++; } else { @@ -1150,6 +1261,7 @@ static int trb_fifo_read(uint8_t channel, #ifdef ETRAX fifo_flush(channel); #endif +fprintf(stderr, "tutaj\n"); trb_errno = TRB_FIFO_INVALID_HEADER; return -1; } @@ -2138,7 +2250,6 @@ int trb_register_read_mem(uint16_t trb_address, udpBuffer[14] = CMD_REGISTER_READ_MEM; status = sendTrbPackage(15); - if (status < 0) { unlockPorts(0); return -1; @@ -2166,9 +2277,7 @@ int trb_register_read_mem(uint16_t trb_address, if (trb_debug > 0) { fprintf(stderr, "CMD_REGISTER_READ_MEM started.\n"); } - status = trb_fifo_read(3, FIFO_MODE_REG_READ_MEM, data, dsize); - if (unlockPorts(0) == -1) return -1; if (status == -1) return status;