X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/6c744a5a5235383b230e3854db9458409ad8781a..35592f46cdf2510114f767f968657711e4c226e9:/net/net.c?ds=inline diff --git a/net/net.c b/net/net.c index 98571b0..eac5d0e 100644 --- a/net/net.c +++ b/net/net.c @@ -4,7 +4,9 @@ #include #include #include +#include #include "net.h" +#include "../aseg/keyboard.h" static struct nic *_nic = 0x0; @@ -12,6 +14,17 @@ 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); @@ -24,6 +37,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; @@ -36,12 +67,33 @@ void eth_poll() if (!_nic) return; - _nic->poll(_nic, 0); + if (_nic->poll(_nic, 0)) { + _nic->packet = packet; + _nic->poll(_nic, 1); + + packet_t * p = (packet_t *) packet; + + 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; + + 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;