From 47c41031c5ec29bb8d8047cd287aa8b0b7af1fd3 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Mon, 10 Nov 2008 21:19:28 -0500 Subject: [PATCH] Get packets in and out of lwIP. PING works. --- lwip/src/include/lwipopts.h | 37 +++++++ net/3c90x.c | 21 +--- net/etherboot-compat.h | 4 +- net/net.c | 188 ++++++++++++++++++++---------------- 4 files changed, 147 insertions(+), 103 deletions(-) diff --git a/lwip/src/include/lwipopts.h b/lwip/src/include/lwipopts.h index f4431d4..4ad4440 100644 --- a/lwip/src/include/lwipopts.h +++ b/lwip/src/include/lwipopts.h @@ -3,6 +3,7 @@ #define NO_SYS 1 + #define LWIP_SOCKET 0 #define LWIP_NETCONN 0 @@ -10,4 +11,40 @@ #define LWIP_DHCP 1 +#undef LWIP_DEBUG + +#define ETHARP_DEBUG LWIP_DBG_ON +#define NETIF_DEBUG LWIP_DBG_ON +#define PBUF_DEBUG LWIP_DBG_ON +#define API_LIB_DEBUG LWIP_DBG_OFF +#define API_MSG_DEBUG LWIP_DBG_OFF +#define SOCKETS_DEBUG LWIP_DBG_OFF +#define ICMP_DEBUG LWIP_DBG_OFF +#define IGMP_DEBUG LWIP_DBG_OFF +#define INET_DEBUG LWIP_DBG_OFF +#define IP_DEBUG LWIP_DBG_ON +#define IP_REASS_DEBUG LWIP_DBG_OFF +#define RAW_DEBUG LWIP_DBG_OFF +#define MEM_DEBUG LWIP_DBG_ON +#define MEMP_DEBUG LWIP_DBG_ON +#define SYS_DEBUG LWIP_DBG_OFF +#define TCP_DEBUG LWIP_DBG_ON +#define TCP_INPUT_DEBUG LWIP_DBG_ON +#define TCP_FR_DEBUG LWIP_DBG_OFF +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#define TCP_WND_DEBUG LWIP_DBG_OFF +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#define TCP_RST_DEBUG LWIP_DBG_OFF +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#define UDP_DEBUG LWIP_DBG_OFF +#define TCPIP_DEBUG LWIP_DBG_OFF +#define PPP_DEBUG LWIP_DBG_OFF +#define SLIP_DEBUG LWIP_DBG_OFF +#define DHCP_DEBUG LWIP_DBG_OFF +#define AUTOIP_DEBUG LWIP_DBG_OFF +#define SNMP_MSG_DEBUG LWIP_DBG_OFF +#define SNMP_MIB_DEBUG LWIP_DBG_OFF +#define DNS_DEBUG LWIP_DBG_OFF + #endif diff --git a/net/3c90x.c b/net/3c90x.c index b9f708c..a9d15df 100644 --- a/net/3c90x.c +++ b/net/3c90x.c @@ -224,8 +224,6 @@ typedef struct { unsigned int DnNextPtr; unsigned int FrameStartHeader; - unsigned int HdrAddr; - unsigned int HdrLength; unsigned int DataAddr; unsigned int DataLength; } @@ -475,16 +473,8 @@ static void a3c90x_reset(void) *** pkt - the pointer to the packet data itself. ***/ static void -a3c90x_transmit(const char *dest_addr, unsigned int proto, - unsigned int size, const char *pkt) +a3c90x_transmit(unsigned int size, const char *pkt) { - struct eth_hdr - { - unsigned char dst_addr[ETH_ALEN]; - unsigned char src_addr[ETH_ALEN]; - unsigned short type; - } hdr; - unsigned char status; unsigned int i, retries; @@ -495,16 +485,10 @@ a3c90x_transmit(const char *dest_addr, unsigned int proto, _issue_command(INF_3C90X.IOAddr, cmdStallCtl, 2 /* Stall download */); - hdr.type = htons(proto); - memcpy(hdr.dst_addr, dest_addr, ETH_ALEN); - memcpy(hdr.src_addr, INF_3C90X.HWAddr, ETH_ALEN); - /** Setup the DPD (download descriptor) **/ INF_3C90X.TransmitDPD.DnNextPtr = 0; /** set notification for transmission completion (bit 15) **/ - INF_3C90X.TransmitDPD.FrameStartHeader = (size + sizeof(hdr)) | 0x8000; - INF_3C90X.TransmitDPD.HdrAddr = memory_v2p(&hdr); - INF_3C90X.TransmitDPD.HdrLength = sizeof(hdr); + INF_3C90X.TransmitDPD.FrameStartHeader = (size) | 0x8000; INF_3C90X.TransmitDPD.DataAddr = memory_v2p((void*)pkt); INF_3C90X.TransmitDPD.DataLength = size + (1<<31); @@ -937,6 +921,7 @@ static int a3c90x_probe(struct pci_dev * pci, void * data) /* * Set our exported functions **/ nic.poll = a3c90x_poll; nic.transmit = a3c90x_transmit; + memcpy(nic.hwaddr, INF_3C90X.HWAddr, 6); eth_register(&nic); return 1; diff --git a/net/etherboot-compat.h b/net/etherboot-compat.h index b72885b..e769ce8 100644 --- a/net/etherboot-compat.h +++ b/net/etherboot-compat.h @@ -15,9 +15,11 @@ struct nic { unsigned int ioaddr; unsigned int irqno; + + unsigned char hwaddr[6]; int (*poll) (struct nic *nic, int retrieve); - void (*transmit) (const char *dest_addr, unsigned int proto, unsigned int size, const char *pkt); + void (*transmit) (unsigned int size, const char *pkt); }; #define virt_to_bus(x) memory_v2p((void *)(x)) diff --git a/net/net.c b/net/net.c index 7164746..9d99342 100644 --- a/net/net.c +++ b/net/net.c @@ -1,121 +1,141 @@ #include -#include -#include #include #include #include #include #include #include "net.h" -#include "../aseg/keyboard.h" + +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/sys.h" +#include +#include +#include "netif/etharp.h" +#include "netif/ppp_oe.h" static struct nic *_nic = 0x0; +static struct netif _netif; extern struct pci_driver a3c90x_driver; -static char test[1024] = {0}; - -static char packet[4096] = {0}; - -typedef struct packet_t { - char from[6]; - char to[6]; - unsigned short ethertype; - unsigned short datalen; - unsigned char command; - char data[]; -} packet_t; - -static unsigned char vga_read(unsigned char idx) -{ - outb(CRTC_IDX_REG, idx); - return inb(CRTC_DATA_REG); -} - -static unsigned int vga_base() +void eth_poll() { - return (((unsigned int) vga_read(CRTC_START_ADDR_MSB_IDX)) << 9) - + (((unsigned int) vga_read(CRTC_START_ADDR_LSB_IDX)) << 1); -} + unsigned char pkt[1600]; + int len; + struct pbuf *p, *q; + struct eth_hdr *ethhdr; + int pos = 0; + + if (!_nic) + return; + + smram_tseg_set_state(SMRAM_TSEG_OPEN); -void handle_command(packet_t * p) -{ - uint16_t dl = htons(p->datalen); - int i; + if (!_nic->poll(_nic, 0)) + return; + + _nic->packet = pkt; + _nic->poll(_nic, 1); + + len = _nic->packetlen; - outputf("NIC: Command: 0x%x, %d bytes", p->command, dl); + outputf("NIC: Packet: %d bytes", len); + + p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); + if (p == NULL) + { + outputf("NIC: out of memory for packet?"); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + return; + } + + for(q = p; q != NULL; q = q->next) + { + memcpy(q->payload, pkt+pos, q->len); + pos += q->len; + } - switch (p->command) { - case 0x42: - for (i = 0; i < dl; i++) - kbd_inject_key(p->data[i]); + LINK_STATS_INC(link.recv); + + ethhdr = p->payload; + + switch (htons(ethhdr->type)) { + case ETHTYPE_IP: + case ETHTYPE_ARP: + if (_netif.input(p, &_netif) != ERR_OK) + { + LWIP_DEBUGF(NETIF_DEBUG, ("netdev_input: IP input error\n")); + pbuf_free(p); + } break; - case 0xFE: - outb(0xCF9, 0x4); /* Reboot */ + + default: + outputf("Unhandled packet type %04x input", ethhdr->type); + pbuf_free(p); break; } } -void eth_poll() +static err_t _transmit(struct netif *netif, struct pbuf *p) { - int i; -// static int c; - static short pos = 0x0; - unsigned short base = vga_base(); - unsigned char *p = (unsigned char *)0xB8000; - smram_state_t old_state; - - if (!_nic) - return; + struct nic *nic = netif->state; + struct pbuf *q; + unsigned char pkt[1600]; + unsigned int len = 0; - if (_nic->poll(_nic, 0)) { - _nic->packet = packet; - _nic->poll(_nic, 1); + for(q = p; q != NULL; q = q->next) + { + memcpy(pkt + len, q->payload, q->len); + len += q->len; + } - packet_t * p = (packet_t *) packet; + outputf("NIC: Transmit packet: %d bytes", len); - outputf("NIC: Packet: %d 0x%x", _nic->packetlen, htons(p->ethertype)); - if (htons(p->ethertype) == 0x1338) { - if (htons(p->datalen) + sizeof(packet_t) > _nic->packetlen) { - outputf("NIC: Malformed packet"); - } else { - handle_command(p); - } - } - } - smram_tseg_set_state(SMRAM_TSEG_OPEN); - old_state = smram_save_state(); - -// if ((c++) % 2) -// return; + nic->transmit(len, pkt); - if (((base + 80*25*2)%0x8000) < base) - { - if ((pos > ((base + 80*25*2)%0x8000)) && (pos < base)) - pos = base; - } else if ((pos > base + 80*25*2) || (pos < base)) - pos = base; + LINK_STATS_INC(link.xmit); + + return ERR_OK; +} + +static err_t _init(struct netif *netif) +{ + struct nic *nic = netif->state; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + +#if LWIP_NETIF_HOSTNAME + netif->hostname = "netwatch"; +#endif - test[0] = pos >> 8; - test[1] = pos & 0xFF; - test[2] = base >> 8; - test[3] = base & 0xFF; + NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 100000000); - smram_aseg_set_state(SMRAM_ASEG_SMMCODE); + netif->name[0] = 'e'; + netif->name[1] = 'n'; + netif->output = etharp_output; + netif->linkoutput = _transmit; - for (i = 4; i < 1024; i++) - { - test[i] = p[pos++]; - pos %= 0x8000; - } - smram_restore_state(old_state); - _nic->transmit("\x00\x03\x93\x87\x84\x8C", 0x1337, 1024, test); + memcpy(netif->hwaddr, nic->hwaddr, 6); + netif->mtu = 1500; + netif->hwaddr_len = ETHARP_HWADDR_LEN; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; + + return ERR_OK; } int eth_register(struct nic *nic) { + static struct ip_addr ipa = { 0x2dba0280 } , netmask = { 0xF0FFFFFF } , gw = { 0x2eba0280 }; + if (_nic) return -1; + netif_add(&_netif, &ipa, &netmask, &gw, (void*)nic, _init, ethernet_input); + netif_set_default(&_netif); + netif_set_up(&_netif); _nic = nic; return 0; } @@ -124,6 +144,6 @@ void eth_init() { /* Required for DMA to work. :( */ smram_tseg_set_state(SMRAM_TSEG_OPEN); - pci_probe_driver(a3c90x_driver); lwip_init(); + pci_probe_driver(a3c90x_driver); } -- 2.43.0