Skip to content

Commit deda3f0

Browse files
committed
ip li add name type dummy_rs working
Signed-off-by: Finn Behrens <[email protected]>
1 parent 6e3bed3 commit deda3f0

File tree

10 files changed

+372
-300
lines changed

10 files changed

+372
-300
lines changed

drivers/net/dummy_rs.rs

+48-52
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
// SPDX-License-Identifier: GPL-2.0
22

33
//! Rust dummy network driver
4-
//!
4+
//!
55
//! This is a demonstration of what a small driver looks like in Rust, based on drivers/net/dummy.c.
66
//! This code is provided as a demonstration only, not as a proposal to mass-rewrite existing drivers in Rust
77
88
// TODO: copyright (see ./dummy.c)
99

10-
1110
#![no_std]
1211
#![feature(allocator_api, global_asm)]
1312

1413
use core::ops::Deref;
1514

16-
use kernel::{net::netlink::{NlAttrVec, NlExtAck}, prelude::*};
17-
use kernel::net::prelude::*;
1815
use kernel::net::device;
16+
use kernel::net::prelude::*;
1917
use kernel::net::rtnl;
2018
use kernel::Error;
19+
use kernel::{
20+
net::netlink::{NlAttrVec, NlExtAck},
21+
prelude::*,
22+
};
2123

