2 Copyright (C) 2012 Intel Corporation
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #include <sys/ioctl.h>
22 #include <sys/socket.h>
25 #include "cansocket.h"
28 CANSocket::CANSocket() :
34 CANSocket::~CANSocket()
41 bool CANSocket::start(const char* ifName)
47 LOG_ERROR("Socket error");
49 can_err_mask_t errorMask = 0xFFFFFFFF;
50 if(!enableCANErrors(errorMask)) {
51 LOG_ERROR("Socket error");
54 mPoll.events = POLLIN | POLLPRI;
56 memset(&ifr, 0, sizeof(ifr));
57 strcpy(ifr.ifr_name, ifName);
58 if(!locateInterfaceIndex(ifr)) {
59 LOG_ERROR("Socket error");
62 struct sockaddr_can addr;
63 memset(&addr, 0, sizeof(addr));
64 addr.can_family = AF_CAN;
65 addr.can_ifindex = ifr.ifr_ifindex;
66 if(!bindSocket(addr)) {
67 LOG_ERROR("Socket error");
79 void CANSocket::stop()
89 bool CANSocket::write(const struct can_frame &frame, int &bytesWritten)
93 bytesWritten = (int)writeFrame(frame);
94 return bytesWritten == sizeof(struct can_frame);
97 CANSocket::CANSocketReadSuccess CANSocket::read(
98 struct can_frame& frame, int &bytesRead, unsigned int timeout)
100 LOG_TRACE("timeout: " << timeout);
102 CANSocket::CANSocketReadSuccess success;
104 switch(waitData(timeout)) {
106 LOG_ERROR("reading error");
107 success = CANSocket::READING_FAILED;
111 success = CANSocket::READING_TIMED_OUT;
114 bytesRead = (int)readFrame(frame);
115 success = bytesRead >= 0 ?CANSocket::READING_SUCCEEDED : CANSocket::READING_FAILED;
120 bool CANSocket::createSocket()
122 return ((mSocket = ::socket(PF_CAN, SOCK_RAW, CAN_RAW)) >= 0);
125 bool CANSocket::enableCANErrors(can_err_mask_t errorMask)
127 return (setsockopt(mSocket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &errorMask, sizeof(errorMask)) == 0);
130 bool CANSocket::locateInterfaceIndex(struct ifreq& ifr)
132 return (::ioctl(mSocket, SIOCGIFINDEX, &ifr) == 0);
135 bool CANSocket::bindSocket(struct sockaddr_can& addr)
137 return (::bind(mSocket, (struct sockaddr*)&addr, sizeof(addr)) == 0);
140 bool CANSocket::closeSocket()
142 return (::close(mSocket) == 0);
145 int CANSocket::waitData(unsigned int timeout)
147 return ::poll(&mPoll, 1, timeout);
150 ssize_t CANSocket::writeFrame(const can_frame& frame)
152 return ::write(mSocket, &frame, sizeof(struct can_frame));
155 ssize_t CANSocket::readFrame(can_frame& frame)
157 return ::recv(mSocket, &frame, sizeof(struct can_frame), 0);