-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
if (0 > retVal) {
deleteLAtm(my->lAtm);
} else {
- my->mtuSize = LAtm_mtu(my->lAtm);
+ my->mtuSize = 60 * 0x400;
my->fd = LAtm_fd(my->lAtm);
}
}
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 {
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;
}
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 {