summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/socketcan/socketcanbackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/socketcan/socketcanbackend.cpp')
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp42
1 files changed, 26 insertions, 16 deletions
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp
index 27a847d..a26070a 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.cpp
+++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp
@@ -325,7 +325,6 @@ bool SocketCanBackend::applyConfigurationParameter(int key, const QVariant &valu
bool SocketCanBackend::connectSocket()
{
- struct sockaddr_can address;
struct ifreq interface;
if (Q_UNLIKELY((canSocket = socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW)) < 0)) {
@@ -341,15 +340,21 @@ bool SocketCanBackend::connectSocket()
return false;
}
- address.can_family = AF_CAN;
- address.can_ifindex = interface.ifr_ifindex;
+ m_address.can_family = AF_CAN;
+ m_address.can_ifindex = interface.ifr_ifindex;
- if (Q_UNLIKELY(bind(canSocket, reinterpret_cast<struct sockaddr *>(&address), sizeof(address)) < 0)) {
+ if (Q_UNLIKELY(bind(canSocket, reinterpret_cast<struct sockaddr *>(&m_address), sizeof(m_address)) < 0)) {
setError(qt_error_string(errno),
QCanBusDevice::CanBusError::ConnectionError);
return false;
}
+ m_iov.iov_base = &m_frame;
+ m_msg.msg_name = &m_address;
+ m_msg.msg_iov = &m_iov;
+ m_msg.msg_iovlen = 1;
+ m_msg.msg_control = &m_ctrlmsg;
+
delete notifier;
notifier = new QSocketNotifier(canSocket, QSocketNotifier::Read, this);
@@ -637,10 +642,13 @@ void SocketCanBackend::readSocket()
QVector<QCanBusFrame> newFrames;
for (;;) {
- struct canfd_frame frame;
- int bytesReceived;
+ memset(&m_frame, 0, sizeof(m_frame));
+ m_iov.iov_len = sizeof(m_frame);
+ m_msg.msg_namelen = sizeof(m_addr);
+ m_msg.msg_controllen = sizeof(m_ctrlmsg);
+ m_msg.msg_flags = 0;
- bytesReceived = ::read(canSocket, &frame, sizeof(frame));
+ const int bytesReceived = ::recvmsg(canSocket, &m_msg, 0);
if (bytesReceived <= 0) {
break;
@@ -648,7 +656,7 @@ void SocketCanBackend::readSocket()
setError(tr("ERROR SocketCanBackend: incomplete CAN frame"),
QCanBusDevice::CanBusError::ReadError);
continue;
- } else if (Q_UNLIKELY(frame.len > bytesReceived - offsetof(canfd_frame, data))) {
+ } else if (Q_UNLIKELY(m_frame.len > bytesReceived - offsetof(canfd_frame, data))) {
setError(tr("ERROR SocketCanBackend: invalid CAN frame length"),
QCanBusDevice::CanBusError::ReadError);
continue;
@@ -666,21 +674,23 @@ void SocketCanBackend::readSocket()
bufferedFrame.setTimeStamp(stamp);
bufferedFrame.setFlexibleDataRateFormat(bytesReceived == CANFD_MTU);
- bufferedFrame.setExtendedFrameFormat(frame.can_id & CAN_EFF_FLAG);
- Q_ASSERT(frame.len <= CANFD_MAX_DLEN);
+ bufferedFrame.setExtendedFrameFormat(m_frame.can_id & CAN_EFF_FLAG);
+ Q_ASSERT(m_frame.len <= CANFD_MAX_DLEN);
- if (frame.can_id & CAN_RTR_FLAG)
+ if (m_frame.can_id & CAN_RTR_FLAG)
bufferedFrame.setFrameType(QCanBusFrame::RemoteRequestFrame);
- if (frame.can_id & CAN_ERR_FLAG)
+ if (m_frame.can_id & CAN_ERR_FLAG)
bufferedFrame.setFrameType(QCanBusFrame::ErrorFrame);
- if (frame.flags & CANFD_BRS)
+ if (m_frame.flags & CANFD_BRS)
bufferedFrame.setBitrateSwitch(true);
- if (frame.flags & CANFD_ESI)
+ if (m_frame.flags & CANFD_ESI)
bufferedFrame.setErrorStateIndicator(true);
+ if (m_msg.msg_flags & MSG_CONFIRM)
+ bufferedFrame.setLocalEcho(true);
- bufferedFrame.setFrameId(frame.can_id & CAN_EFF_MASK);
+ bufferedFrame.setFrameId(m_frame.can_id & CAN_EFF_MASK);
- const QByteArray load(reinterpret_cast<char *>(frame.data), frame.len);
+ const QByteArray load(reinterpret_cast<char *>(m_frame.data), m_frame.len);
bufferedFrame.setPayload(load);
newFrames.append(std::move(bufferedFrame));