20#include <linux/can/raw.h>
23#include <sys/socket.h>
35 "Name of the CAN monitor.");
37 "Socket CAN status checking interval seconds.");
39 "Name of the Socket CAN component in SystemStatus.");
46bool SocketCanHandlerTest(
const int dev_handler, std::string* message) {
49 struct can_filter filter[1];
50 filter[0].can_id = 0x000;
51 filter[0].can_mask = CAN_SFF_MASK;
53 int ret = setsockopt(dev_handler, SOL_CAN_RAW, CAN_RAW_FILTER, &filter,
56 *message =
"set message filter failed";
62 ret = setsockopt(dev_handler, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &enable,
65 *message =
"Enable reception of can frames failed";
70 std::strncpy(ifr.ifr_name,
"can0", IFNAMSIZ);
71 if (ioctl(dev_handler, SIOCGIFINDEX, &ifr) < 0) {
72 *message =
"ioctl failed";
77 struct sockaddr_can addr;
78 addr.can_family = AF_CAN;
79 addr.can_ifindex = ifr.ifr_ifindex;
80 ret = bind(dev_handler,
reinterpret_cast<struct sockaddr*
>(&addr),
84 *message =
"bind socket can failed";
92bool SocketCanTest(std::string* message) {
93 const int dev_handler = socket(PF_CAN, SOCK_RAW, CAN_RAW);
94 if (dev_handler < 0) {
95 *message =
"Open can device failed";
98 const bool ret = SocketCanHandlerTest(dev_handler, message);
107 FLAGS_socket_can_monitor_interval) {}
110 auto manager = MonitorManager::Instance();
111 Component* component = apollo::common::util::FindOrNull(
112 *manager->GetStatus()->mutable_components(),
113 FLAGS_socket_can_component_name);
114 if (component ==
nullptr) {
118 auto* status = component->mutable_other_status();
119 status->clear_status();
122 const bool ret = SocketCanTest(&message);
124 ret ? ComponentStatus::OK : ComponentStatus::ERROR, message, status);
void RunOnce(const double current_time) override
static void EscalateStatus(const ComponentStatus::Status new_status, const std::string &message, ComponentStatus *current_status)
DEFINE_string(socket_can_monitor_name, "SocketCanMonitor", "Name of the CAN monitor.")
DEFINE_double(socket_can_monitor_interval, 3, "Socket CAN status checking interval seconds.")