1 From 10327a700491ba7412ce1296cb709b4d3303326f Mon Sep 17 00:00:00 2001
2 From: Petr Nechaev <petr.nechaev@cogentembedded.com>
3 Date: Wed, 29 Jul 2015 17:58:49 +0300
4 Subject: [PATCH 4/9] cansocketbcm: Fix reading of frames in case of RX_TIMEOUT
6 If bcms.hdr.nframes==0 we must not read any frames.
7 Also, frame size can vary with the number of messages.
9 plugins/common/cansocketbcm.cpp | 26 ++++++++++++++++++++------
10 1 file changed, 20 insertions(+), 6 deletions(-)
12 diff --git a/plugins/common/cansocketbcm.cpp b/plugins/common/cansocketbcm.cpp
13 index d923ce3..7ee663c 100644
14 --- a/plugins/common/cansocketbcm.cpp
15 +++ b/plugins/common/cansocketbcm.cpp
16 @@ -145,7 +145,7 @@ int CANSocketBCM::waitData(unsigned int timeout)
19 * BCM header with one message.
20 - * @note hdr.nframes must always be 0 or 1.
21 + * @note As a result, hdr.nframes must always be 0 or 1.
23 struct __attribute__ ((__packed__)) bcm_msg_one{
24 struct bcm_msg_head hdr;
25 @@ -190,7 +190,7 @@ CANSocket::CANSocketReadSuccess CANSocketBCM::readMessage(CANFrameInfo& message)
26 switch (bcms.hdr.opcode)
29 - if (bcms.hdr.nframes >= 1 && nbytes == sizeof(bcms))
30 + if (bcms.hdr.nframes >= 1 && nbytes == sizeof(bcm_msg_head) + bcms.hdr.nframes*sizeof(can_frame))
32 if (bcms.hdr.nframes > 1)
34 @@ -211,10 +211,24 @@ CANSocket::CANSocketReadSuccess CANSocketBCM::readMessage(CANFrameInfo& message)
35 return CANSocket::CANSocketReadSuccess::READING_FAILED;
38 - memcpy(&message.frame, &bcms.frames[0], sizeof(bcms.frames[0]));
39 - message.frame.can_id = bcms.hdr.can_id; //doubtful. Do we need to override this?
40 - message.status = CANFrameInfo::CANMessageStatus::TIMEOUT;
41 - return CANSocket::CANSocketReadSuccess::READING_SUCCEEDED;
42 + if (bcms.hdr.nframes >= 0 && nbytes == sizeof(bcm_msg_head) + bcms.hdr.nframes*sizeof(can_frame))
44 + if (bcms.hdr.nframes > 0)
46 + memcpy(&message.frame, &bcms.frames[0], sizeof(bcms.frames[0]));
48 + message.frame.can_id = bcms.hdr.can_id; //doubtful. Do we need to override this?
49 + message.status = CANFrameInfo::CANMessageStatus::TIMEOUT;
50 + return CANSocket::CANSocketReadSuccess::READING_SUCCEEDED;
54 + LOG_ERROR("Unexpected data from the socket"
55 + << " " << bcms.hdr.opcode
56 + << " " << bcms.hdr.nframes
58 + return CANSocket::CANSocketReadSuccess::READING_FAILED;