Message ID | 20230613045326.3938283-6-fujita.tomonori@gmail.com (mailing list archive) |
---|---|
State | Deferred |
Headers | show |
Series | Rust abstractions for network device drivers | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch, async |
On 6/13/23 06:53, FUJITA Tomonori wrote: > This is a simpler version of drivers/net/dummy.c. > > This demonstrates the usage of abstractions for network device drivers. > > Allows allocator_api feature for Box::try_new(); > > Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> > --- > samples/rust/Kconfig | 12 +++++ > samples/rust/Makefile | 1 + > samples/rust/rust_net_dummy.rs | 81 ++++++++++++++++++++++++++++++++++ > scripts/Makefile.build | 2 +- > 4 files changed, 95 insertions(+), 1 deletion(-) > create mode 100644 samples/rust/rust_net_dummy.rs > > diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig > index b0f74a81c8f9..8b52ba620ae3 100644 > --- a/samples/rust/Kconfig > +++ b/samples/rust/Kconfig > @@ -30,6 +30,18 @@ config SAMPLE_RUST_PRINT > > If unsure, say N. > > +config SAMPLE_RUST_NET_DUMMY > + tristate "Dummy network driver" > + depends on NET > + help > + This is the simpler version of drivers/net/dummy.c. No intention to replace it. > + This provides educational information for Rust abstractions for network drivers. > + > + To compile this as a module, choose M here: > + the module will be called rust_minimal. The module is not called `rust_minimal` :) -- Cheers, Benno > + > + If unsure, say N. > + > config SAMPLE_RUST_HOSTPROGS > bool "Host programs" > help > diff --git a/samples/rust/Makefile b/samples/rust/Makefile > index 03086dabbea4..440dee2971ba 100644 > --- a/samples/rust/Makefile > +++ b/samples/rust/Makefile > @@ -2,5 +2,6 @@ > > obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o > obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o > +obj-$(CONFIG_SAMPLE_RUST_NET_DUMMY) += rust_net_dummy.o > > subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs > diff --git a/samples/rust/rust_net_dummy.rs b/samples/rust/rust_net_dummy.rs > new file mode 100644 > index 000000000000..6c49a7ba7ba2 > --- /dev/null > +++ b/samples/rust/rust_net_dummy.rs > @@ -0,0 +1,81 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +//! Rust dummy netdev. > + > +use kernel::{ > + c_str, > + net::dev::{ > + ethtool_op_get_ts_info, flags, priv_flags, Device, DeviceOperations, DriverData, > + EtherOperations, EthtoolTsInfo, Registration, RtnlLinkStats64, SkBuff, TxCode, > + }, > + prelude::*, > +}; > + > +module! { > + type: DummyNetdev, > + name: "rust_net_dummy", > + author: "Rust for Linux Contributors", > + description: "Rust dummy netdev", > + license: "GPL v2", > +} > + > +struct DevOps {} > + > +#[vtable] > +impl<D: DriverData<Data = Box<Stats>>> DeviceOperations<D> for DevOps { > + fn init(_dev: &mut Device, _data: &Stats) -> Result { > + Ok(()) > + } > + > + fn start_xmit(_dev: &mut Device, _data: &Stats, mut skb: SkBuff) -> TxCode { > + skb.tx_timestamp(); > + TxCode::Ok > + } > + > + fn get_stats64(_dev: &mut Device, _data: &Stats, _stats: &mut RtnlLinkStats64) {} > +} > + > +/// For device driver specific information. > +struct Stats {} > + > +impl DriverData for Stats { > + type Data = Box<Stats>; > +} > + > +struct DummyNetdev { > + _r: Registration<DevOps, Stats>, > +} > + > +struct EtherOps {} > + > +#[vtable] > +impl<D: DriverData<Data = Box<Stats>>> EtherOperations<D> for EtherOps { > + fn get_ts_info(dev: &mut Device, _data: &Stats, info: &mut EthtoolTsInfo) -> Result { > + ethtool_op_get_ts_info(dev, info) > + } > +} > + > +impl kernel::Module for DummyNetdev { > + fn init(_module: &'static ThisModule) -> Result<Self> { > + let data = Box::try_new(Stats {})?; > + let mut r = Registration::<DevOps, Stats>::try_new_ether(1, 1, data)?; > + r.set_ether_operations::<EtherOps>()?; > + > + let netdev = r.dev_get(); > + netdev.set_name(c_str!("dummy%d"))?; > + > + netdev.set_flags(netdev.get_flags() | flags::IFF_NOARP & !flags::IFF_MULTICAST); > + netdev.set_priv_flags( > + netdev.get_priv_flags() | priv_flags::IFF_LIVE_ADDR_CHANGE | priv_flags::IFF_NO_QUEUE, > + ); > + netdev.set_random_eth_hw_addr(); > + netdev.set_min_mtu(0); > + netdev.set_max_mtu(0); > + > + r.register()?; > + > + // TODO: Replaces pr_info with the wrapper of netdev_info(). > + pr_info!("Hello Rust dummy netdev!"); > + Ok(DummyNetdev { _r: r }) > + } > +} > diff --git a/scripts/Makefile.build b/scripts/Makefile.build > index 78175231c969..1404967e908e 100644 > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE > # Compile Rust sources (.rs) > # --------------------------------------------------------------------------- > > -rust_allowed_features := new_uninit > +rust_allowed_features := allocator_api,new_uninit > > rust_common_cmd = \ > RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \ > -- > 2.34.1 >
Hi, On Thu, 15 Jun 2023 13:08:39 +0000 Benno Lossin <benno.lossin@proton.me> wrote: > On 6/13/23 06:53, FUJITA Tomonori wrote: >> This is a simpler version of drivers/net/dummy.c. >> >> This demonstrates the usage of abstractions for network device drivers. >> >> Allows allocator_api feature for Box::try_new(); >> >> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> >> --- >> samples/rust/Kconfig | 12 +++++ >> samples/rust/Makefile | 1 + >> samples/rust/rust_net_dummy.rs | 81 ++++++++++++++++++++++++++++++++++ >> scripts/Makefile.build | 2 +- >> 4 files changed, 95 insertions(+), 1 deletion(-) >> create mode 100644 samples/rust/rust_net_dummy.rs >> >> diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig >> index b0f74a81c8f9..8b52ba620ae3 100644 >> --- a/samples/rust/Kconfig >> +++ b/samples/rust/Kconfig >> @@ -30,6 +30,18 @@ config SAMPLE_RUST_PRINT >> >> If unsure, say N. >> >> +config SAMPLE_RUST_NET_DUMMY >> + tristate "Dummy network driver" >> + depends on NET >> + help >> + This is the simpler version of drivers/net/dummy.c. No intention to replace it. >> + This provides educational information for Rust abstractions for network drivers. >> + >> + To compile this as a module, choose M here: >> + the module will be called rust_minimal. > > The module is not called `rust_minimal` :) Oops, I'll fix it in the next version. thanks,
diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig index b0f74a81c8f9..8b52ba620ae3 100644 --- a/samples/rust/Kconfig +++ b/samples/rust/Kconfig @@ -30,6 +30,18 @@ config SAMPLE_RUST_PRINT If unsure, say N. +config SAMPLE_RUST_NET_DUMMY + tristate "Dummy network driver" + depends on NET + help + This is the simpler version of drivers/net/dummy.c. No intention to replace it. + This provides educational information for Rust abstractions for network drivers. + + To compile this as a module, choose M here: + the module will be called rust_minimal. + + If unsure, say N. + config SAMPLE_RUST_HOSTPROGS bool "Host programs" help diff --git a/samples/rust/Makefile b/samples/rust/Makefile index 03086dabbea4..440dee2971ba 100644 --- a/samples/rust/Makefile +++ b/samples/rust/Makefile @@ -2,5 +2,6 @@ obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o +obj-$(CONFIG_SAMPLE_RUST_NET_DUMMY) += rust_net_dummy.o subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs diff --git a/samples/rust/rust_net_dummy.rs b/samples/rust/rust_net_dummy.rs new file mode 100644 index 000000000000..6c49a7ba7ba2 --- /dev/null +++ b/samples/rust/rust_net_dummy.rs @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0 +// +//! Rust dummy netdev. + +use kernel::{ + c_str, + net::dev::{ + ethtool_op_get_ts_info, flags, priv_flags, Device, DeviceOperations, DriverData, + EtherOperations, EthtoolTsInfo, Registration, RtnlLinkStats64, SkBuff, TxCode, + }, + prelude::*, +}; + +module! { + type: DummyNetdev, + name: "rust_net_dummy", + author: "Rust for Linux Contributors", + description: "Rust dummy netdev", + license: "GPL v2", +} + +struct DevOps {} + +#[vtable] +impl<D: DriverData<Data = Box<Stats>>> DeviceOperations<D> for DevOps { + fn init(_dev: &mut Device, _data: &Stats) -> Result { + Ok(()) + } + + fn start_xmit(_dev: &mut Device, _data: &Stats, mut skb: SkBuff) -> TxCode { + skb.tx_timestamp(); + TxCode::Ok + } + + fn get_stats64(_dev: &mut Device, _data: &Stats, _stats: &mut RtnlLinkStats64) {} +} + +/// For device driver specific information. +struct Stats {} + +impl DriverData for Stats { + type Data = Box<Stats>; +} + +struct DummyNetdev { + _r: Registration<DevOps, Stats>, +} + +struct EtherOps {} + +#[vtable] +impl<D: DriverData<Data = Box<Stats>>> EtherOperations<D> for EtherOps { + fn get_ts_info(dev: &mut Device, _data: &Stats, info: &mut EthtoolTsInfo) -> Result { + ethtool_op_get_ts_info(dev, info) + } +} + +impl kernel::Module for DummyNetdev { + fn init(_module: &'static ThisModule) -> Result<Self> { + let data = Box::try_new(Stats {})?; + let mut r = Registration::<DevOps, Stats>::try_new_ether(1, 1, data)?; + r.set_ether_operations::<EtherOps>()?; + + let netdev = r.dev_get(); + netdev.set_name(c_str!("dummy%d"))?; + + netdev.set_flags(netdev.get_flags() | flags::IFF_NOARP & !flags::IFF_MULTICAST); + netdev.set_priv_flags( + netdev.get_priv_flags() | priv_flags::IFF_LIVE_ADDR_CHANGE | priv_flags::IFF_NO_QUEUE, + ); + netdev.set_random_eth_hw_addr(); + netdev.set_min_mtu(0); + netdev.set_max_mtu(0); + + r.register()?; + + // TODO: Replaces pr_info with the wrapper of netdev_info(). + pr_info!("Hello Rust dummy netdev!"); + Ok(DummyNetdev { _r: r }) + } +} diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 78175231c969..1404967e908e 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE # Compile Rust sources (.rs) # --------------------------------------------------------------------------- -rust_allowed_features := new_uninit +rust_allowed_features := allocator_api,new_uninit rust_common_cmd = \ RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \
This is a simpler version of drivers/net/dummy.c. This demonstrates the usage of abstractions for network device drivers. Allows allocator_api feature for Box::try_new(); Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> --- samples/rust/Kconfig | 12 +++++ samples/rust/Makefile | 1 + samples/rust/rust_net_dummy.rs | 81 ++++++++++++++++++++++++++++++++++ scripts/Makefile.build | 2 +- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 samples/rust/rust_net_dummy.rs