[Tinyos-2-commits] CVS: tinyos-2.x/support/sdk/cpp/sf tcpcomm.cpp, 1.7, 1.8 sfpacket.cpp, 1.4, 1.5 sfcontrol.cpp, 1.4, 1.5 serialcomm.h, 1.3, 1.4 serialcomm.cpp, 1.4, 1.5
akoepke
andreaskoepke at users.sourceforge.net
Fri Feb 20 01:27:49 PST 2009
Update of /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf
In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv7458
Modified Files:
tcpcomm.cpp sfpacket.cpp sfcontrol.cpp serialcomm.h
serialcomm.cpp
Log Message:
be more careful with the stack when reading a packet
fix includes for g++ 4.3
Index: tcpcomm.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/tcpcomm.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** tcpcomm.cpp 2 May 2008 09:21:22 -0000 1.7
--- tcpcomm.cpp 20 Feb 2009 09:27:46 -0000 1.8
***************
*** 39,42 ****
--- 39,43 ----
#include <set>
+ #include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
***************
*** 583,587 ****
{
char info = 'n';
! write(pipeWriteFD, &info, 1);
}
--- 584,588 ----
{
char info = 'n';
! if(write(pipeWriteFD, &info, 1) != 1) DEBUG("TCPComm::stuffPipe : lokal pipe is broken");
}
Index: sfpacket.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/sfpacket.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** sfpacket.cpp 2 May 2008 09:21:23 -0000 1.4
--- sfpacket.cpp 20 Feb 2009 09:27:46 -0000 1.5
***************
*** 32,35 ****
--- 32,36 ----
#include "sfpacket.h"
+ #include <cstring>
SFPacket::SFPacket(int pType, int pSeqno) {
Index: sfcontrol.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/sfcontrol.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** sfcontrol.cpp 23 Apr 2008 09:50:01 -0000 1.4
--- sfcontrol.cpp 20 Feb 2009 09:27:46 -0000 1.5
***************
*** 43,46 ****
--- 43,48 ----
#include <string>
+ #include <cstdlib>
+ #include <cstring>
#include <iostream>
#include <sstream>
Index: serialcomm.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/serialcomm.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** serialcomm.h 21 Apr 2008 19:57:47 -0000 1.3
--- serialcomm.h 20 Feb 2009 09:27:46 -0000 1.4
***************
*** 39,42 ****
--- 39,43 ----
#include "sharedinfo.h"
+ #include <sys/select.h>
#include <pthread.h>
#include <termios.h>
***************
*** 67,77 ****
static const int minMTU = 4;
// byte count of serial header
! static const int serialHeaderBytes = 6;
// byte offset of type field
! static const int typeOffset = 1;
// byte offset of sequence number field
! static const int seqnoOffset = 2;
// byte offset of payload field
! static const int payloadOffset = 3;
// timeout for acks in s
static const int ackTimeout = 1000 * 1000 * 200;
--- 68,78 ----
static const int minMTU = 4;
// byte count of serial header
! static const int serialHeaderBytes = 5;
// byte offset of type field
! static const int typeOffset = 0;
// byte offset of sequence number field
! static const int seqnoOffset = 1;
// byte offset of payload field
! static const int payloadOffset = 2;
// timeout for acks in s
static const int ackTimeout = 1000 * 1000 * 200;
***************
*** 81,84 ****
--- 82,91 ----
// how many bytes do we attempt to read from the serial line in one go?
static const int rawReadBytes = 20;
+
+ enum rx_states_t {
+ WAIT_FOR_SYNC,
+ IN_SYNC,
+ ESCAPED
+ };
/** Member vars */
***************
*** 190,193 ****
--- 197,218 ----
return crc;
}
+
+ inline static uint16_t calcCRC(uint8_t *bytes, uint16_t len) {
+ uint16_t crc = 0;
+ for(unsigned i = 0; i < len; i++) {
+ crc = SerialComm::byteCRC(bytes[i], crc);
+ }
+ return crc;
+ }
+
+ inline static uint16_t checkCrc(uint8_t *bytes, uint16_t count) {
+ bool crcOk = false;
+ if(count > 2) {
+ uint16_t crc = calcCRC(bytes, count - 2);
+ uint16_t packetCrc = (bytes[count-1] << 8) | bytes[count-2];
+ if(crc == packetCrc) crcOk = true;
+ }
+ return crcOk;
+ }
/* HDLC encode (byte stuff) count bytes from buffer from into buffer to.
Index: serialcomm.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/serialcomm.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** serialcomm.cpp 21 Apr 2008 19:57:47 -0000 1.4
--- serialcomm.cpp 20 Feb 2009 09:27:46 -0000 1.5
***************
*** 36,39 ****
--- 36,40 ----
#include <ctime>
#include <cstdlib>
+ #include <cstring>
#include <iostream>
#include <fcntl.h>
***************
*** 43,46 ****
--- 44,48 ----
#include <sys/time.h>
#include <errno.h>
+ #include <stdint.h>
using namespace std;
***************
*** 276,284 ****
if ((tcflush(serialReadFD, TCIFLUSH) >= 0 && tcsetattr(serialReadFD, TCSANOW, &newtio) >= 0)
! && (tcflush(serialWriteFD, TCIFLUSH) >= 0 && tcsetattr(serialWriteFD, TCSANOW, &newtio) >= 0)
! && !errorReported)
{
DEBUG("SerialComm::SerialComm : opened device "<< pDevice << " with baudrate = " << pBaudrate)
! }
else
{
--- 278,286 ----
if ((tcflush(serialReadFD, TCIFLUSH) >= 0 && tcsetattr(serialReadFD, TCSANOW, &newtio) >= 0)
! && (tcflush(serialWriteFD, TCIFLUSH) >= 0 && tcsetattr(serialWriteFD, TCSANOW, &newtio) >= 0)
! && !errorReported)
{
DEBUG("SerialComm::SerialComm : opened device "<< pDevice << " with baudrate = " << pBaudrate)
! }
else
{
***************
*** 338,347 ****
int cnt = 0;
/*
! FD_SET(serialWriteFD, &wfds);
! if(select(serialWriteFD + 1, NULL, &wfds, NULL, NULL) < 0) {
! return -1;
! }
! FD_CLR(serialWriteFD, &wfds);
! */
int tmpCnt = BaseComm::writeFD(fd, buffer, count, err);
if (tmpCnt < 0) {
--- 340,349 ----
int cnt = 0;
/*
! FD_SET(serialWriteFD, &wfds);
! if(select(serialWriteFD + 1, NULL, &wfds, NULL, NULL) < 0) {
! return -1;
! }
! FD_CLR(serialWriteFD, &wfds);
! */
int tmpCnt = BaseComm::writeFD(fd, buffer, count, err);
if (tmpCnt < 0) {
***************
*** 415,551 ****
bool SerialComm::readPacket(SFPacket &pPacket)
{
! bool sync = false;
! bool escape = false;
! bool completePacket = false;
int count = 0;
! uint16_t crc = 0;
! char buffer[maxMTU];
! while(!completePacket)
! {
! buffer[count] = nextRaw();
!
! if(sync && (count == 1) && (buffer[count] == SYNC_BYTE)) {
! DEBUG("SerialComm::readPacket double sync byte");
! sync = false;
! escape = false;
! count = 1;
! crc = 0;
! buffer[0] = SYNC_BYTE;
! }
!
! if (!sync)
! {
! // wait for sync
! if (buffer[0] == SYNC_BYTE)
! {
! sync = true;
! escape = false;
! count = 1;
! crc = 0;
}
}
! else if (count >= maxMTU)
! {
! DEBUG("SerialComm::readPacket : frame too long - size = " << count << " : resynchronising")
! sync = false;
! escape = false;
! count = crc = 0;
! badPacketCount++;
! }
! else if (escape)
! {
! if (buffer[count] == SYNC_BYTE)
! {
! DEBUG("SerialComm::readPacket : resynchronising")
! sync = false;
! escape = false;
! count = crc = 0;
! badPacketCount++;
! }
! else
! {
! buffer[count] ^= 0x20;
! if (count > 3)
! {
! crc = SerialComm::byteCRC(buffer[count-3], crc);
}
- ++count;
- escape = false;
}
! }
! else if (buffer[count] == ESCAPE_BYTE)
! {
! // next byte is escaped
! escape = true;
! }
! else if (buffer[count] == SYNC_BYTE)
! {
! // calculate last crc byte
! if (count > 3)
! {
! crc = SerialComm::byteCRC(buffer[count-3], crc);
}
! uint16_t packetCRC = (buffer[count - 2] & 0xff) | ((buffer[count - 1] << 8) & 0xff00);
! if (count < minMTU)
! {
! DEBUG("SerialComm::readPacket : frame too short - size = " << count << " : resynchronising ")
! sync = false;
! escape = false;
! count = crc = 0;
! badPacketCount++;
}
! else if (crc != packetCRC)
! {
! DEBUG("SerialComm::readPacket : bad crc - calculated crc = " << crc << " packet crc = " << packetCRC << " : resynchronising " )
! sync = false;
! escape = false;
! count = crc = 0;
! badPacketCount++;
}
! else
! {
! pPacket.setType(buffer[typeOffset]);
! pPacket.setSeqno(buffer[seqnoOffset]);
! switch (buffer[typeOffset])
! {
! case SF_ACK:
! break;
! case SF_PACKET_NO_ACK:
! case SF_PACKET_ACK:
! // buffer / payload
! // FIXME: strange packet format!? because seqno is not really defined - missing :(
! pPacket.setPayload(&buffer[payloadOffset]-1, count+1+1 - serialHeaderBytes);
! break;
! default:
! DEBUG("SerialComm::readPacket : unknown packet type = " << static_cast<uint16_t>(buffer[typeOffset] & 0xff))
! ;
! }
! completePacket = true;
! #ifdef DEBUG_RAW_SERIALCOMM
!
! DEBUG("SerialComm::readPacket : raw data >>")
! for (int j=0; j <= count; j++)
! {
! cout << std::hex << static_cast<uint16_t>(buffer[j] & 0xff) << " " << std::dec;
}
! cout << endl;
! cout << "as payload >> " << endl;
! const char* ptr = pPacket.getPayload();
! for (int j=0; j < pPacket.getLength(); j++)
! {
! cout << std::hex << static_cast<uint16_t>(ptr[j] & 0xff) << " " << std::dec;
}
- cout << endl;
- #endif
-
- }
- }
- else
- {
- if (count > 3)
- {
- crc = SerialComm::byteCRC(buffer[count-3], crc);
}
- ++count;
}
}
--- 417,495 ----
bool SerialComm::readPacket(SFPacket &pPacket)
{
! uint8_t buffer[maxMTU + 10];
int count = 0;
! rx_states_t state = WAIT_FOR_SYNC;
! for(;;) {
! uint8_t nextByte = nextRaw();
! if(state == WAIT_FOR_SYNC) {
! if(nextByte == SYNC_BYTE) {
! count = 0;
! state = IN_SYNC;
}
}
! else if(state == IN_SYNC) {
! if(nextByte == SYNC_BYTE) {
! if(count < minMTU) {
! DEBUG("SerialComm::readPacket : frame too short - size = " << count << " : resynchronising ");
! badPacketCount++;
! count = 0;
! }
! else {
! if(checkCrc(buffer, count)) {
! pPacket.setType(buffer[typeOffset]);
! pPacket.setSeqno(buffer[seqnoOffset]);
! switch (buffer[typeOffset]) {
! case SF_ACK:
! break;
! case SF_PACKET_NO_ACK:
! case SF_PACKET_ACK:
! pPacket.setPayload((char *)(&buffer[payloadOffset]-1), count+1+1 - serialHeaderBytes);
! break;
! default:
! DEBUG("SerialComm::readPacket : unknown packet type = " \
! << static_cast<uint16_t>(buffer[typeOffset] & 0xff));
! break;
! }
! break; // leave loop
! }
! else {
! DEBUG("SerialComm::readPacket : bad crc");
! count = 0;
! badPacketCount++;
! }
}
}
! else if(nextByte == ESCAPE_BYTE) {
! state = ESCAPED;
}
! else {
! buffer[count++] = nextByte;
! if(count >= maxMTU) {
! DEBUG("SerialComm::readPacket : packet too long, resynchronizing");
! count = 0;
! badPacketCount++;
! state = WAIT_FOR_SYNC;
! }
}
! }
! else if(state == ESCAPED) {
! if(nextByte == SYNC_BYTE) {
! DEBUG("SerialComm::readPacket : state ESCAPED, packet got sync byte, resynchronizing");
! count = 0;
! badPacketCount++;
! state = IN_SYNC;
}
! else {
! buffer[count++] = nextByte ^ 0x20;
! if(count >= maxMTU) {
! DEBUG("SerialComm::readPacket : state ESCAPED, packet too long, resynchronizing");
! count = 0;
! badPacketCount++;
! state = WAIT_FOR_SYNC;
}
! else {
! state = IN_SYNC;
}
}
}
}
***************
*** 553,557 ****
}
-
/* writes packet */
bool SerialComm::writePacket(SFPacket &pPacket)
--- 497,500 ----
***************
*** 644,670 ****
readPacket(packet);
switch (packet.getType())
! {
! case SF_ACK:
// successful delivery
// FIXME: seqnos are not implemented on the node !
pthread_cond_signal(&ack.received);
break;
! case SF_PACKET_ACK:
! {
! // put ack in front of queue
! SFPacket ack(SF_ACK, packet.getSeqno());
! writeBuffer.enqueueFront(ack);
! }
! case SF_PACKET_NO_ACK:
// do nothing - fall through
! default:
if (!readBuffer.isFull())
! {
++readPacketCount;
// put silently into buffer...
readBuffer.enqueueBack(packet);
! }
else
! {
while(readBuffer.isFull()) {
readBuffer.dequeue();
--- 587,613 ----
readPacket(packet);
switch (packet.getType())
! {
! case SF_ACK:
// successful delivery
// FIXME: seqnos are not implemented on the node !
pthread_cond_signal(&ack.received);
break;
! case SF_PACKET_ACK:
! {
! // put ack in front of queue
! SFPacket ack(SF_ACK, packet.getSeqno());
! writeBuffer.enqueueFront(ack);
! }
! case SF_PACKET_NO_ACK:
// do nothing - fall through
! default:
if (!readBuffer.isFull())
! {
++readPacketCount;
// put silently into buffer...
readBuffer.enqueueBack(packet);
! }
else
! {
while(readBuffer.isFull()) {
readBuffer.dequeue();
***************
*** 673,678 ****
readBuffer.enqueueBack(packet);
// DEBUG("SerialComm::readSerial : dropped packet")
! }
! }
}
}
--- 616,621 ----
readBuffer.enqueueBack(packet);
// DEBUG("SerialComm::readSerial : dropped packet")
! }
! }
}
}
***************
*** 696,717 ****
{
if (!retry)
! {
packet = writeBuffer.dequeue();
! }
switch (packet.getType())
! {
! case SF_ACK:
// successful delivery
if (!writePacket(packet))
! {
DEBUG("SerialComm::writeSerial : writePacket failed (SF_ACK)")
! reportError("SerialComm::writeSerial : writePacket(SF_ACK)", -1);
! }
break;
! case SF_PACKET_ACK:
// do nothing - fall through
! case SF_PACKET_NO_ACK:
// do nothing - fall through
! default:
if (!retry)
++writtenPacketCount;
--- 639,661 ----
{
if (!retry)
! {
! cerr << " serial deqeue packet, empty: " << writeBuffer.isEmpty() << endl;
packet = writeBuffer.dequeue();
! }
switch (packet.getType())
! {
! case SF_ACK:
// successful delivery
if (!writePacket(packet))
! {
DEBUG("SerialComm::writeSerial : writePacket failed (SF_ACK)")
! reportError("SerialComm::writeSerial : writePacket(SF_ACK)", -1);
! }
break;
! case SF_PACKET_ACK:
// do nothing - fall through
! case SF_PACKET_NO_ACK:
// do nothing - fall through
! default:
if (!retry)
++writtenPacketCount;
***************
*** 719,726 ****
packet.setType(SF_PACKET_ACK);
if (!writePacket(packet))
! {
DEBUG("SerialComm::writeSerial : writePacket failed (SF_PACKET)")
! reportError("SerialComm::writeSerial : writeFD(SF_PACKET)", -1);
! }
// wait for ack...
struct timeval currentTime;
--- 663,670 ----
packet.setType(SF_PACKET_ACK);
if (!writePacket(packet))
! {
DEBUG("SerialComm::writeSerial : writePacket failed (SF_PACKET)")
! reportError("SerialComm::writeSerial : writeFD(SF_PACKET)", -1);
! }
// wait for ack...
struct timeval currentTime;
***************
*** 735,756 ****
ackTime.tv_nsec = currentTime.tv_usec * 1000;
! ackTime.tv_sec += timeout / (1000*1000*1000);
! ackTime.tv_nsec += timeout % (1000*1000*1000);
pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &ack.lock);
int retval = pthread_cond_timedwait(&ack.received, &ack.lock, &ackTime);
if (!((retryCount < maxRetries) && (retval == ETIMEDOUT)))
! {
! if (retryCount >= maxRetries) ++droppedWritePacketCount;
retry = false;
retryCount = 0;
! }
else
! {
++retryCount;
retry = true;
DEBUG("SerialComm::writeSerial : packet retryCount = " << retryCount);
! ++sumRetries;
! }
// removes the cleanup handler and executes it (unlock mutex)
pthread_cleanup_pop(1); }
--- 679,700 ----
ackTime.tv_nsec = currentTime.tv_usec * 1000;
! ackTime.tv_sec += timeout / (1000*1000*1000);
! ackTime.tv_nsec += timeout % (1000*1000*1000);
pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &ack.lock);
int retval = pthread_cond_timedwait(&ack.received, &ack.lock, &ackTime);
if (!((retryCount < maxRetries) && (retval == ETIMEDOUT)))
! {
! if (retryCount >= maxRetries) ++droppedWritePacketCount;
retry = false;
retryCount = 0;
! }
else
! {
++retryCount;
retry = true;
DEBUG("SerialComm::writeSerial : packet retryCount = " << retryCount);
! ++sumRetries;
! }
// removes the cleanup handler and executes it (unlock mutex)
pthread_cleanup_pop(1); }
***************
*** 765,778 ****
{
DEBUG("SerialComm::cancel : by readerThread")
! pthread_detach(readerThread);
if (writerThreadRunning)
! {
pthread_cancel(writerThread);
DEBUG("SerialComm::cancel : writerThread canceled, joining")
! pthread_join(writerThread, NULL);
writerThreadRunning = false;
! }
readerThreadRunning = false;
! pthread_cond_signal(&control.cancel);
pthread_exit(NULL);
}
--- 709,722 ----
{
DEBUG("SerialComm::cancel : by readerThread")
! pthread_detach(readerThread);
if (writerThreadRunning)
! {
pthread_cancel(writerThread);
DEBUG("SerialComm::cancel : writerThread canceled, joining")
! pthread_join(writerThread, NULL);
writerThreadRunning = false;
! }
readerThreadRunning = false;
! pthread_cond_signal(&control.cancel);
pthread_exit(NULL);
}
***************
*** 780,793 ****
{
DEBUG("SerialComm::cancel : by writerThread")
! pthread_detach(writerThread);
if (readerThreadRunning)
! {
pthread_cancel(readerThread);
DEBUG("SerialComm::cancel : readerThread canceled, joining")
! pthread_join(readerThread, NULL);
readerThreadRunning = false;
! }
writerThreadRunning = false;
! pthread_cond_signal(&control.cancel);
pthread_exit(NULL);
}
--- 724,737 ----
{
DEBUG("SerialComm::cancel : by writerThread")
! pthread_detach(writerThread);
if (readerThreadRunning)
! {
pthread_cancel(readerThread);
DEBUG("SerialComm::cancel : readerThread canceled, joining")
! pthread_join(readerThread, NULL);
readerThreadRunning = false;
! }
writerThreadRunning = false;
! pthread_cond_signal(&control.cancel);
pthread_exit(NULL);
}
***************
*** 795,813 ****
{
DEBUG("SerialComm::cancel : by other thread")
! if (readerThreadRunning)
! {
! pthread_cancel(readerThread);
! DEBUG("SerialComm::cancel : readerThread canceled, joining")
! pthread_join(readerThread, NULL);
! readerThreadRunning = false;
! }
if (writerThreadRunning)
! {
pthread_cancel(writerThread);
DEBUG("SerialComm::cancel : writerThread canceled, joining")
! pthread_join(writerThread, NULL);
writerThreadRunning = false;
! }
! pthread_cond_signal(&control.cancel);
}
}
--- 739,757 ----
{
DEBUG("SerialComm::cancel : by other thread")
! if (readerThreadRunning)
! {
! pthread_cancel(readerThread);
! DEBUG("SerialComm::cancel : readerThread canceled, joining")
! pthread_join(readerThread, NULL);
! readerThreadRunning = false;
! }
if (writerThreadRunning)
! {
pthread_cancel(writerThread);
DEBUG("SerialComm::cancel : writerThread canceled, joining")
! pthread_join(writerThread, NULL);
writerThreadRunning = false;
! }
! pthread_cond_signal(&control.cancel);
}
}
***************
*** 819,826 ****
{
errorMsg << "error : SF-Server ( SerialComm on device = " << device << " ) : "
! << msg << " ( result = " << result << " )" << endl
! << "error-description : " << strerror(errno) << endl;
! cerr << errorMsg.str();
errorReported = true;
cancel();
--- 763,770 ----
{
errorMsg << "error : SF-Server ( SerialComm on device = " << device << " ) : "
! << msg << " ( result = " << result << " )" << endl
! << "error-description : " << strerror(errno) << endl;
! cerr << errorMsg.str();
errorReported = true;
cancel();
More information about the Tinyos-2-commits
mailing list