vhost-device/staging/vhost-device-can
dependabot[bot] 993d6f2101 build(deps): bump the vhost-device group in /staging with 14 updates
Bumps the vhost-device group in /staging with 14 updates:

| Package | From | To |
| --- | --- | --- |
| [clap](https://github.com/clap-rs/clap) | `4.5.11` | `4.5.13` |
| [num_enum](https://github.com/illicitonion/num_enum) | `0.7.2` | `0.7.3` |
| [rstest](https://github.com/la10736/rstest) | `0.21.0` | `0.22.0` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.10.1` | `3.11.0` |
| [clap_builder](https://github.com/clap-rs/clap) | `4.5.11` | `4.5.13` |
| [clap_derive](https://github.com/clap-rs/clap) | `4.5.11` | `4.5.13` |
| [enumn](https://github.com/dtolnay/enumn) | `0.1.13` | `0.1.14` |
| [indexmap](https://github.com/indexmap-rs/indexmap) | `2.2.6` | `2.3.0` |
| [nix](https://github.com/nix-rust/nix) | `0.27.1` | `0.26.4` |
| [num_enum_derive](https://github.com/illicitonion/num_enum) | `0.7.2` | `0.7.3` |
| [regex](https://github.com/rust-lang/regex) | `1.10.5` | `1.10.6` |
| [rstest_macros](https://github.com/la10736/rstest) | `0.21.0` | `0.22.0` |
| [syn](https://github.com/dtolnay/syn) | `2.0.72` | `1.0.109` |
| [toml_datetime](https://github.com/toml-rs/toml) | `0.6.7` | `0.6.8` |


Updates `clap` from 4.5.11 to 4.5.13
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.11...v4.5.13)

Updates `num_enum` from 0.7.2 to 0.7.3
- [Commits](https://github.com/illicitonion/num_enum/compare/0.7.2...0.7.3)

Updates `rstest` from 0.21.0 to 0.22.0
- [Release notes](https://github.com/la10736/rstest/releases)
- [Changelog](https://github.com/la10736/rstest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/la10736/rstest/compare/v0.21.0...v0.22.0)

Updates `tempfile` from 3.10.1 to 3.11.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.10.1...v3.11.0)

Updates `clap_builder` from 4.5.11 to 4.5.13
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.11...v4.5.13)

Updates `clap_derive` from 4.5.11 to 4.5.13
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.11...v4.5.13)

Updates `enumn` from 0.1.13 to 0.1.14
- [Release notes](https://github.com/dtolnay/enumn/releases)
- [Commits](https://github.com/dtolnay/enumn/compare/0.1.13...0.1.14)

Updates `indexmap` from 2.2.6 to 2.3.0
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/master/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.2.6...2.3.0)

Updates `nix` from 0.27.1 to 0.26.4
- [Changelog](https://github.com/nix-rust/nix/blob/v0.26.4/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.27.1...v0.26.4)

Updates `num_enum_derive` from 0.7.2 to 0.7.3
- [Commits](https://github.com/illicitonion/num_enum/compare/0.7.2...0.7.3)

Updates `regex` from 1.10.5 to 1.10.6
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.10.5...1.10.6)

Updates `rstest_macros` from 0.21.0 to 0.22.0
- [Release notes](https://github.com/la10736/rstest/releases)
- [Changelog](https://github.com/la10736/rstest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/la10736/rstest/compare/v0.21.0...v0.22.0)

Updates `syn` from 2.0.72 to 1.0.109
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/2.0.72...1.0.109)

Updates `toml_datetime` from 0.6.7 to 0.6.8
- [Commits](https://github.com/toml-rs/toml/compare/toml_datetime-v0.6.7...toml_datetime-v0.6.8)

---
updated-dependencies:
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: num_enum
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: rstest
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: vhost-device
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: vhost-device
- dependency-name: clap_builder
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: clap_derive
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: enumn
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: indexmap
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: vhost-device
- dependency-name: nix
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: vhost-device
- dependency-name: num_enum_derive
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: regex
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
- dependency-name: rstest_macros
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: vhost-device
- dependency-name: syn
  dependency-type: indirect
  update-type: version-update:semver-major
  dependency-group: vhost-device
- dependency-name: toml_datetime
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: vhost-device
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-05 11:46:17 +05:30
..
src vhost-device-can: Add initial implementation 2024-08-02 09:34:25 +02:00
Cargo.toml build(deps): bump the vhost-device group in /staging with 14 updates 2024-08-05 11:46:17 +05:30
CHANGELOG.md vhost-device-can: Add initial implementation 2024-08-02 09:34:25 +02:00
LICENSE-APACHE vhost-device-can: Add initial implementation 2024-08-02 09:34:25 +02:00
LICENSE-BSD-3-Clause vhost-device-can: Add initial implementation 2024-08-02 09:34:25 +02:00
README.md vhost-device-can: Add initial implementation 2024-08-02 09:34:25 +02:00

vhost-device-can - CAN emulation backend daemon

Description

This program is a vhost-user backend that emulates a VirtIO CAN device. The device's binary takes two (2) parameters: a socket, a 'can-devices' list. The socket is commonly used across all vhost-devices to communicate with the vhost-user frontend device. The 'can-devices' represents a list of CAN/FD devices appears in the host system which vhost-device-can will forward messages to and from the frontend side.

This program is tested with QEMU's vhost-user-device-pci device. Examples' section below.

Synopsis

**vhost-device-can** [*OPTIONS*]

Options

.. program:: vhost-device-can

.. option:: -h, --help

Print help.

.. option:: -s, --socket-path=PATH

Location of vhost-user Unix domain sockets, this path will be suffixed with 0,1,2..socket_count-1.

.. option:: -c, --socket-count=INT

Number of guests (sockets) to attach to, default set to 1.

.. option:: -d, --can-devices='CAN/FD interfaces'

CAN/FD device list at the host OS in the format: <can-_X_0> [<can_in_X_1>] ... [<can_in_X_N-1>]

Note 1: Where N (the number of CAN/FD interfaces) is equal with the number provided via socket_count parameter.

  Example: --can-devices "can0 can1 can2"

Features

This device is still work-in-progress (WIP) and on virtio-spec v1.4 is based on virtio-can Linux's driver and QEMU's device presented in the following RFC:

Vhost-device-can have be been tested in scenarios with multiple QEMU's VMs using host's CAN/FD devices.

Limitations

  1. The transmission of a CAN/FD frame to a host interface always is done synchronously. This means that regardless the negotiation or not of the feature VIRTIO_CAN_F_LATE_TX_ACK, the backend will always wait for the transmission of the frame and after will mark the transmission request as used.
  2. Does not check for undefined flags in CAN/FD frame when send and receive a CAN/FD frame from the frontend (QEMU device).
  3. The host's CAN/FD devices should be already in UP state before staring the vhost-device-can (by using ip link set can0 [up,down]).
    • The control messages does not actually change host's device state
  4. Current version of the device has been tested only with vcan device.

Examples

Dependencies

For testing the device the required dependencies are:

Test the device

The daemon should be started first:

host# vhost-device-can --socket-path=can.sock --can-devices="vcan0"

The QEMU invocation needs to create a chardev socket the device can use to communicate as well as share the guests memory over a memfd.

There are two option for running QEMU with vhost-device-can:

  1. Using vhost-user-device-pci available upstream since QEMU v8.2.0:
host# qemu-system                                                                    \
    -m 4096                                                                          \
    -numa node,memdev=mem                                                            \
    -object memory-backend-memfd,id=mem,size=4G,share=on                             \
    -chardev socket,id=can0,path=/tmp/can.sock                                       \
    -device vhost-user-device-pci,chardev=can0,virtio-id=36,num_vqs=3,config_size=16 \
    ...
  1. Using vhost-user-can-pci:
host# qemu-system                                         \
    -m 4096                                               \
    -numa node,memdev=mem                                 \
    -object memory-backend-memfd,id=mem,size=4G,share=on  \
    -chardev socket,path=/tmp/can.sock,id=can0            \
    -device vhost-user-can-pci,chardev=can0,id=can        \
    ...

Note: For testing this scenario the reader needs to clone the QEMU version from the following repo which implements vhost-user-can device:

Multi-Guest case

Run vhost-device-can as:

./vhost-device-can --socket-path /tmp/can.sock  --socket-count 2 --can-devices "vcan0 vcan1"

This command will start the device and create two new sockets: /tmp/can.sock0 and /tmp/can.sock1.

From the other side we run two QEMU instances (VMs) with vhost-user-can:

host# qemu-system                                         \
    -m 4096                                               \
    -numa node,memdev=mem                                 \
    -object memory-backend-memfd,id=mem,size=4G,share=on  \
    -chardev socket,path=<SOCKET_PATH>,id=can0            \
    -device vhost-user-can-pci,chardev=can0,id=can        \
    ...

In the first instance of QEMU SOCKET_PATH would be: /tmp/can.sock0, and will use can0 (host interface) as sender and receiver. The second QEMU VM would have: SOCKET_PATH = /tmp/can.sock1, and will use can1 as receiver and can2 as sender.

License

This project is licensed under either of