2224
module! {
2325
type: RustNetDummy,
2426
name: b"dummy_rs",
2527
author: b"Rust for Linux Contributors",
2628
description: b"Rust dummy network driver",
2729
license: b"GPL v2",
28-
alias: b"rtnl-link-dummy_rs",
30+
alias_rtnl_link: b"dummy_rs",
2931
params: {
3032
numdummies: usize {
3133
default: 0,
@@ -36,9 +38,10 @@ module! {
3638
}
3739

3840
fn setup(dev: &mut NetDevice<DummyRsDev>) {
39-
pr_info!("called rtnl_setup");
4041
dev.ether_setup();
4142

43+
dev.set_ops();
44+
4245
// Fill in device structure with ethernet-generic values.
4346
dev.add_flag(device::Iff::NOARP);
4447
dev.remove_flag(device::Iff::MULTICAST);
@@ -67,18 +70,14 @@ fn setup(dev: &mut NetDevice<DummyRsDev>) {
6770
}
6871

6972
fn validate(tb: &NlAttrVec, data: &NlAttrVec, ext_ack: &NlExtAck) -> KernelResult<()> {
70-
pr_info!("validate nlattr");
7173
if let Some(addr) = tb.get(kernel::bindings::IFLA_ADDRESS) {
7274
if addr.nla_len() != kernel::net::netlink::ETH_ALEN {
7375
return Err(Error::EINVAL);
7476
}
7577
if !addr.is_valid_ether_addr() {
7678
return Err(Error::EADDRNOTAVAIL);
7779
}
78-
} else {
79-
pr_info!("no IFLA_ADDRESS in nlattr");
8080
}
81-
pr_info!("valid nlattr");
8281
Ok(())
8382
}
8483

@@ -90,52 +89,51 @@ rtnl_link_ops! {
9089
}
9190

9291
struct RustNetDummy {
93-
dev: NetDevice<DummyRsDev>,
92+
//dev: NetDevice<DummyRsDev>,
9493
}
9594

96-
9795
impl KernelModule for RustNetDummy {
9896
fn init() -> KernelResult<Self> {
99-
{
100-
let lock =THIS_MODULE.kernel_param_lock();
101-
pr_info!("Rust Network Dummy with {} pseudo devices\n", numdummies.read(&lock));
102-
}
103-
104-
unsafe { dummy_rs_rtnl_link_ops.register() }?;
105-
106-
let mut dev = NetDevice::new(DummyRsDev, kernel::cstr!("dummyrs%d"), kernel::net::device::NetNameAssingType::Enum, 1, 1)?;
107-
dev.set_rtnl_ops( unsafe { &dummy_rs_rtnl_link_ops });
108-
109-
if let Err(e) = dev.register() {
110-
pr_warn!("could not register: {}", e.to_kernel_errno());
111-
return Err(e);
97+
let num = {
98+
let lock = THIS_MODULE.kernel_param_lock();
99+
pr_info!(
100+
"Rust Network Dummy with {} pseudo devices\n",
101+
numdummies.read(&lock)
102+
);
103+
numdummies.read(&lock).clone()
104+
};
105+
106+
unsafe { dummy_rs_link_ops.register() }?;
107+
108+
for x in 0..(num) {
109+
let dev = NetDevice::new(
110+
DummyRsDev,
111+
kernel::cstr!("dummyrs%d"),
112+
kernel::net::device::NetNameAssingType::Enum,
113+
1,
114+
1,
115+
)?;
116+
dev.set_rtnl_ops(unsafe { &dummy_rs_link_ops });
117+
118+
if let Err(e) = dev.register() {
119+
pr_warn!("could not register: {}", e.to_kernel_errno());
120+
return Err(e);
121+
}
112122
}
113-
pr_info!("device registered");
114123

115124
Ok(RustNetDummy {
116-
dev,
125+
//dev,
117126
})
118127
}
119128
}
120129

121130
impl Drop for RustNetDummy {
122131
fn drop(&mut self) {
123-
pr_info!("remove rust net dummy");
124-
125-
126-
unsafe {
127-
//let ptr = &dummy_rs_rtnl_link_ops as *const _ as *mut kernel::bindings::rtnl_link_ops;
128-
pr_info!("rtnl: {:#?}", &dummy_rs_rtnl_link_ops.0);
129-
let ptr = &dummy_rs_rtnl_link_ops.get_ptr();
130-
pr_info!("rtnl_link_ops_ptr: {:?}", ptr);
131-
}
132-
// TODO rtnl_link_unregister
133132
// TODO: remove unsafe somehow
134-
unsafe { dummy_rs_rtnl_link_ops.unregister() };
133+
unsafe { dummy_rs_link_ops.unregister() };
135134
}
136135
}
137136

138-
139137
struct DummyRsDev;
140138

141139
impl NetDeviceOps<Self> for DummyRsDev {
@@ -159,19 +157,15 @@ impl NetDeviceOps<Self> for DummyRsDev {
159157
fn start_xmit(skb: SkBuff, dev: &mut NetDevice<Self>) -> kernel::net::device::NetdevTX {
160158
let mut skb = skb;
161159

162-
// TODO: dev_lstatt_add(dev, skb->len)
163160
dev.lstats_add(skb.len());
164161

165162
skb.tx_timestamp();
166163
drop(skb);
167164

168-
pr_info!("start_xmit called");
169-
170165
kernel::net::device::NetdevTX::TX_OK
171166
}
172167

173168
fn get_stats64(dev: &NetDevice<Self>, stats: &mut rtnl::RtnlLinkStats64) {
174-
pr_info!("get stats64");
175169
stats.dev_read(dev);
176170
}
177171

@@ -182,18 +176,18 @@ impl NetDeviceOps<Self> for DummyRsDev {
182176
}
183177

184178
fn validate_addr(dev: &NetDevice<Self>) -> KernelResult<()> {
185-
pr_info!("eth_validate_addr");
186179
device::helpers::eth_validate_addr(dev)
187180
}
188181

189-
fn set_mac_addr(dev: &mut NetDevice<Self>, p: *mut kernel::c_types::c_void) -> KernelResult<()> {
182+
fn set_mac_addr(
183+
dev: &mut NetDevice<Self>,
184+
p: *mut kernel::c_types::c_void,
185+
) -> KernelResult<()> {
190186
device::helpers::eth_mac_addr(dev, p)
191187
}
192188

193-
// Someting about faking multicast
194-
fn set_rx_mode(dev: &mut NetDevice<Self>) {
195-
pr_info!("set_rx_mode");
196-
}
189+
// [Someting about faking multicast](https://elixir.bootlin.com/linux/v5.12-rc4/source/drivers/net/dummy.c#L48).
190+
fn set_rx_mode(_dev: &mut NetDevice<Self>) {}
197191
}
198192

199193
impl NetDeviceAdapter for DummyRsDev {
@@ -204,9 +198,7 @@ impl NetDeviceAdapter for DummyRsDev {
204198
type EthOps = Self;
205199

206200
fn setup(dev: &mut NetDevice<Self>) {
207-
pr_info!("called netdev_setup");
208201
setup(dev);
209-
//dev.set_rtnl_ops( unsafe { &dummy_rs_rtnl_link_ops });
210202
}
211203
}
212204

@@ -218,7 +210,11 @@ impl EthToolOps<Self> for DummyRsDev {
218210
// FIXME: !!
219211
let info: &kernel::bindings::ethtool_drvinfo = info.deref();
220212
unsafe {
221-
kernel::bindings::strlcpy(&(info.driver) as *const _ as *mut i8, b"dummy_rs\0" as *const _ as *mut i8, 32);
213+
kernel::bindings::strlcpy(
214+
&(info.driver) as *const _ as *mut i8,
215+
b"dummy_rs\0" as *const _ as *mut i8,
216+
32,
217+
);
222218
}
223219
}
224220

rust/kernel/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,4 @@ macro_rules! c_from_kernel_result {
127127
$($tt)*
128128
})())
129129
}};
130-
}
130+
}

rust/kernel/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ pub mod c_types;
4141
pub mod chrdev;
4242
mod error;
4343
pub mod file_operations;
44-
pub mod net;
4544
pub mod miscdev;
45+
pub mod net;
4646
pub mod pages;
4747

4848
pub mod linked_list;
@@ -65,7 +65,7 @@ pub mod iov_iter;
6565
mod types;
6666
pub mod user_ptr;
6767

68-
pub use crate::error::{Error, KernelResult, c_from_kernel_result};
68+
pub use crate::error::{c_from_kernel_result, Error, KernelResult};
6969
pub use crate::types::{CStr, Mode};
7070

7171
/// Page size defined in terms of the `PAGE_SHIFT` macro from C.

0 commit comments

Comments
 (0)