1use std::sync::{Arc, Mutex};
5
6use smoltcp::wire::EthernetAddress;
7use twizzler::error::TwzError;
8use twizzler_abi::syscall::{ObjectCreate, ThreadSync};
9use twizzler_driver::device::Device;
10use twizzler_net::{
11 drivers::{NetDriver, Packet, QueueHandle, WorkItems},
12 packet::PacketObject,
13};
14use virtio_drivers::{
15 device::net::{RxBuffer, TxBuffer, VirtIONet},
16 transport::Transport,
17};
18
19use crate::{hal::TwzHal, transport::TwizzlerTransport};
20
21const NET_QUEUE_SIZE: usize = 64;
22
23type DeviceImpl<T> = VirtIONet<TwzHal, T, NET_QUEUE_SIZE>;
24
25const NET_BUFFER_LEN: usize = 4096;
26
27pub struct DeviceWrapper<T: Transport> {
28 inner: Arc<Mutex<DeviceImpl<T>>>,
29 rx_po: PacketObject,
30 tx_po: PacketObject,
31 tt_device: Arc<twizzler_driver::device::Device>,
32}
33
34impl<T: Transport> Clone for DeviceWrapper<T> {
35 fn clone(&self) -> Self {
36 Self {
37 inner: self.inner.clone(),
38 rx_po: self.rx_po.clone(),
39 tx_po: self.tx_po.clone(),
40 tt_device: self.tt_device.clone(),
41 }
42 }
43}
44
45impl<T: Transport> DeviceWrapper<T> {
46 fn new(
47 dev: DeviceImpl<T>,
48 rx_po: PacketObject,
49 tt_device: Arc<twizzler_driver::device::Device>,
50 ) -> Self {
51 DeviceWrapper {
52 inner: Arc::new(Mutex::new(dev)),
53 rx_po,
54 tx_po: PacketObject::new(ObjectCreate::default(), NET_QUEUE_SIZE, NET_BUFFER_LEN)
55 .unwrap(),
56 tt_device,
57 }
58 }
59
60 pub fn mac_address(&self) -> EthernetAddress {
61 EthernetAddress(self.inner.lock().unwrap().mac_address())
62 }
63
64 pub fn has_work(&self) -> bool {
65 self.tt_device.repr().check_for_interrupt(0).is_some()
66 }
67
68 pub fn get_sleep(&self) -> ThreadSync {
69 ThreadSync::new_sleep(self.tt_device.repr().setup_interrupt_sleep(0))
70 }
71
72 pub fn get_rx(&self) -> Option<RxBuffer> {
73 self.inner.lock().unwrap().receive().ok()
74 }
75
76 pub fn recycle(&self, rx: RxBuffer) {
77 self.inner.lock().unwrap().recycle_rx_buffer(rx).unwrap();
78 }
79
80 pub fn transmit(&self, tx: TxBuffer) {
81 self.inner.lock().unwrap().send(tx).unwrap();
82 }
83}
84
85impl NetDriver for DeviceWrapper<TwizzlerTransport> {
86 fn device(&self) -> &Device {
87 todo!()
88 }
89
90 fn device_mut(&mut self) -> &mut Device {
91 todo!()
92 }
93
94 fn setup_rx_queue(&mut self, _len: usize) -> Result<QueueHandle, TwzError> {
95 todo!()
96 }
97
98 fn destroy_rx_queue(&mut self, _queue: QueueHandle) -> Result<(), TwzError> {
99 todo!()
100 }
101
102 fn setup_tx_queue(&mut self, _len: usize) -> Result<QueueHandle, TwzError> {
103 todo!()
104 }
105
106 fn destroy_tx_queue(&mut self, _queue: QueueHandle) -> Result<(), TwzError> {
107 todo!()
108 }
109
110 fn tx_queues(&self) -> Vec<QueueHandle> {
111 todo!()
112 }
113
114 fn rx_queues(&self) -> Vec<QueueHandle> {
115 todo!()
116 }
117
118 fn mac_address(&self, _queue: QueueHandle) -> Result<[u8; 6], TwzError> {
119 todo!()
120 }
121
122 fn recv_packets(
123 &mut self,
124 _queue: QueueHandle,
125 _packets: &mut [Packet],
126 ) -> Result<usize, TwzError> {
127 todo!()
128 }
129
130 fn send_packets(
131 &mut self,
132 _queue: QueueHandle,
133 _packets: &mut [Packet],
134 ) -> Result<usize, TwzError> {
135 todo!()
136 }
137
138 fn has_work(&self, _queue: QueueHandle) -> WorkItems {
139 todo!()
140 }
141
142 fn waitpoint(&self, _queue: QueueHandle) -> twizzler_abi::syscall::ThreadSync {
143 todo!()
144 }
145
146 fn rx_packet_buffer(&self, _queue: QueueHandle) -> &twizzler_net::drivers::DmaPacketObject {
147 todo!()
148 }
149
150 fn tx_packet_buffer(&self, _queue: QueueHandle) -> &twizzler_net::drivers::DmaPacketObject {
151 todo!()
152 }
153}
154pub fn get_device() -> DeviceWrapper<TwizzlerTransport> {
225 let rx_po = PacketObject::new(ObjectCreate::default(), NET_QUEUE_SIZE, NET_BUFFER_LEN).unwrap();
226 let tt = TwizzlerTransport::new().unwrap();
227 let tt_device = tt.device();
228 let net = VirtIONet::<TwzHal, TwizzlerTransport, NET_QUEUE_SIZE>::new(
229 tt,
230 NET_BUFFER_LEN,
231 rx_po.clone(),
232 )
233 .expect("failed to create net driver");
234 DeviceWrapper::<TwizzlerTransport>::new(net, rx_po, tt_device)
235}