Using python with socketcan in the J1939 protocol, it seems that recvfrom() does not return the interface when the data is more than 8 bytes. In the J1939 protocl, when there is more than 8 data bytes, multiple CAN messages are sent since a CAN message can only hold up to 8 data bytes.
Using the program below, I see that the interface is returned for 8 data bytes, but not for 9 data bytes.
Is the issue with Python or with the kernel? How can we reach the right developer in the case this is really a bug?
Thank you.
#!/usr/bin/env python3
import socket
send_socket = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
interface = "vcan0"
send_socket_src_name = socket.J1939_NO_NAME
send_socket_src_pgn = socket.J1939_NO_PGN
send_socket_src_addr = 0x80
send_socket_src_sck_addr = (interface, send_socket_src_name, send_socket_src_pgn, send_socket_src_addr)
send_socket.bind(send_socket_src_sck_addr)
send_socket_dest_name = socket.J1939_NO_NAME
send_socket_dest_pgn = 0x2300
send_socket_dest_addr = 0x81
send_socket_dest_sck_addr = (interface, send_socket_dest_name, send_socket_dest_pgn, send_socket_dest_addr)
send_socket_data_8_bytes = b'\x01\x02\x03\x04\x05\x06\x07\x08'
send_socket_data_9_bytes = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09'
receive_socket = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
receive_socket_src_name = socket.J1939_NO_NAME
receive_socket_src_pgn = socket.J1939_NO_PGN
receive_socket_src_addr = 0x81
receive_socket_src_sck_addr = (interface, receive_socket_src_name, receive_socket_src_pgn, receive_socket_src_addr)
receive_socket.bind(receive_socket_src_sck_addr)
send_socket.sendto(send_socket_data_8_bytes, send_socket_dest_sck_addr)
(data, sock_addr) = receive_socket.recvfrom(128)
(interface, src_name, src_pgn, src_addr) = sock_addr
print(f"interface for 8 data bytes:{interface}")
send_socket.sendto(send_socket_data_9_bytes, send_socket_dest_sck_addr)
(data, sock_addr) = receive_socket.recvfrom(128)
(interface, src_name, src_pgn, src_addr) = sock_addr
print(f"interface for 9 data bytes:{interface}")
receive_socket.close()
send_socket.close()
This is the output:
interface for 8 data bytes:vcan0
interface for 9 data bytes: