#socket-can #async #isotp #linux #iso-tp #iso-15762-2

tokio-socketcan-isotp

A asynchronous tokio ISO-TP library build on top of socketcan-isotp

2 unstable releases

new 0.2.0 May 1, 2024
0.1.0 Jan 9, 2024

#380 in Unix APIs

Download history 5/week @ 2024-01-03 3/week @ 2024-01-10 2/week @ 2024-02-14 5/week @ 2024-02-21 10/week @ 2024-02-28 5/week @ 2024-03-13 6/week @ 2024-03-27 16/week @ 2024-04-03 50/week @ 2024-04-10

72 downloads per month
Used in uds-rs

Custom license

31KB
550 lines

tokio-socketcan-isotp

This library creates asynchronous wrapper around socketcan-isotp

Currently not dependent on the original, but rather on the modified of the socketcan-isotp library, which adds read_to_vec method, in order to prevent mutable borrowing of the socket, when reading.

You may experience busy waiting, or soft locks when write encounters io::Error:WouldBlock. This is due to the error in Linux Kernel, which is now solved, but the maintainer of your Linux kernel might not have shipped it yet. I tested it on the mainline Kernel 6.6.5 and everything worked correctly. If you experience mentioned errors and cannot upgrade to newer kernel, refer to the src/lib.rs file to the poll method of the IsoTpWriteFuture, where a edit is suggested that might help with your situation.

Example of basic echoing server on vcan0:

use tokio_socketcan_isotp::{IsoTpSocket, StandardId, Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let mut socket = IsoTpSocket::open(
        "vcan0",
        StandardId::new(0x123).expect("Invalid src id"),
        StandardId::new(0x321).expect("Invalid src id")
            )?;
            
    while let Ok(packet) = socket.read_packet().await {
        println!("{:?}", packet);
        let rx = socket.write_packet(packet).await;
    }
}

To setup vcan0 run following commands:

sudo modprobe can
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

Dependencies

~5–17MB
~175K SLoC