#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>
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"
static int getUDPPackage()
{
+ static struct sockaddr_in in_addr;
+ static socklen_t in_addr_len;
int status;
int i;
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
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;
}
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 */
/* UDP Timeout, resend request */
timeoutCtr++;
}
-
+
return status;
}
int init_ports()
{
char* trb3_name = NULL;
- struct sockaddr_in sender_addr;
- struct sockaddr_in receiver_addr;
struct hostent* host = NULL;
struct timeval tv;
fprintf(stderr, "init_ports: called\n");
}
+ /* Get TRB3 IP-Address */
trb3_name = getenv("TRB3_SERVER");
if (trb3_name == NULL) {
trb3_name = "pexor";
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;
}
udpBuffer[18] = 0;
udpBuffer[19] = CMD_NETADMINISTRATION;
- status = sendTrbPackage(15);
+ status = sendTrbPackage(20);
if (status < 0) {
unlockPorts(0);