From 016775a031d3a25f20b62254aaf8f1affd66c5bb Mon Sep 17 00:00:00 2001 From: Mikhail Kulinich Date: Wed, 26 Feb 2020 22:21:12 +0300 Subject: [PATCH 1/3] Add TX/RX message direction to socketcan --- can/interfaces/socketcan/socketcan.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/can/interfaces/socketcan/socketcan.py b/can/interfaces/socketcan/socketcan.py index 307763d9f..131e74b23 100644 --- a/can/interfaces/socketcan/socketcan.py +++ b/can/interfaces/socketcan/socketcan.py @@ -509,10 +509,10 @@ def capture_message( # Fetching the Arb ID, DLC and Data try: if get_channel: - cf, addr = sock.recvfrom(CANFD_MTU) + cf, _, msg_flags, addr = sock.recvmsg(CANFD_MTU) channel = addr[0] if isinstance(addr, tuple) else addr else: - cf = sock.recv(CANFD_MTU) + cf, _, msg_flags, _ = sock.recvmsg(CANFD_MTU) channel = None except socket.error as exc: raise can.CanError("Error receiving: %s" % exc) @@ -536,6 +536,7 @@ def capture_message( is_remote_transmission_request = bool(can_id & CAN_RTR_FLAG) is_error_frame = bool(can_id & CAN_ERR_FLAG) is_fd = len(cf) == CANFD_MTU + is_tx = bool(msg_flags & socket.MSG_DONTROUTE) bitrate_switch = bool(flags & CANFD_BRS) error_state_indicator = bool(flags & CANFD_ESI) @@ -555,6 +556,7 @@ def capture_message( is_remote_frame=is_remote_transmission_request, is_error_frame=is_error_frame, is_fd=is_fd, + is_rx=not is_tx, bitrate_switch=bitrate_switch, error_state_indicator=error_state_indicator, dlc=can_dlc, From 67e21e92a86bf693c5a92eb19ae678f119c0ac8b Mon Sep 17 00:00:00 2001 From: Mikhail Kulinich Date: Thu, 27 Feb 2020 18:31:51 +0300 Subject: [PATCH 2/3] Resolve review comments --- can/interfaces/socketcan/socketcan.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/can/interfaces/socketcan/socketcan.py b/can/interfaces/socketcan/socketcan.py index 131e74b23..9c56de4d5 100644 --- a/can/interfaces/socketcan/socketcan.py +++ b/can/interfaces/socketcan/socketcan.py @@ -536,10 +536,13 @@ def capture_message( is_remote_transmission_request = bool(can_id & CAN_RTR_FLAG) is_error_frame = bool(can_id & CAN_ERR_FLAG) is_fd = len(cf) == CANFD_MTU - is_tx = bool(msg_flags & socket.MSG_DONTROUTE) bitrate_switch = bool(flags & CANFD_BRS) error_state_indicator = bool(flags & CANFD_ESI) + # https://www.kernel.org/doc/Documentation/networking/can.txt, section 4.7.1: + # MSG_DONTROUTE: set when the received frame was created on the local host. + is_rx = not bool(msg_flags & socket.MSG_DONTROUTE) + if is_extended_frame_format: # log.debug("CAN: Extended") # TODO does this depend on SFF or EFF? @@ -556,7 +559,7 @@ def capture_message( is_remote_frame=is_remote_transmission_request, is_error_frame=is_error_frame, is_fd=is_fd, - is_rx=not is_tx, + is_rx=is_rx, bitrate_switch=bitrate_switch, error_state_indicator=error_state_indicator, dlc=can_dlc, From 69039c20cd980e10b0e52cfeedad6e0bf793e211 Mon Sep 17 00:00:00 2001 From: Mikhail Kulinich Date: Sat, 29 Feb 2020 19:44:46 +0300 Subject: [PATCH 3/3] update comment --- can/interfaces/socketcan/socketcan.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/can/interfaces/socketcan/socketcan.py b/can/interfaces/socketcan/socketcan.py index 9c56de4d5..e6ca07f5c 100644 --- a/can/interfaces/socketcan/socketcan.py +++ b/can/interfaces/socketcan/socketcan.py @@ -539,8 +539,7 @@ def capture_message( bitrate_switch = bool(flags & CANFD_BRS) error_state_indicator = bool(flags & CANFD_ESI) - # https://www.kernel.org/doc/Documentation/networking/can.txt, section 4.7.1: - # MSG_DONTROUTE: set when the received frame was created on the local host. + # Section 4.7.1: MSG_DONTROUTE: set when the received frame was created on the local host. is_rx = not bool(msg_flags & socket.MSG_DONTROUTE) if is_extended_frame_format: