]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
commit tests for large ethernet into new branch large_ethernet
authorhadaq <hadaq@hades33.gsi.de>
Fri, 31 Oct 2025 10:13:31 +0000 (11:13 +0100)
committerhadaq <hadaq@hades33.gsi.de>
Fri, 31 Oct 2025 10:13:31 +0000 (11:13 +0100)
libtrbnet/trbnet.c

index 9477d432580fbfe6e8349a625f6da870aced2e4c..f27b90e63df27a1d4d6569d1044d9c47eed4c8b4 100644 (file)
@@ -25,6 +25,9 @@ const char trbnet_version[] = "Revision " TRBNET_VERSION " UNKNOWN, i.e. ERROR";
 #include <stdint.h>
 #include <math.h>
 
+//#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;