From 9a6607a7cb6a863e2fe4a4513555a059905a0c92 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 28 Aug 2001 12:04:56 +0000 Subject: [PATCH] Major Bugfix in segment and reassembly works with broken and proper CES ATM driver now --- hadaq/nettrans.c | 73 ++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/hadaq/nettrans.c b/hadaq/nettrans.c index 8081230..d4eb893 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.21 2001-03-07 16:02:44 hades Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.22 2001-08-28 12:04:56 hades Exp $"; #define _GNU_SOURCE @@ -108,7 +108,7 @@ static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl) { if (0 > retVal) { deleteLAtm(my->lAtm); } else { - my->mtuSize = LAtm_mtu(my->lAtm); + my->mtuSize = 60 * 0x400; my->fd = LAtm_fd(my->lAtm); } } @@ -235,16 +235,6 @@ int recvGeneric(NetTrans *my) { break; } -#if 0 -/* -* due to a bug in the CES Lynx ATM driver, the packet size -* does not match the transportet size right now, check disabled -*/ - if (retVal != Pkt_size(my->pkt)) { - retVal = -1; - } -#endif - if (0 > retVal) { msglog(LOG_DEBUG, "recvGeneric: %s\n", strerror(errno)); } else { @@ -332,36 +322,47 @@ void NetTrans_remove(NetTrans *my) freeMem(my); } +static size_t adjustedSize(NetTrans *my, void *hadTu) { + size_t size; + + size = HadTu_paddedSize(hadTu) + 32; + /* round to the next 1K boundary to circumvent bug in CES ATM driver */ + size = (size & 0x3ff) == 0 ? size : (size & ~0x3ff) + 0x400; + if (size % my->mtuSize == 0) { + size += 0x400; + } + return size; +} + int NetTrans_send(NetTrans *my, void *hadTu) { - size_t pktSize; + char saveIt[32]; + size_t size; - for (my->offset = 0; my->offset < HadTu_size(hadTu); my->offset += pktSize) { - my->pkt = (char *)hadTu + my->offset; - pktSize = min(my->mtuSize, HadTu_size(hadTu) - my->offset); + /* copy message header to end for check at receiver */ + memcpy(saveIt, HadTu_end(hadTu), 32); + memcpy(HadTu_end(hadTu), hadTu, 32); - /* we reserve pkts < 32 Byte for control messages */ - if (pktSize < (2 * 1024)) { - my->pktSize = (2 * 1024); - } else { - my->pktSize = pktSize; - } + size = adjustedSize(my, hadTu); + + my->offset = 0; + do { + my->pkt = (char *)hadTu + my->offset; + my->pktSize = min(my->mtuSize, size - my->offset); if (0 > sendGeneric(my)) { return -1; } + + my->offset += my->pktSize; (*my->pktsSent)++; - } + } while (my->pktSize == my->mtuSize); - /* mark the end of message */ - my->pkt = hadTu; - my->pktSize = 1024; + memcpy(HadTu_end(hadTu), saveIt, 32); - if (0 > sendGeneric(my)) { - return -1; - } (*my->msgsSent)++; - (*my->bytesSent) += my->offset; + (*my->bytesSent) += size; + return 0; } @@ -387,13 +388,17 @@ static int assembleMsg(NetTrans *my, void *hadTu, size_t size) if (0 > recvGeneric(my)) { abort(); } + my->offset += my->pktSize; + (*my->pktsReceived)++; - if (my->pktSize != 1024) { - my->offset += my->pktSize; - (*my->pktsReceived)++; + if (my->pktSize == my->mtuSize) { retVal = 0; } else { - if (my->offset < HadTu_size(my->pkt) || memcmp(my->pkt, hadTu, 24)) { + size_t size; + + size = adjustedSize(my, hadTu); + + if (my->offset != size || memcmp(HadTu_end(hadTu), hadTu, 32)) { (*my->msgsDiscarded)++; retVal = 0; } else { -- 2.43.0