]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
sender and receiver port are the same, portnumber wil be chosen by operating system
authorhadaq <hadaq>
Wed, 18 Jul 2012 19:58:50 +0000 (19:58 +0000)
committerhadaq <hadaq>
Wed, 18 Jul 2012 19:58:50 +0000 (19:58 +0000)
libtrbnet/trbnet.c

index df3c0aeadff44621815c0cd937800570bccf7158..d2f8879124f62cd23a2ad72bfbc2941c1e77f3d3 100644 (file)
@@ -1,11 +1,11 @@
 #ifdef ETRAX
-const char trbnet_version[] = "$Revision: 4.30 $  Local Etrax";
+const char trbnet_version[] = "$Revision: 4.31 $  Local Etrax";
 #elif defined PEXOR
-const char trbnet_version[] = "$Revision: 4.30 $  Local Pexor";
+const char trbnet_version[] = "$Revision: 4.31 $  Local Pexor";
 #elif defined TRB3
-const char trbnet_version[] = "$Revision: 4.30 $  Local TRB3";
+const char trbnet_version[] = "$Revision: 4.31 $  Local TRB3";
 #else
-const char trbnet_version[] = "$Revision: 4.30 $  UNKNOWN, i.e. ERROR";
+const char trbnet_version[] = "$Revision: 4.31 $  UNKNOWN, i.e. ERROR";
 #endif
 
 #include <stdlib.h>
@@ -47,13 +47,13 @@ int pexor_dma = 1;
 
 static uint16_t udpBuffer[32768]; /* One UDP Package */
 static uint16_t dataBuffer[4096 * 1024];
-static unsigned int dataBufferSize = 0;  /* Size of dataBuffer in 16BIt words */
+static unsigned int dataBufferSize = 0;  /* Size of dataBuffer in 16Bit words */
 static int trb3_sockfd = -1;
-static int trb3_sockfd_in = -1;
+static struct sockaddr_in trb3_addr;
 static uint16_t trb3_port = 25000; 
 uint16_t sender_address = 0x5555;
-#endif
 
+#endif
 
 #include <trberror.h>
 #include "trbnet.h"
@@ -382,6 +382,8 @@ static inline void com_reset_FPGA()
 
 static int getUDPPackage()
 {
+  static struct sockaddr_in in_addr;
+  static socklen_t in_addr_len;
   int status;
   int i;
   
@@ -389,7 +391,13 @@ static int getUDPPackage()
   if (trb_debug > 2) {
     fprintf(stderr, "Wait UDP Data\n");
   }
-  status = recv(trb3_sockfd_in, (void*)dataBuffer, 65536, 0);
+  in_addr_len = sizeof(struct sockaddr_in);
+  status = recvfrom(trb3_sockfd,
+                    (void*)dataBuffer,
+                    65536,
+                    0,
+                    (struct sockaddr*)&in_addr,
+                    &in_addr_len);
   if (status == -1) {
     trb_errno = errno == EAGAIN 
       ? TRB_TRB3_SOCKET_TIMEOUT 
@@ -400,18 +408,15 @@ static int getUDPPackage()
   if (trb_debug > 2) {
     fprintf(stderr, "udp received: %d\n", status);
   }
-  
+    
   /* Adjust endianess ... */
-  if (trb_debug > 2) {
-    fprintf(stderr, "udp received: %d\n", status);
-  }
   for (i = 0; i < status / 2; i++) {
     dataBuffer[i] = ntohs(dataBuffer[i]);
     if (trb_debug > 2) {
       fprintf(stderr, "%d  0x%04x\n", i, dataBuffer[i]);
     }
   } 
-
+  
   return status;
 }
 
@@ -436,11 +441,17 @@ static int sendTrbPackage(size_t size)
     if (trb_debug > 2) {
       fprintf(stderr, "Send UDP request attempt #%d\n", timeoutCtr);
     }
-    if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
+    
+    /* Send request */
+    if (sendto(trb3_sockfd,
+               (void*)udpBuffer,
+               size * 2, MSG_CONFIRM,
+               (const struct sockaddr*)(&trb3_addr),
+               sizeof(struct sockaddr_in)) == -1) {
       trb_errno = TRB_TRB3_SOCKET_ERROR;
       return -1;
     }
-  
+    
     /* GetData */
     status = getUDPPackage();
     if (status > 0) break;  /* Success */
@@ -449,7 +460,7 @@ static int sendTrbPackage(size_t size)
     /* UDP Timeout, resend request */
     timeoutCtr++;
   }
