]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Major Bugfix in segment and reassembly
authorhades <hades>
Tue, 28 Aug 2001 12:04:56 +0000 (12:04 +0000)
committerhades <hades>
Tue, 28 Aug 2001 12:04:56 +0000 (12:04 +0000)
works with broken and proper CES ATM driver now

hadaq/nettrans.c

index 808123049b73403dfea1a67d4ac9d4dc6ac6c6a0..d4eb893806a1221c55fd1398a7cb19499eb04958 100644 (file)
@@ -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 {