From 0fc49f1291f950c6c80cacb317e5aab068c68786 Mon Sep 17 00:00:00 2001 From: hadaq Date: Wed, 18 Jul 2012 19:58:50 +0000 Subject: [PATCH] sender and receiver port are the same, portnumber wil be chosen by operating system --- libtrbnet/trbnet.c | 105 +++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 60 deletions(-) diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index df3c0ae..d2f8879 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -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 @@ -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 #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); -- 2.43.0