15
15
// You should have received a copy of the GNU General Public License
16
16
// along with Aero. If not, see <https://www.gnu.org/licenses/>.
17
17
18
+ use alloc:: boxed:: Box ;
18
19
use alloc:: sync:: Arc ;
19
20
use spin:: Once ;
20
21
@@ -23,9 +24,11 @@ use crate::arch::interrupts::{self, InterruptStack};
23
24
use crate :: drivers:: pci:: * ;
24
25
use crate :: mem:: paging:: * ;
25
26
use crate :: userland:: scheduler;
27
+ use crate :: utils:: dma:: DmaAllocator ;
26
28
use crate :: utils:: sync:: { Mutex , WaitQueue } ;
27
29
28
- use crate :: net:: { self , ethernet, MacAddr , NetworkDevice , NetworkDriver , PacketBaseTrait } ;
30
+ use crate :: net:: { self , ethernet, NetworkDevice , NetworkDriver } ;
31
+ use netstack:: data_link:: MacAddr ;
29
32
30
33
const TX_DESC_NUM : u32 = 32 ;
31
34
const TX_DESC_SIZE : u32 = TX_DESC_NUM * core:: mem:: size_of :: < TxDescriptor > ( ) as u32 ;
@@ -374,35 +377,35 @@ impl E1000 {
374
377
}
375
378
}
376
379
377
- fn send ( & mut self , packet : net :: Packet < net :: Eth > ) {
380
+ fn send ( & mut self , packet : Box < [ u8 ] , DmaAllocator > ) {
378
381
let cur = self . tx_cur ;
379
382
let ring = self . tx_ring ( ) ;
380
383
381
- ring[ cur] . addr = unsafe { packet. addr ( ) - crate :: PHYSICAL_MEMORY_OFFSET } ;
384
+ ring[ cur] . addr =
385
+ unsafe { VirtAddr :: new ( packet. as_ptr ( ) as u64 ) - crate :: PHYSICAL_MEMORY_OFFSET } ;
382
386
ring[ cur] . length = packet. len ( ) as _ ;
383
387
ring[ cur] . cmd = 0b1011 ;
384
388
ring[ cur] . status = TStatus :: empty ( ) ;
385
389
386
390
self . tx_cur = ( self . tx_cur + 1 ) % TX_DESC_NUM as usize ;
387
391
388
392
self . write ( Register :: TxDescTail , self . tx_cur as u32 ) ;
393
+ core:: mem:: forget ( packet) ; // FIXME: hack
389
394
}
390
395
391
- fn recv ( & mut self ) -> Option < net:: RecvPacket > {
396
+ fn recv < ' a > ( & mut self ) -> Option < net:: RecvPacket < ' a > > {
392
397
let id = self . rx_cur ;
393
398
let desc = & mut self . rx_ring ( ) [ id] ;
394
399
395
400
if desc. status & 0x1 != 0x1 {
396
401
return None ;
397
402
}
398
403
399
- Some ( net:: RecvPacket {
400
- packet : net:: Packet :: < ethernet:: Eth > :: new (
401
- PhysAddr :: new ( desc. addr ) . as_hhdm_virt ( ) ,
402
- desc. length as usize ,
403
- ) ,
404
- id,
405
- } )
404
+ let packet = PhysAddr :: new ( desc. addr )
405
+ . as_hhdm_virt ( )
406
+ . as_bytes_mut ( desc. length as usize ) ;
407
+
408
+ Some ( net:: RecvPacket { packet, id } )
406
409
}
407
410
408
411
fn recv_end ( & mut self , id : usize ) {
@@ -595,7 +598,7 @@ impl Device {
595
598
}
596
599
597
600
impl NetworkDriver for Device {
598
- fn send ( & self , packet : net :: Packet < net :: Eth > ) {
601
+ fn send ( & self , packet : Box < [ u8 ] , DmaAllocator > ) {
599
602
self . e1000 . lock_irq ( ) . send ( packet)
600
603
}
601
604
@@ -619,7 +622,7 @@ impl NetworkDriver for Device {
619
622
self . e1000 . lock_irq ( ) . recv_end ( packet_id)
620
623
}
621
624
622
- fn mac ( & self ) -> net :: MacAddr {
625
+ fn mac ( & self ) -> MacAddr {
623
626
self . e1000 . lock_irq ( ) . mac
624
627
}
625
628
}
0 commit comments