From b11188e8d0a63f8b3341ac00a8682a2fa7aa22d9 Mon Sep 17 00:00:00 2001 From: muench Date: Mon, 3 Nov 2003 16:49:09 +0000 Subject: [PATCH] connectionless UDP, works in Munich --- hadaq/nettrans.c | 70 +++++++++++++++++++----------------------------- hadaq/nettrans.h | 12 ++++++--- 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/hadaq/nettrans.c b/hadaq/nettrans.c index 43e533f..952dfe3 100644 --- a/hadaq/nettrans.c +++ b/hadaq/nettrans.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.28 2003-05-14 13:54:44 muench Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.29 2003-11-03 16:49:09 muench Exp $"; #define _GNU_SOURCE @@ -34,7 +34,6 @@ static int min(int a, int b) static int openUdp(NetTrans *my, unsigned long addr, int port, int fl) { int retVal; - struct sockaddr_in sa; assert(my != NULL); @@ -43,34 +42,18 @@ static int openUdp(NetTrans *my, unsigned long addr, int port, int fl) if (-1 == my->fd) { retVal = -1; } else { - switch (fl) { - case O_RDONLY: - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - sa.sin_addr.s_addr = 0; - retVal = bind(my->fd, (struct sockaddr *) &sa, sizeof(sa)); - break; - case O_WRONLY: - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - sa.sin_addr.s_addr = addr; - retVal = connect(my->fd, (struct sockaddr *) &sa, sizeof(sa)); - break; - default: - errno = EINVAL; - retVal = -1; - break; - } - - if (0 > retVal) { - close(my->fd); - } else { - my->mtuSize = 8192; - } + my->spec.sa.sin_family = AF_INET; + my->spec.sa.sin_port = port; + my->spec.sa.sin_addr.s_addr = htonl(INADDR_ANY); + retVal = bind(my->fd, &my->spec.sa, sizeof(my->spec.sa)); + my->spec.sa.sin_family = AF_INET; + my->spec.sa.sin_port = port; + my->spec.sa.sin_addr.s_addr = addr; } + my->mtuSize = 8192; if (0 > retVal) { - syslog(LOG_DEBUG, "openAtm: %s", strerror(errno)); + syslog(LOG_DEBUG, "openUdp: %s", strerror(errno)); } return retVal; } @@ -90,17 +73,17 @@ static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl) syslog(LOG_DEBUG, "aal: %d; vpi: %d; vci: %d; bandwidth: %d", lAtmAttr->aal, lAtmAttr->vpi, lAtmAttr->vci, lAtmAttr->peakBandwidth); - my->lAtm = newLAtm("/dev/fa0", fl); + my->spec.lAtm = newLAtm("/dev/fa0", fl); - if (NULL == my->lAtm) { + if (NULL == my->spec.lAtm) { retVal = -1; } else { switch (fl) { case O_RDONLY: - retVal = LAtm_bind(my->lAtm, lAtmAttr); + retVal = LAtm_bind(my->spec.lAtm, lAtmAttr); break; case O_WRONLY: - retVal = LAtm_connect(my->lAtm, lAtmAttr); + retVal = LAtm_connect(my->spec.lAtm, lAtmAttr); break; default: errno = EINVAL; @@ -109,10 +92,10 @@ static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl) } if (0 > retVal) { - deleteLAtm(my->lAtm); + deleteLAtm(my->spec.lAtm); } else { my->mtuSize = 60 * 0x400; - my->fd = LAtm_fd(my->lAtm); + my->fd = LAtm_fd(my->spec.lAtm); } } @@ -149,7 +132,8 @@ int openGeneric(NetTrans *my, const char *name, int flags, size_t bandwidth) int port; addr = inet_addr(pa); - port = atoi(ep); + fprintf(stderr, "%d\n", addr); + port = htons(atoi(ep)); my->type = NetTransType_udp; retVal = openUdp(my, addr, port, flags); } else { @@ -173,7 +157,7 @@ int closeGeneric(NetTrans *my) switch (my->type) { case NetTransType_atm: - deleteLAtm(my->lAtm); + deleteLAtm(my->spec.lAtm); retVal = 0; break; case NetTransType_udp: @@ -191,17 +175,19 @@ int closeGeneric(NetTrans *my) int sendGeneric(NetTrans *my) { int retVal; + socklen_t socklen = sizeof(my->spec.sa); assert(NetTrans_invariant(my)); switch (my->type) { case NetTransType_atm: - retVal = LAtm_send(my->lAtm, my->pkt, my->pktSize); + retVal = LAtm_send(my->spec.lAtm, my->pkt, my->pktSize); if (0 > retVal) { LAtm_perror("LAtm_send"); } break; case NetTransType_udp: + retVal = sendto(my->fd, my->pkt, my->pktSize, 0, &my->spec.sa, socklen); #if 0 /* This limits the output data rate to 100 * mtuSize / s */ { static int i = 0; @@ -213,7 +199,6 @@ int sendGeneric(NetTrans *my) } } #endif - retVal = send(my->fd, my->pkt, my->pktSize, 0); break; } @@ -229,15 +214,16 @@ int sendGeneric(NetTrans *my) int recvGeneric(NetTrans *my) { int retVal; + socklen_t socklen = sizeof(my->spec.sa); assert(NetTrans_invariant(my)); switch (my->type) { case NetTransType_atm: - retVal = LAtm_recv(my->lAtm, my->pkt, my->mtuSize); + retVal = LAtm_recv(my->spec.lAtm, my->pkt, my->mtuSize); break; case NetTransType_udp: - retVal = recv(my->fd, my->pkt, my->mtuSize, 0); + retVal = recvfrom(my->fd, my->pkt, my->mtuSize, 0, &my->spec.sa, &socklen); break; } @@ -251,10 +237,8 @@ int recvGeneric(NetTrans *my) int NetTrans_invariant(const NetTrans *my) { - return ( - my != NULL - && (my->type == NetTransType_atm || my->type == NetTransType_udp) - ); + return (my != NULL && (my->type == NetTransType_atm || my->type == NetTransType_udp) + ); } NetTrans *NetTrans_create(const char *name, size_t bandwidth, Worker *worker) diff --git a/hadaq/nettrans.h b/hadaq/nettrans.h index 5620011..e60d9d2 100644 --- a/hadaq/nettrans.h +++ b/hadaq/nettrans.h @@ -3,6 +3,9 @@ #define NETTRANS_H #include +#include +#include +#include #include "worker.h" #include "hadtu.h" @@ -16,7 +19,10 @@ typedef enum NetTransTypeE { typedef struct NetTransS { char name[512]; NetTransType type; - LAtm *lAtm; + union { + LAtm *lAtm; + struct sockaddr_in sa; + } spec; size_t mtuSize; int fd; void *pkt; @@ -30,9 +36,7 @@ typedef struct NetTransS { unsigned long *msgsReceived; unsigned long *msgsDiscarded; unsigned long *bytesReceived; -} - -NetTrans; +} NetTrans; int NetTrans_invariant(const NetTrans *my); NetTrans *NetTrans_create(const char *name, size_t bandwidth, Worker *worker); -- 2.43.0