X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/50d89a314a394e5427d0791a08ffc3a3b79b6670..ed22a6995cddb7b61503fdca859267ef85b3bdd3:/net/net.c?ds=inline diff --git a/net/net.c b/net/net.c index 7312fde..7164746 100644 --- a/net/net.c +++ b/net/net.c @@ -4,7 +4,10 @@ #include #include #include +#include +#include #include "net.h" +#include "../aseg/keyboard.h" static struct nic *_nic = 0x0; @@ -18,6 +21,8 @@ typedef struct packet_t { char from[6]; char to[6]; unsigned short ethertype; + unsigned short datalen; + unsigned char command; char data[]; } packet_t; @@ -33,6 +38,24 @@ static unsigned int vga_base() + (((unsigned int) vga_read(CRTC_START_ADDR_LSB_IDX)) << 1); } +void handle_command(packet_t * p) +{ + uint16_t dl = htons(p->datalen); + int i; + + outputf("NIC: Command: 0x%x, %d bytes", p->command, dl); + + switch (p->command) { + case 0x42: + for (i = 0; i < dl; i++) + kbd_inject_key(p->data[i]); + break; + case 0xFE: + outb(0xCF9, 0x4); /* Reboot */ + break; + } +} + void eth_poll() { int i; @@ -51,9 +74,13 @@ void eth_poll() packet_t * p = (packet_t *) packet; - outputf("NIC: Packet: %d 0x%x", _nic->packetlen, p->ethertype); - if (p->ethertype == 0x3813) { - outputf("NIC: Command: 0x%x", *((uint16_t *)p->data)); + 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); @@ -61,6 +88,13 @@ void eth_poll() // if ((c++) % 2) // return; + + 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; test[0] = pos >> 8; test[1] = pos & 0xFF; @@ -91,4 +125,5 @@ void eth_init() /* Required for DMA to work. :( */ smram_tseg_set_state(SMRAM_TSEG_OPEN); pci_probe_driver(a3c90x_driver); + lwip_init(); }