-  
+
   return status;
 }
 
@@ -1570,8 +1581,6 @@ void close_ports()
 int init_ports()
 {
   char* trb3_name = NULL;
-  struct sockaddr_in sender_addr;
-  struct sockaddr_in receiver_addr;
   struct hostent* host = NULL;
   struct timeval tv;
 
@@ -1581,6 +1590,7 @@ int init_ports()
     fprintf(stderr, "init_ports: called\n");
   }
   
+  /* Get TRB3 IP-Address */
   trb3_name = getenv("TRB3_SERVER");
   if (trb3_name == NULL) {
     trb3_name = "pexor";
@@ -1590,53 +1600,28 @@ int init_ports()
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
-  /* Sender/Receiver Socket */
+  
+  /* Create Socket */
   trb3_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
-  if (trb3_sockfd  == -1) {
+  if (trb3_sockfd == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
 
-
-   sender_addr.sin_family = AF_INET;
-   sender_addr.sin_port = htons(trb3_port);  
-   sender_addr.sin_addr = *((struct in_addr *)host->h_addr);
-   memset(&(sender_addr.sin_zero), 0, 8);
-
-  if (connect(trb3_sockfd, 
-             (struct sockaddr *)&sender_addr,
-             sizeof(struct sockaddr)) == -1) {
-    trb_errno = TRB_TRB3_SOCKET_ERROR;
-     return -1;
-  }
-   
-  struct sockaddr_in temp;
-  int addr_size = sizeof(temp);
-  getsockname(trb3_sockfd, &temp, &addr_size);
-
-  printf("got socketnumber: %d\n", ntohs(temp.sin_port));
+  /* Create Target Address */
+  trb3_addr.sin_family = AF_INET;
+  trb3_addr.sin_port = htons(trb3_port);  
+  trb3_addr.sin_addr = *((struct in_addr*)host->h_addr);
+  memset(&(trb3_addr.sin_zero), 0, 8);
+  
   /* Set Socket Timepout */
-  tv.tv_sec = 3;    /* 10 Secs Timeout */
-  tv.tv_usec = 0;  /* do not init this, it can cause strange errors */
-  setsockopt(trb3_sockfd, SOL_SOCKET, SO_RCVTIMEO, 
-             (char *)&tv,sizeof(struct timeval));
-  
-  /* ??? */
-  receiver_addr.sin_family = AF_INET;
-  receiver_addr.sin_port = htons(ntohs(temp.sin_port) + 1); /*htons(25000);  */
-  receiver_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-  memset(&(receiver_addr.sin_zero), 0, 8);
-
-  trb3_sockfd_in = socket(AF_INET, SOCK_DGRAM, 0);
-  if (trb3_sockfd_in  == -1) {
-    trb_errno = TRB_TRB3_SOCKET_ERROR;
-    return -1;
-  }
-
-  if (bind(trb3_sockfd_in,
-          (struct sockaddr *)&receiver_addr,
-          sizeof(struct sockaddr)) ==-1) {
+  tv.tv_sec = 3;    /* 3 Secs Timeout */
+  tv.tv_usec = 0;   /* do not init this, it can cause strange errors */
+  if (setsockopt(trb3_sockfd,
+                 SOL_SOCKET,
+                 SO_RCVTIMEO, 
+                 (char *)&tv,
+                 sizeof(struct timeval)) == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
@@ -2495,7 +2480,7 @@ int trb_set_address(uint64_t uid,
   udpBuffer[18] = 0;
   udpBuffer[19] = CMD_NETADMINISTRATION;
   
-  status = sendTrbPackage(15);
+  status = sendTrbPackage(20);
   
   if (status < 0) {
     unlockPorts(0);