Запускать / останавливать платы CAN из пространства пользователя с помощью libsocketcan

Я пытаюсь запустить / остановить платы CAN или обновить их скорость передачи данных с помощью SocketCAN из пользовательского пространства. Мои тесты выполняются на платах PeakSystem и IXXAT USB-to-CAN V1 / V2.

Моей первой попыткой было использовать visudo и включить NOPASSWD для «ip link set …», а затем вызвать «sudo ip link set …» в моем C ++ коде.
Полная линия visudo:

%sudo  ALL=(ALL:ALL) NOPASSWD: /bin/ip link set can[0123456789]* type can bitrate [0123456789]*, /bin/ip link set can[0123456789]* up, /bin/ip link set can[0123456789]* down

Затем я попытался использовать возможности Linux, добавив возможности в / bin / ip. Это позволяет мне вызывать «ip link set …» из моего кода C ++, что было даже лучше.
Команда добавления возможностей:

sudo setcap cap_net_raw,cap_net_admin+ep /bin/ip

Но потом я обнаружил libsocketcan это гораздо лучший подход, чем вызов командных строк из C ++. Однако при вызове «can_set_bitrate» или «can_do_start» у меня появляется ошибка «RTNETLINK: операция не разрешена». Но все работает нормально, когда моя программа запускается от имени пользователя root. Другие функции, такие как can_get_state, отлично работают в пользовательском пространстве (на самом деле они возвращают: 4 -> CAN_STATE_STOPPED).
Я пытался добавить возможности в мою программу безуспешно «» sudo setcap cap_net_raw, cap_net_admin + ep ./myprogram «.

Как я могу разрешить моей программе использовать libsocketcan в пользовательском пространстве?

Спасибо за вашу помощь!

1

Решение

sudo setcap cap_net_raw,cap_net_admin+ep your_executable это решение. Возможно, вам придется скомпилировать с -Wl,-rpath поэтому ваша программа находит свои общие библиотеки (см. также этот ответ)

-1

Другие решения

Других решений пока нет …