From 112ca29a3bb2ab38693943ed33ee51f4fd7d2d81 Mon Sep 17 00:00:00 2001 From: Miguel Date: Tue, 25 Sep 2018 12:43:03 +0200 Subject: arp replies working! --- driver/e1000.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'driver/e1000.c') diff --git a/driver/e1000.c b/driver/e1000.c index 35e106e..4c6b8de 100644 --- a/driver/e1000.c +++ b/driver/e1000.c @@ -5,9 +5,14 @@ //registers etc. verified from pdf at https://pdos.csail.mit.edu/6.828/2006/readings/hardware/8254x_GBe_SDM.pdf #include + #include "log.h" #include "e1000.h" #include "kmalloc.h" +#include "netdev.h" +#include "arp.h" + +#include "lib/string/string.h" #define REG_CTRL 0x0000 // device control R/W #define REG_CTRL_LRST 1<<3 // Link Reset / transition to 0 to initiates auto-negotiation @@ -130,6 +135,10 @@ #define E1000_NUM_RX_DESC 32 #define E1000_NUM_TX_DESC 8 +// TODO: move all global stuff to some struct so we can run multiple e1000 cards! +// +struct netdev dev; ///TODO not global! + struct e1000_rx_desc { volatile uint32_t addr_lo; // 4 volatile uint32_t addr_hi; // 4 @@ -413,6 +422,7 @@ void e1000_handleReceive() uint16_t len = rx_descs[rx_cur]->length; // Here you should inject the received packet into your network stack + arp_incoming(&dev,buf); rx_descs[rx_cur]->status = 0; old_cur = rx_cur; @@ -472,8 +482,11 @@ void e1000_linkdown() } -bool e1000_init(uint32_t base) +struct netdev e1000_init(uint32_t base) { + dev.ip=0; + dev.hwaddr[0]=dev.hwaddr[1]=dev.hwaddr[2]=dev.hwaddr[3]=dev.hwaddr[4]=dev.hwaddr[5]=0; + klog("init E1000"); klog("interrupt mask: 0x%08X",readCommand(REG_IMS)); klog("device status: 0x%08X",readCommand(REG_STATUS)); @@ -485,10 +498,14 @@ bool e1000_init(uint32_t base) if(base!=0){ mem_base=base;} detectEEProm(); - if (! readMACAddress()) return false; + if (! readMACAddress()) return dev; klog("mac : %02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],mac[6]); + memcpy(dev.hwaddr,mac,6); // use mac obtained from device + dev.ip=(192<<0)+(168<<8)+(0<<16)+(20<<24); // 192.168.0.20 // TODO: not hardcode! + dev.transmit=e1000_sendPacket; + // clear multicast table for(int i = 0; i < 0x80; i++)writeCommand(REG_MTA + i*4, 0); @@ -498,10 +515,10 @@ bool e1000_init(uint32_t base) txinit(); rxinit(); - + klog("E1000 initialized"); - return true; + return dev; } void e1000_irq (int irq) { -- cgit v1.2.3