Skip to content

Commit de0992b

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

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

Diff for: drivers/net/dummy_rs.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ fn setup(dev: &mut NetDevice<DummyRsDev>) {
3939
pr_info!("called rtnl_setup");
4040
dev.ether_setup();
4141

42+
dev.set_ops();
43+
4244
// Fill in device structure with ethernet-generic values.
4345
dev.add_flag(device::Iff::NOARP);
4446
dev.remove_flag(device::Iff::MULTICAST);
@@ -62,8 +64,13 @@ fn setup(dev: &mut NetDevice<DummyRsDev>) {
6264
dev.set_hw_features(feature);
6365
dev.set_hw_enc_features(feature);
6466

67+
pr_info!("setting hw addr random");
6568
dev.hw_addr_random();
69+
pr_info!("set hw addr");
6670
dev.set_mtu(0, 0);
71+
72+
pr_info!("printing rtnl_link_ops");
73+
pr_info!("rtnl_link_ops_after_setup_ptr: {:?}", dev.deref().rtnl_link_ops);
6774
}
6875

6976
fn validate(tb: &NlAttrVec, data: &NlAttrVec, ext_ack: &NlExtAck) -> KernelResult<()> {
@@ -101,10 +108,12 @@ impl KernelModule for RustNetDummy {
101108
pr_info!("Rust Network Dummy with {} pseudo devices\n", numdummies.read(&lock));
102109
}
103110

104-
unsafe { dummy_rs_rtnl_link_ops.register() }?;
111+
unsafe { dummy_rs_link_ops.register() }?;
105112

106113
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 });
114+
dev.set_rtnl_ops( unsafe { &dummy_rs_link_ops });
115+
116+
pr_info!("rtnl_link_ops_set_ptr: {:?}", dev.deref().rtnl_link_ops);
108117

109118
if let Err(e) = dev.register() {
110119
pr_warn!("could not register: {}", e.to_kernel_errno());
@@ -125,13 +134,13 @@ impl Drop for RustNetDummy {
125134

126135
unsafe {
127136
//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();
137+
pr_info!("rtnl: {:#?}", &dummy_rs_link_ops.0);
138+
let ptr = &dummy_rs_link_ops.get_ptr();
130139
pr_info!("rtnl_link_ops_ptr: {:?}", ptr);
131140
}
132141
// TODO rtnl_link_unregister
133142
// TODO: remove unsafe somehow
134-
unsafe { dummy_rs_rtnl_link_ops.unregister() };
143+
unsafe { dummy_rs_link_ops.unregister() };
135144
}
136145
}
137146

Diff for: rust/kernel/net/device.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ pub enum NetNameAssingType {
5454
unsafe extern "C" fn setup_netdev_callback<T: NetDeviceAdapter>(dev: *mut bindings::net_device) {
5555
// TODO: pass on dev
5656
let mut dev = NetDevice::<T>::from_ptr(dev);
57-
dev.needs_free_netdev = true; // TODO: is this reasonable?
57+
/*dev.needs_free_netdev = true; // TODO: is this reasonable?
5858
dev.netdev_ops = NetDeviceOperationsVtable::<T>::build();
59-
dev.ethtool_ops = super::ethtool::EthToolOperationsVtable::<T>::build();
59+
dev.ethtool_ops = super::ethtool::EthToolOperationsVtable::<T>::build();*/
6060

6161
T::setup(&mut dev);
6262
}
@@ -336,6 +336,14 @@ impl<T: NetDeviceAdapter> NetDevice<T> {
336336
}
337337
}
338338

339+
pub fn set_ops(&mut self) {
340+
self.needs_free_netdev = true; // TODO: is this reasonable?
341+
unsafe {
342+
self.netdev_ops = NetDeviceOperationsVtable::<T>::build();
343+
self.ethtool_ops = super::ethtool::EthToolOperationsVtable::<T>::build();
344+
}
345+
}
346+
339347
/// Constructs a new [`struct net_device`] wrapper.
340348
///
341349
/// # Safety

Diff for: rust/kernel/net/rtnl.rs

+6
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ impl RtnlLinkOps {
103103
}
104104
}
105105

106+
impl Drop for RtnlLinkOps {
107+
fn drop(&mut self) {
108+
crate::pr_info!("dropping rtnl_link_ops");
109+
}
110+
}
111+
106112
#[repr(transparent)]
107113
pub struct RtnlLinkStats64 {
108114
ptr: *const bindings::rtnl_link_stats64

Diff for: rust/module.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ fn expect_end(it: &mut token_stream::IntoIter) {
103103
}
104104
}
105105

106+
fn get_ident(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
107+
assert_eq!(expect_ident(it), expected_name);
108+
assert_eq!(expect_punct(it), ':');
109+
let ident = expect_ident(it);
110+
assert_eq!(expect_punct(it), ',');
111+
ident
112+
}
113+
106114
fn get_literal(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
107115
assert_eq!(expect_ident(it), expected_name);
108116
assert_eq!(expect_punct(it), ':');
@@ -951,7 +959,8 @@ pub fn rtnl_link_ops(ts: TokenStream) -> TokenStream {
951959
let ops_struct = format!(r#"
952960
#[doc(hidden)]
953961
#[used]
954-
pub static mut {kind}_rtnl_link_ops: kernel::net::rtnl::RtnlLinkOps = kernel::net::rtnl::RtnlLinkOps(kernel::bindings::rtnl_link_ops {{
962+
#[no_mangle]
963+
pub static mut {kind}_link_ops: kernel::net::rtnl::RtnlLinkOps = kernel::net::rtnl::RtnlLinkOps(kernel::bindings::rtnl_link_ops {{
955964
priv_size: core::mem::size_of::<<{netdevice} as kernel::net::device::NetDeviceAdapter>::Inner>(),
956965
kind: b"{kind}\0".as_ptr() as *const i8,
957966
{callback_fields}

0 commit comments

Comments
 (0)