diff options
Diffstat (limited to 'meta-ivi-common/recipes-automotive/automotive-message-broker/automotive-message-broker/0004-cansocketbcm-Fix-reading-of-frames-in-case-of-RX_TIM.patch')
-rw-r--r-- | meta-ivi-common/recipes-automotive/automotive-message-broker/automotive-message-broker/0004-cansocketbcm-Fix-reading-of-frames-in-case-of-RX_TIM.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/meta-ivi-common/recipes-automotive/automotive-message-broker/automotive-message-broker/0004-cansocketbcm-Fix-reading-of-frames-in-case-of-RX_TIM.patch b/meta-ivi-common/recipes-automotive/automotive-message-broker/automotive-message-broker/0004-cansocketbcm-Fix-reading-of-frames-in-case-of-RX_TIM.patch new file mode 100644 index 000000000..fda729270 --- /dev/null +++ b/meta-ivi-common/recipes-automotive/automotive-message-broker/automotive-message-broker/0004-cansocketbcm-Fix-reading-of-frames-in-case-of-RX_TIM.patch @@ -0,0 +1,65 @@ +From 10327a700491ba7412ce1296cb709b4d3303326f Mon Sep 17 00:00:00 2001 +From: Petr Nechaev <petr.nechaev@cogentembedded.com> +Date: Wed, 29 Jul 2015 17:58:49 +0300 +Subject: [PATCH 4/9] cansocketbcm: Fix reading of frames in case of RX_TIMEOUT + +If bcms.hdr.nframes==0 we must not read any frames. +Also, frame size can vary with the number of messages. +--- + plugins/common/cansocketbcm.cpp | 26 ++++++++++++++++++++------ + 1 file changed, 20 insertions(+), 6 deletions(-) + +diff --git a/plugins/common/cansocketbcm.cpp b/plugins/common/cansocketbcm.cpp +index d923ce3..7ee663c 100644 +--- a/plugins/common/cansocketbcm.cpp ++++ b/plugins/common/cansocketbcm.cpp +@@ -145,7 +145,7 @@ int CANSocketBCM::waitData(unsigned int timeout) + + /** + * BCM header with one message. +- * @note hdr.nframes must always be 0 or 1. ++ * @note As a result, hdr.nframes must always be 0 or 1. + */ + struct __attribute__ ((__packed__)) bcm_msg_one{ + struct bcm_msg_head hdr; +@@ -190,7 +190,7 @@ CANSocket::CANSocketReadSuccess CANSocketBCM::readMessage(CANFrameInfo& message) + switch (bcms.hdr.opcode) + { + case RX_CHANGED: +- if (bcms.hdr.nframes >= 1 && nbytes == sizeof(bcms)) ++ if (bcms.hdr.nframes >= 1 && nbytes == sizeof(bcm_msg_head) + bcms.hdr.nframes*sizeof(can_frame)) + { + if (bcms.hdr.nframes > 1) + { +@@ -211,10 +211,24 @@ CANSocket::CANSocketReadSuccess CANSocketBCM::readMessage(CANFrameInfo& message) + return CANSocket::CANSocketReadSuccess::READING_FAILED; + } + case RX_TIMEOUT: +- memcpy(&message.frame, &bcms.frames[0], sizeof(bcms.frames[0])); +- message.frame.can_id = bcms.hdr.can_id; //doubtful. Do we need to override this? +- message.status = CANFrameInfo::CANMessageStatus::TIMEOUT; +- return CANSocket::CANSocketReadSuccess::READING_SUCCEEDED; ++ if (bcms.hdr.nframes >= 0 && nbytes == sizeof(bcm_msg_head) + bcms.hdr.nframes*sizeof(can_frame)) ++ { ++ if (bcms.hdr.nframes > 0) ++ { ++ memcpy(&message.frame, &bcms.frames[0], sizeof(bcms.frames[0])); ++ } ++ message.frame.can_id = bcms.hdr.can_id; //doubtful. Do we need to override this? ++ message.status = CANFrameInfo::CANMessageStatus::TIMEOUT; ++ return CANSocket::CANSocketReadSuccess::READING_SUCCEEDED; ++ } ++ else ++ { ++ LOG_ERROR("Unexpected data from the socket" ++ << " " << bcms.hdr.opcode ++ << " " << bcms.hdr.nframes ++ << " " << nbytes); ++ return CANSocket::CANSocketReadSuccess::READING_FAILED; ++ } + + case TX_EXPIRED: + // do nothing +-- +1.9.1 + |